15 #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>>; };
50 #ifdef SEQAN3_DEPRECATED_310
58 template <std::ranges::input_range rng_t>
60 requires (!std::input_or_output_iterator<rng_t>)
62 struct value_type<rng_t>
65 using type = value_type_t<std::ranges::iterator_t<rng_t>>;
74 #ifdef SEQAN3_DEPRECATED_310
82 template <std::ranges::input_range rng_t>
84 requires (!std::input_or_output_iterator<rng_t>)
86 struct reference<rng_t>
89 using type = reference_t<std::ranges::iterator_t<rng_t>>;
98 #ifdef SEQAN3_DEPRECATED_310
106 template <std::ranges::input_range rng_t>
108 requires (!std::input_or_output_iterator<rng_t>)
110 struct rvalue_reference<rng_t>
113 using type = rvalue_reference_t<std::ranges::iterator_t<rng_t>>;
122 #ifdef SEQAN3_DEPRECATED_310
130 template <std::ranges::input_range rng_t>
132 requires (!std::input_or_output_iterator<rng_t>)
134 struct const_reference<rng_t>
137 using type = std::iter_reference_t<std::ranges::iterator_t<rng_t const>>;
146 #ifdef SEQAN3_DEPRECATED_310
154 template <std::ranges::range rng_t>
156 requires (!std::input_or_output_iterator<rng_t>)
158 struct difference_type<rng_t>
161 using type = difference_type_t<std::ranges::iterator_t<rng_t>>;
170 #ifdef SEQAN3_DEPRECATED_310
178 template <std::ranges::sized_range rng_t>
180 requires (!std::input_or_output_iterator<rng_t>)
182 struct size_type<rng_t>
204 template <
typename t>
206 requires detail::has_range_value_type<t>
211 using type = std::ranges::range_value_t<std::remove_cvref_t<t>>;
215 template <
typename t>
216 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
225 template <
typename t>
242 template <
typename t>
244 requires detail::has_range_value_type<t>
249 template <
typename t>
250 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
251 constexpr
size_t range_dimension_v<t> = range_dimension_v<std::ranges::range_value_t<std::remove_cvref_t<t>>> + 1;
272 template <
typename t1,
typename t2>
275 requires (range_dimension_v<t1> == range_dimension_v<t2>);
Provides various type traits on generic types.
Provides various transformation traits for use on iterators.
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:116
constexpr size_t range_dimension_v
Returns the number of times you can call seqan3::value_type_t recursively on t (type trait).
Definition: range.hpp:246
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition: range.hpp:226
Two types are "compatible" if their seqan3::range_dimension_v and their seqan3::range_innermost_value...
Provides C++20 additions to the <iterator> header.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides various transformation trait base templates and shortcuts.
Adaptations of concepts from the Ranges TS.
Recursively determines the value_type on containers and/or iterators.
Definition: range.hpp:209
std::ranges::range_value_t< std::remove_cvref_t< t > > type
The return type (recursion not shown).
Definition: range.hpp:211