SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
template_inspection.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 
14 #pragma once
15 
16 #include <seqan3/std/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 ...> typename target_template,
59  typename ...source_arg_types>
61  requires requires ()
62  {
63  typename target_template<source_arg_types...>;
64  }
66 struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
67 {
69  using type = target_template<source_arg_types...>;
70 };
71 
76 template <typename source_type, template <typename ...> typename target_template>
77 using transfer_template_args_onto_t = typename transfer_template_args_onto<source_type, target_template>::type;
78 
79 // ----------------------------------------------------------------------------
80 // transfer_template_vargs_onto
81 // ----------------------------------------------------------------------------
82 
84 template <typename source_type, template <auto ...> typename target_template>
85 struct transfer_template_vargs_onto
86 {};
88 
106 template <template <auto ...> typename source_template,
107  template <auto ...> typename target_template,
108  auto ... source_varg_types>
110  requires requires ()
111  {
112  typename target_template<source_varg_types...>;
113  }
115 struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
116 {
118  using type = target_template<source_varg_types...>;
119 };
120 
125 template <typename source_type, template <auto ...> typename target_template>
126 using transfer_template_vargs_onto_t = typename transfer_template_vargs_onto<source_type, target_template>::type;
127 
128 // ----------------------------------------------------------------------------
129 // is_type_specialisation_of_v
130 // ----------------------------------------------------------------------------
131 
144 template <typename source_t, template <typename ...> typename target_template>
145 struct is_type_specialisation_of : public std::false_type
146 {};
147 
149 template <typename source_t, template <typename ...> typename target_template>
151  requires (!std::same_as<transformation_trait_or_t<transfer_template_args_onto<source_t, target_template>, void>,
152  void>)
154 struct is_type_specialisation_of<source_t, target_template> :
155  std::is_same<source_t, transfer_template_args_onto_t<source_t, target_template>>
156 {};
157 
163 template <typename source_t, template <typename ...> typename target_template>
164 inline constexpr bool is_type_specialisation_of_v = is_type_specialisation_of<source_t, target_template>::value;
165 
166 // ----------------------------------------------------------------------------
167 // is_value_specialisation_of_v
168 // ----------------------------------------------------------------------------
169 
171 template <typename source_t, template <auto ...> typename target_template>
172 struct is_value_specialisation_of : std::false_type
173 {};
175 
185 template <typename source_t, template <auto ...> typename target_template>
187  requires (!std::same_as<transformation_trait_or_t<transfer_template_vargs_onto<source_t, target_template>, void>,
188  void>)
190 struct is_value_specialisation_of<source_t, target_template> :
191  std::is_same<source_t, transfer_template_vargs_onto_t<source_t, target_template>>
192 {};
193 
199 template <typename source_t, template <auto ...> typename target_template>
200 inline constexpr bool is_value_specialisation_of_v = is_value_specialisation_of<source_t, target_template>::value;
201 
211 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
212 struct valid_template_spec_or
213 {
215  using type = fallback_t;
216 };
217 
219 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
221  requires requires { typename templ_t<spec_t...>; }
223 struct valid_template_spec_or<fallback_t, templ_t, spec_t...>
224 {
226  using type = templ_t<spec_t...>;
227 };
228 
236 template <typename fallback_t, template <typename ...> typename templ_t, typename ...spec_t>
237 using valid_template_spec_or_t = typename valid_template_spec_or<fallback_t, templ_t, spec_t...>::type;
238 
239 // ----------------------------------------------------------------------------
240 // template_specialisation_of
241 // ----------------------------------------------------------------------------
242 
259 template <typename mytype, template <typename ...> typename type_template>
260 SEQAN3_CONCEPT template_specialisation_of = is_type_specialisation_of_v<mytype, type_template>;
261 
263 
264 // ----------------------------------------------------------------------------
265 // strip_type_identity
266 // ----------------------------------------------------------------------------
267 
271 template <typename t>
273  transformation_trait_or_t<t, void>,
274  t>;
275 } // namespace seqan3::detail
The Concepts library.
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:200
SeqAn specific customisations in the standard namespace.
Provides seqan3::detail::transformation_trait_or.