SeqAn3
align_config_gap.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 
41 #pragma once
42 
50 
51 namespace seqan3::detail
52 {
57 template <typename gap_scheme_t>
58 struct align_config_gap
59 {
61  gap_scheme_t value;
62 };
63 
68 template <template <typename ...> typename gap_config_type>
69 struct align_config_gap_adaptor : public configuration_fn_base<align_config_gap_adaptor<gap_config_type>>
70 {
77  template <typename configuration_type,
78  arithmetic_concept value_type>
80  requires is_algorithm_configuration_v<remove_cvref_t<configuration_type>>
82  constexpr auto invoke(configuration_type && cfg,
83  gap_scheme<value_type> const scheme) const
84  {
85  static_assert(is_valid_alignment_configuration_v<align_cfg::id::gap, remove_cvref_t<configuration_type>>,
86  SEQAN3_INVALID_CONFIG(align_cfg::id::gap));
87 
88  return std::forward<configuration_type>(cfg).push_front(align_config_gap<gap_scheme<value_type>>
89  {std::move(scheme)});
90  }
91 
97  template <typename configuration_type,
98  arithmetic_concept value_type>
100  requires is_algorithm_configuration_v<remove_cvref_t<configuration_type>>
102  constexpr auto invoke(configuration_type && cfg,
103  gap_score<value_type> const gs) const
104  {
105  static_assert(is_valid_alignment_configuration_v<align_cfg::id::gap, remove_cvref_t<configuration_type>>,
106  SEQAN3_INVALID_CONFIG(align_cfg::id::gap));
107 
108  gap_scheme<value_type> scheme(gs);
109  return std::forward<configuration_type>(cfg).push_front(align_config_gap<decltype(scheme)>{std::move(scheme)});
110  }
111 
118  template <typename configuration_type,
119  arithmetic_concept value_type>
121  requires is_algorithm_configuration_v<remove_cvref_t<configuration_type>>
123  constexpr auto invoke(configuration_type && cfg,
124  gap_score<value_type> const gs,
125  gap_open_score<value_type> const gos) const
126  {
127  static_assert(is_valid_alignment_configuration_v<align_cfg::id::gap, remove_cvref_t<configuration_type>>,
128  SEQAN3_INVALID_CONFIG(align_cfg::id::gap));
129 
130  gap_scheme<value_type> scheme(gs, gos);
131  return std::forward<configuration_type>(cfg).push_front(align_config_gap<decltype(scheme)>{std::move(scheme)});
132  }
133 };
134 
137 template <>
138 struct on_align_config<align_cfg::id::gap>
139 {
141  template <config_element_concept t>
142  using invoke = typename is_type_specialisation_of<t, align_config_gap>::type;
143 };
144 
147 template <typename value_type>
148 struct align_config_type_to_id<align_config_gap<value_type>>
149 {
151  static constexpr align_cfg::id value = align_cfg::id::gap;
152 };
153 
154 } // namespace seqan3::detail
155 
156 namespace seqan3::align_cfg
157 {
158 
162 inline constexpr detail::align_config_gap_adaptor<seqan3::detail::align_config_gap> gap;
163 
164 } // namespace seqan3::align_cfg
Contains basic data structure for strong types.
Provides concepts for core language types and relations that don&#39;t have concepts in C++20 (yet)...
constexpr detail::align_config_gap_adaptor< seqan3::detail::align_config_gap > gap
A configuration adaptor for gaps.
Definition: align_config_gap.hpp:162
The alphabet of a gap character &#39;-&#39;.
Definition: gap.hpp:62
Provides seqan3::type_list and auxiliary metafunctions.
Provides seqan3::gap_scheme.
A special sub namespace for the alignment configurations.
Definition: align_config_band.hpp:151
Provides functionality to access get function by enum values.
Identifier for gap configuration.
Definition: aligned_sequence_concept.hpp:288
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.