SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
template_inspection.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
16 
17 #include <seqan3/std/concepts>
18 
19 namespace seqan3::detail
20 {
21 
22 // ----------------------------------------------------------------------------
23 // transfer_template_args_onto
24 // ----------------------------------------------------------------------------
25 
27 template <typename source_type, template <typename ...> typename target_template>
28 struct transfer_template_args_onto
29 {};
31 
56 template <template <typename ...> typename source_template,
57  template <typename ...> typename target_template,
58  typename ...source_arg_types>
60  requires requires ()
61  {
62  typename target_template<source_arg_types...>;
63  }
65 struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
66 {
68  using type = target_template<source_arg_types...>;
69 };
70 
75 template <typename source_type, template <typename ...> typename target_template>
76 using transfer_template_args_onto_t = typename transfer_template_args_onto<source_type, target_template>::type;
77 
78 // ----------------------------------------------------------------------------
79 // transfer_template_vargs_onto
80 // ----------------------------------------------------------------------------
81 
83 template <typename source_type, template <auto ...> typename target_template>
84 struct transfer_template_vargs_onto
85 {};
87 
105 template <template <auto ...> typename source_template,
106  template <auto ...> typename target_template,
107  auto ... source_varg_types>
109  requires requires ()
110  {
111  typename target_template<source_varg_types...>;
112  }
114 struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
115 {
117  using type = target_template<source_varg_types...>;
118 };
119 
124 template <typename source_type, template <auto ...> typename target_template>
125 using transfer_template_vargs_onto_t = typename transfer_template_vargs_onto<source_type, target_template>::type;
126 
127 // ----------------------------------------------------------------------------
128 // is_type_specialisation_of_v
129 // ----------------------------------------------------------------------------
130 
143 template <typename source_t, template <typename ...> typename target_template>
144 struct is_type_specialisation_of : public std::false_type
145 {};
146 
148 template <typename source_t, template <typename ...> typename target_template>
150  requires (!std::same_as<transformation_trait_or_t<transfer_template_args_onto<source_t, target_template>, void>,
151  void>)
153 struct is_type_specialisation_of<source_t, target_template> :
154  std::is_same<source_t, transfer_template_args_onto_t<source_t, target_template>>
155 {};
156 
162 template <typename source_t, template <typename ...> typename target_template>
163 inline constexpr bool is_type_specialisation_of_v = is_type_specialisation_of<source_t, target_template>::value;
164 
165 // ----------------------------------------------------------------------------
166 // is_value_specialisation_of_v
167 // ----------------------------------------------------------------------------
168 
170 template <typename source_t, template <auto ...> typename target_template>
171 struct is_value_specialisation_of : std::false_type
172 {};
174 
184 template <typename source_t, template <auto ...> typename target_template>
186  requires (!std::same_as<transformation_trait_or_t<transfer_template_vargs_onto<source_t, target_template>, void>,
187  void>)
189 struct is_value_specialisation_of<source_t, target_template> :
190  std::is_same<source_t, transfer_template_vargs_onto_t<source_t, target_template>>
191 {};
192 
198 template <typename source_t, template <auto ...> typename target_template>
199 inline constexpr bool is_value_specialisation_of_v = is_value_specialisation_of<source_t, target_template>::value;
200 
210 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
211 struct valid_template_spec_or
212 {
214  using type = fallback_t;
215 };
216 
218 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
220  requires requires { typename templ_t<spec_t...>; }
222 struct valid_template_spec_or<fallback_t, templ_t, spec_t...>
223 {
225  using type = templ_t<spec_t...>;
226 };
227 
235 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
236 using valid_template_spec_or_t = typename valid_template_spec_or<fallback_t, templ_t, spec_t...>::type;
237 
238 // ----------------------------------------------------------------------------
239 // strip_type_identity
240 // ----------------------------------------------------------------------------
241 
245 template <typename t>
247  transformation_trait_or_t<t, void>,
248  t>;
249 } // namespace seqan3::detail
std::false_type
concepts
The Concepts library.
transformation_trait_or.hpp
Provides seqan3::detail::transformation_trait_or.
is_value_specialisation_of_v
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:199
std
SeqAn specific customisations in the standard namespace.
std::conditional_t