21namespace seqan3::detail
30template <
typename tuple_t>
31concept tuple_size =
requires (tuple_t v) {
32 { std::tuple_size<tuple_t>::value } -> std::convertible_to<size_t>;
42template <
typename tuple_t>
43concept tuple_get =
requires (tuple_t & v, tuple_t
const & v_c) {
46 typename std::tuple_element<0, tuple_t>::type;
48 {
get<0>(v) } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
53 {
get<0>(v_c) } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
54 {
get<0>(std::move(v)) } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
55 {
get<0>(std::move(v_c)) } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type
const &&>;
66template <detail::tuple_size tuple_t>
71 template <
size_t... Is>
72 static constexpr auto invoke_to_type_list(std::index_sequence<Is...>)
74 return type_list<std::tuple_element_t<Is, tuple_t>...>{};
79 using type =
decltype(invoke_to_type_list(std::make_index_sequence<std::tuple_size<tuple_t>::value>{}));
87template <detail::tuple_size tuple_t>
88using tuple_type_list_t =
typename tuple_type_list<tuple_t>::type;
93template <
typename... elements_t>
94inline constexpr auto all_elements_model_totally_ordered(seqan3::type_list<elements_t...>)
95 -> std::bool_constant<(std::totally_ordered<elements_t> && ... &&
true)>;
101template <
typename tuple_t>
102 requires requires () {
103 { detail::all_elements_model_totally_ordered(tuple_type_list_t<tuple_t>{}) };
105static constexpr bool all_elements_model_totally_ordered_v =
106 decltype(detail::all_elements_model_totally_ordered(tuple_type_list_t<tuple_t>{}))::value;
166concept tuple_like = detail::tuple_size<std::remove_reference_t<t>> &&
requires (t v) {
167 typename detail::tuple_type_list<std::remove_cvref_t<t>>::type;
173 requires (std::tuple_size<std::remove_reference_t<t>>::value == 0)
174 || (detail::tuple_get<std::remove_cvref_t<t>>
175 && (!detail::all_elements_model_totally_ordered_v<std::remove_cvref_t<t>>
176 || std::totally_ordered<std::remove_cvref_t<t>>));
Provides various type traits on generic types.
Whether a type behaves like a tuple with exactly two elements.
Whether a type behaves like a tuple.
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
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:412
Provides seqan3::pod_tuple.
Provides type traits for working with templates.
Provides seqan3::type_list.