SeqAn3
detail.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, FU 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 
42 #include <type_traits>
43 
44 #include <seqan3/core/platform.hpp>
45 
46 namespace seqan3::detail
47 {
48 
49 // ------------------------------------------------------------------
50 // cartesian_composition_concept
51 // ------------------------------------------------------------------
52 
63 template <typename t>
65 concept cartesian_composition_concept = requires
66 {
67  typename t::seqan3_cartesian_components;
68  typename t::seqan3_recursive_cartesian_components;
69 };
71 
72 // ------------------------------------------------------------------
73 // cartesian_components
74 // ------------------------------------------------------------------
75 
80 template <typename t>
81 struct cartesian_components;
82 
88 template <cartesian_composition_concept t>
89 struct cartesian_components<t>
90 {
92  using type = typename t::seqan3_cartesian_components;
93 };
94 
95 // ------------------------------------------------------------------
96 // recursive_cartesian_components
97 // ------------------------------------------------------------------
98 
104 template <typename t>
105 struct recursive_cartesian_components;
106 
112 template <cartesian_composition_concept t>
113 struct recursive_cartesian_components<t>
114 {
116  using type = typename t::seqan3_recursive_cartesian_components;
117 };
118 
119 // ------------------------------------------------------------------
120 // Callable concept helpers for meta::invoke
121 // ------------------------------------------------------------------
122 
126 template <typename T>
127 struct constructible_from
128 {
130  template <typename type>
131  using invoke = std::integral_constant<bool, std::is_constructible_v<type, T>>;
132 };
133 
137 template <typename T>
138 struct implicitly_convertible_from
139 {
141  template <typename type>
142  using invoke = std::integral_constant<bool, implicitly_convertible_to_concept<T, type>>;
143 };
144 
148 template <typename T>
149 struct assignable_from
150 {
152  template <typename type>
153  using invoke = std::integral_constant<bool, weakly_assignable_concept<type, T>>;
154 };
155 
159 template <typename T>
160 struct weakly_equality_comparable_with
161 {
163  template <typename type>
164  using invoke = std::integral_constant<bool, std::detail::WeaklyEqualityComparableWith<type, T>>;
165 };
166 
170 template <typename T>
171 struct weakly_ordered_with
172 {
174  template <typename type>
175  using invoke = std::integral_constant<bool, weakly_ordered_with_concept<type, T>>;
176 };
177 
178 } // namespace seqan3::detail
179 
180 // ------------------------------------------------------------------
181 // Forwards
182 // ------------------------------------------------------------------
183 
184 namespace seqan3
185 {
186 
187 // forward
188 template <typename ...alternative_types>
190  requires (detail::constexpr_alphabet_concept<alternative_types> && ...) &&
191  (sizeof...(alternative_types) >= 2)
192  //TODO same char_type
195 
196 template <typename derived_type,
197  typename ...component_types>
199  requires (detail::constexpr_semi_alphabet_concept<component_types> && ...)
202 
203 } // namespace seqan3
Contains platform and dependency checks.
The CRTP base for a combined alphabet that contains multiple values of different alphabets at the sam...
Definition: cartesian_composition.hpp:209
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
A combined alphabet that can hold values of either of its alternatives.
Definition: detail.hpp:194
Definition: aligned_sequence_concept.hpp:288
Provides C++20 additions to the type_traits header.