recursive_traits.h 787 B

12345678910111213141516171819202122232425
  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>
  9. concept associative_value = std::is_const_v<typename V::first_type>;
  10. template <typename V>
  11. concept recursive_associative =
  12. associative_value<V> && Range<typename V::second_type>;
  13. template <typename V>
  14. constexpr auto typeclass =
  15. recursive_associative<V>
  16. ? recursion_type::ASSOC
  17. : (Range<V> ? recursion_type::THRU : recursion_type::END);
  18. template <typename It>
  19. constexpr auto iter_typeclass = typeclass<std::iter_value_t<It>>;
  20. }