|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
|
|
#pragma once
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
+#include "facade.h"
|
|
|
#include <iterator>
|
|
#include <iterator>
|
|
|
|
|
|
|
|
namespace iterator {
|
|
namespace iterator {
|
|
@@ -25,57 +26,26 @@ namespace iterator {
|
|
|
* }
|
|
* }
|
|
|
* \endcode
|
|
* \endcode
|
|
|
*/
|
|
*/
|
|
|
- template <typename Iterator> class unkeyed_iterator {
|
|
|
|
|
|
|
+ template <typename Iterator>
|
|
|
|
|
+ class unkeyed_iterator : public facade<unkeyed_iterator<Iterator>> {
|
|
|
private:
|
|
private:
|
|
|
- using impl_value_type = typename std::iterator_traits<Iterator>::value_type;
|
|
|
|
|
- using impl_reference = typename std::iterator_traits<Iterator>::reference;
|
|
|
|
|
static constexpr std::size_t const value_index =
|
|
static constexpr std::size_t const value_index =
|
|
|
- std::tuple_size<impl_value_type>::value - 1;
|
|
|
|
|
|
|
+ std::tuple_size<typename Iterator::value_type>::value - 1;
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
- using value_type = typename std::remove_reference<decltype(
|
|
|
|
|
- std::get<value_index>(std::declval<impl_value_type>()))>::type;
|
|
|
|
|
- using reference =
|
|
|
|
|
- decltype(std::get<value_index>(std::declval<impl_reference>()));
|
|
|
|
|
- using pointer = value_type *;
|
|
|
|
|
- using difference_type =
|
|
|
|
|
- typename std::iterator_traits<Iterator>::difference_type;
|
|
|
|
|
- using iterator_category =
|
|
|
|
|
- typename std::iterator_traits<Iterator>::iterator_category;
|
|
|
|
|
-
|
|
|
|
|
unkeyed_iterator() = default;
|
|
unkeyed_iterator() = default;
|
|
|
unkeyed_iterator(Iterator it) : base(it) {}
|
|
unkeyed_iterator(Iterator it) : base(it) {}
|
|
|
|
|
|
|
|
- reference operator*() const { return std::get<value_index>(*base); }
|
|
|
|
|
- pointer operator->() const { return std::addressof(operator*()); }
|
|
|
|
|
- unkeyed_iterator & operator++() {
|
|
|
|
|
- ++base;
|
|
|
|
|
- return *this;
|
|
|
|
|
- }
|
|
|
|
|
- unkeyed_iterator operator++(int) {
|
|
|
|
|
- unkeyed_iterator tmp{*this};
|
|
|
|
|
- operator++();
|
|
|
|
|
- return tmp;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- unkeyed_iterator & operator--() {
|
|
|
|
|
- --base;
|
|
|
|
|
- return *this;
|
|
|
|
|
- }
|
|
|
|
|
- unkeyed_iterator operator--(int) {
|
|
|
|
|
- unkeyed_iterator tmp{*this};
|
|
|
|
|
- operator--();
|
|
|
|
|
- return tmp;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- bool operator==(unkeyed_iterator const & other) const {
|
|
|
|
|
|
|
+ decltype(auto) dereference() const { return std::get<value_index>(*base); }
|
|
|
|
|
+ void increment() { ++base; }
|
|
|
|
|
+ void decrement() { --base; }
|
|
|
|
|
+ bool equal_to(unkeyed_iterator const & other) const {
|
|
|
return base == other.base;
|
|
return base == other.base;
|
|
|
}
|
|
}
|
|
|
- bool operator!=(unkeyed_iterator const & other) const {
|
|
|
|
|
- return base != other.base;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
Iterator base;
|
|
Iterator base;
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::unkeyed_iterator)
|