SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
detail.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
19
20namespace seqan3::detail
21{
22
23// ------------------------------------------------------------------
24// alphabet_tuple_like
25// ------------------------------------------------------------------
26
37template <typename t>
38SEQAN3_CONCEPT alphabet_tuple_like = requires
39{
40 requires t::seqan3_alphabet_tuple_like;
41};
43
44// ------------------------------------------------------------------
45// required_types
46// ------------------------------------------------------------------
47
57template <typename t>
58struct required_types
59{
61 using type = type_list<>;
62};
63
73template <typename t>
75 requires requires { typename t::seqan3_required_types; }
77struct required_types<t>
78{
80 using type = typename t::seqan3_required_types;
81};
82
86template <typename t>
87using required_types_t = typename required_types<t>::type;
88
89// ------------------------------------------------------------------
90// recursive_required_types
91// ------------------------------------------------------------------
92
93//TODO: This can be replaced with metaprogramming magic once a few more functions land in list_traits.
94
99template <typename t>
100struct recursive_required_types
101{
103 using type = type_list<>;
104};
105
110template <typename t>
112 requires requires
113 {
114 typename t::seqan3_recursive_required_types;
115 }
117struct recursive_required_types<t>
118{
120 using type = typename t::seqan3_recursive_required_types;
121};
122
126template <typename t>
127using recursive_required_types_t = typename recursive_required_types<t>::type;
128
129// ------------------------------------------------------------------
130// Callable concept helpers for meta::invoke
131// ------------------------------------------------------------------
132
136template <typename T>
137struct constructible_from
138{
140 template <typename type>
142};
143
147template <typename T>
148struct implicitly_convertible_from
149{
151 template <typename type>
153};
154
158template <typename T>
159struct assignable_from
160{
162 template <typename type>
164};
165
169template <typename T>
170struct weakly_equality_comparable_with_
171{
173 template <typename type>
175};
176
180template <typename T>
181struct weakly_ordered_with_
182{
184 template <typename type>
186};
187
188} // namespace seqan3::detail
189
190// ------------------------------------------------------------------
191// Forwards
192// ------------------------------------------------------------------
193
194namespace seqan3
195{
196
197// forward
198template <typename ...alternative_types>
200 requires (detail::writable_constexpr_alphabet<alternative_types> && ...) &&
201 (std::regular<alternative_types> && ...) &&
202 (sizeof...(alternative_types) >= 2)
204class alphabet_variant;
205
206template <typename derived_type,
207 typename ...component_types>
209 requires (detail::writable_constexpr_semialphabet<component_types> && ...) &&
210 (std::regular<component_types> && ...)
212class alphabet_tuple_base;
213
214} // namespace seqan3
Core alphabet concept and free function/type trait wrappers.
Provides concepts for core language types and relations that don't have concepts in C++20 (yet).
T invoke(T... args)
Provides lazy template instantiation traits.
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
Provides seqan3::type_list.