Provides metaprogramming utilities for working on template parameter packs.
More...
template<ptrdiff_t idx, typename head_t , typename... tail_t>
auto seqan3::pack_traits::detail::at ()
Implementation for seqan3::pack_traits::at .
template<typename head_t , typename... tail_t>
type_list < tail_t... > seqan3::pack_traits::detail::drop_front ()
Implementation for seqan3::pack_traits::drop_front .
template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::detail::find ()
Implementation for seqan3::pack_traits::find .
template<template < typename > typename pred_t, typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::detail::find_if ()
Implementation for seqan3::pack_traits::find_if .
template<typename head_t , typename... tail_t>
std::type_identity < head_t > seqan3::pack_traits::detail::front ()
Implementation for seqan3::pack_traits::front .
template<typename replace_t , ptrdiff_t idx, typename... pack_t, size_t... i>
auto seqan3::pack_traits::detail::replace_at (std::index_sequence < i... >) -> type_list < std::conditional_t < i ==idx , replace_t , pack_t >... >
Implementation for seqan3::pack_traits::replace_at .
template<ptrdiff_t idx, typename head_t , typename... pack2_t, typename... pack1_t>
auto seqan3::pack_traits::detail::split_after (type_list < pack1_t... >)
Implementation for seqan3::pack_traits::split_after .
template<typename... pack_t>
using seqan3::pack_traits::drop_front = typename decltype (detail::drop_front< pack_t... >())::type
Return a seqan3::type_list of all the types in the type pack, except the first.
template<template < typename > typename trait_t, typename... pack_t>
using seqan3::pack_traits::transform = seqan3::type_list < trait_t < pack_t >... >
Apply a transformation trait to every type in the pack and return a seqan3::type_list of the results.
template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::take = typename decltype (detail::split_after < i , pack_t... >(type_list <>{}))::first_type
Return a seqan3::type_list of the first n
types in the type pack.
template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::drop = typename decltype (detail::split_after < i , pack_t... >(type_list <>{}))::second_type
Return a seqan3::type_list of the types in the type pack, except the first n
.
template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::take_last = drop < size < pack_t... > - i , pack_t... >
Return a seqan3::type_list of the last n
types in the type pack.
template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::drop_last = take < size < pack_t... > - i , pack_t... >
Return a seqan3::type_list of the types the type pack, except the last n
.
template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::split_after = decltype (detail::split_after< i , pack_t... >(type_list <>{}))
Split a type pack into two parts returned as a pair of seqan3::type_list .
template<typename replace_t , std::ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::replace_at = decltype (detail::replace_at< replace_t , i , pack_t... >(std::make_index_sequence < size < pack_t... > >{}))
Replace the type at the given index with the given type.
Provides metaprogramming utilities for working on template parameter packs.
See also Utility
This module contains auxiliary functions, algorithms and traits on template parameter packs . All traits on a template parameter pack are defined in the header <seqan3/utility/type_pack/traits.hpp >
.
◆ at [no-api]
Return the type at given index from the type pack.
Template Parameters
idx The index; must be smaller than the size of the pack.
pack_t The type pack.
Negative indexes are supported (e.g. at<-1, int, double, bool &>
is bool &
).
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
int main()
{
static_assert (std::same_as<float, seqan3::pack_traits::at<1, int, float, bool, double>>);
}
A "pretty printer" for most SeqAn data structures and related types.
Definition debug_stream_type.hpp:79
typename decltype(detail::at< idx, pack_t... >())::type at
Return the type at given index from the type pack.
Definition type_pack/traits.hpp:245
Provides various traits for template packs.
◆ back [no-api]
Return the last type from the type pack.
Template Parameters
(Compile-time) Complexity
Number of template instantiations: O(n) (possibly O(1))
Other operations: O(1)
Notably faster than seqan3::pack_traits::at <size<pack...> - 1, pack...>
(no recursive template instantiations).
int main()
{
static_assert (std::same_as<float, seqan3::pack_traits::back<int, float, bool, int, float>>);
}
◆ drop [no-api]
Return a seqan3::type_list of the types in the type pack, except the first n
.
Template Parameters
i The amount to drop; must be >= 0 and <= the size of the type pack.
pack_t The type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
int main()
{
}
typename decltype(detail::split_after< i, pack_t... >(type_list<>{}))::second_type drop
Return a seqan3::type_list of the types in the type pack, except the first n.
Definition type_pack/traits.hpp:367
◆ drop_front [no-api]
Return a seqan3::type_list of all the types in the type pack, except the first.
Template Parameters
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(1)
int main()
{
static_assert (
}
typename decltype(detail::drop_front< pack_t... >())::type drop_front
Return a seqan3::type_list of all the types in the type pack, except the first.
Definition type_pack/traits.hpp:305
◆ drop_last [no-api]
Return a seqan3::type_list of the types the type pack, except the last n
.
Template Parameters
i The amount to drop; must be >= 0 and <= the size of the type pack.
pack_t The type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
◆ front [no-api]
Return the first type from the type pack.
Template Parameters
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(1)
int main()
{
static_assert (std::same_as<int, seqan3::pack_traits::front<int, float, bool, int, float>>);
}
◆ replace_at [no-api]
Replace the type at the given index with the given type.
Template Parameters
replace_t The type to replace the old type with.
i The index of the type to be replaced.
pack_t The (input) type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
◆ split_after [no-api]
Split a type pack into two parts returned as a pair of seqan3::type_list .
Template Parameters
i The number of elements after which to split; must be >= 0 and <= the size of the type pack.
pack_t The type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
◆ take [no-api]
Return a seqan3::type_list of the first n
types in the type pack.
Template Parameters
i The target size; must be >= 0 and <= the size of the type pack.
pack_t The type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
int main()
{
}
typename decltype(detail::split_after< i, pack_t... >(type_list<>{}))::first_type take
Return a seqan3::type_list of the first n types in the type pack.
Definition type_pack/traits.hpp:349
◆ take_last [no-api]
Return a seqan3::type_list of the last n
types in the type pack.
Template Parameters
i The target size; must be >= 0 and <= the size of the type pack.
pack_t The type pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(n)
◆ transform [no-api]
Apply a transformation trait to every type in the pack and return a seqan3::type_list of the results.
Template Parameters
trait_t The transformation trait, can be an alias template , e.g. a transformation trait shortcut.
pack_t The type pack.
The transformation trait given as first argument can be an alias template, e.g. std::type_identity_t , not std::type_identity . The alias must take exactly one argument and be defined for all types in the pack.
(Compile-time) Complexity
Number of template instantiations: O(n)
Other operations: O(1)
int main()
{
static_assert (std::same_as<
seqan3::pack_traits::
}
Provides various transformation traits used by the range module.
◆ at() [no-api]
auto seqan3::pack_traits::detail::at
(
)
no-api
Implementation for seqan3::pack_traits::at .
Template Parameters
idx The index.
head_t Currently viewed pack_t element.
tail_t Rest of the type pack.
◆ drop_front() [no-api]
type_list < tail_t... > seqan3::pack_traits::detail::drop_front
(
)
no-api
◆ find() [no-api]
constexpr ptrdiff_t seqan3::pack_traits::detail::find
(
)
no-api constexpr
Implementation for seqan3::pack_traits::find .
Template Parameters
query_t The type you are searching for.
pack_t The type pack.
Returns The position of the first occurrence of query_t
in pack_t
or -1
if it is not contained.
◆ find_if() [no-api]
constexpr ptrdiff_t seqan3::pack_traits::detail::find_if
(
)
no-api constexpr
Implementation for seqan3::pack_traits::find_if .
Template Parameters
pred_t The predicate that is being evaluated.
pack_t The type pack.
Returns The position of the first type t
in pack_t
for whom pred_t<t>::value
is true.
◆ front() [no-api]
Implementation for seqan3::pack_traits::front .
Template Parameters
head_t Currently viewed pack_t element.
tail_t Rest of the type pack.
◆ replace_at() [no-api]
Implementation for seqan3::pack_traits::replace_at .
Template Parameters
replace_t The type replacing the old one.
idx The index of the type to replace.
pack_t The type pack to be modified.
i The indicies of the index sequence associated with the type pack.
◆ split_after() [no-api]
auto seqan3::pack_traits::detail::split_after
(
type_list < pack1_t... >
)
no-api
Implementation for seqan3::pack_traits::split_after .
Template Parameters
idx The index to split the type pack at.
pack1_t The type pack before the split index.
head_t The next type that is moved before split index.
pack2_t The type pack after the split index.
◆ contains [no-api]
Whether a type occurs in a pack or not.
Template Parameters
query_t The type you are searching for.
pack_t The type pack.
Returns true
or false
.
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(n), possibly == i
, where i
is the index of the first occurrence
int main()
{
static_assert (seqan3::pack_traits::find<double, int, float, bool> == -1);
static_assert (seqan3::pack_traits::find<bool, int, float, bool> == 2);
}
◆ count [no-api]
Count the occurrences of a type in a pack.
Template Parameters
query_t The type you are searching for.
pack_t The type pack.
Returns The number of occurrences of the query_t
in pack_t
.
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(n)
int main()
{
static_assert (seqan3::pack_traits::count<int, int, float, bool, int> == 2);
}
◆ find [no-api]
constexpr ptrdiff_t seqan3::pack_traits::find = seqan3::pack_traits::detail::find<query_t , pack_t...>()
no-api inline constexpr
Get the index of the first occurrence of a type in a pack.
Template Parameters
query_t The type you are searching for.
pack_t The type pack.
Returns The position of the first occurrence of query_t
in pack_t
or -1
if it is not contained.
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(n), possibly == i
, where i
is the return value
int main()
{
static_assert (seqan3::pack_traits::find<double, int, float, bool> == -1);
static_assert (seqan3::pack_traits::find<bool, int, float, bool> == 2);
}
◆ find_if [no-api]
constexpr ptrdiff_t seqan3::pack_traits::find_if = seqan3::pack_traits::detail::find_if<pred_t , pack_t...>()
no-api inline constexpr
Get the index of the first type in a pack that satisfies the given predicate.
Template Parameters
pred_t The predicate that is being evaluated (a class template).
pack_t The type pack.
Returns The index or -1
if no types match.
Note that the predicate must be given as a type template (variable templates cannot be passed as template arguments unfortunately). This means e.g. find_if<std::is_integral , float, double, int, float>
(not std::is_integral_v
!).
(Compile-time) Complexity
Number of template instantiations: O(n), possibly == i
, where i
is the return value
Other operations: O(n), possibly == i
, where i
is the return value
Only the predicate is instantiated.
int main()
{
static_assert (seqan3::pack_traits::find_if<std::is_pointer, int, float, double> == -1);
static_assert (seqan3::pack_traits::find_if<std::is_integral, int, float, double> == 0);
}
◆ size [no-api]
template<typename... pack_t>
The size of a type pack.
Template Parameters
Returns sizeof...(pack_t)
(Compile-time) Complexity
Number of template instantiations: O(1)
Other operations: O(1)
int main()
{
static_assert (seqan3::pack_traits::size<int, float, bool, int> == 4);
}