Skip to content

Commit 6bf1e98

Browse files
Improve views::elements tests (#3350)
1 parent 4f5d13a commit 6bf1e98

File tree

1 file changed

+48
-24
lines changed
  • tests/std/tests/P0896R4_views_elements

1 file changed

+48
-24
lines changed

tests/std/tests/P0896R4_views_elements/test.cpp

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -223,26 +223,66 @@ constexpr bool test_one(Rng&& rng) {
223223
same_as<sentinel_t<R>> auto i = r.end();
224224
static_assert(common_range<R> == common_range<V>);
225225
if constexpr (bidirectional_range<R> && common_range<R>) {
226-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
227226
assert(*prev(i) == *prev(end(expected_keys)));
228-
#else // ^^^ no workaround / workaround vvv
229-
assert(*ranges::prev(i) == *ranges::prev(end(expected_keys)));
230-
#endif // ^^^ workaround ^^^
231227
}
232228

233229
if constexpr (CanEnd<const R&>) {
234230
same_as<sentinel_t<const R>> auto i2 = as_const(r).end();
235231
static_assert(common_range<const R> == common_range<const V>);
236232
if constexpr (bidirectional_range<const R> && common_range<const R>) {
237-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
238233
assert(*prev(i2) == *prev(end(expected_keys)));
239-
#else // ^^^ no workaround / workaround vvv
240-
assert(*ranges::prev(i2) == *ranges::prev(end(expected_keys)));
241-
#endif // ^^^ workaround ^^^
242234
}
243235
}
244236
}
245237

238+
#if _HAS_CXX23
239+
using ranges::const_iterator_t, ranges::const_sentinel_t, ranges::cbegin, ranges::cend;
240+
241+
// Validate view_interface::cbegin
242+
STATIC_ASSERT(CanMemberCBegin<R>);
243+
STATIC_ASSERT(CanMemberCBegin<const R&> == range<const V>);
244+
if (forward_range<V>) { // intentionally not if constexpr
245+
const same_as<const_iterator_t<R>> auto i = r.cbegin();
246+
if (!is_empty) {
247+
assert(*i == *cbegin(expected_keys));
248+
}
249+
250+
if constexpr (copyable<V>) {
251+
auto r2 = r;
252+
const same_as<const_iterator_t<R>> auto i2 = r2.cbegin();
253+
if (!is_empty) {
254+
assert(*i2 == *i);
255+
}
256+
}
257+
258+
if constexpr (CanCBegin<const R&>) {
259+
const same_as<const_iterator_t<const R>> auto i3 = as_const(r).cbegin();
260+
if (!is_empty) {
261+
assert(*i3 == *i);
262+
}
263+
}
264+
}
265+
266+
// Validate view_interface::cend
267+
STATIC_ASSERT(CanMemberCEnd<R>);
268+
STATIC_ASSERT(CanMemberCEnd<const R&> == range<const V>);
269+
if (!is_empty) {
270+
same_as<const_sentinel_t<R>> auto i = r.cend();
271+
static_assert(common_range<R> == common_range<V>);
272+
if constexpr (bidirectional_range<R> && common_range<R>) {
273+
assert(*prev(i) == *prev(cend(expected_keys)));
274+
}
275+
276+
if constexpr (CanCEnd<const R&>) {
277+
same_as<const_sentinel_t<const R>> auto i2 = as_const(r).cend();
278+
static_assert(common_range<const R> == common_range<const V>);
279+
if constexpr (bidirectional_range<const R> && common_range<const R>) {
280+
assert(*prev(i2) == *prev(cend(expected_keys)));
281+
}
282+
}
283+
}
284+
#endif // _HAS_CXX23
285+
246286
// Validate view_interface::data
247287
STATIC_ASSERT(!CanData<R>);
248288
STATIC_ASSERT(!CanData<const R>);
@@ -256,11 +296,7 @@ constexpr bool test_one(Rng&& rng) {
256296

257297
STATIC_ASSERT(CanMemberBack<R> == (bidirectional_range<V> && common_range<V>) );
258298
if constexpr (CanMemberBack<R>) {
259-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
260299
assert(r.back() == *prev(end(expected_keys)));
261-
#else // ^^^ no workaround / workaround vvv
262-
assert(r.back() == *ranges::prev(end(expected_keys)));
263-
#endif // ^^^ workaround ^^^
264300
}
265301

266302
STATIC_ASSERT(CanMemberFront<const R> == (forward_range<const V>) );
@@ -270,11 +306,7 @@ constexpr bool test_one(Rng&& rng) {
270306

271307
STATIC_ASSERT(CanMemberBack<const R> == (bidirectional_range<const V> && common_range<const V>) );
272308
if constexpr (CanMemberBack<const R>) {
273-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
274309
assert(as_const(r).back() == *prev(end(expected_keys)));
275-
#else // ^^^ no workaround / workaround vvv
276-
assert(as_const(r).back() == *ranges::prev(end(expected_keys)));
277-
#endif // ^^^ workaround ^^^
278310
}
279311
}
280312

@@ -299,11 +331,7 @@ constexpr bool test_one(Rng&& rng) {
299331
if (!is_empty) {
300332
assert((*b1.begin() == pair{0, -1})); // NB: depends on the test data
301333
if constexpr (bidirectional_range<V> && common_range<V>) {
302-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
303334
assert((*prev(b1.end()) == pair{7, -8})); // NB: depends on the test data
304-
#else // ^^^ no workaround / workaround vvv
305-
assert((*ranges::prev(b1.end()) == pair{7, -8})); // NB: depends on the test data
306-
#endif // ^^^ workaround ^^^
307335
}
308336
}
309337
}
@@ -315,11 +343,7 @@ constexpr bool test_one(Rng&& rng) {
315343
if (!is_empty) {
316344
assert((*b2.begin() == pair{0, -1})); // NB: depends on the test data
317345
if constexpr (bidirectional_range<V> && common_range<V>) {
318-
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1243263
319346
assert((*prev(b2.end()) == pair{7, -8})); // NB: depends on the test data
320-
#else // ^^^ no workaround / workaround vvv
321-
assert((*ranges::prev(b2.end()) == pair{7, -8})); // NB: depends on the test data
322-
#endif // ^^^ workaround ^^^
323347
}
324348
}
325349
}

0 commit comments

Comments
 (0)