| 1234567891011121314151617 |
- #pragma once
- #include <iterator/concepts.h>
- namespace iterator::recursive {
- // Type deduction guides for constructing recursive iterators.
- enum class recursion_type { END, THRU, ASSOC };
- // Helpers for condensing type deductions
- template <typename It> using value = decltype(std::begin(*std::declval<It>()));
- template <typename V> concept associative_value = std::is_const_v<typename V::first_type>;
- template <typename V> concept recursive_associative = associative_value<V> && Range<typename V::second_type>;
- template <typename V> constexpr auto typeclass = recursive_associative<V> ? recursion_type::ASSOC : (Range<V> ? recursion_type::THRU : recursion_type::END);
- template <typename It> constexpr auto iter_typeclass = typeclass<std::iter_value_t<It>>;
- }
|