SeqAn3  3.0.0
The Modern C++ library for sequence analysis.
template_inspection.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2019, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2019, 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 
15 #include <meta/meta.hpp>
16 
18 
19 #include <seqan3/std/concepts>
20 
21 namespace seqan3::detail
22 {
23 
24 // ----------------------------------------------------------------------------
25 // transfer_template_args_onto
26 // ----------------------------------------------------------------------------
27 
29 template <typename source_type, template <typename ...> typename target_template>
30 struct transfer_template_args_onto
31 {};
33 
58 template <template <typename ...> typename source_template,
59  template <typename ...> typename target_template,
60  typename ... source_arg_types>
62  requires requires ()
63  {
64  std::declval<target_template<source_arg_types...>>();
65  }
67 struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
68 {
70  using type = target_template<source_arg_types...>;
71 };
72 
77 template <typename source_type, template <typename ...> typename target_template>
78 using transfer_template_args_onto_t = typename transfer_template_args_onto<source_type, target_template>::type;
79 
80 // ----------------------------------------------------------------------------
81 // transfer_template_vargs_onto
82 // ----------------------------------------------------------------------------
83 
85 template <typename source_type, template <auto ...> typename target_template>
86 struct transfer_template_vargs_onto
87 {};
89 
107 template <template <auto ...> typename source_template,
108  template <auto ...> typename target_template,
109  auto ... source_varg_types>
111  requires requires ()
112  {
113  std::declval<target_template<source_varg_types...>>();
114  }
116 struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
117 {
119  using type = target_template<source_varg_types...>;
120 };
121 
126 template <typename source_type, template <auto ...> typename target_template>
127 using transfer_template_vargs_onto_t = typename transfer_template_vargs_onto<source_type, target_template>::type;
128 
129 // ----------------------------------------------------------------------------
130 // is_type_specialisation_of_v
131 // ----------------------------------------------------------------------------
132 
145 template <typename source_t, template <typename ...> typename target_template>
146 struct is_type_specialisation_of : public std::false_type
147 {};
148 
150 template <typename source_t, template <typename ...> typename target_template>
153  void>
155 struct is_type_specialisation_of<source_t, target_template> :
156  std::is_same<source_t, transfer_template_args_onto_t<source_t, target_template>>
157 {};
158 
164 template <typename source_t, template <typename ...> typename target_template>
165 inline constexpr bool is_type_specialisation_of_v = is_type_specialisation_of<source_t, target_template>::value;
166 
167 // ----------------------------------------------------------------------------
168 // is_value_specialisation_of_v
169 // ----------------------------------------------------------------------------
170 
172 template <typename source_t, template <auto ...> typename target_template>
173 struct is_value_specialisation_of : std::false_type
174 {};
176 
186 template <typename source_t, template <auto ...> typename target_template>
189  void>
191 struct is_value_specialisation_of<source_t, target_template> :
192  std::is_same<source_t, transfer_template_vargs_onto_t<source_t, target_template>>
193 {};
194 
200 template <typename source_t, template <auto ...> typename target_template>
201 inline constexpr bool is_value_specialisation_of_v = is_value_specialisation_of<source_t, target_template>::value;
202 
212 template <typename fallback_t, template <typename...> typename templ_t, typename ...spec_t>
213 struct valid_template_spec_or
214 {
216  using type = fallback_t;
217 };
218 
220 template <typename fallback_t, template <typename...> typename templ_t, typename ...spec_t>
222  requires requires { typename templ_t<spec_t...>; }
224 struct valid_template_spec_or<fallback_t, templ_t, spec_t...>
225 {
227  using type = templ_t<spec_t...>;
228 };
229 
237 template <typename fallback_t, template <typename...> typename templ_t, typename ...spec_t>
238 using valid_template_spec_or_t = typename valid_template_spec_or<fallback_t, templ_t, spec_t...>::type;
239 
240 } // namespace seqan3::detail
constexpr bool is_value_specialisation_of_v
Helper variable template for seqan3::detail::is_value_specialisation_of (UnaryTypeTrait shortcut)...
Definition: template_inspection.hpp:201
Provides seqan3::detail::transformation_trait_or.
The Concepts library.
T declval(T... args)
Definition: aligned_sequence_concept.hpp:35
The concept std::Same<T, U> is satisfied if and only if T and U denote the same type.