SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
template_inspection.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
11#pragma once
12
13#include <concepts>
14
16
17namespace seqan3::detail
18{
19
20// ----------------------------------------------------------------------------
21// transfer_template_args_onto
22// ----------------------------------------------------------------------------
23
25template <typename source_type, template <typename...> typename target_template>
26struct transfer_template_args_onto
27{};
29
54template <template <typename...> typename source_template,
55 template <typename...>
56 typename target_template,
57 typename... source_arg_types>
58 requires requires () { typename target_template<source_arg_types...>; }
59struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
60{
62 using type = target_template<source_arg_types...>;
63};
64
69template <typename source_type, template <typename...> typename target_template>
70using transfer_template_args_onto_t = typename transfer_template_args_onto<source_type, target_template>::type;
71
72// ----------------------------------------------------------------------------
73// transfer_template_vargs_onto
74// ----------------------------------------------------------------------------
75
77template <typename source_type, template <auto...> typename target_template>
78struct transfer_template_vargs_onto
79{};
81
99template <template <auto...> typename source_template,
100 template <auto...>
101 typename target_template,
102 auto... source_varg_types>
103 requires requires () { typename target_template<source_varg_types...>; }
104struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
105{
107 using type = target_template<source_varg_types...>;
108};
109
114template <typename source_type, template <auto...> typename target_template>
115using transfer_template_vargs_onto_t = typename transfer_template_vargs_onto<source_type, target_template>::type;
116
117// ----------------------------------------------------------------------------
118// is_type_specialisation_of_v
119// ----------------------------------------------------------------------------
120
133template <typename source_t, template <typename...> typename target_template>
136
138template <typename source_t, template <typename...> typename target_template>
139 requires (
140 !std::same_as<transformation_trait_or_t<transfer_template_args_onto<source_t, target_template>, void>, void>)
142 std::is_same<source_t, transfer_template_args_onto_t<source_t, target_template>>
143{};
144
150template <typename source_t, template <typename...> typename target_template>
151inline constexpr bool is_type_specialisation_of_v = is_type_specialisation_of<source_t, target_template>::value;
152
153// ----------------------------------------------------------------------------
154// is_value_specialisation_of_v
155// ----------------------------------------------------------------------------
156
158template <typename source_t, template <auto...> typename target_template>
159struct is_value_specialisation_of : std::false_type
160{};
162
172template <typename source_t, template <auto...> typename target_template>
173 requires (
174 !std::same_as<transformation_trait_or_t<transfer_template_vargs_onto<source_t, target_template>, void>, void>)
175struct is_value_specialisation_of<source_t, target_template> :
176 std::is_same<source_t, transfer_template_vargs_onto_t<source_t, target_template>>
177{};
178
184template <typename source_t, template <auto...> typename target_template>
185inline constexpr bool is_value_specialisation_of_v = is_value_specialisation_of<source_t, target_template>::value;
186
195template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
197{
199 using type = fallback_t;
200};
201
203template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
204 requires requires { typename templ_t<spec_t...>; }
205struct valid_template_spec_or<fallback_t, templ_t, spec_t...>
206{
208 using type = templ_t<spec_t...>;
209};
210
218template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
219using valid_template_spec_or_t = typename valid_template_spec_or<fallback_t, templ_t, spec_t...>::type;
220
221// ----------------------------------------------------------------------------
222// template_specialisation_of
223// ----------------------------------------------------------------------------
224
240template <typename mytype, template <typename...> typename type_template>
241concept template_specialisation_of = is_type_specialisation_of_v<mytype, type_template>;
242
244
245// ----------------------------------------------------------------------------
246// strip_type_identity
247// ----------------------------------------------------------------------------
248
253template <typename t>
256} // namespace seqan3::detail
typename transfer_template_args_onto< source_type, target_template >::type transfer_template_args_onto_t
Shortcut for seqan3::detail::transfer_template_args_onto (transformation_trait shortcut).
Definition template_inspection.hpp:70
typename valid_template_spec_or< fallback_t, templ_t, spec_t... >::type valid_template_spec_or_t
Helper for seqan3::detail::valid_template_spec_or (transformation_trait shortcut).
Definition template_inspection.hpp:219
typename transfer_template_vargs_onto< source_type, target_template >::type transfer_template_vargs_onto_t
Shortcut for seqan3::detail::transfer_template_vargs_onto (transformation_trait shortcut).
Definition template_inspection.hpp:115
typename transformation_trait_or< type_t, default_t >::type transformation_trait_or_t
Helper type of seqan3::detail::transformation_trait_or (transformation_trait shortcut).
Definition transformation_trait_or.hpp:48
Provides concept seqan3::template_specialisation_of<mytype, [...]> for checking the type specialisati...
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
SeqAn specific customisations in the standard namespace.
Determines whether a source_type is a specialisation of another template.
Definition template_inspection.hpp:135
target_template< source_arg_types... > type
The return type: the target type specialised by the unpacked types in the list.
Definition template_inspection.hpp:62
target_template< source_varg_types... > type
The return type: the target type specialised by the unpacked types in the list.
Definition template_inspection.hpp:107
templ_t< spec_t... > type
The resulting type.
Definition template_inspection.hpp:208
Exposes templ_t<spec_t...> if that is valid, otherwise fallback_t.
Definition template_inspection.hpp:197
fallback_t type
The resulting type.
Definition template_inspection.hpp:199
constexpr bool is_value_specialisation_of_v
Helper variable template for seqan3::detail::is_value_specialisation_of (unary_type_trait shortcut).
Definition template_inspection.hpp:185
Provides seqan3::detail::transformation_trait_or.
Hide me