19 namespace seqan3::detail
27 template <
typename source_type,
template <
typename ...>
typename target_template>
28 struct transfer_template_args_onto
56 template <
template <
typename ...>
typename source_template,
57 template <
typename ...>
typename target_template,
58 typename ...source_arg_types>
62 typename target_template<source_arg_types...>;
65 struct transfer_template_args_onto<source_template<source_arg_types...>, target_template>
68 using type = target_template<source_arg_types...>;
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;
83 template <
typename source_type,
template <
auto ...>
typename target_template>
84 struct transfer_template_vargs_onto
105 template <
template <
auto ...>
typename source_template,
106 template <
auto ...>
typename target_template,
107 auto ... source_varg_types>
111 typename target_template<source_varg_types...>;
114 struct transfer_template_vargs_onto<source_template<source_varg_types...>, target_template>
117 using type = target_template<source_varg_types...>;
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;
143 template <
typename source_t,
template <
typename ...>
typename target_template>
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>,
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>>
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;
170 template <
typename source_t,
template <
auto ...>
typename target_template>
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>,
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>>
198 template <
typename source_t,
template <
auto ...>
typename target_template>
210 template <
typename fallback_t,
template <
typename ...>
typename templ_t,
typename ...spec_t>
211 struct valid_template_spec_or
214 using type = fallback_t;
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...>
225 using type = templ_t<spec_t...>;
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;
245 template <
typename t>
247 transformation_trait_or_t<t, void>,