24 namespace seqan3::detail
29 template <
typename list_t,
template <
typename ...>
typename output_t>
30 struct variant_from_tags;
34 template <
template <
typename...>
typename output_t,
typename ...ts>
35 struct variant_from_tags<
type_list<ts...>, output_t>
47 template <std::output_iterator<
char> it_t>
48 constexpr
void write_eol(it_t & it,
bool const add_cr)
66 template <
typename format_variant_type>
67 void set_format(format_variant_type & format,
70 using valid_formats = detail::transfer_template_args_onto_t<format_variant_type, type_list>;
72 bool format_found =
false;
74 if (extension.
size() > 1)
76 extension = extension.
substr(1);
77 detail::for_each<valid_formats>([&] (
auto fmt)
79 using fm_type =
typename decltype(fmt)::type;
81 for (
auto const & ext : fm_type::file_extensions)
83 if (std::ranges::equal(ext, extension))
85 format.template emplace<fm_type>();
94 throw unhandled_extension_error(
"No valid format found for this extension.");
101 template <
typename list_t>
102 inline constexpr
bool has_member_file_extensions =
false;
105 template <
template <
typename ...>
typename list_t,
typename ...ts>
106 requires (requires { ts::file_extensions; }, ...,
true)
107 inline constexpr
bool has_member_file_extensions<list_t<ts...>> =
true;
114 template <
typename query_t>
115 inline constexpr
bool has_type_valid_formats =
false;
118 template <
typename query_t>
119 requires requires {
typename query_t::valid_formats; }
120 inline constexpr
bool has_type_valid_formats<query_t> =
true;
142 template <
typename formats_t>
145 static_assert(has_member_file_extensions<formats_t>,
146 "Expects that all formats have a static member file_extensions storing the extensions in a range");
149 detail::for_each<formats_t>([&extensions] (
auto t_identity)
151 using format_t =
typename decltype(t_identity)::type;
152 std::ranges::copy(format_t::file_extensions, std::cpp20::back_inserter(extensions));