16 #include <type_traits>
24 namespace seqan3::detail
32 template <
typename tuple_t>
34 SEQAN3_CONCEPT tuple_size = requires (tuple_t v)
45 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);
77 template <
typename state_t,
typename element_t>
78 struct models_strict_totally_ordered
93 template <detail::tuple_size tuple_t>
94 struct tuple_type_list
99 template <
size_t ... Is>
102 return type_list<std::tuple_element_t<Is, tuple_t>...>{};
115 template <detail::tuple_size tuple_t>
116 using tuple_type_list_t =
typename tuple_type_list<tuple_t>::type;
173 template <
typename t>
176 SEQAN3_CONCEPT
tuple_like = detail::tuple_size<std::remove_reference_t<t>> && requires(t v)
178 typename detail::tuple_type_list<std::remove_cvref_t<t>>::type;
185 (detail::tuple_get<std::remove_cvref_t<t>> &&
186 (!meta::fold<detail::tuple_type_list_t<std::remove_cvref_t<t>>,
188 meta::quote_trait<detail::models_strict_totally_ordered>>::value ||
189 std::totally_ordered<std::remove_cvref_t<t>>));
203 template <
typename t>