| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- //
- // unkeyed_iterator.hpp
- // iterator
- //
- // Created by Sam Jaffe on 2/20/17.
- //
- #pragma once
- #include "proxy.h"
- 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<int, std::map<std::string, std::map<int, BigType>>> object;
- * auto const rit = make_recursive_iterator(object);
- * for (unkeyed_iterator<decltype(rit)> it = rit, end = {}; it != end; ++it) {
- * // Process only BigType, discarding all of the keys that we need to walk
- * }
- * \endcode
- */
- template <typename Iterator>
- class unkeyed_iterator : public proxy<Iterator, unkeyed_iterator<Iterator>> {
- public:
- using proxy<Iterator, unkeyed_iterator<Iterator>>::proxy;
- decltype(auto) dereference() const {
- using value_type = typename Iterator::value_type;
- constexpr auto index = std::tuple_size<value_type>::value - 1;
- return std::get<index>(*this->impl());
- }
- };
- template <typename It> unkeyed_iterator(It) -> unkeyed_iterator<It>;
- }
- MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::unkeyed_iterator);
|