Bladeren bron

refactor: add caching to joining_iterator

Sam Jaffe 2 jaren geleden
bovenliggende
commit
a325073efc
2 gewijzigde bestanden met toevoegingen van 10 en 1 verwijderingen
  1. 4 0
      include/iterator/detail/arrow_proxy.h
  2. 6 1
      include/iterator/join_iterator.hpp

+ 4 - 0
include/iterator/detail/arrow_proxy.h

@@ -19,6 +19,8 @@ template <typename Value> struct value_proxy {
   }
 
   operator Value &() const { return value; }
+  Value & get() const { return value; }
+
   Value value;
 };
 
@@ -27,7 +29,9 @@ template <typename Value> struct value_proxy<Value &> {
     this->value = &value;
     return *this;
   }
+
   operator Value &() const { return *value; }
+  Value & get() const { return *value; }
 
   Value * value;
 };

+ 6 - 1
include/iterator/join_iterator.hpp

@@ -10,6 +10,7 @@
 #include <iterator>
 #include <utility>
 
+#include <iterator/detail/arrow_proxy.h>
 #include <iterator/end_aware_iterator.hpp>
 #include <iterator/facade.h>
 #include <iterator/iterator_fwd.hpp>
@@ -70,10 +71,14 @@ private:
     while (!joiner_.at_end() && end_aware_iterator(*joiner_).at_end()) {
       ++joiner_;
     }
-    if (!joiner_.at_end()) { iterator_ = end_aware_iterator(*joiner_); }
+    if (!joiner_.at_end()) {
+      cache_ = *joiner_;
+      iterator_ = end_aware_iterator(cache_.get());
+    }
   }
 
   end_aware_iterator<join_iter> joiner_;
+  detail::value_proxy<decltype(*std::declval<join_iter>())> cache_;
   end_aware_iterator<iter_type> iterator_;
 };