// // 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 = RecursiveIterator(object); * for (ValuesIterator it = rit, end = {}; it != end; ++it) { * // Process only BigType, discarding all of the keys that we need to walk * } * \endcode */ template class ValuesIterator : 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 ValuesIterator(It) -> ValuesIterator; }