Procházet zdrojové kódy

refactor: take ownership of sentinel_iterator => common_iterator

Sam Jaffe před 2 roky
rodič
revize
3b54624e64
3 změnil soubory, kde provedl 25 přidání a 6 odebrání
  1. 1 1
      external/iterator
  2. 2 2
      include/stream/any_view.h
  3. 22 3
      include/stream/common_view.h

+ 1 - 1
external/iterator

@@ -1 +1 @@
-Subproject commit 5ee7b843d7add9743cf6f4f551ca3045f51b0c26
+Subproject commit 5ee6fea85eeab110cd4341edc6adc7b88f1d4eab

+ 2 - 2
include/stream/any_view.h

@@ -9,7 +9,7 @@
 
 #include <memory>
 
-#include <iterator/sentinel_iterator.h>
+#include <stream/common_view.h>
 #include <stream/detail/traits.h>
 #include <stream/forward.h>
 
@@ -44,7 +44,7 @@ template <typename T> class any_view {
 private:
   template <typename S>
   using sentinel_iterator =
-      iterator::sentinel_iterator<detail::begin_t<S>, detail::end_t<S>>;
+      common_iterator<detail::begin_t<S>, detail::end_t<S>>;
   template <typename S, typename It>
   using iter_cast_t =
       std::conditional_t<detail::is_sentinal_v<S>, sentinel_iterator<S>, It>;

+ 22 - 3
include/stream/common_view.h

@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include <iterator/sentinel_iterator.h>
+#include <iterator/proxy.h>
 #include <stream/detail/traits.h>
 #include <stream/forward.h>
 
@@ -16,10 +16,27 @@
 #define FWD(x) std::forward<decltype(x)>(x)
 
 namespace stream::ranges {
+
+template <typename It, typename S>
+class common_iterator : public proxy<It, common_iterator<It, S>> {
+public:
+  static_assert(!std::is_same_v<It, S>, "cannot operator on common types");
+  using super_t = proxy<It, common_iterator<It, S>>;
+  using sentinel_type = common_iterator;
+
+public:
+  using super_t::super_t;
+  common_iterator(S) : super_t() {}
+
+  bool equal_to(common_iterator const & other) const {
+    return (at_end() && other.at_end()) || super_t::impl() == other.impl();
+  }
+  bool at_end() const { return super_t::impl() == S(); }
+};
+
 template <typename S> class common_view {
 private:
-  using iterator =
-      iterator::sentinel_iterator<detail::begin_t<S>, detail::end_t<S>>;
+  using iterator = common_iterator<detail::begin_t<S>, detail::end_t<S>>;
 
 private:
   S stream_;
@@ -50,5 +67,7 @@ struct common {
 };
 }
 
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::common_iterator);
+
 #undef FWD
 #include <iterator/detail/undef.h>