|
|
@@ -8,9 +8,9 @@
|
|
|
#pragma once
|
|
|
|
|
|
#include <iterator>
|
|
|
+#include <memory>
|
|
|
#include <utility>
|
|
|
|
|
|
-#include <iterator/detail/arrow_proxy.h>
|
|
|
#include <iterator/end_aware_iterator.hpp>
|
|
|
#include <iterator/facade.h>
|
|
|
#include <iterator/iterator_fwd.hpp>
|
|
|
@@ -67,21 +67,6 @@ protected:
|
|
|
iterator(end_aware_iterator<Iter> join) : joiner_(join) {
|
|
|
update_iterator();
|
|
|
}
|
|
|
-
|
|
|
- iterator(iterator const &other) { *this = other; }
|
|
|
- iterator(iterator &&other) { *this = std::move(other); }
|
|
|
-
|
|
|
- iterator &operator=(iterator const &other) {
|
|
|
- joiner_ = other.joiner_;
|
|
|
- sync(std::distance(end_aware_iterator(cache_.get()), element_));
|
|
|
- return *this;
|
|
|
- }
|
|
|
-
|
|
|
- iterator &operator=(iterator &&other) {
|
|
|
- joiner_ = std::move(joiner_);
|
|
|
- sync(std::distance(end_aware_iterator(cache_.get()), element_));
|
|
|
- return *this;
|
|
|
- }
|
|
|
|
|
|
void update_iterator() {
|
|
|
while (!joiner_.at_end() && sync().at_end()) {
|
|
|
@@ -90,17 +75,16 @@ protected:
|
|
|
}
|
|
|
|
|
|
private:
|
|
|
- end_aware_iterator<iter<inner_t>> const & sync(size_t n = 0) {
|
|
|
+ end_aware_iterator<iter<inner_t>> const & sync() {
|
|
|
if (joiner_.at_end()) { return element_ = {}; }
|
|
|
- cache_ = *joiner_;
|
|
|
- element_ = end_aware_iterator(cache_.get());
|
|
|
- std::advance(element_, n);
|
|
|
+ cache_ = std::make_shared<inner_t>(*joiner_);
|
|
|
+ element_ = end_aware_iterator(*cache_);
|
|
|
return element_;
|
|
|
}
|
|
|
|
|
|
protected:
|
|
|
end_aware_iterator<Iter> joiner_;
|
|
|
- detail::value_proxy<decltype(*std::declval<Iter>())> cache_;
|
|
|
+ std::shared_ptr<inner_t> cache_;
|
|
|
end_aware_iterator<iter<inner_t>> element_;
|
|
|
};
|
|
|
}
|