Selaa lähdekoodia

refactor: update iterator version, fix regressions/breaks

Sam Jaffe 2 vuotta sitten
vanhempi
commit
5e2b0f829a

+ 1 - 1
external/iterator

@@ -1 +1 @@
-Subproject commit 4dda725401bc328b511f1e9a6ab13960e702cc30
+Subproject commit c51d6b7adc07573976bab75dbe0e098f804a9b45

+ 3 - 1
include/stream/iterator/any_iterator.h

@@ -14,7 +14,9 @@
 #include <stream/detail/adaptor.h>
 
 namespace stream::ranges {
-template <typename T> class any_iterator : public facade<any_iterator<T>> {
+template <typename T>
+class any_iterator
+    : public facade<any_iterator<T>, iterator::category::forward> {
 private:
   typename detail::adaptor<T>::dereference_t dereference_;
   typename detail::adaptor<T>::equal_to_t equal_to_;

+ 9 - 0
include/stream/iterator/common_iterator.h

@@ -11,6 +11,8 @@
 
 #include <stream/forward.h>
 
+#include <stream/detail/macro.h>
+
 namespace stream::ranges {
 template <typename It, typename S>
 class common_iterator : public proxy<It, common_iterator<It, S>> {
@@ -23,6 +25,11 @@ public:
   using super_t::super_t;
   common_iterator(S) : super_t() {}
 
+  SFINAE(super_t::category_enum == iterator::category::random_access)
+  auto distance_to(common_iterator const & other) const {
+    return (at_end() && other.at_end()) ? 0 : super_t::distance_to(other);
+  }
+
   bool equal_to(common_iterator const & other) const {
     return (at_end() && other.at_end()) || super_t::impl() == other.impl();
   }
@@ -31,3 +38,5 @@ public:
 }
 
 MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::common_iterator);
+
+#include <stream/detail/undef.h>

+ 2 - 1
include/stream/iterator/iota_iterator.h

@@ -14,7 +14,8 @@
 namespace stream::ranges {
 
 template <typename T, typename Bound>
-class iota_iterator : public facade<iota_iterator<T, Bound>> {
+class iota_iterator
+    : public facade<iota_iterator<T, Bound>, iterator::category::forward> {
 public:
   using sentinal_type = Bound;
 

+ 2 - 2
include/stream/view/common.h

@@ -29,9 +29,9 @@ public:
   auto begin() const { return iterator(stream_.begin()); }
   auto end() const { return iterator(stream_.end()); }
 
-  SFINAE(detail::has_empty_v<S>, bool) empty() const { return stream_.empty(); }
+  SFINAE(detail::has_empty_v<S>) bool empty() const { return stream_.empty(); }
 
-  SFINAE(detail::has_size_v<S>, bool) size() const { return stream_.size(); }
+  SFINAE(detail::has_size_v<S>) size_t size() const { return stream_.size(); }
 };
 
 template <typename S> common_view(S &&) -> common_view<S>;

+ 1 - 1
include/stream/view/iota.h

@@ -35,7 +35,7 @@ public:
   }
 
   bool empty() const { return begin().at_end(); }
-  SFINAE(has_size_v, size_t) size() const { return begin().distance_to(end()); }
+  SFINAE(has_size_v) size_t size() const { return begin().distance_to(end()); }
 };
 }
 

+ 1 - 1
include/stream/view/join.h

@@ -18,7 +18,7 @@ public:
 
   auto begin() const { return iterator::joining_iterator(stream_); }
   auto end() const { return iterator::sentinel; }
-  SFINAE(detail::has_empty_v<S>, bool) empty() const { return stream_.empty(); }
+  SFINAE(detail::has_empty_v<S>) bool empty() const { return stream_.empty(); }
 };
 
 template <typename S> join_view(S &&) -> join_view<S>;

+ 1 - 3
include/stream/view/subrange.h

@@ -2,8 +2,6 @@
 
 #include <iterator>
 
-#include <iterator/detail/facade_traits.h>
-
 #include <stream/forward.h>
 
 #include <stream/detail/traits.h>
@@ -29,7 +27,7 @@ public:
   auto begin() const { return begin_; }
   auto end() const { return end_; }
   bool empty() const { return begin_ == end_; }
-  SFINAE(detail::has_distance_to_v<It>, size_t) size() const {
+  SFINAE((detail::is_sized_sentinel_v<It, S>)) size_t size() const {
     return end_ - begin_;
   }
 };

+ 2 - 2
include/stream/view/transform.h

@@ -30,9 +30,9 @@ public:
     }
   }
 
-  SFINAE(detail::has_empty_v<S>, bool) empty() const { return stream_.empty(); }
+  SFINAE(detail::has_empty_v<S>) bool empty() const { return stream_.empty(); }
 
-  SFINAE(detail::has_size_v<S>, size_t) size() { return stream_.size(); }
+  SFINAE(detail::has_size_v<S>) size_t size() { return stream_.size(); }
 
 private:
   auto invoke() const {

+ 0 - 6
stream.xcodeproj/project.pbxproj

@@ -622,7 +622,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_WEAK = YES;
@@ -633,7 +632,6 @@
 				CODE_SIGN_STYLE = Automatic;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				EXECUTABLE_PREFIX = lib;
-				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
@@ -656,7 +654,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_WEAK = YES;
@@ -669,7 +666,6 @@
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
 				EXECUTABLE_PREFIX = lib;
-				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				MACOSX_DEPLOYMENT_TARGET = 12.0;
@@ -697,7 +693,6 @@
 				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				DEBUG_INFORMATION_FORMAT = dwarf;
-				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = (
@@ -735,7 +730,6 @@
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				ENABLE_NS_ASSERTIONS = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu11;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				INFOPLIST_FILE = "stream-test/Info.plist";