|
|
@@ -1,5 +1,6 @@
|
|
|
#pragma once
|
|
|
|
|
|
+#include "arrow_proxy.h"
|
|
|
#include "recursive_iterator_base.hpp"
|
|
|
#include "recursive_iterator_traits.hpp"
|
|
|
|
|
|
@@ -36,13 +37,13 @@ namespace iterator { namespace detail {
|
|
|
std::declval<next_value_type>()));
|
|
|
using reference = decltype(std::tuple_cat(
|
|
|
std::tie(std::declval<key_type>()), std::declval<next_reference>()));
|
|
|
- using pointer = void;
|
|
|
- using difference_type = typename super::difference_type;
|
|
|
+ using pointer = detail::arrow_proxy<reference>;
|
|
|
+ using difference_type = std::ptrdiff_t;
|
|
|
using iterator_category = std::forward_iterator_tag;
|
|
|
|
|
|
public:
|
|
|
flatten_iterator_layer() = default;
|
|
|
- flatten_iterator_layer(layer v) : flatten_iterator_layer() {
|
|
|
+ explicit flatten_iterator_layer(layer v) : flatten_iterator_layer() {
|
|
|
assign(v);
|
|
|
update();
|
|
|
}
|
|
|
@@ -61,7 +62,7 @@ namespace iterator { namespace detail {
|
|
|
* sub-aggregates of pair/tuple type. Similarly, forward_as_tuple means
|
|
|
* even a key-type of pair/tuple will not be unwrapped.
|
|
|
*/
|
|
|
- reference operator*() const {
|
|
|
+ decltype(auto) operator*() const {
|
|
|
return std::tuple_cat(std::forward_as_tuple(std::get<0>(layer::get())),
|
|
|
next_reference(super::get()));
|
|
|
}
|
|
|
@@ -70,14 +71,16 @@ namespace iterator { namespace detail {
|
|
|
* Unimplemented because we return an inline constructed type, and tuple
|
|
|
* can only be accessed through std::get anyway.
|
|
|
*/
|
|
|
- pointer operator->() const;
|
|
|
+ // auto operator->() const { return detail::arrow_proxy(**this); }
|
|
|
+ void operator->() const;
|
|
|
|
|
|
bool operator==(flatten_iterator_layer const & other) const {
|
|
|
- return layer::operator==(other) && super::operator==(other);
|
|
|
+ return (static_cast<layer const &>(*this) == other) &&
|
|
|
+ (static_cast<super const &>(*this) == other);
|
|
|
}
|
|
|
|
|
|
protected:
|
|
|
- reference get() const { return operator*(); }
|
|
|
+ decltype(auto) get() const { return **this; }
|
|
|
|
|
|
/**
|
|
|
* @copydoc recursive_iterator_layer::next
|
|
|
@@ -89,7 +92,7 @@ namespace iterator { namespace detail {
|
|
|
|
|
|
void update() {
|
|
|
layer & self = static_cast<layer &>(*this);
|
|
|
- while (super::done() && !(++self).done()) {
|
|
|
+ while (super::at_end() && !(++self).at_end()) {
|
|
|
super::assign(make_end_aware_iterator(self->second));
|
|
|
}
|
|
|
}
|
|
|
@@ -99,9 +102,9 @@ namespace iterator { namespace detail {
|
|
|
*/
|
|
|
void assign(layer v) {
|
|
|
static_cast<layer &>(*this) = v;
|
|
|
- if (!v.done()) { super::assign(make_end_aware_iterator(v->second)); }
|
|
|
+ if (!v.at_end()) { super::assign(make_end_aware_iterator(v->second)); }
|
|
|
}
|
|
|
|
|
|
- bool done() const { return layer::done(); }
|
|
|
+ using layer::at_end;
|
|
|
};
|
|
|
}}
|