recursive_iterator_traits.hpp 752 B

123456789101112131415161718192021222324252627
  1. #pragma once
  2. namespace iterator { namespace detail {
  3. struct terminal_layer_tag_t;
  4. struct continue_layer_tag_t;
  5. template <typename> struct void_t { using type = void; };
  6. template <typename IterType>
  7. using value_iterator = decltype(std::begin(*std::declval<IterType>()));
  8. template <typename IterType>
  9. using mapped_iterator =
  10. decltype(std::begin(std::declval<IterType>()->second));
  11. /**
  12. * @class next_layer_type
  13. * @breif A template metaprogramming type for unifying associative and
  14. * non-associative containers.
  15. */
  16. template <typename V, typename Tag> struct next_layer_type {
  17. using type = std::tuple<V>;
  18. };
  19. template <typename V> struct next_layer_type<V, continue_layer_tag_t> {
  20. using type = V;
  21. };
  22. }}