From 39b60449f838beb11bc2e3246636c6821befeb55 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 2 Aug 2023 12:07:53 +0200 Subject: [PATCH 1/7] Test `views::as_const` --- .../std/tests/P2278R4_views_as_const/test.cpp | 81 ++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/P2278R4_views_as_const/test.cpp b/tests/std/tests/P2278R4_views_as_const/test.cpp index c33e2e1b17..fb9beeacd1 100644 --- a/tests/std/tests/P2278R4_views_as_const/test.cpp +++ b/tests/std/tests/P2278R4_views_as_const/test.cpp @@ -35,9 +35,10 @@ constexpr bool CanReconstructRefView> = ranges::constant_ran template constexpr bool test_one(Rng&& rng, Expected&& expected) { - using ranges::ref_view, ranges::as_const_view, ranges::begin, ranges::end, ranges::iterator_t, ranges::sentinel_t, - ranges::prev, ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range, - ranges::contiguous_range, ranges::common_range, ranges::sized_range, ranges::constant_range; + using ranges::ref_view, ranges::as_const_view, ranges::begin, ranges::end, ranges::cbegin, ranges::cend, + ranges::iterator_t, ranges::sentinel_t, ranges::const_iterator_t, ranges::const_sentinel_t, ranges::prev, + ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range, ranges::contiguous_range, + ranges::common_range, ranges::sized_range, ranges::constant_range; using V = views::all_t; using R = as_const_view; @@ -414,6 +415,80 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { } } + // Validate view_interface::cbegin + STATIC_ASSERT(CanMemberCBegin); + { + const same_as> auto i = r.cbegin(); + if (!is_empty) { + assert(*i == *cbegin(expected)); + } + + if constexpr (copy_constructible) { + auto r2 = r; + const same_as> auto i2 = r2.cbegin(); + if (!is_empty) { + assert(*i2 == *i); + } + } + } + + // Validate view_interface::cbegin (const) + STATIC_ASSERT(CanMemberCBegin == ranges::range); + if constexpr (CanMemberCBegin) { + const same_as> auto ci = as_const(r).cbegin(); + if (!is_empty) { + assert(*ci == *cbegin(expected)); + } + + if constexpr (copy_constructible) { + const auto cr2 = r; + const same_as> auto ci2 = cr2.cbegin(); + if (!is_empty) { + assert(*ci2 == *ci); + } + } + } + + // Validate view_interface::cend + STATIC_ASSERT(CanMemberCEnd); + { + const same_as> auto s = r.cend(); + assert((r.cbegin() == s) == is_empty); + STATIC_ASSERT(common_range == common_range); + if constexpr (common_range && bidirectional_range) { + if (!is_empty) { + assert(*prev(s) == *prev(cend(expected))); + } + + if constexpr (copy_constructible) { + auto r2 = r; + if (!is_empty) { + assert(*prev(r2.cend()) == *prev(cend(expected))); + } + } + } + } + + // Validate view_interface::cend (const) + STATIC_ASSERT(CanMemberCEnd == ranges::range); + if constexpr (CanMemberCEnd) { + const same_as> auto cs = as_const(r).cend(); + assert((as_const(r).cbegin() == cs) == is_empty); + STATIC_ASSERT(common_range == common_range); + if constexpr (common_range && bidirectional_range) { + if (!is_empty) { + assert(*prev(cs) == *prev(cend(expected))); + } + + if constexpr (copy_constructible) { + const auto r2 = r; + if (!is_empty) { + assert(*prev(r2.cend()) == *prev(cend(expected))); + } + } + } + } + // Validate view_interface::data STATIC_ASSERT(CanMemberData == contiguous_range); STATIC_ASSERT(CanData == contiguous_range); From e9ac4368bfe045fbde87138367f690009366cf0c Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 2 Aug 2023 13:53:40 +0200 Subject: [PATCH 2/7] Test `views::zip` --- tests/std/tests/P2321R2_views_zip/test.cpp | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/std/tests/P2321R2_views_zip/test.cpp b/tests/std/tests/P2321R2_views_zip/test.cpp index 79ef5cfa69..dcc9e1a5cc 100644 --- a/tests/std/tests/P2321R2_views_zip/test.cpp +++ b/tests/std/tests/P2321R2_views_zip/test.cpp @@ -437,6 +437,35 @@ constexpr bool test_one(TestContainerType& test_container, RangeTypes&&... rngs) assert(end == as_const(zipped_range).end()); } + // Validate view_interface::cbegin() + STATIC_ASSERT(CanMemberCBegin); + { + const same_as> auto itr = zipped_range.cbegin(); + assert(do_tuples_reference_same_objects(*itr, tuple_element_arr[0])); + } + + STATIC_ASSERT(CanMemberCBegin == (ranges::range> && ...)); + if constexpr (CanMemberCBegin) { + assert(do_tuples_reference_same_objects(*(as_const(zipped_range).cbegin()), const_tuple_element_arr[0])); + } + + // Validate view_interface::cend() + STATIC_ASSERT(CanMemberCEnd); + if constexpr (equality_comparable>) { + auto end = zipped_range.cbegin(); + ranges::advance(end, TestContainerType::smallest_array_size); + + assert(end == zipped_range.cend()); + } + + STATIC_ASSERT(CanMemberCEnd == (ranges::range> && ...)); + if constexpr (CanMemberCEnd && equality_comparable>) { + auto end = as_const(zipped_range).cbegin(); + ranges::advance(end, TestContainerType::smallest_array_size); + + assert(end == as_const(zipped_range).cend()); + } + const auto validate_iterators_lambda = []( LocalZipType& relevant_range, const ArrayType& relevant_tuple_element_arr) { From 3a61c48d108ecf49926e8a40a6167393f4a8b11e Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 2 Aug 2023 14:05:39 +0200 Subject: [PATCH 3/7] Test `views::stride` --- tests/std/tests/P1899R3_views_stride/test.cpp | 86 ++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/tests/std/tests/P1899R3_views_stride/test.cpp b/tests/std/tests/P1899R3_views_stride/test.cpp index a24e63e75c..be2328717a 100644 --- a/tests/std/tests/P1899R3_views_stride/test.cpp +++ b/tests/std/tests/P1899R3_views_stride/test.cpp @@ -21,7 +21,8 @@ template constexpr bool test_one(Rng&& rng, Expected&& expected) { using ranges::forward_range, ranges::bidirectional_range, ranges::random_access_range, ranges::common_range, ranges::sized_range; - using ranges::stride_view, ranges::begin, ranges::end, ranges::iterator_t, ranges::sentinel_t, ranges::prev; + using ranges::stride_view, ranges::begin, ranges::end, ranges::cbegin, ranges::cend, ranges::iterator_t, + ranges::sentinel_t, ranges::const_iterator_t, ranges::const_sentinel_t, ranges::prev; constexpr bool is_view = ranges::view>; @@ -227,6 +228,89 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { } } + // Validate view_interface::cbegin + STATIC_ASSERT(CanMemberCBegin); + { + const same_as> auto i = r.cbegin(); + if (!is_empty) { + assert(*i == *cbegin(expected)); + } + + if constexpr (copy_constructible) { + auto r2 = r; + const same_as> auto i2 = r2.cbegin(); + if (!is_empty) { + assert(*i2 == *i); + } + } + } + + // Validate view_interface::cbegin (const) + STATIC_ASSERT(CanMemberCBegin == ranges::range); + if constexpr (CanMemberCBegin) { + const same_as> auto ci = as_const(r).cbegin(); + if (!is_empty) { + assert(*ci == *cbegin(expected)); + } + + if constexpr (copy_constructible) { + const auto cr2 = r; + const same_as> auto ci2 = cr2.cbegin(); + if (!is_empty) { + assert(*ci2 == *ci); + } + } + } + + // Validate view_interface::cend + STATIC_ASSERT(CanMemberCEnd); + { + const same_as> auto s = r.cend(); + assert((r.cbegin() == s) == is_empty); + STATIC_ASSERT(common_range == (common_range && (sized_range || !bidirectional_range) )); + if constexpr (common_range && bidirectional_range) { + if (!is_empty) { + assert(*prev(s) == *prev(cend(expected))); + } + + if constexpr (copy_constructible) { + auto r2 = r; + if (!is_empty) { + assert(*prev(r2.cend()) == *prev(cend(expected))); + } + } + } + + if constexpr (!common_range) { + STATIC_ASSERT(same_as, default_sentinel_t>); + } + } + + // Validate view_interface::cend (const) + STATIC_ASSERT(CanMemberCEnd == ranges::range); + if constexpr (CanMemberCEnd) { + const same_as> auto cs = as_const(r).cend(); + assert((as_const(r).cbegin() == cs) == is_empty); + STATIC_ASSERT(common_range == // + (common_range && (sized_range || !bidirectional_range) )); + if constexpr (common_range && bidirectional_range) { + if (!is_empty) { + assert(*prev(cs) == *prev(cend(expected))); + } + + if constexpr (copy_constructible) { + const auto r2 = r; + if (!is_empty) { + assert(*prev(r2.cend()) == *prev(cend(expected))); + } + } + } + + if constexpr (!common_range) { + STATIC_ASSERT(same_as, default_sentinel_t>); + } + } + // Validate view_interface::data STATIC_ASSERT(!CanData); STATIC_ASSERT(!CanData); From bafe3e93467f4e84c52f5a31e489b78ead9abb25 Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 2 Aug 2023 15:08:45 +0200 Subject: [PATCH 4/7] Fixes --- tests/std/tests/P1899R3_views_stride/test.cpp | 2 +- tests/std/tests/P2278R4_views_as_const/test.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/P1899R3_views_stride/test.cpp b/tests/std/tests/P1899R3_views_stride/test.cpp index be2328717a..6fed56b85c 100644 --- a/tests/std/tests/P1899R3_views_stride/test.cpp +++ b/tests/std/tests/P1899R3_views_stride/test.cpp @@ -238,7 +238,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { auto r2 = r; - const same_as> auto i2 = r2.cbegin(); + const same_as> auto i2 = as_const(r2).cbegin(); if (!is_empty) { assert(*i2 == *i); } diff --git a/tests/std/tests/P2278R4_views_as_const/test.cpp b/tests/std/tests/P2278R4_views_as_const/test.cpp index fb9beeacd1..8f545f4380 100644 --- a/tests/std/tests/P2278R4_views_as_const/test.cpp +++ b/tests/std/tests/P2278R4_views_as_const/test.cpp @@ -442,7 +442,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto cr2 = r; - const same_as> auto ci2 = cr2.cbegin(); + const same_as> auto ci2 = as_const(cr2).cbegin(); if (!is_empty) { assert(*ci2 == *ci); } @@ -483,7 +483,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto r2 = r; if (!is_empty) { - assert(*prev(r2.cend()) == *prev(cend(expected))); + assert(*prev(as_const(r2).cend()) == *prev(cend(expected))); } } } From f9125671e8a6498240e2a6a7a2443648a3b28b8a Mon Sep 17 00:00:00 2001 From: Jakub Mazurkiewicz Date: Wed, 2 Aug 2023 15:59:16 +0200 Subject: [PATCH 5/7] Fix `views::stride` test --- tests/std/tests/P1899R3_views_stride/test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/std/tests/P1899R3_views_stride/test.cpp b/tests/std/tests/P1899R3_views_stride/test.cpp index 6fed56b85c..144bd34187 100644 --- a/tests/std/tests/P1899R3_views_stride/test.cpp +++ b/tests/std/tests/P1899R3_views_stride/test.cpp @@ -238,7 +238,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { auto r2 = r; - const same_as> auto i2 = as_const(r2).cbegin(); + const same_as> auto i2 = r2.cbegin(); if (!is_empty) { assert(*i2 == *i); } @@ -255,7 +255,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto cr2 = r; - const same_as> auto ci2 = cr2.cbegin(); + const same_as> auto ci2 = as_const(cr2).cbegin(); if (!is_empty) { assert(*ci2 == *ci); } @@ -301,7 +301,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto r2 = r; if (!is_empty) { - assert(*prev(r2.cend()) == *prev(cend(expected))); + assert(*prev(as_const(r2).cend()) == *prev(cend(expected))); } } } From faf39fd3534e999c4ca95e0fa6eb1025ce5504ad Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 2 Aug 2023 15:28:33 -0700 Subject: [PATCH 6/7] Code review feedback. --- tests/std/tests/P1899R3_views_stride/test.cpp | 8 ++++---- tests/std/tests/P2278R4_views_as_const/test.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/std/tests/P1899R3_views_stride/test.cpp b/tests/std/tests/P1899R3_views_stride/test.cpp index 144bd34187..2f8f8b6255 100644 --- a/tests/std/tests/P1899R3_views_stride/test.cpp +++ b/tests/std/tests/P1899R3_views_stride/test.cpp @@ -255,7 +255,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto cr2 = r; - const same_as> auto ci2 = as_const(cr2).cbegin(); + const same_as> auto ci2 = cr2.cbegin(); if (!is_empty) { assert(*ci2 == *ci); } @@ -291,8 +291,8 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (CanMemberCEnd) { const same_as> auto cs = as_const(r).cend(); assert((as_const(r).cbegin() == cs) == is_empty); - STATIC_ASSERT(common_range == // - (common_range && (sized_range || !bidirectional_range) )); + STATIC_ASSERT(common_range + == (common_range && (sized_range || !bidirectional_range) )); if constexpr (common_range && bidirectional_range) { if (!is_empty) { assert(*prev(cs) == *prev(cend(expected))); @@ -301,7 +301,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto r2 = r; if (!is_empty) { - assert(*prev(as_const(r2).cend()) == *prev(cend(expected))); + assert(*prev(r2.cend()) == *prev(cend(expected))); } } } diff --git a/tests/std/tests/P2278R4_views_as_const/test.cpp b/tests/std/tests/P2278R4_views_as_const/test.cpp index 8f545f4380..fb9beeacd1 100644 --- a/tests/std/tests/P2278R4_views_as_const/test.cpp +++ b/tests/std/tests/P2278R4_views_as_const/test.cpp @@ -442,7 +442,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto cr2 = r; - const same_as> auto ci2 = as_const(cr2).cbegin(); + const same_as> auto ci2 = cr2.cbegin(); if (!is_empty) { assert(*ci2 == *ci); } @@ -483,7 +483,7 @@ constexpr bool test_one(Rng&& rng, Expected&& expected) { if constexpr (copy_constructible) { const auto r2 = r; if (!is_empty) { - assert(*prev(as_const(r2).cend()) == *prev(cend(expected))); + assert(*prev(r2.cend()) == *prev(cend(expected))); } } } From 7af1e8b158497a1098290aa7bfab0966e18d788f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 9 Aug 2023 21:07:57 -0700 Subject: [PATCH 7/7] Work around GH 1030 by imitating P2321R2_views_zip_transform. --- tests/std/tests/P2321R2_views_zip/test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/std/tests/P2321R2_views_zip/test.cpp b/tests/std/tests/P2321R2_views_zip/test.cpp index dcc9e1a5cc..18bc23f655 100644 --- a/tests/std/tests/P2321R2_views_zip/test.cpp +++ b/tests/std/tests/P2321R2_views_zip/test.cpp @@ -769,6 +769,7 @@ constexpr bool instantiation_test_for_category() { using test::Sized, test::Common, test::CanDifference; +#ifndef _PREFAST_ // TRANSITION, GH-1030 InstantiatorType::call(); InstantiatorType::call(); InstantiatorType::call(); @@ -776,6 +777,7 @@ constexpr bool instantiation_test_for_category() { InstantiatorType::call(); InstantiatorType::call(); InstantiatorType::call(); +#endif // TRANSITION, GH-1030 InstantiatorType::call(); return true;