[libc++] Move assignable_sentinel to a common header where it can be reused
authorLouis Dionne <ldionne.2@gmail.com>
Thu, 13 Jan 2022 17:58:53 +0000 (12:58 -0500)
committerLouis Dionne <ldionne.2@gmail.com>
Thu, 13 Jan 2022 17:59:16 +0000 (12:59 -0500)
libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.next/iterator_sentinel.pass.cpp
libcxx/test/std/iterators/iterator.primitives/range.iter.ops/types.h

index dcb3c6f..950fd77 100644 (file)
 
 using range_t = std::array<int, 10>;
 
-// Sentinel type that can be assigned to an iterator. This is to test the case where
-// std::ranges::next uses assignment instead of successive increments below.
-template <class It>
-class assignable_sentinel {
-public:
-    explicit assignable_sentinel() = default;
-    constexpr explicit assignable_sentinel(const It& it) : base_(base(it)) {}
-    constexpr operator It() const { return It(base_); }
-    constexpr bool operator==(const It& other) const { return base_ == base(other); }
-    friend constexpr It base(const assignable_sentinel& s) { return It(s.base_); }
-private:
-    decltype(base(std::declval<It>())) base_;
-};
-
 template <bool Count, typename It>
 constexpr void check_assignable(int* it, int* last, int const* expected) {
   {
index 2f2f0a8..71704c9 100644 (file)
@@ -12,6 +12,7 @@
 #include <cassert>
 #include <cstddef>
 #include <iterator>
+#include <utility>
 
 class distance_apriori_sentinel {
 public:
@@ -37,4 +38,18 @@ private:
   std::ptrdiff_t count_ = 0;
 };
 
+// Sentinel type that can be assigned to an iterator. This is to test the cases where the
+// various iterator operations use assignment instead of successive increments/decrements.
+template <class It>
+class assignable_sentinel {
+public:
+    explicit assignable_sentinel() = default;
+    constexpr explicit assignable_sentinel(const It& it) : base_(base(it)) {}
+    constexpr operator It() const { return It(base_); }
+    constexpr bool operator==(const It& other) const { return base_ == base(other); }
+    friend constexpr It base(const assignable_sentinel& s) { return It(s.base_); }
+private:
+    decltype(base(std::declval<It>())) base_;
+};
+
 #endif // TEST_STD_ITERATORS_ITERATOR_PRIMITIVES_RANGE_ITER_OPS_TYPES_H