35template <
typename tuple_derived_t,
typename rhs_t,
typename... component_types>
38 !std::is_base_of_v<tuple_derived_t, rhs_t>)&&(!(std::same_as<rhs_t, component_types> || ...))
42template <
typename lhs_t,
typename tuple_derived_t,
typename rhs_t,
typename... component_types>
44 (instantiate_if_v<lazy<weakly_equality_comparable_with_trait, rhs_t, component_types>,
45 std::same_as<lhs_t, tuple_derived_t>
50template <
typename lhs_t,
typename tuple_derived_t,
typename rhs_t,
typename... component_types>
52 (instantiate_if_v<lazy<weakly_ordered_with_trait, rhs_t, component_types>,
53 std::same_as<lhs_t, tuple_derived_t>
110template <
typename derived_type,
typename... component_types>
111 requires (detail::writable_constexpr_semialphabet<component_types> && ...) && (std::regular<component_types> && ...)
114 (1 * ... * alphabet_size<component_types>),
120 (1 * ... * alphabet_size<component_types>),
127 template <
typename type>
128 static constexpr bool is_component = seqan3::list_traits::contains<type, component_list>;
131 template <
typename type>
135 template <
typename alphabet_type,
size_t index>
149 using base_t::base_t;
200 template <
typename component_type>
201 requires (!std::is_base_of_v<alphabet_tuple_base, component_type>) && is_unique_component<component_type>
204 get<component_type>(*
this) = alph;
222 template <
typename indirect_component_type>
223 requires ((detail::instantiate_if_v<
224 detail::lazy<std::is_convertible, indirect_component_type, component_types>,
230 constexpr auto component_position =
231 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
233 component_type tmp(alph);
234 get<component_type>(*
this) = tmp;
238 template <
typename indirect_component_type>
239 requires ((!(detail::instantiate_if_v<
240 detail::lazy<std::is_convertible, indirect_component_type, component_types>,
243 && (detail::instantiate_if_v<
244 detail::lazy<std::is_constructible, component_types, indirect_component_type>,
245 detail::tuple_general_guard<derived_type, indirect_component_type, component_types...>>
249 using component_predicate = detail::constructible_from<indirect_component_type>;
250 constexpr auto component_position =
251 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
253 component_type tmp(alph);
254 get<component_type>(*
this) = tmp;
268 template <
typename component_type>
269 requires (!std::derived_from<component_type, alphabet_tuple_base>) && is_unique_component<component_type>
272 get<component_type>(*
this) = alph;
287 template <
typename indirect_component_type>
288 requires ((!std::derived_from<indirect_component_type, alphabet_tuple_base>)
289 && (!is_unique_component<indirect_component_type>)
290 && (std::assignable_from<component_types, indirect_component_type> || ...))
291 constexpr derived_type &
operator=(indirect_component_type
const alph)
noexcept
294 constexpr auto component_position =
295 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
297 get<component_type>(*
this) = alph;
302 template <
typename indirect_component_type>
303 requires ((!std::derived_from<indirect_component_type, alphabet_tuple_base>)
304 && (!is_unique_component<indirect_component_type>)
305 && (!(std::assignable_from<component_types, indirect_component_type> || ...))
306 && (std::convertible_to<indirect_component_type, component_types> || ...))
307 constexpr derived_type &
operator=(indirect_component_type
const alph)
noexcept
310 constexpr auto component_position =
311 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
313 component_type tmp(alph);
314 get<component_type>(*
this) = tmp;
318 template <
typename indirect_component_type>
319 requires ((!std::derived_from<indirect_component_type, alphabet_tuple_base>)
320 && (!is_unique_component<indirect_component_type>)
321 && (!(std::assignable_from<component_types, indirect_component_type> || ...))
322 && (!(std::convertible_to<indirect_component_type, component_types> || ...))
323 && (std::constructible_from<component_types, indirect_component_type> || ...))
324 constexpr derived_type &
operator=(indirect_component_type
const alph)
noexcept
326 using component_predicate = detail::constructible_from<indirect_component_type>;
327 constexpr auto component_position =
328 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
330 component_type tmp(alph);
331 get<component_type>(*
this) = tmp;
347 template <
size_t index>
350 static_assert(index <
sizeof...(component_types),
"Index out of range.");
366 template <
typename type>
368 requires is_unique_component<type>
370 return get<seqan3::list_traits::find<type, component_list>>(l);
379 template <
size_t index>
382 static_assert(index <
sizeof...(component_types),
"Index out of range.");
395 template <
typename type>
397 requires is_unique_component<type>
399 return get<seqan3::list_traits::find<type, component_list>>(l);
406 template <
typename type>
407 constexpr operator type() const noexcept
410 return get<type>(*
this);
431 template <
typename derived_type_t,
typename indirect_component_type>
432 friend constexpr auto operator==(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
438 constexpr auto component_position =
439 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
441 return get<component_type>(lhs) == rhs;
445 template <
typename derived_type_t,
typename indirect_component_type>
446 friend constexpr auto operator==(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
455 template <
typename derived_type_t,
typename indirect_component_type>
456 friend constexpr auto operator!=(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
462 constexpr auto component_position =
463 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
465 return get<component_type>(lhs) != rhs;
469 template <
typename derived_type_t,
typename indirect_component_type>
470 friend constexpr auto operator!=(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
479 template <
typename derived_type_t,
typename indirect_component_type>
480 friend constexpr auto operator<(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
486 constexpr auto component_position =
487 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
489 return get<component_type>(lhs) < rhs;
493 template <
typename derived_type_t,
typename indirect_component_type>
494 friend constexpr auto operator<(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
503 template <
typename derived_type_t,
typename indirect_component_type>
504 friend constexpr auto operator<=(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
510 constexpr auto component_position =
511 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
513 return get<component_type>(lhs) <= rhs;
517 template <
typename derived_type_t,
typename indirect_component_type>
518 friend constexpr auto operator<=(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
527 template <
typename derived_type_t,
typename indirect_component_type>
528 friend constexpr auto operator>(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
534 constexpr auto component_position =
535 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
537 return get<component_type>(lhs) > rhs;
541 template <
typename derived_type_t,
typename indirect_component_type>
542 friend constexpr auto operator>(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
551 template <
typename derived_type_t,
typename indirect_component_type>
552 friend constexpr auto operator>=(derived_type_t
const lhs, indirect_component_type
const rhs)
noexcept
558 constexpr auto component_position =
559 seqan3::list_traits::find_if<component_predicate::template invoke, component_list>;
561 return get<component_type>(lhs) >= rhs;
565 template <
typename derived_type_t,
typename indirect_component_type>
566 friend constexpr auto operator>=(indirect_component_type
const lhs, derived_type_t
const rhs)
noexcept
577 template <
size_t index>
582 return rank_to_component_rank[index][
to_rank()];
592 template <
size_t index>
596 + ((r -
static_cast<ptrdiff_t
>(to_component_rank<index>()))
606 using reverse_list_t =
decltype(seqan3::list_traits::detail::reverse(
component_list{}));
607 seqan3::detail::for_each<reverse_list_t>([&](
auto alphabet_type_identity)
constexpr {
608 using alphabet_t =
typename decltype(alphabet_type_identity)::type;
633 alphabet_size<1024 ? alphabet_size : 0>,
634 list_traits::size<component_list>>
635 rank_to_component_rank{
637 alphabet_size<1024 ? alphabet_size : 0>,
638 list_traits::size<component_list>> ret{};
644 for (
size_t i = 0; i < list_traits::size<component_list>; ++i)
645 for (
size_t j = 0; j < static_cast<size_t>(
alphabet_size); ++j)
663template <
typename derived_type,
typename... component_types>
664 requires (detail::writable_constexpr_semialphabet<component_types> && ...) && (std::regular<component_types> && ...)
665template <
typename alphabet_type,
size_t index>
667 public alphabet_proxy<component_proxy<alphabet_type, index>, alphabet_type>
686 using base_t::operator=;
717 return get<index>(lhs) ==
static_cast<alphabet_type
>(rhs);
729 return get<index>(lhs) !=
static_cast<alphabet_type
>(rhs);
741 return get<index>(lhs) <
static_cast<alphabet_type
>(rhs);
753 return get<index>(lhs) <=
static_cast<alphabet_type
>(rhs);
765 return get<index>(lhs) >
static_cast<alphabet_type
>(rhs);
777 return get<index>(lhs) >=
static_cast<alphabet_type
>(rhs);
800template <std::
size_t i, seqan3::detail::alphabet_tuple_like tuple_t>
801struct tuple_element<i, tuple_t>
814template <seqan3::detail::alphabet_tuple_like tuple_t>
Provides implementation detail for seqan3::alphabet_variant and seqan3::alphabet_tuple_base.
Core alphabet concept and free function/type trait wrappers.
Provides seqan3::alphabet_base.
Provides seqan3::alphabet_proxy.
A CRTP-base that makes defining a custom alphabet easier.
Definition: alphabet_base.hpp:57
constexpr rank_type to_rank() const noexcept
Return the letter's numeric value (rank in the alphabet).
Definition: alphabet_base.hpp:137
detail::min_viable_uint_t< size - 1 > rank_type
The type of the alphabet when represented as a number (e.g. via to_rank()).
Definition: alphabet_base.hpp:80
static constexpr detail::min_viable_uint_t< size > alphabet_size
The size of the alphabet, i.e. the number of different values it can take.
Definition: alphabet_base.hpp:199
constexpr derived_type & assign_rank(rank_type const c) noexcept
Assign from a numeric value.
Definition: alphabet_base.hpp:187
A CRTP-base that eases the definition of proxy types returned in place of regular alphabets.
Definition: alphabet_proxy.hpp:65
Specialisation of seqan3::alphabet_proxy that updates the rank of the alphabet_tuple_base.
Definition: alphabet_tuple_base.hpp:668
friend constexpr bool operator!=(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:733
~component_proxy()=default
Defaulted.
constexpr void on_update() noexcept
The implementation updates the rank in the parent object.
Definition: alphabet_tuple_base.hpp:679
constexpr component_proxy(component_proxy const &)=default
Defaulted.
friend constexpr bool operator<=(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:751
friend constexpr bool operator<=(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:757
constexpr component_proxy & operator=(component_proxy &&)=default
Defaulted.
constexpr component_proxy & operator=(component_proxy const &)=default
Defaulted.
friend constexpr bool operator<(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:739
friend constexpr bool operator>=(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:775
alphabet_tuple_base * parent
Store a pointer to the parent object so we can update it.
Definition: alphabet_tuple_base.hpp:676
friend constexpr bool operator==(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:715
friend constexpr bool operator<(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:745
constexpr component_proxy(alphabet_type const l, alphabet_tuple_base &p)
Construct from an alphabet letter and reference to the parent object.
Definition: alphabet_tuple_base.hpp:700
friend constexpr bool operator!=(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:727
friend constexpr bool operator>(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:769
friend constexpr bool operator==(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:721
friend constexpr bool operator>(derived_type const lhs, component_proxy const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:763
friend constexpr bool operator>=(component_proxy< alphabet_type, index > const lhs, derived_type const rhs) noexcept
Comparison against the alphabet tuple by casting self and tuple to the emulated type.
Definition: alphabet_tuple_base.hpp:781
friend base_t
Befriend the base type so it can call our seqan3::alphabet_tuple_base::component_proxy::on_update().
Definition: alphabet_tuple_base.hpp:673
constexpr component_proxy(component_proxy &&)=default
Defaulted.
component_proxy()=delete
Deleted, because using this proxy without parent would be undefined behaviour.
The CRTP base for a combined alphabet that contains multiple values of different alphabets at the sam...
Definition: alphabet_tuple_base.hpp:116
~alphabet_tuple_base()=default
Defaulted.
friend constexpr auto get(alphabet_tuple_base &l) noexcept
Tuple-like access to the contained components.
Definition: alphabet_tuple_base.hpp:348
friend constexpr type get(alphabet_tuple_base const &l) noexcept
Tuple-like access to the contained components.
Definition: alphabet_tuple_base.hpp:396
friend constexpr auto operator==(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_eq_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:446
constexpr rank_type to_component_rank() const noexcept
Return the rank of the i-th component.
Definition: alphabet_tuple_base.hpp:578
friend constexpr auto operator>=(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:552
friend constexpr auto operator<=(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:518
friend constexpr auto operator<(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:480
friend constexpr auto operator>(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:542
static constexpr bool seqan3_alphabet_tuple_like
Make specialisations of this template identifiable in metapgrogramming contexts.
Definition: alphabet_tuple_base.hpp:175
friend constexpr auto get(alphabet_tuple_base &l) noexcept
Tuple-like access to the contained components.
Definition: alphabet_tuple_base.hpp:367
list_traits::concat< component_list, detail::transformation_trait_or_t< detail::recursive_required_types< component_types >, seqan3::type_list<> >... > seqan3_recursive_required_types
Export this type's components and possibly the components' components in a visible manner.
Definition: alphabet_tuple_base.hpp:172
constexpr alphabet_tuple_base(alphabet_tuple_base const &)=default
Defaulted.
constexpr alphabet_tuple_base(indirect_component_type const alph) noexcept
Construction via a value of a subtype that is assignable to one of the components.
Definition: alphabet_tuple_base.hpp:227
constexpr alphabet_tuple_base(component_type const alph) noexcept
Construction via a value of one of the components.
Definition: alphabet_tuple_base.hpp:202
friend constexpr auto operator>(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:528
static constexpr rank_type rank_sum_helper(component_types... components, std::index_sequence< idx... > const &) noexcept
For the given components, compute the combined rank.
Definition: alphabet_tuple_base.hpp:626
constexpr alphabet_tuple_base(alphabet_tuple_base &&)=default
Defaulted.
static constexpr bool is_unique_component
Is set to true if the type is uniquely contained in the type list.
Definition: alphabet_tuple_base.hpp:132
constexpr alphabet_tuple_base() noexcept
Defaulted.
Definition: alphabet_tuple_base.hpp:141
seqan3::type_list< component_types... > component_list
A seqan3::type_list The types of each component in the composite.
Definition: alphabet_tuple_base.hpp:124
friend constexpr auto operator<(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:494
friend constexpr auto operator>=(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:566
friend constexpr auto operator!=(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_eq_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:456
constexpr alphabet_tuple_base(component_types... components) noexcept
Construction from initialiser-list.
Definition: alphabet_tuple_base.hpp:185
static constexpr std::array< rank_type, component_list::size()> cummulative_alph_sizes
The cumulative alphabet size products are cached.
Definition: alphabet_tuple_base.hpp:601
static constexpr bool is_component
Is set to true if the type is contained in the type list.
Definition: alphabet_tuple_base.hpp:128
constexpr void assign_component_rank(ptrdiff_t const r) noexcept
Assign via the rank of i-th component (does not update other components' state).
Definition: alphabet_tuple_base.hpp:593
friend constexpr auto operator!=(indirect_component_type const lhs, derived_type_t const rhs) noexcept -> std::enable_if_t< detail::tuple_eq_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:470
friend derived_type
Befriend the derived type so that it can instantiate.
Definition: alphabet_tuple_base.hpp:154
friend constexpr auto operator==(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_eq_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:432
constexpr alphabet_tuple_base & operator=(alphabet_tuple_base &&)=default
Defaulted.
friend constexpr auto operator<=(derived_type_t const lhs, indirect_component_type const rhs) noexcept -> std::enable_if_t< detail::tuple_order_guard< derived_type_t, derived_type, indirect_component_type, component_types... >, bool >
Comparison against types comparable with components.
Definition: alphabet_tuple_base.hpp:504
constexpr alphabet_tuple_base & operator=(alphabet_tuple_base const &)=default
Defaulted.
friend constexpr auto get(alphabet_tuple_base const &l) noexcept
Tuple-like access to the contained components.
Definition: alphabet_tuple_base.hpp:380
constexpr auto alphabet_size
A type trait that holds the size of a (semi-)alphabet.
Definition: concept.hpp:849
constexpr auto assign_rank_to
Assign a rank to an alphabet object.
Definition: concept.hpp:293
constexpr auto to_rank
Return the rank representation of a (semi-)alphabet object.
Definition: concept.hpp:155
decltype(detail::concat(lists_t{}...)) concat
Join two seqan3::type_list s into one.
Definition: traits.hpp:342
constexpr bool contains
Whether a type occurs in a type list or not.
Definition: traits.hpp:252
typename decltype(detail::at< idx >(list_t{}))::type at
Return the type at given index from the type list.
Definition: traits.hpp:279
constexpr ptrdiff_t count
Count the occurrences of a type in a pack.
Definition: traits.hpp:164
typename decltype(detail::at< idx, pack_t... >())::type at
Return the type at given index from the type pack.
Definition: traits.hpp:248
typename transformation_trait_or< type_t, default_t >::type transformation_trait_or_t
Helper type of seqan3::detail::transformation_trait_or (transformation_trait shortcut).
Definition: transformation_trait_or.hpp:51
Provides metaprogramming utilities for integer types.
Subconcept definition for seqan3::tuple_like to test for std::tuple_size-interface.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
constexpr bool tuple_general_guard
Prevents wrong instantiations of seqan3::alphabet_tuple_base's equality comparison operators.
Definition: alphabet_tuple_base.hpp:36
constexpr bool tuple_eq_guard
Prevents wrong instantiations of seqan3::alphabet_tuple_base's equality comparison operators.
Definition: alphabet_tuple_base.hpp:43
constexpr bool tuple_order_guard
Prevents wrong instantiations of seqan3::alphabet_tuple_base's ordered comparison operators.
Definition: alphabet_tuple_base.hpp:51
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
constexpr auto const & get(configuration< configs_t... > const &config) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:415
SeqAn specific customisations in the standard namespace.
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is ass...
Definition: detail.hpp:154
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the T is implic...
Definition: detail.hpp:142
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is wea...
Definition: detail.hpp:166
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is com...
Definition: detail.hpp:178
Type that contains multiple types.
Definition: type_list.hpp:29
static constexpr size_t size() noexcept
The number of types contained in the type list.
Definition: type_list.hpp:34
seqan3::list_traits::at< i, typename tuple_t::seqan3_required_types > type
Element type.
Definition: alphabet_tuple_base.hpp:804
Provides traits for seqan3::type_list.
Provides seqan3::type_list.
Provides algorithms for meta programming, parameter packs and seqan3::type_list.
Provides various traits for template packs.
Provides seqan3::tuple_like.