From 74b5cdf43c7933ff437a132864923475487435e6 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 19 Feb 2020 15:00:19 +0100 Subject: [PATCH 1/5] Implement range_size_t this resolves LWG 3335 (at least the applicable parts) by adding ranges_size_t --- stl/inc/xutility | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stl/inc/xutility b/stl/inc/xutility index 94a29388815..5ed97e33809 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -2483,6 +2483,10 @@ namespace ranges { inline constexpr _Size::_Cpo size; } + // ALIAS TEMPLATE ranges::range_size_t + template + using range_size_t = decltype(_RANGES size(_STD declval<_Rng&>())); + // CUSTOMIZATION POINT OBJECT ranges::empty (Implements D2091R0) namespace _Empty { // clang-format off From c360fa74a6b06d7d0ac434cf41e004d9eed32eda Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 19 Feb 2020 17:31:47 +0100 Subject: [PATCH 2/5] Add test --- tests/std/tests/P0896R4_ranges_range_machinery/test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp index 18a386fe6ec..98a8dc3c50f 100644 --- a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp +++ b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp @@ -324,6 +324,7 @@ constexpr bool test_size() { STATIC_ASSERT(ranges::sized_range == is_valid); if constexpr (is_valid) { STATIC_ASSERT(std::same_as())), Size>); + STATIC_ASSERT(std::same_as, Size>); STATIC_ASSERT(CanEmpty); } From 2b1c509787fab1eb6df84e111a7cb4bbb8937013 Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Fri, 21 Feb 2020 12:50:54 -0800 Subject: [PATCH 3/5] constrain range_size_t with sized_range instead of range ...per the resolution of LWG-3335. --- stl/inc/xutility | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 5ed97e33809..6afe1f0bc85 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -2484,7 +2484,7 @@ namespace ranges { } // ALIAS TEMPLATE ranges::range_size_t - template + template using range_size_t = decltype(_RANGES size(_STD declval<_Rng&>())); // CUSTOMIZATION POINT OBJECT ranges::empty (Implements D2091R0) From c8607d0c4c0ce8f47f572c4ff9a18d028b58f7cd Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Fri, 21 Feb 2020 12:56:13 -0800 Subject: [PATCH 4/5] Oops - move definition of range_size_t after definition of sized_range --- stl/inc/xutility | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 6afe1f0bc85..45873dea7c3 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -2483,10 +2483,6 @@ namespace ranges { inline constexpr _Size::_Cpo size; } - // ALIAS TEMPLATE ranges::range_size_t - template - using range_size_t = decltype(_RANGES size(_STD declval<_Rng&>())); - // CUSTOMIZATION POINT OBJECT ranges::empty (Implements D2091R0) namespace _Empty { // clang-format off @@ -2640,6 +2636,10 @@ namespace ranges { && requires(_Rng& __r) { _RANGES size(__r); }; // clang-format on + // ALIAS TEMPLATE ranges::range_size_t + template + using range_size_t = decltype(_RANGES size(_STD declval<_Rng&>())); + // STRUCT ranges::view_base struct view_base {}; From dbe9bb8adaf371676cb62d3f9c62811fc3912f65 Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Fri, 21 Feb 2020 13:20:40 -0800 Subject: [PATCH 5/5] Test negative cases for range_size_t also --- tests/std/tests/P0896R4_ranges_range_machinery/test.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp index 98a8dc3c50f..20fac5b0da3 100644 --- a/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp +++ b/tests/std/tests/P0896R4_ranges_range_machinery/test.cpp @@ -66,6 +66,9 @@ concept CanEmpty = requires(R&& r) { ranges::empty(std::forward(r)); }; template concept CanSize = requires(R&& r) { ranges::size(std::forward(r)); }; +template +concept CanSizeType = requires { typename ranges::range_size_t; }; + template concept CanData = requires(R&& r) { ranges::data(std::forward(r)); }; @@ -321,6 +324,7 @@ constexpr bool test_size() { STATIC_ASSERT(!is_valid || std::integral); STATIC_ASSERT(CanSize == is_valid); + STATIC_ASSERT(CanSizeType == is_valid); STATIC_ASSERT(ranges::sized_range == is_valid); if constexpr (is_valid) { STATIC_ASSERT(std::same_as())), Size>);