recursive_traits.h 763 B

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