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>>;
68 #endif // SEQAN3_DEPRECATED_310
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>>;
92 #endif // SEQAN3_DEPRECATED_310
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>>;
116 #endif // SEQAN3_DEPRECATED_310
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>
140 #endif // SEQAN3_DEPRECATED_310
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>>;
164 #endif // SEQAN3_DEPRECATED_310
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>
188 #endif // SEQAN3_DEPRECATED_310
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;
271 template <
typename t1,
typename t2>
275 requires (range_dimension_v<t1> == range_dimension_v<t2>);