SeqAn3
align_config_band.hpp
Go to the documentation of this file.
1 // ============================================================================
2 // SeqAn - The Library for Sequence Analysis
3 // ============================================================================
4 //
5 // Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin
6 // Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of Knut Reinert or the FU Berlin nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
25 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 // DAMAGE.
32 //
33 // ============================================================================
34 
40 #pragma once
41 
47 #include <seqan3/std/concepts>
48 
49 namespace seqan3::detail
50 {
51 
58 template <typename object_t>
59 struct is_band_config : public std::false_type
60 {};
61 
68 template <typename object_t>
69 inline constexpr bool is_band_config_v = is_band_config<object_t>::value;
70 
76 template <typename band_t>
78  requires is_band_config_v<band_t>
80 struct align_config_band
81 {
83  band_t value;
84 };
85 
91 template <template <typename ...> typename band_t>
93  requires is_band_config_v<band_t<int32_t>>
95 struct align_config_band_adaptor : public configuration_fn_base<align_config_band_adaptor<band_t>>
96 {
105  template <typename configuration_t, std::Integral value_t>
107  requires is_algorithm_configuration_v<remove_cvref_t<configuration_t>>
109  constexpr auto invoke(configuration_t && cfg,
110  lower_bound<value_t> const lower,
111  upper_bound<value_t> const upper) const
112  {
113  static_assert(is_valid_alignment_configuration_v<align_cfg::id::band, remove_cvref_t<configuration_t>>,
114  SEQAN3_INVALID_CONFIG(align_cfg::id::band));
115 
116  return std::forward<configuration_t>(cfg).push_front(align_config_band<band_t<value_t>>{{lower, upper}});
117  }
118 };
119 
122 template <>
123 struct on_align_config<align_cfg::id::band>
124 {
126  template <config_element_concept t>
127  using invoke = typename is_type_specialisation_of<t, align_config_band>::type;
128 };
129 
136 template <typename band_t>
137 struct align_config_type_to_id<align_config_band<band_t>>
138 {
140  static constexpr align_cfg::id value = align_cfg::id::band;
141 };
142 
144 template <std::Integral value_t>
145 struct is_band_config<band_static<value_t>> : public std::true_type
146 {};
148 
149 } // namespace seqan3::detail
150 
152 {
156 inline constexpr detail::align_config_band_adaptor<seqan3::band_static> band_static;
157 
158 } // namespace seqan3::align_cfg
Provides seqan3::type_list and auxiliary metafunctions.
A special sub namespace for the alignment configurations.
Definition: align_config_band.hpp:151
Provides functionality to access get function by enum values.
The Concepts library.
constexpr detail::align_config_band_adaptor< seqan3::band_static > band_static
A configuration adaptor for a static band.
Definition: align_config_band.hpp:156
Definition: aligned_sequence_concept.hpp:288
Provides seqan3::band_static.
id
Specifies an id for every configuration element.
Definition: utility.hpp:66
Provides various metafunctions on generic types.
Meta-Header for components of the algorithm submodule.