SeqAn3  3.2.0
The Modern C++ library for sequence analysis.
template_inspection.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, 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 
14 #pragma once
15 
16 #include <concepts>
17 
19 
20 namespace seqan3::detail
21 {
22 
23 // ----------------------------------------------------------------------------
24 // transfer_template_args_onto
25 // ----------------------------------------------------------------------------
26 
28 template <typename source_type, template <typename...> typename target_template>
29 struct transfer_template_args_onto
30 {};
32 
57 template <template <typename...> typename source_template,
58  template <typename...>
59  typename target_template,
60  typename... source_arg_types>
61  requires requires () { typename target_template<source_arg_types...>; }
62 struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
63 {
65  using type = target_template<source_arg_types...>;
66 };
67 
72 template <typename source_type, template <typename...> typename target_template>
73 using transfer_template_args_onto_t = typename transfer_template_args_onto<source_type, target_template>::type;
74 
75 // ----------------------------------------------------------------------------
76 // transfer_template_vargs_onto
77 // ----------------------------------------------------------------------------
78 
80 template <typename source_type, template <auto...> typename target_template>
81 struct transfer_template_vargs_onto
82 {};
84 
102 template <template <auto...> typename source_template,
103  template <auto...>
104  typename target_template,
105  auto... source_varg_types>
106  requires requires () { typename target_template<source_varg_types...>; }
107 struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
108 {
110  using type = target_template<source_varg_types...>;
111 };
112 
117 template <typename source_type, template <auto...> typename target_template>
118 using transfer_template_vargs_onto_t = typename transfer_template_vargs_onto<source_type, target_template>::type;
119 
120 // ----------------------------------------------------------------------------
121 // is_type_specialisation_of_v
122 // ----------------------------------------------------------------------------
123 
136 template <typename source_t, template <typename...> typename target_template>
137 struct is_type_specialisation_of : public std::false_type
138 {};
139 
141 template <typename source_t, template <typename...> typename target_template>
142  requires (
143  !std::same_as<transformation_trait_or_t<transfer_template_args_onto<source_t, target_template>, void>, void>)
144 struct is_type_specialisation_of<source_t, target_template> :
145  std::is_same<source_t, transfer_template_args_onto_t<source_t, target_template>>
146 {};
147 
153 template <typename source_t, template <typename...> typename target_template>
154 inline constexpr bool is_type_specialisation_of_v = is_type_specialisation_of<source_t, target_template>::value;
155 
156 // ----------------------------------------------------------------------------
157 // is_value_specialisation_of_v
158 // ----------------------------------------------------------------------------
159 
161 template <typename source_t, template <auto...> typename target_template>
162 struct is_value_specialisation_of : std::false_type
163 {};
165 
175 template <typename source_t, template <auto...> typename target_template>
176  requires (
177  !std::same_as<transformation_trait_or_t<transfer_template_vargs_onto<source_t, target_template>, void>, void>)
178 struct is_value_specialisation_of<source_t, target_template> :
179  std::is_same<source_t, transfer_template_vargs_onto_t<source_t, target_template>>
180 {};
181 
187 template <typename source_t, template <auto...> typename target_template>
188 inline constexpr bool is_value_specialisation_of_v = is_value_specialisation_of<source_t, target_template>::value;
189 
198 template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
199 struct valid_template_spec_or
200 {
202  using type = fallback_t;
203 };
204 
206 template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
207  requires requires { typename templ_t<spec_t...>; }
208 struct valid_template_spec_or<fallback_t, templ_t, spec_t...>
209 {
211  using type = templ_t<spec_t...>;
212 };
213 
221 template <typename fallback_t, template <typename...> typename templ_t, typename... spec_t>
222 using valid_template_spec_or_t = typename valid_template_spec_or<fallback_t, templ_t, spec_t...>::type;
223 
224 // ----------------------------------------------------------------------------
225 // template_specialisation_of
226 // ----------------------------------------------------------------------------
227 
243 template <typename mytype, template <typename...> typename type_template>
244 concept template_specialisation_of = is_type_specialisation_of_v<mytype, type_template>;
245 
247 
248 // ----------------------------------------------------------------------------
249 // strip_type_identity
250 // ----------------------------------------------------------------------------
251 
256 template <typename t>
257 using strip_type_identity_t =
258  std::conditional_t<is_type_specialisation_of_v<t, std::type_identity>, transformation_trait_or_t<t, void>, t>;
259 } // namespace seqan3::detail
The <concepts> header from C++20's standard library.
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
SeqAn specific customisations in the standard namespace.
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:188
Provides seqan3::detail::transformation_trait_or.