Browse Source

refactor: make sentinel use fewer dependent types to fix compiler weirdness

Sam Jaffe 2 years ago
parent
commit
be1b61e465

+ 2 - 2
include/iterator/end_aware_iterator.hpp

@@ -10,6 +10,7 @@
 #include <iterator/detail/traits.h>
 #include <iterator/facade.h>
 #include <iterator/iterator_fwd.hpp>
+#include <iterator/sentinel.h>
 
 namespace iterator {
 /**
@@ -21,8 +22,7 @@ namespace iterator {
 template <typename It>
 class end_aware_iterator : public facade<end_aware_iterator<It>> {
 public:
-  struct sentinal_type {};
-  static constexpr sentinal_type sentinal;
+  using sentinel_type = sentinel_t;
 
 public:
   end_aware_iterator() = default;

+ 0 - 24
include/iterator/facade.h

@@ -46,17 +46,7 @@ struct distance_to<T, std::enable_if_t<has_distance_to<T>{}>> {
   using type = decltype(_val(T).distance_to(_val(T)));
 };
 
-template <typename, typename = void> struct sentinal_type {
-  using type = void;
-};
-
-template <typename T>
-struct sentinal_type<T, std::void_t<typename T::sentinal_type>> {
-  using type = typename T::sentinal_type;
-};
-
 template <typename T> using distance_to_t = typename distance_to<T>::type;
-template <typename T> using sentinal_type_t = typename sentinal_type<T>::type;
 template <typename T> constexpr bool has_equal_to_v = has_equal_to<T>{};
 template <typename T> constexpr bool has_distance_to_v = has_distance_to<T>{};
 template <typename T> constexpr bool has_increment_v = has_increment<T>{};
@@ -91,10 +81,6 @@ template <typename D, typename T>
 using difference_type_arg_t =
     std::enable_if_t<std::is_convertible_v<D, detail::distance_to_t<T>>>;
 
-template <typename D, typename T>
-using sentinal_type_arg_t =
-    std::enable_if_t<std::is_same_v<D, detail::sentinal_type_t<T>>>;
-
 template <typename self_type> class facade {
 public:
   decltype(auto) operator*() const { return self().dereference(); }
@@ -195,16 +181,6 @@ public:
     }
   }
 
-  template <typename S, typename = sentinal_type_arg_t<S, self_type>>
-  friend auto operator==(self_type self, S) {
-    return self.at_end();
-  }
-
-  template <typename S, typename = sentinal_type_arg_t<S, self_type>>
-  friend auto operator!=(self_type self, S) {
-    return !self.at_end();
-  }
-
   friend bool operator!=(self_type const & left, self_type const & right) {
     return !(left == right);
   }

+ 1 - 2
include/iterator/filter_iterator.hpp

@@ -18,8 +18,7 @@ namespace iterator {
 template <typename Iter, bool Cache>
 class filter_iterator : public facade<filter_iterator<Iter, Cache>> {
 public:
-  struct sentinal_type {};
-  static constexpr sentinal_type sentinal;
+  using sentinel_type = sentinel_t;
 
   using reference = typename std::iterator_traits<Iter>::reference;
   using cache_t = std::conditional_t<Cache, detail::value_proxy<reference>,

+ 1 - 2
include/iterator/join_iterator.hpp

@@ -95,8 +95,7 @@ class joining_iterator : public facade<joining_iterator<Iter>>,
                          public joining::iterator<Iter> {
 public:
   using super_t = joining::iterator<Iter>;
-  struct sentinal_type {};
-  static constexpr sentinal_type sentinal;
+  using sentinel_type = sentinel_t;
 
 public:
   using super_t::super_t;

+ 21 - 0
include/iterator/sentinel.h

@@ -0,0 +1,21 @@
+//
+//  sentinel.h
+//  iterator
+//
+//  Created by Sam Jaffe on 3/31/23.
+//  Copyright © 2023 Sam Jaffe. All rights reserved.
+//
+
+#pragma once
+
+namespace iterator {
+struct sentinel_t {};
+inline constexpr sentinel_t sentinel;
+
+template <typename It> bool operator==(It const & iter, sentinel_t) {
+  return iter.at_end();
+}
+template <typename It> bool operator!=(It const & iter, sentinel_t) {
+  return !iter.at_end();
+}
+}

+ 10 - 10
include/iterator/sentinal_iterator.h

@@ -1,5 +1,5 @@
 //
-//  sentinal_iterator.h
+//  sentinel_iterator.h
 //  iterator
 //
 //  Created by Sam Jaffe on 3/30/23.
@@ -14,16 +14,16 @@
 
 namespace iterator {
 template <typename It>
-class sentinal_iterator : public facade<sentinal_iterator<It>> {
+class sentinel_iterator : public facade<sentinel_iterator<It>> {
 public:
-  static inline const sentinal_iterator<It> sentinal{};
+  using sentinel_type = sentinel_iterator;
 
 public:
-  sentinal_iterator() = default;
-  sentinal_iterator(It it) : curr_(it) {}
+  sentinel_iterator() = default;
+  sentinel_iterator(It it) : curr_(it) {}
 
   template <typename C, typename = std::enable_if_t<detail::is_container_v<C>>>
-  sentinal_iterator(C && container) : curr_(std::begin(container)) {
+  sentinel_iterator(C && container) : curr_(std::begin(container)) {
     static_assert(std::is_reference_v<C>,
                   "Cannot access iterator of a temporary");
   }
@@ -31,7 +31,7 @@ public:
   decltype(auto) dereference() const { return *curr_; }
   void increment() { ++curr_; }
   bool at_end() const { return curr_.at_end() || curr_ == It(); }
-  bool equal_to(sentinal_iterator const & other) const {
+  bool equal_to(sentinel_iterator const & other) const {
     // TODO: Fix this clause
     return (at_end() && other.at_end()) || curr_ == other.curr_;
   }
@@ -40,8 +40,8 @@ private:
   It curr_;
 };
 
-template <typename C> sentinal_iterator(C &&) -> sentinal_iterator<iter<C>>;
-template <typename It> sentinal_iterator(It) -> sentinal_iterator<It>;
+template <typename C> sentinel_iterator(C &&) -> sentinel_iterator<iter<C>>;
+template <typename It> sentinel_iterator(It) -> sentinel_iterator<It>;
 }
 
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinal_iterator);
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinel_iterator);

+ 4 - 2
iterator.xcodeproj/project.pbxproj

@@ -62,7 +62,8 @@
 
 /* Begin PBXFileReference section */
 		CD3C6DDB26238F8F00548B64 /* xcode_gtest_helper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xcode_gtest_helper.h; sourceTree = "<group>"; };
-		CD6EBE2229D5C93A00F387C1 /* sentinal_iterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sentinal_iterator.h; sourceTree = "<group>"; };
+		CD5A8E7329D7910D008C2A4F /* sentinel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sentinel.h; sourceTree = "<group>"; };
+		CD6EBE2229D5C93A00F387C1 /* sentinel_iterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sentinel_iterator.h; sourceTree = "<group>"; };
 		CDA2B60928581255004D5353 /* libiterator.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libiterator.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDA2B6122858128C004D5353 /* iterator_fwd.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = iterator_fwd.hpp; sourceTree = "<group>"; };
 		CDA2B6132858128C004D5353 /* facade.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = facade.h; sourceTree = "<group>"; };
@@ -172,8 +173,9 @@
 				CDA2B6162858128C004D5353 /* recursive_iterator.hpp */,
 				CDA2B6172858128C004D5353 /* detail */,
 				CDA2B61B2858128C004D5353 /* end_aware_iterator.hpp */,
-				CD6EBE2229D5C93A00F387C1 /* sentinal_iterator.h */,
+				CD6EBE2229D5C93A00F387C1 /* sentinel_iterator.h */,
 				CDA2B61C2858128C004D5353 /* proxy.h */,
+				CD5A8E7329D7910D008C2A4F /* sentinel.h */,
 				CDA2B61D2858128C004D5353 /* zip_iterator.hpp */,
 				CDA2B61E2858128C004D5353 /* filter_iterator.hpp */,
 				CDA2B61F2858128C004D5353 /* join_iterator.hpp */,