17 #include <type_traits>
29 namespace seqan3::detail
34 SEQAN3_CONCEPT has_range_value_type = requires {
typename std::ranges::range_value_t<std::remove_cvref_t<t>>; };
39 template <
bool const_range,
typename range_t>
44 template <
bool const_range,
typename range_t>
45 using maybe_const_iterator_t = std::ranges::iterator_t<maybe_const_range_t<const_range, range_t>>;
49 template <
bool const_v,
typename range_t>
50 using maybe_const_sentinel_t = std::ranges::sentinel_t<maybe_const_range_t<const_v, range_t>>;
64 #ifdef SEQAN3_DEPRECATED_310
72 template <std::ranges::input_range rng_t>
74 requires (!std::input_or_output_iterator<rng_t>)
76 struct value_type<rng_t>
79 using type = value_type_t<std::ranges::iterator_t<rng_t>>;
88 #ifdef SEQAN3_DEPRECATED_310
96 template <std::ranges::input_range rng_t>
98 requires (!std::input_or_output_iterator<rng_t>)
100 struct reference<rng_t>
103 using type = reference_t<std::ranges::iterator_t<rng_t>>;
112 #ifdef SEQAN3_DEPRECATED_310
120 template <std::ranges::input_range rng_t>
122 requires (!std::input_or_output_iterator<rng_t>)
124 struct rvalue_reference<rng_t>
127 using type = rvalue_reference_t<std::ranges::iterator_t<rng_t>>;
136 #ifdef SEQAN3_DEPRECATED_310
144 template <std::ranges::input_range rng_t>
146 requires (!std::input_or_output_iterator<rng_t>)
148 struct const_reference<rng_t>
160 #ifdef SEQAN3_DEPRECATED_310
168 template <std::ranges::range rng_t>
170 requires (!std::input_or_output_iterator<rng_t>)
172 struct difference_type<rng_t>
175 using type = difference_type_t<std::ranges::iterator_t<rng_t>>;
184 #ifdef SEQAN3_DEPRECATED_310
192 template <std::ranges::sized_range rng_t>
194 requires (!std::input_or_output_iterator<rng_t>)
196 struct size_type<rng_t>
218 template <
typename t>
220 requires detail::has_range_value_type<t>
225 using type = std::ranges::range_value_t<std::remove_cvref_t<t>>;
229 template <
typename t>
230 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
239 template <
typename t>
256 template <
typename t>
258 requires detail::has_range_value_type<t>
263 template <
typename t>
264 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
265 constexpr
size_t range_dimension_v<t> = range_dimension_v<std::ranges::range_value_t<std::remove_cvref_t<t>>> + 1;
272 #ifdef SEQAN3_DEPRECATED_310
281 template <
typename t1,
typename t2>
282 SEQAN3_CONCEPT range_compatible_concept = requires (t1, t2)
284 requires (range_dimension_v<t1> == range_dimension_v<t2>);
290 template <
typename t1,
typename t2>
constexpr size_t range_dimension_v
Returns the number of times you can call seqan3::value_type_t recursively on t (type trait).
Definition: type_traits.hpp:260
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition: type_traits.hpp:240
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:150
Two types are "compatible" if their seqan3::range_dimension_v and their seqan3::range_innermost_value...
Provides various transformation traits for use on iterators.
Provides C++20 additions to the <iterator> header.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Adaptations of concepts from the Ranges TS.
Recursively determines the value_type on containers and/or iterators.
Definition: type_traits.hpp:223
std::ranges::range_value_t< std::remove_cvref_t< t > > type
The return type (recursion not shown).
Definition: type_traits.hpp:225
Provides various type traits on generic types.
Provides various transformation trait base templates and shortcuts.