Skip to content

Commit 9625fe9

Browse files
Create test_consteval_iterators.h and include it
1 parent d4f2563 commit 9625fe9

File tree

5 files changed

+237
-211
lines changed

5 files changed

+237
-211
lines changed

libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/ranges.sort.pass.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#include "almost_satisfies_types.h"
3131
#include "test_iterators.h"
32+
#include "test_consteval_iterators.h"
3233

3334
// SFINAE tests.
3435

libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort_constexpr.pass.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "test_macros.h"
2121
#include "test_iterators.h"
22+
#include "test_consteval_iterators.h"
2223
#include "MoveOnly.h"
2324

2425
const int LargeN = 128;

libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort_constexpr_comp.pass.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "test_macros.h"
2222
#include "test_iterators.h"
23+
#include "test_consteval_iterators.h"
2324
#include "MoveOnly.h"
2425

2526
const int LargeN = 128;
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef SUPPORT_TEST_CONSTEVAL_ITERATORS_H
10+
#define SUPPORT_TEST_CONSTEVAL_ITERATORS_H
11+
12+
#include <iterator>
13+
#include <type_traits>
14+
#include <utility>
15+
16+
#include "double_move_tracker.h"
17+
#include "test_macros.h"
18+
19+
#if TEST_STD_VER >= 20
20+
21+
template <std::random_access_iterator It>
22+
class consteval_random_access_iterator {
23+
It it_;
24+
support::double_move_tracker tracker_;
25+
26+
template <std::random_access_iterator>
27+
friend class consteval_random_access_iterator;
28+
29+
public:
30+
using iterator_category = std::input_iterator_tag;
31+
using iterator_concept = std::random_access_iterator_tag;
32+
using value_type = std::iterator_traits<It>::value_type;
33+
using difference_type = std::iterator_traits<It>::difference_type;
34+
35+
consteval consteval_random_access_iterator() : it_() {}
36+
consteval explicit consteval_random_access_iterator(It it) : it_(it) {}
37+
consteval consteval_random_access_iterator(const consteval_random_access_iterator&) = default;
38+
consteval consteval_random_access_iterator(consteval_random_access_iterator&&) = default;
39+
40+
consteval consteval_random_access_iterator& operator=(const consteval_random_access_iterator&) = default;
41+
consteval consteval_random_access_iterator& operator=(consteval_random_access_iterator&&) = default;
42+
43+
template <class U>
44+
consteval consteval_random_access_iterator(const consteval_random_access_iterator<U>& u)
45+
: it_(u.it_), tracker_(u.tracker_) {}
46+
47+
template <class U>
48+
consteval consteval_random_access_iterator(consteval_random_access_iterator<U>&& u)
49+
: it_(std::move(u.it_)), tracker_(std::move(u.tracker_)) {
50+
u.it_ = U();
51+
}
52+
53+
consteval decltype(auto) operator*() const { return *it_; }
54+
consteval decltype(auto) operator[](difference_type n) const { return it_[n]; }
55+
56+
consteval consteval_random_access_iterator& operator++() {
57+
++it_;
58+
return *this;
59+
}
60+
consteval consteval_random_access_iterator& operator--() {
61+
--it_;
62+
return *this;
63+
}
64+
consteval consteval_random_access_iterator operator++(int) { return consteval_random_access_iterator(it_++); }
65+
consteval consteval_random_access_iterator operator--(int) { return consteval_random_access_iterator(it_--); }
66+
67+
consteval consteval_random_access_iterator& operator+=(difference_type n) {
68+
it_ += n;
69+
return *this;
70+
}
71+
consteval consteval_random_access_iterator& operator-=(difference_type n) {
72+
it_ -= n;
73+
return *this;
74+
}
75+
friend consteval consteval_random_access_iterator operator+(consteval_random_access_iterator x, difference_type n) {
76+
x += n;
77+
return x;
78+
}
79+
friend consteval consteval_random_access_iterator operator+(difference_type n, consteval_random_access_iterator x) {
80+
x += n;
81+
return x;
82+
}
83+
friend consteval consteval_random_access_iterator operator-(consteval_random_access_iterator x, difference_type n) {
84+
x -= n;
85+
return x;
86+
}
87+
friend consteval difference_type operator-(consteval_random_access_iterator x, consteval_random_access_iterator y) {
88+
return x.it_ - y.it_;
89+
}
90+
91+
friend consteval bool
92+
operator==(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
93+
return x.it_ == y.it_;
94+
}
95+
friend consteval bool
96+
operator!=(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
97+
return x.it_ != y.it_;
98+
}
99+
friend consteval bool
100+
operator<(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
101+
return x.it_ < y.it_;
102+
}
103+
friend consteval bool
104+
operator<=(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
105+
return x.it_ <= y.it_;
106+
}
107+
friend consteval bool
108+
operator>(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
109+
return x.it_ > y.it_;
110+
}
111+
friend consteval bool
112+
operator>=(const consteval_random_access_iterator& x, const consteval_random_access_iterator& y) {
113+
return x.it_ >= y.it_;
114+
}
115+
116+
friend consteval It base(const consteval_random_access_iterator& i) { return i.it_; }
117+
118+
template <class T>
119+
void operator,(T const&) = delete;
120+
};
121+
template <class It>
122+
consteval_random_access_iterator(It) -> consteval_random_access_iterator<It>;
123+
124+
static_assert(std::random_access_iterator<consteval_random_access_iterator<int*>>);
125+
126+
template <std::contiguous_iterator It>
127+
class consteval_contiguous_iterator {
128+
It it_;
129+
support::double_move_tracker tracker_;
130+
131+
template <std::contiguous_iterator U>
132+
friend class consteval_contiguous_iterator;
133+
134+
public:
135+
using iterator_category = std::contiguous_iterator_tag;
136+
using value_type = std::iterator_traits<It>::value_type;
137+
using difference_type = std::iterator_traits<It>::difference_type;
138+
using pointer = std::iterator_traits<It>::pointer;
139+
using reference = std::iterator_traits<It>::reference;
140+
using element_type = value_type;
141+
142+
consteval It base() const { return it_; }
143+
144+
consteval consteval_contiguous_iterator() : it_() {}
145+
consteval explicit consteval_contiguous_iterator(It it) : it_(it) {}
146+
consteval consteval_contiguous_iterator(const consteval_contiguous_iterator&) = default;
147+
consteval consteval_contiguous_iterator(consteval_contiguous_iterator&&) = default;
148+
149+
consteval consteval_contiguous_iterator& operator=(const consteval_contiguous_iterator&) = default;
150+
consteval consteval_contiguous_iterator& operator=(consteval_contiguous_iterator&&) = default;
151+
152+
template <class U>
153+
consteval consteval_contiguous_iterator(const consteval_contiguous_iterator<U>& u)
154+
: it_(u.it_), tracker_(u.tracker_) {}
155+
156+
template <class U, std::enable_if_t<std::is_default_constructible_v<U>, int> = 0>
157+
consteval consteval_contiguous_iterator(consteval_contiguous_iterator<U>&& u)
158+
: it_(std::move(u.it_)), tracker_(std::move(u.tracker_)) {
159+
u.it_ = U();
160+
}
161+
162+
consteval reference operator*() const { return *it_; }
163+
consteval pointer operator->() const { return it_; }
164+
consteval reference operator[](difference_type n) const { return it_[n]; }
165+
166+
consteval consteval_contiguous_iterator& operator++() {
167+
++it_;
168+
return *this;
169+
}
170+
consteval consteval_contiguous_iterator& operator--() {
171+
--it_;
172+
return *this;
173+
}
174+
consteval consteval_contiguous_iterator operator++(int) { return consteval_contiguous_iterator(it_++); }
175+
consteval consteval_contiguous_iterator operator--(int) { return consteval_contiguous_iterator(it_--); }
176+
177+
consteval consteval_contiguous_iterator& operator+=(difference_type n) {
178+
it_ += n;
179+
return *this;
180+
}
181+
consteval consteval_contiguous_iterator& operator-=(difference_type n) {
182+
it_ -= n;
183+
return *this;
184+
}
185+
friend consteval consteval_contiguous_iterator operator+(consteval_contiguous_iterator x, difference_type n) {
186+
x += n;
187+
return x;
188+
}
189+
friend consteval consteval_contiguous_iterator operator+(difference_type n, consteval_contiguous_iterator x) {
190+
x += n;
191+
return x;
192+
}
193+
friend consteval consteval_contiguous_iterator operator-(consteval_contiguous_iterator x, difference_type n) {
194+
x -= n;
195+
return x;
196+
}
197+
friend consteval difference_type operator-(consteval_contiguous_iterator x, consteval_contiguous_iterator y) {
198+
return x.it_ - y.it_;
199+
}
200+
201+
friend consteval bool operator==(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
202+
return x.it_ == y.it_;
203+
}
204+
friend consteval bool operator!=(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
205+
return x.it_ != y.it_;
206+
}
207+
friend consteval bool operator<(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
208+
return x.it_ < y.it_;
209+
}
210+
friend consteval bool operator<=(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
211+
return x.it_ <= y.it_;
212+
}
213+
friend consteval bool operator>(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
214+
return x.it_ > y.it_;
215+
}
216+
friend consteval bool operator>=(const consteval_contiguous_iterator& x, const consteval_contiguous_iterator& y) {
217+
return x.it_ >= y.it_;
218+
}
219+
220+
// Note no operator<=>, use three_way_contiguous_iterator for testing operator<=>
221+
222+
friend consteval It base(const consteval_contiguous_iterator& i) { return i.it_; }
223+
224+
template <class T>
225+
void operator,(T const&) = delete;
226+
};
227+
template <class It>
228+
consteval_contiguous_iterator(It) -> consteval_contiguous_iterator<It>;
229+
230+
static_assert(std::contiguous_iterator<consteval_contiguous_iterator<int*>>);
231+
232+
#endif // TEST_STD_VER >= 20
233+
234+
#endif // SUPPORT_TEST_CONSTEVAL_ITERATORS_H

0 commit comments

Comments
 (0)