Explorar o código

fix: at_end checks when possible
chore: remove commented out code

Sam Jaffe hai 2 meses
pai
achega
2115587a9c

+ 5 - 41
include/iterator/facade.h

@@ -108,7 +108,11 @@ public:
   }
 
   friend bool operator==(self_type const & left, self_type const & right) {
-    return left.equal_to(right);
+    if constexpr (has_sentinel<self_type>) {
+      return (left.at_end() && right.at_end()) || left.equal_to(right);
+    } else {
+      return left.equal_to(right);
+    }
   }
 
   friend auto operator<=>(self_type const & left, self_type const & right)
@@ -125,10 +129,6 @@ protected:
 };
 }
 
-// In C++20, a concept/requires could be used to eschew the need for the below
-// macros.
-#define MAKE_ITERATOR_FACADE_TYPEDEFS_T(Iter)
-
 template <typename It>
   requires std::is_base_of_v<iterator::facade<It>, It>
 struct std::iterator_traits<It> {
@@ -145,40 +145,4 @@ struct std::iterator_traits<It> {
                              forward_iterator_tag>>>;
 };
 
-// template <typename It> requires(std::derived_from<It, iterator::facade<It,
-// iterator::category::single_pass>>) struct std::iterator_traits<It> {
-//   using reference = decltype(std::declval<It>().operator*());
-//   using value_type = std::decay_t<reference>;
-//   using pointer = decltype(std::declval<It>().operator->());
-//   using difference_type = ::iterator::infer_difference_type_t<It>;
-//   using iterator_category = std::input_iterator_tag;
-// };
-//
-// template <typename It> requires(std::derived_from<It, iterator::facade<It,
-// iterator::category::forward>>) struct std::iterator_traits<It> {
-//   using reference = decltype(std::declval<It>().operator*());
-//   using value_type = std::decay_t<reference>;
-//   using pointer = decltype(std::declval<It>().operator->());
-//   using difference_type = ::iterator::infer_difference_type_t<It>;
-//   using iterator_category = std::forward_iterator_tag;
-// };
-//
-// template <typename It> requires(std::derived_from<It, iterator::facade<It,
-// iterator::category::bidirectional>>) struct std::iterator_traits<It> {
-//   using reference = decltype(std::declval<It>().operator*());
-//   using value_type = std::decay_t<reference>;
-//   using pointer = decltype(std::declval<It>().operator->());
-//   using difference_type = ::iterator::infer_difference_type_t<It>;
-//   using iterator_category = std::bidirectional_iterator_tag;
-// };
-//
-// template <typename It> requires(std::derived_from<It, iterator::facade<It,
-// iterator::category::random_access>>) struct std::iterator_traits<It> {
-//   using reference = decltype(std::declval<It>().operator*());
-//   using value_type = std::decay_t<reference>;
-//   using pointer = decltype(std::declval<It>().operator->());
-//   using difference_type = ::iterator::infer_difference_type_t<It>;
-//   using iterator_category = std::random_access_iterator_tag;
-// };
-
 #include <iterator/detail/undef.h>

+ 0 - 2
include/iterator/indexed_iterator.h

@@ -81,5 +81,3 @@ private:
 template <typename It> indexed_iterator(It) -> indexed_iterator<It>;
 template <typename It> indexed_iterator(It, size_t) -> indexed_iterator<It>;
 }
-
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::indexed_iterator);

+ 0 - 2
include/iterator/recursive_iterator.h

@@ -183,8 +183,6 @@ private:
 };
 }
 
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::recursive::rimpl);
-
 namespace std {
 template <std::size_t I, typename It>
 auto get(::iterator::recursive_iterator<It> const & iter) {

+ 0 - 2
include/iterator/unkeyed_iterator.h

@@ -39,5 +39,3 @@ public:
 
 template <typename It> unkeyed_iterator(It) -> unkeyed_iterator<It>;
 }
-
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::unkeyed_iterator);

+ 0 - 2
include/iterator/zip_iterator.h

@@ -69,5 +69,3 @@ public:
 
 template <typename... It> zip_iterator(It...) -> zip_iterator<It...>;
 }
-
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::zip_iterator);