88
99// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1010
11- // std::ranges::elements_of;
12-
13- #include < ranges>
11+ // <ranges>
12+ //
13+ // template<range R, class Allocator = allocator<byte>>
14+ // struct std::ranges::elements_of;
1415
16+ #include < cassert>
1517#include < concepts>
1618#include < memory>
19+ #include < ranges>
1720#include < type_traits>
21+ #include < utility>
1822#include < vector>
1923
2024#include " min_allocator.h"
@@ -25,9 +29,9 @@ template <class Iterator>
2529struct Range {
2630 using Sentinel = sentinel_wrapper<Iterator>;
2731
28- Iterator begin () { return Iterator (data_.data ()); }
32+ constexpr Iterator begin () { return Iterator (data_.data ()); }
2933
30- Sentinel end () { return Sentinel (Iterator (data_.data () + data_.size ())); }
34+ constexpr Sentinel end () { return Sentinel (Iterator (data_.data () + data_.size ())); }
3135
3236private:
3337 std::vector<int > data_ = {0 , 1 , 2 , 3 };
@@ -40,50 +44,45 @@ constexpr bool test_range() {
4044 using elements_of_t = std::ranges::elements_of<Range&, Allocator>;
4145 {
4246 // constructor
43- std::same_as<elements_of_t > decltype (auto ) elements_of = std::ranges::elements_of (r, Allocator ());
44- [[maybe_unused]] std::same_as<Range&> decltype (auto ) elements_of_range = elements_of.range ;
45- if (!std::is_constant_evaluated ()) {
46- assert (std::ranges::distance (elements_of_range) == 4 );
47- }
48- [[maybe_unused]] std::same_as<Allocator> decltype (auto ) elements_of_allocator = elements_of.allocator ;
47+ std::same_as<elements_of_t > decltype (auto ) e = std::ranges::elements_of (r, Allocator ());
48+ std::same_as<Range&> decltype (auto ) range = e.range ;
49+ assert (std::ranges::distance (range) == 4 );
50+ [[maybe_unused]] std::same_as<Allocator> decltype (auto ) allocator = e.allocator ;
4951 }
5052 {
5153 // designated initializer
52- std::same_as<elements_of_t > decltype (auto ) elements_of = std::ranges::elements_of{
54+ std::same_as<elements_of_t > decltype (auto ) e = std::ranges::elements_of{
5355 .range = r,
5456 .allocator = Allocator (),
5557 };
56- [[maybe_unused]] std::same_as<Range&> decltype (auto ) elements_of_range = elements_of.range ;
57- if (!std::is_constant_evaluated ()) {
58- assert (std::ranges::distance (elements_of_range) == 4 );
59- }
60- [[maybe_unused]] std::same_as<Allocator> decltype (auto ) elements_of_allocator = elements_of.allocator ;
58+ std::same_as<Range&> decltype (auto ) range = e.range ;
59+ assert (&range == &r);
60+ assert (std::ranges::distance (range) == 4 );
61+ [[maybe_unused]] std::same_as<Allocator> decltype (auto ) allocator = e.allocator ;
6162 }
6263 {
6364 // copy constructor
64- std::same_as<elements_of_t > decltype (auto ) elements_of_1 = std::ranges::elements_of (r, Allocator ());
65- std::same_as<elements_of_t > auto elements_of_2 = elements_of_1;
66- [[maybe_unused]] std::same_as<Range&> decltype (auto ) elements_of_1_range = elements_of_1.range ;
67- [[maybe_unused]] std::same_as<Range&> decltype (auto ) elements_of_2_range = elements_of_2.range ;
68- if (!std::is_constant_evaluated ()) {
69- assert (std::ranges::distance (elements_of_1_range) == 4 );
70- assert (std::ranges::distance (elements_of_2_range) == 4 );
71- }
72- [[maybe_unused]] std::same_as<Allocator> decltype (auto ) elements_of_2_allocator = elements_of_2.allocator ;
65+ std::same_as<elements_of_t > decltype (auto ) e = std::ranges::elements_of (r, Allocator ());
66+ std::same_as<elements_of_t > auto copy = e;
67+ std::same_as<Range&> decltype (auto ) range = e.range ;
68+ std::same_as<Range&> decltype (auto ) copy_range = copy.range ;
69+ assert (&range == &r);
70+ assert (&range == ©_range);
71+ assert (std::ranges::distance (range) == 4 );
72+ [[maybe_unused]] std::same_as<Allocator> decltype (auto ) copy_allocator = copy.allocator ;
7373 }
7474
7575 using elements_of_r_t = std::ranges::elements_of<Range&&, Allocator>;
7676 {
7777 // move constructor
78- std::same_as<elements_of_r_t > decltype (auto ) elements_of_1 = std::ranges::elements_of (std::move (r), Allocator ());
79- std::same_as<elements_of_r_t > auto elements_of_2 = std::move (elements_of_1);
80- [[maybe_unused]] std::same_as<Range&&> decltype (auto ) elements_of_1_range = std::move (elements_of_1.range );
81- [[maybe_unused]] std::same_as<Range&&> decltype (auto ) elements_of_2_range = std::move (elements_of_2.range );
82- if (!std::is_constant_evaluated ()) {
83- assert (std::ranges::distance (elements_of_1_range) == 4 );
84- assert (std::ranges::distance (elements_of_2_range) == 4 );
85- }
86- [[maybe_unused]] std::same_as<Allocator> decltype (auto ) elements_of_2_allocator = elements_of_2.allocator ;
78+ std::same_as<elements_of_r_t > decltype (auto ) e = std::ranges::elements_of (std::move (r), Allocator ());
79+ std::same_as<elements_of_r_t > auto copy = std::move (e);
80+ std::same_as<Range&&> decltype (auto ) range = std::move (e.range );
81+ std::same_as<Range&&> decltype (auto ) copy_range = std::move (copy.range );
82+ assert (&range == &r);
83+ assert (&range == ©_range);
84+ assert (std::ranges::distance (range) == 4 );
85+ [[maybe_unused]] std::same_as<Allocator> decltype (auto ) copy_allocator = copy.allocator ;
8786 }
8887 return true ;
8988}
0 commit comments