diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp index adf27459f4c833..9fc24a66ee02dc 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp @@ -66,14 +66,14 @@ int main(int, char**) { { SizedForwardView view{buf, buf + 8}; std::ranges::common_view common(view); - using CommonIter = std::common_iterator>; + using CommonIter = std::common_iterator>; std::same_as auto begin = common.begin(); assert(begin == std::ranges::begin(view)); } { SizedForwardView view{buf, buf + 8}; std::ranges::common_view const common(view); - using CommonIter = std::common_iterator>; + using CommonIter = std::common_iterator>; std::same_as auto begin = common.begin(); assert(begin == std::ranges::begin(view)); } diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp index ed18414dfa7fb7..cf3b625612bb46 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp @@ -51,7 +51,7 @@ int main(int, char**) { { int buf[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - using CommonForwardIter = std::common_iterator>; + using CommonForwardIter = std::common_iterator>; using CommonIntIter = std::common_iterator>; { diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h index 698c5af73cda82..18354483fd3290 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h +++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h @@ -52,15 +52,8 @@ struct SizedForwardView : std::ranges::view_base { int* end_; constexpr explicit SizedForwardView(int* b, int* e) : begin_(b), end_(e) { } constexpr auto begin() const { return forward_iterator(begin_); } - constexpr auto end() const { return sentinel_wrapper>(forward_iterator(end_)); } + constexpr auto end() const { return sized_sentinel>(forward_iterator(end_)); } }; -// Required to make SizedForwardView a sized view. -constexpr auto operator-(sentinel_wrapper sent, ForwardIter iter) { - return sent.base().base() - iter.base(); -} -constexpr auto operator-(ForwardIter iter, sentinel_wrapper sent) { - return iter.base() - sent.base().base(); -} static_assert(std::ranges::view); static_assert(std::ranges::forward_range); static_assert(std::ranges::sized_range); @@ -71,15 +64,8 @@ struct SizedRandomAccessView : std::ranges::view_base { int* end_; constexpr explicit SizedRandomAccessView(int* b, int* e) : begin_(b), end_(e) { } constexpr auto begin() const { return random_access_iterator(begin_); } - constexpr auto end() const { return sentinel_wrapper>(random_access_iterator(end_)); } + constexpr auto end() const { return sized_sentinel>(random_access_iterator(end_)); } }; -// Required to make SizedRandomAccessView a sized view. -constexpr auto operator-(sentinel_wrapper sent, RandomAccessIter iter) { - return sent.base().base() - iter.base(); -} -constexpr auto operator-(RandomAccessIter iter, sentinel_wrapper sent) { - return iter.base() - sent.base().base(); -} static_assert(std::ranges::view); static_assert(std::ranges::random_access_range); static_assert(std::ranges::sized_range); diff --git a/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/base.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/base.pass.cpp index cd666f19d3a282..1562a188a80244 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/base.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/base.pass.cpp @@ -28,13 +28,13 @@ constexpr bool test() { { const std::ranges::take_view tv(MoveOnlyView{buffer}, 4); - assert(tv.end().base().base() == sw.base()); + assert(base(tv.end().base()) == base(sw)); ASSERT_SAME_TYPE(decltype(tv.end().base()), sentinel_wrapper); } { std::ranges::take_view tv(MoveOnlyView{buffer}, 4); - assert(tv.end().base().base() == sw.base()); + assert(base(tv.end().base()) == base(sw)); ASSERT_SAME_TYPE(decltype(tv.end().base()), sentinel_wrapper); } diff --git a/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/ctor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/ctor.pass.cpp index 842659ccdc9391..92a6c17705105f 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/ctor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.take/sentinel/ctor.pass.cpp @@ -47,7 +47,7 @@ constexpr bool test() { auto sw = sentinel_wrapper(buffer + 6); using Sent = decltype(tv.end()); Sent sent = Sent(sw); - assert(sent.base().base() == sw.base()); + assert(base(sent.base()) == base(sw)); } return true; diff --git a/libcxx/test/std/ranges/range.adaptors/range.take/types.h b/libcxx/test/std/ranges/range.adaptors/range.take/types.h index bd3336c6f04d16..09549a9e086f0e 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.take/types.h +++ b/libcxx/test/std/ranges/range.adaptors/range.take/types.h @@ -37,15 +37,8 @@ struct SizedForwardView : std::ranges::view_base { int *ptr_; constexpr explicit SizedForwardView(int* ptr) : ptr_(ptr) {} constexpr auto begin() const { return ForwardIter(ptr_); } - constexpr auto end() const { return sentinel_wrapper(ForwardIter(ptr_ + 8)); } + constexpr auto end() const { return sized_sentinel(ForwardIter(ptr_ + 8)); } }; -// Required to make SizedForwardView a sized view. -constexpr auto operator-(sentinel_wrapper sent, ForwardIter iter) { - return sent.base().base() - iter.base(); -} -constexpr auto operator-(ForwardIter iter, sentinel_wrapper sent) { - return iter.base() - sent.base().base(); -} static_assert(std::ranges::view); static_assert(std::ranges::forward_range); static_assert(std::ranges::sized_range); @@ -55,15 +48,8 @@ struct SizedRandomAccessView : std::ranges::view_base { int *ptr_; constexpr explicit SizedRandomAccessView(int* ptr) : ptr_(ptr) {} constexpr auto begin() const { return RandomAccessIter(ptr_); } - constexpr auto end() const { return sentinel_wrapper(RandomAccessIter(ptr_ + 8)); } + constexpr auto end() const { return sized_sentinel(RandomAccessIter(ptr_ + 8)); } }; -// Required to make SizedRandomAccessView a sized view. -constexpr auto operator-(sentinel_wrapper sent, RandomAccessIter iter) { - return sent.base().base() - iter.base(); -} -constexpr auto operator-(RandomAccessIter iter, sentinel_wrapper sent) { - return iter.base() - sent.base().base(); -} static_assert(std::ranges::view); static_assert(std::ranges::random_access_range); static_assert(std::ranges::sized_range); diff --git a/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp b/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp index e342e258613bbb..98f9408590ee6f 100644 --- a/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp +++ b/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp @@ -122,7 +122,7 @@ static_assert(!std::ranges::contiguous_range); static_assert(std::ranges::sized_range); static_assert(!std::is_constructible_v); -using ContiguousButNotSizedRange = std::ranges::subrange, sentinel_wrapper, std::ranges::subrange_kind::unsized>; +using ContiguousButNotSizedRange = std::ranges::subrange, sentinel_wrapper>, std::ranges::subrange_kind::unsized>; static_assert(std::ranges::contiguous_range); static_assert(!std::ranges::sized_range); static_assert(!std::is_constructible_v); diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h index cc03ccc100fc1c..4bf082b3634f2a 100644 --- a/libcxx/test/support/test_iterators.h +++ b/libcxx/test/support/test_iterators.h @@ -838,69 +838,30 @@ class stride_counting_iterator { difference_type stride_displacement_ = 0; }; -template -concept sentinel_for_base = requires(U const& u) { - u.base(); - requires std::input_or_output_iterator>; - requires std::equality_comparable_with; -}; - -template +template class sentinel_wrapper { public: - sentinel_wrapper() = default; - constexpr explicit sentinel_wrapper(I base) : base_(std::move(base)) {} - - constexpr bool operator==(const I& other) const requires std::equality_comparable { - return base_ == other; - } - - constexpr const I& base() const& { return base_; } - constexpr I base() && { return std::move(base_); } - - template - requires sentinel_for_base - constexpr bool operator==(const I2& other) const { - return base_ == other.base(); - } - + explicit sentinel_wrapper() = default; + constexpr explicit sentinel_wrapper(const It& it) : base_(base(it)) {} + constexpr bool operator==(const It& other) const { return base_ == base(other); } + friend constexpr It base(const sentinel_wrapper& s) { return It(s.base_); } private: - I base_ = I(); + decltype(base(std::declval())) base_; }; -template +template class sized_sentinel { public: - sized_sentinel() = default; - constexpr explicit sized_sentinel(I base) : base_(std::move(base)) {} - - constexpr bool operator==(const I& other) const requires std::equality_comparable { - return base_ == other; - } - - constexpr const I& base() const& { return base_; } - constexpr I base() && { return std::move(base_); } - - template - requires sentinel_for_base - constexpr bool operator==(const I2& other) const { - return base_ == other.base(); - } - + explicit sized_sentinel() = default; + constexpr explicit sized_sentinel(const It& it) : base_(base(it)) {} + constexpr bool operator==(const It& other) const { return base_ == base(other); } + friend constexpr auto operator-(const sized_sentinel& s, const It& i) { return s.base_ - base(i); } + friend constexpr auto operator-(const It& i, const sized_sentinel& s) { return base(i) - s.base_; } + friend constexpr It base(const sized_sentinel& s) { return It(s.base_); } private: - I base_ = I(); + decltype(base(std::declval())) base_; }; -template -constexpr auto operator-(sized_sentinel sent, std::input_or_output_iterator auto iter) { - return sent.base() - iter; -} - -template -constexpr auto operator-(std::input_or_output_iterator auto iter, sized_sentinel sent) { - return iter - sent.base(); -} - template class three_way_contiguous_iterator {