// // unkeyed_iterator.h // iterator // // Created by Sam Jaffe on 2/20/17. // #pragma once #include #include namespace iterator { /** * At first glance, this class seems like it acts as an iterator that would be * used in the C++ equivalent of Java's Map::values() function. However, * notices that we do not assume that the input iterator is a map iterator. * The useful feature of this iterator - and the source of its name - is its * ability to be composed with recursive_iterator. This means that you can * have something crazy like a four-level map and then do: * \code * std::map>> object; * auto const rit = make_recursive_iterator(object); * for (unkeyed_iterator it = rit, end = {}; it != end; ++it) { * // Process only BigType, discarding all of the keys that we need to walk * } * \endcode */ template class unkeyed_iterator : public proxy> { public: using proxy>::proxy; decltype(auto) dereference() const { using value_type = typename Iterator::value_type; constexpr auto index = std::tuple_size::value - 1; return std::get(*this->impl()); } }; template unkeyed_iterator(It) -> unkeyed_iterator; } MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::unkeyed_iterator);