17 #include <type_traits>
24 namespace seqan3::detail
33 template <
typename tuple_t>
34 SEQAN3_CONCEPT tuple_size = requires (tuple_t v)
46 template <
typename tuple_t>
47 SEQAN3_CONCEPT tuple_get = requires (tuple_t & v, tuple_t
const & v_c)
49 requires std::tuple_size_v<tuple_t> > 0;
51 typename std::tuple_element<0, tuple_t>::type;
60 std::convertible_to,
typename std::tuple_element<0, tuple_t>::type);
75 template <detail::tuple_size tuple_t>
76 struct tuple_type_list
81 template <
size_t ... Is>
84 return type_list<std::tuple_element_t<Is, tuple_t>...>{};
97 template <detail::tuple_size tuple_t>
98 using tuple_type_list_t =
typename tuple_type_list<tuple_t>::type;
103 template <
typename ...elements_t>
111 template <
typename tuple_t>
115 { detail::all_elements_model_totally_ordered(tuple_type_list_t<tuple_t>{}) };
118 static constexpr
bool all_elements_model_totally_ordered_v =
119 decltype(detail::all_elements_model_totally_ordered(tuple_type_list_t<tuple_t>{}))::value;
178 template <
typename t>
179 SEQAN3_CONCEPT
tuple_like = detail::tuple_size<std::remove_reference_t<t>> && requires(t v)
181 typename detail::tuple_type_list<std::remove_cvref_t<t>>::type;
188 (detail::tuple_get<std::remove_cvref_t<t>> &&
189 (!detail::all_elements_model_totally_ordered_v<std::remove_cvref_t<t>> ||
190 std::totally_ordered<std::remove_cvref_t<t>>));
205 template <
typename t>
Provides type traits for working with templates.
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
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:29
Type that contains multiple types.
Definition: type_list.hpp:29
Provides seqan3::pod_tuple.
Provides seqan3::type_list.
Provides various type traits on generic types.