SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
Type List

Provides seqan3::type_list and metaprogramming utilities for working on type lists. More...

+ Collaboration diagram for Type List:

Classes

struct  seqan3::type_list< types >
 Type that contains multiple types. More...
 

Type list traits (return a type list)

template<template< typename > typename trait_t, typename list_t >
using seqan3::list_traits::transform = decltype(detail::transform< trait_t >(list_t{}))
 Apply a transformation trait to every type in the list and return a seqan3::type_list of the results. More...
 
template<size_t count, typename t >
using seqan3::list_traits::repeat = decltype(detail::repeat< count, t >())
 Create a type list with the given type repeated count times.. More...
 
 seqan3::list_traits::list_t
 Apply a transformation trait to every type in the list and return a seqan3::type_list of the results. More...
 
template<typename... lists_t>
 seqan3::list_traits::requires (seqan3::detail::template_specialisation_of< lists_t, seqan3::type_list > &&...) using concat
 Join two seqan3::type_list s into one. More...
 
template<typename replace_t , std::ptrdiff_t i, typename list_t >
 seqan3::list_traits::requires (seqan3::detail::template_specialisation_of< list_t, seqan3::type_list >) &&(i >=0 &&i< size< list_t >) using replace_at
 Replace the type at the given index with the given type. More...
 

Type list traits (return a value)

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

Type list traits (return a single type)

template<ptrdiff_t idx, typename list_t >
 seqan3::list_traits::requires (seqan3::detail::template_specialisation_of< list_t, seqan3::type_list >) &&((idx >=0 &&idx< size< list_t >)||(-idx<
 Return the type at given index from the type list. More...
 
template<typename list_t >
 seqan3::list_traits::requires (seqan3::detail::template_specialisation_of< list_t, seqan3::type_list >) &&(size< list_t > > 0) using front = typename decltype(detail::back(list_t{}))::type
 Return the first type from the type list. More...
 

Detailed Description

Provides seqan3::type_list and metaprogramming utilities for working on type lists.

See also
Utility

All traits on type lists are defined in the header <seqan3/utility/type_list/traits.hpp>.

Typedef Documentation

◆ repeat

template<size_t count, typename t >
using seqan3::list_traits::repeat = typedef decltype(detail::repeat<count, t>())

Create a type list with the given type repeated count times..

Template Parameters
countThe number of repititions.
tThe type to repeat

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)

However, with a constant of 0.2, e.g. repeat<10,int> results in 2-3 instantiations.

◆ transform

template<template< typename > typename trait_t, typename list_t >
using seqan3::list_traits::transform = typedef decltype(detail::transform<trait_t>(list_t{}))

Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.

Template Parameters
trait_tThe trait to transform, must be an alias template, e.g. a transformation trait shortcut.
list_tThe (input) type list.

The transformation trait given as first argument must 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 input list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
#include <list>
#include <vector>
int main()
{
// Transform the types into reference types.
}
Provides various transformation traits used by the range module.
list_t
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: type_list/traits.hpp:412
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: type_list/traits.hpp:469
Type that contains multiple types.
Definition: type_list.hpp:29
Provides traits for seqan3::type_list.

Function Documentation

◆ requires() [1/4]

template<ptrdiff_t idx, typename list_t >
seqan3::list_traits::requires ( seqan3::detail::template_specialisation_of< list_t, seqan3::type_list ) &&
pure virtual
Initial value:
= size<list_t>)
using take = typename decltype(detail::split_after<i>(list_t{}))::first_type

Return the type at given index from the type list.

Replace the type at the given index with the given type.

Return the first type from the type list.

Split a seqan3::type_list into two parts returned as a pair of seqan3::type_list.

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

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

Return a seqan3::type_list of the types in the input type list, except the first n.

Return a seqan3::type_list of the first n types in the input type list.

Template Parameters
idxThe index; must be smaller than the size of the type list.
list_tThe type_list.

Negative indexes are supported (e.g. at<-1, type_list<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::list_traits::at<1, list_t>>);
// Look at the last element.
static_assert(std::same_as<double, seqan3::list_traits::at<-1, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::take<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::drop<2, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::take_last<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}
Template Parameters
iThe number of elements after which to split; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}

◆ requires() [2/4]

template<typename replace_t , std::ptrdiff_t i, typename list_t >
seqan3::list_traits::requires ( seqan3::detail::template_specialisation_of< list_t, seqan3::type_list ) &&
pure virtual

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.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Replace the second element with int.
static_assert(
std::same_as<seqan3::type_list<int, int, bool, double>, seqan3::list_traits::replace_at<int, 1, list_t>>);
}

Replace the type at the given index with the given type.

Return the first type from the type list.

Split a seqan3::type_list into two parts returned as a pair of seqan3::type_list.

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

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

Return a seqan3::type_list of the types in the input type list, except the first n.

Return a seqan3::type_list of the first n types in the input type list.

Template Parameters
idxThe index; must be smaller than the size of the type list.
list_tThe type_list.

Negative indexes are supported (e.g. at<-1, type_list<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::list_traits::at<1, list_t>>);
// Look at the last element.
static_assert(std::same_as<double, seqan3::list_traits::at<-1, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::take<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::drop<2, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::take_last<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}
Template Parameters
iThe number of elements after which to split; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}

◆ requires() [3/4]

template<typename list_t >
seqan3::list_traits::requires ( seqan3::detail::template_specialisation_of< list_t, seqan3::type_list ) && = typename decltype(detail::back(list_t{}))::type

Return the first type from the type list.

Return a seqan3::type_list of all the types in the type list, except the first.

Return the last type from the type list.

Template Parameters
list_tThe type list.

(Compile-time) Complexity

  • Number of template instantiations: O(1)
  • Other operations: O(1)
int main()
{
static_assert(std::same_as<int, seqan3::list_traits::front<list_t>>); // Check if the first value is int.
}
Template Parameters
list_tThe type list.

(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()
{
// Access the last value (float) with seqan3::list_traits::back
static_assert(std::same_as<float, seqan3::list_traits::back<list_t>>);
}
Template Parameters
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(1)
  • Other operations: O(1)
int main()
{
static_assert(std::same_as<seqan3::type_list<float, bool, int>, seqan3::list_traits::drop_front<list_t>>);
}

Return the first type from the type list.

Split a seqan3::type_list into two parts returned as a pair of seqan3::type_list.

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

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

Return a seqan3::type_list of the types in the input type list, except the first n.

Return a seqan3::type_list of the first n types in the input type list.

Template Parameters
idxThe index; must be smaller than the size of the type list.
list_tThe type_list.

Negative indexes are supported (e.g. at<-1, type_list<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::list_traits::at<1, list_t>>);
// Look at the last element.
static_assert(std::same_as<double, seqan3::list_traits::at<-1, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::take<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the first two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::drop<2, list_t>>);
}
Template Parameters
iThe target size; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Take the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<bool, int>, seqan3::list_traits::take_last<2, list_t>>);
}
Template Parameters
iThe amount to drop; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}
Template Parameters
iThe number of elements after which to split; must be >= 0 and <= the size of the input type list.
list_tThe (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)
int main()
{
// Drop the last two types in list_t.
static_assert(std::same_as<seqan3::type_list<int, float>, seqan3::list_traits::drop_last<2, list_t>>);
}

◆ requires() [4/4]

template<typename... lists_t>
seqan3::list_traits::requires ( seqan3::detail::template_specialisation_of< lists_t, seqan3::type_list > &&  ...)

Join two seqan3::type_list s into one.

Template Parameters
list1_tThe first (input) type list.
list2_tThe second (input) type list.

(Compile-time) Complexity

  • Number of template instantiations: O(n) in the number of type lists
  • Other operations: O(n) in the number of type lists

Complexity is independent of the number of types in each list.

int main()
{
using list_t3 = seqan3::type_list<int, int>;
static_assert(std::same_as<seqan3::list_traits::concat<list_t, list_t2, list_t3>,
}

Variable Documentation

◆ contains

template<typename query_t , typename list_t >
requires constexpr seqan3::detail::template_specialisation_of<list_t, seqan3::type_list> bool seqan3::list_traits::contains = (find<query_t, list_t> != -1)
inlineconstexpr

Whether a type occurs in a type list 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);
}
Provides various traits for template packs.
int main()
{
static_assert(seqan3::list_traits::contains<double, list_t> == false); // Is type double in type_list list_t?
static_assert(seqan3::list_traits::contains<float, list_t> == true); // Is type float in type_list list_t?
}

◆ count< query_t, type_list< pack_t... > >

template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::list_traits::count< query_t, type_list< pack_t... > > = seqan3::pack_traits::count<query_t, pack_t...>
inlineconstexpr

Count the occurrences of a type in a type list.

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);
}
int main()
{
// Count the number of type int in list_t.
static_assert(seqan3::list_traits::count<int, list_t> == 2);
}

◆ find< query_t, type_list< pack_t... > >

template<typename query_t , typename... pack_t>
constexpr ptrdiff_t seqan3::list_traits::find< query_t, type_list< pack_t... > >
inlineconstexpr
Initial value:
=
seqan3::pack_traits::detail::find<query_t, pack_t...>()
constexpr ptrdiff_t find
Get the index of the first occurrence of a type in a pack.
Definition: type_pack/traits.hpp:182

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

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);
}
int main()
{
// Double is not in list_t so find returns -1. However, bool is in the type list so find will return 2.
static_assert(seqan3::list_traits::find<double, list_t> == -1);
static_assert(seqan3::list_traits::find<bool, list_t> == 2);
}

◆ find_if< pred_t, type_list< pack_t... > >

template<template< typename > typename pred_t, typename... pack_t>
constexpr ptrdiff_t seqan3::list_traits::find_if< pred_t, type_list< pack_t... > >
inlineconstexpr
Initial value:
=
constexpr ptrdiff_t find_if
Get the index of the first type in a pack that satisfies the given predicate.
Definition: type_pack/traits.hpp:205

Get the index of the first type in a type list 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);
}
int main()
{
// None of the types in list_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::list_traits::find_if<std::is_pointer, list_t> == -1);
static_assert(seqan3::list_traits::find_if<std::is_integral, list_t> == 0);
}

◆ list_t

seqan3::list_traits::list_t

Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.

Template Parameters
trait_tThe trait to transform, must be an alias template, e.g. a transformation trait shortcut.
list_tThe (input) type list.

The transformation trait given as first argument must 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 input list.

(Compile-time) Complexity

  • Number of template instantiations: O(n)
  • Other operations: O(n)

◆ size< type_list< pack_t... > >

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

The size of a type list.

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);
}
int main()
{
static_assert(seqan3::list_traits::size<list_t> == 4);
}