From 6eaf7f6b7a18e846c32cf88b2b007bbd948f127a Mon Sep 17 00:00:00 2001 From: Wim Haeck Date: Tue, 14 May 2024 02:14:55 -0600 Subject: [PATCH] It just works --- src/tools/std23/test/usecase.test.cpp | 26 +++++++++------------- src/tools/std23/views/chunk.hpp | 4 ++++ src/tools/std23/views/stride.hpp | 4 +++- src/tools/std23/views/test/stride.test.cpp | 6 ++--- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/tools/std23/test/usecase.test.cpp b/src/tools/std23/test/usecase.test.cpp index 1067fc6..6fee21c 100644 --- a/src/tools/std23/test/usecase.test.cpp +++ b/src/tools/std23/test/usecase.test.cpp @@ -163,21 +163,17 @@ SCENARIO( "use case" ) { CHECK( std20::random_access_range< DropChunk > ); CHECK( std20::sized_range< DropChunk > ); -// using StrideDrop = decltype( test.stride_drop() ); -// auto begin = std20::ranges::begin( test.stride_drop() ); -// auto end = std20::ranges::end( test.stride_drop() ); -// CHECK( std20::view< StrideDrop > ); -// CHECK( std20::range< StrideDrop > ); -// CHECK( std20::random_access_range< StrideDrop > ); -// CHECK( std20::sized_range< StrideDrop > ); - -// using ChunkDrop = decltype( test.chunk_drop() ); -// auto begin1 = std20::ranges::begin( test.chunk_drop() ); -// auto end1 = std20::ranges::end( test.chunk_drop() ); -// CHECK( std20::view< ChunkDrop > ); -// CHECK( std20::range< ChunkDrop > ); -// CHECK( std20::random_access_range< ChunkDrop > ); -// CHECK( std20::sized_range< ChunkDrop > ); + using StrideDrop = decltype( test.stride_drop() ); + CHECK( std20::view< StrideDrop > ); + CHECK( std20::range< StrideDrop > ); + CHECK( std20::random_access_range< StrideDrop > ); + CHECK( std20::sized_range< StrideDrop > ); + + using ChunkDrop = decltype( test.chunk_drop() ); + CHECK( std20::view< ChunkDrop > ); + CHECK( std20::range< ChunkDrop > ); + CHECK( std20::random_access_range< ChunkDrop > ); + CHECK( std20::sized_range< ChunkDrop > ); using ChunkStride = decltype( test.chunk_stride() ); CHECK( std20::view< ChunkStride > ); diff --git a/src/tools/std23/views/chunk.hpp b/src/tools/std23/views/chunk.hpp index 3a19304..e742b0f 100644 --- a/src/tools/std23/views/chunk.hpp +++ b/src/tools/std23/views/chunk.hpp @@ -271,16 +271,19 @@ struct chunk_view : std20::ranges::view_interface< chunk_view< R > > { constexpr R base() const { return base_; } + template < typename RR = R, std::enable_if_t< !std20::ranges::detail::simple_view< RR >, int> = 0> constexpr iterator< false > begin() { return { this, std20::ranges::begin( this->base_ ) }; } + template < typename RR = R, std::enable_if_t< std20::ranges::forward_range< const RR >, int > = 0 > constexpr iterator< true > begin() const { return { this, std20::ranges::begin( this->base_ ) }; } + template < typename RR = R, std::enable_if_t< !std20::ranges::detail::simple_view< RR >, int> = 0> constexpr iterator< false > end() { if constexpr ( std20::ranges::common_range< R > && std20::ranges::sized_range< R >) { @@ -298,6 +301,7 @@ struct chunk_view : std20::ranges::view_interface< chunk_view< R > > { } } + template < typename RR = R, std::enable_if_t< std20::ranges::forward_range< const RR >, int > = 0 > constexpr iterator< true > end() const { if constexpr ( std20::ranges::common_range< R > && std20::ranges::sized_range< R >) { diff --git a/src/tools/std23/views/stride.hpp b/src/tools/std23/views/stride.hpp index d0e9ae4..829b45b 100644 --- a/src/tools/std23/views/stride.hpp +++ b/src/tools/std23/views/stride.hpp @@ -273,11 +273,13 @@ struct stride_view : std20::ranges::view_interface< stride_view< R > > { constexpr R base() const { return base_; } + template < typename RR = R, std::enable_if_t< !std20::ranges::detail::simple_view< RR >, int> = 0> constexpr iterator< false > begin() { return { this, std20::ranges::begin( this->base_ ) }; } + template < typename RR = R, std::enable_if_t< std20::ranges::forward_range< const RR >, int > = 0 > constexpr iterator< true > begin() const { return { this, std20::ranges::begin( this->base_ ) }; @@ -303,7 +305,7 @@ struct stride_view : std20::ranges::view_interface< stride_view< R > > { } } - template < typename RR = R, std::enable_if_t< std20::ranges::range< const RR >, int > = 0 > + template < typename RR = R, std::enable_if_t< std20::ranges::forward_range< const RR >, int > = 0 > constexpr iterator< true > end() const { if constexpr ( std20::ranges::common_range< R > && diff --git a/src/tools/std23/views/test/stride.test.cpp b/src/tools/std23/views/test/stride.test.cpp index b19d39c..43be801 100644 --- a/src/tools/std23/views/test/stride.test.cpp +++ b/src/tools/std23/views/test/stride.test.cpp @@ -38,7 +38,7 @@ SCENARIO( "stride_view" ) { CHECK( ! std20::ranges::bidirectional_range< Range > ); CHECK( ! std20::ranges::random_access_range< Range > ); CHECK( ! std20::ranges::contiguous_range< Range > ); - CHECK( ! std20::ranges::common_range< Range > ); + CHECK( std20::ranges::common_range< Range > ); } THEN( "a stride_view can be constructed and members can be tested" ) { @@ -74,7 +74,7 @@ SCENARIO( "stride_view" ) { CHECK( std20::ranges::bidirectional_range< Range > ); CHECK( ! std20::ranges::random_access_range< Range > ); CHECK( ! std20::ranges::contiguous_range< Range > ); - CHECK( ! std20::ranges::common_range< Range > ); + CHECK( std20::ranges::common_range< Range > ); } THEN( "a stride_view can be constructed and members can be tested" ) { @@ -113,7 +113,7 @@ SCENARIO( "stride_view" ) { CHECK( std20::ranges::bidirectional_range< Range > ); CHECK( std20::ranges::random_access_range< Range > ); CHECK( ! std20::ranges::contiguous_range< Range > ); - CHECK( ! std20::ranges::common_range< Range > ); + CHECK( std20::ranges::common_range< Range > ); } THEN( "a stride_view can be constructed and members can be tested" ) {