17 #include <type_traits>
22 #ifdef SEQAN3_DEPRECATED_310
31 namespace seqan3::detail
36 SEQAN3_CONCEPT has_range_value_type = requires {
typename std::ranges::range_value_t<std::remove_cvref_t<t>>; };
41 template <
bool const_range,
typename range_t>
46 template <
bool const_range,
typename range_t>
47 using maybe_const_iterator_t = std::ranges::iterator_t<maybe_const_range_t<const_range, range_t>>;
51 template <
bool const_v,
typename range_t>
52 using maybe_const_sentinel_t = std::ranges::sentinel_t<maybe_const_range_t<const_v, range_t>>;
66 #ifdef SEQAN3_DEPRECATED_310
74 template <std::ranges::input_range rng_t>
76 requires (!std::input_or_output_iterator<rng_t>)
78 struct value_type<rng_t>
81 using type = value_type_t<std::ranges::iterator_t<rng_t>>;
90 #ifdef SEQAN3_DEPRECATED_310
98 template <std::ranges::input_range rng_t>
100 requires (!std::input_or_output_iterator<rng_t>)
102 struct reference<rng_t>
105 using type = reference_t<std::ranges::iterator_t<rng_t>>;
114 #ifdef SEQAN3_DEPRECATED_310
122 template <std::ranges::input_range rng_t>
124 requires (!std::input_or_output_iterator<rng_t>)
126 struct rvalue_reference<rng_t>
129 using type = rvalue_reference_t<std::ranges::iterator_t<rng_t>>;
138 #ifdef SEQAN3_DEPRECATED_310
146 template <std::ranges::input_range rng_t>
148 requires (!std::input_or_output_iterator<rng_t>)
150 struct const_reference<rng_t>
162 #ifdef SEQAN3_DEPRECATED_310
170 template <std::ranges::range rng_t>
172 requires (!std::input_or_output_iterator<rng_t>)
174 struct difference_type<rng_t>
177 using type = difference_type_t<std::ranges::iterator_t<rng_t>>;
186 #ifdef SEQAN3_DEPRECATED_310
194 template <std::ranges::sized_range rng_t>
196 requires (!std::input_or_output_iterator<rng_t>)
198 struct size_type<rng_t>
220 template <
typename t>
222 requires detail::has_range_value_type<t>
227 using type = std::ranges::range_value_t<std::remove_cvref_t<t>>;
231 template <
typename t>
232 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
241 template <
typename t>
258 template <
typename t>
260 requires detail::has_range_value_type<t>
265 template <
typename t>
266 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
267 constexpr
size_t range_dimension_v<t> = range_dimension_v<std::ranges::range_value_t<std::remove_cvref_t<t>>> + 1;
274 #ifdef SEQAN3_DEPRECATED_310
283 template <
typename t1,
typename t2>
284 SEQAN3_CONCEPT range_compatible_concept = requires (t1, t2)
286 requires (range_dimension_v<t1> == range_dimension_v<t2>);
292 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:262
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition: type_traits.hpp:242
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
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:225
std::ranges::range_value_t< std::remove_cvref_t< t > > type
The return type (recursion not shown).
Definition: type_traits.hpp:227
Provides various type traits on generic types.
Provides various transformation trait base templates and shortcuts.