SeqAn3 3.2.0
The Modern C++ library for sequence analysis.
Type Pack

Provides metaprogramming utilities for working on template parameter packs. More...

+ Collaboration diagram for Type Pack:

Type pack traits (return a single type)

template<ptrdiff_t idx, typename... pack_t>
using seqan3::pack_traits::at = typename decltype(detail::at< idx, pack_t... >())::type
 Return the type at given index from the type pack. More...
 
template<typename... pack_t>
using seqan3::pack_traits::front = typename decltype(detail::front< pack_t... >())::type
 Return the first type from the type pack. More...
 
template<typename... pack_t>
using seqan3::pack_traits::back = typename decltype((std::type_identity< pack_t >{},...))::type
 Return the last type from the type pack. More...
 

Type pack traits (return a type list)

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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 

Type pack traits (return a value)

template<typename... pack_t>
constexpr size_t seqan3::pack_traits::size = sizeof...(pack_t)
 The size of a type pack. More...
 
template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::count = (std::is_same_v<query_t, pack_t> + ... + 0)
 Count the occurrences of a type in a pack. More...
 
template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::find = seqan3::pack_traits::detail::find<query_t, pack_t...>()
 Get the index of the first occurrence of a type in a pack. More...
 
template<template< typename > typename pred_t, typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::find_if = seqan3::pack_traits::detail::find_if<pred_t, pack_t...>()
 Get the index of the first type in a pack that satisfies the given predicate. More...
 
template<typename query_t , typename... pack_t>
constexpr bool seqan3::pack_traits::contains = (find<query_t, pack_t...> != -1)
 Whether a type occurs in a pack or not. More...
 

Detailed Description

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>.

Typedef Documentation

◆ at

template<ptrdiff_t idx, typename... pack_t>
using seqan3::pack_traits::at = typedef typename decltype(detail::at<idx, pack_t...>())::type

Return the type at given index from the type pack.

Template Parameters
idxThe index; must be smaller than the size of the pack.
pack_tThe 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()
{
// Look at the 2nd element.
static_assert(std::same_as<float, seqan3::pack_traits::at<1, int, float, bool, double>>);
// Look at the last element.
static_assert(std::same_as<double, seqan3::pack_traits::at<-1, int, float, bool, double>>);
}
typename decltype(detail::at< idx, pack_t... >())::type at
Return the type at given index from the type pack.
Definition: traits.hpp:248
Provides various traits for template packs.

◆ back

template<typename... pack_t>
using seqan3::pack_traits::back = typedef typename decltype((std::type_identity<pack_t>{}, ...))::type

Return the last type from the type pack.

Template Parameters
pack_tThe type pack.

(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()
{
// Check if the last value is float.
static_assert(std::same_as<float, seqan3::pack_traits::back<int, float, bool, int, float>>);
}

◆ drop

template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::drop = typedef 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 Parameters
iThe amount to drop; must be >= 0 and <= the size of the type pack.
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the first two types in the pack.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::pack_traits::drop<2, float, double, bool, int>>);
}
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: traits.hpp:370

◆ drop_front

template<typename... pack_t>
using seqan3::pack_traits::drop_front = typedef 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 Parameters
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(1)
  • Other operations: O(1)
int main()
{
// Return the a type list of the pack without the first type.
static_assert(
std::same_as<seqan3::type_list<float, bool, int>, seqan3::pack_traits::drop_front<int, float, bool, int>>);
}
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: traits.hpp:308

◆ drop_last

template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::drop_last = typedef take<size<pack_t...> - i, pack_t...>

Return a seqan3::type_list of the types the type pack, except the last n.

Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the type pack.
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in the pack.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::pack_traits::take_last<2, int, float, bool, int>>);
}
drop< size< pack_t... > - i, pack_t... > take_last
Return a seqan3::type_list of the last n types in the type pack.
Definition: traits.hpp:388

◆ front

template<typename... pack_t>
using seqan3::pack_traits::front = typedef typename decltype(detail::front<pack_t...>())::type

Return the first type from the type pack.

Template Parameters
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(1)
  • Other operations: O(1)
int main()
{
// Check if the first value is int.
static_assert(std::same_as<int, seqan3::pack_traits::front<int, float, bool, int, float>>);
}

◆ replace_at

template<typename replace_t , std::ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::replace_at = typedef 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.

Template Parameters
replace_tThe type to replace the old type with.
iThe index of the type to be replaced.
pack_tThe (input) type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in the pack.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::pack_traits::take_last<2, int, float, bool, int>>);
}

◆ split_after

template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::split_after = typedef 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 Parameters
iThe number of elements after which to split; must be >= 0 and <= the size of the type pack.
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in the pack.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::pack_traits::take_last<2, int, float, bool, int>>);
}

◆ take

template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::take = typedef 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 Parameters
iThe target size; must be >= 0 and <= the size of the type pack.
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the first two types in the pack.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::pack_traits::take<2, int, float, bool, double>>);
}
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: traits.hpp:352

◆ take_last

template<ptrdiff_t i, typename... pack_t>
using seqan3::pack_traits::take_last = typedef drop<size<pack_t...> - i, pack_t...>

Return a seqan3::type_list of the last n types in the type pack.

Template Parameters
iThe target size; must be >= 0 and <= the size of the type pack.
pack_tThe type pack.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in the pack.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::pack_traits::take_last<2, int, float, bool, int>>);
}

◆ transform

template<template< typename > typename trait_t, typename... pack_t>
using seqan3::pack_traits::transform = typedef 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 Parameters
trait_tThe transformation trait, can be an alias template, e.g. a transformation trait shortcut.
pack_tThe 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)
#include <list>
#include <vector>
int main()
{
// Transform the types in the pack into reference types.
static_assert(std::same_as<
seqan3::pack_traits::
transform<std::ranges::range_reference_t, std::vector<int>, std::vector<float>, std::list<bool>>,
}
Provides various transformation traits used by the range module.
Type that contains multiple types.
Definition: type_list.hpp:29

Variable Documentation

◆ contains

template<typename query_t , typename... pack_t>
constexpr bool seqan3::pack_traits::contains = (find<query_t, pack_t...> != -1)
inlineconstexpr

Whether a type occurs in a pack or not.

Template Parameters
query_tThe type you are searching for.
pack_tThe 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()
{
// Double is not in the pack so find returns -1. However, bool is in the pack so find will return 2.
static_assert(seqan3::pack_traits::find<double, int, float, bool> == -1);
static_assert(seqan3::pack_traits::find<bool, int, float, bool> == 2);
}

◆ count

template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::count = (std::is_same_v<query_t, pack_t> + ... + 0)
inlineconstexpr

Count the occurrences of a type in a pack.

Template Parameters
query_tThe type you are searching for.
pack_tThe 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()
{
// Count the number of type int in the pack.
static_assert(seqan3::pack_traits::count<int, int, float, bool, int> == 2);
}

◆ find

template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::find = seqan3::pack_traits::detail::find<query_t, pack_t...>()
inlineconstexpr

Get the index of the first occurrence of a type in a pack.

Template Parameters
query_tThe type you are searching for.
pack_tThe 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()
{
// Double is not in the pack so find returns -1. However, bool is in the pack so find will return 2.
static_assert(seqan3::pack_traits::find<double, int, float, bool> == -1);
static_assert(seqan3::pack_traits::find<bool, int, float, bool> == 2);
}

◆ find_if

template<template< typename > typename pred_t, typename... pack_t>
constexpr ptrdiff_t seqan3::pack_traits::find_if = seqan3::pack_traits::detail::find_if<pred_t, pack_t...>()
inlineconstexpr

Get the index of the first type in a pack that satisfies the given predicate.

Template Parameters
pred_tThe predicate that is being evaluated (a class template).
pack_tThe 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()
{
// None of the types in t is a pointer so find_if returns -1. However, int and bool are both integral,
// so find_if returns 0 for the first occurrence.
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

template<typename... pack_t>
constexpr size_t seqan3::pack_traits::size = sizeof...(pack_t)
inlineconstexpr

The size of a type pack.

Template Parameters
pack_tThe type pack.
Returns
sizeof...(pack_t)

(Compile-time) Complexity

  • Number of template instantiations: O(1)
  • Other operations: O(1)
int main()
{
// Get the size of the pack.
static_assert(seqan3::pack_traits::size<int, float, bool, int> == 4);
}