#pragma once #include #include #include namespace iterator { namespace detail { struct terminal_layer_tag_t; struct continue_layer_tag_t; template struct void_t { using type = void; }; template using value_iterator = decltype(std::begin(*std::declval())); template using mapped_iterator = decltype(std::begin(std::declval()->second)); /** * @class next_layer_type * @breif A template metaprogramming type for unifying associative and * non-associative containers. */ template struct next_layer_type { using type = std::tuple; }; template struct next_layer_type { using type = V; }; template struct is_associative : std::false_type {}; template struct is_associative::value>> : std::true_type {}; template using is_associative_t = std::enable_if_t::value>; }}