diff options
author | Patrick Palka <ppalka@redhat.com> | 2025-03-05 16:46:15 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2025-03-05 16:46:15 -0500 |
commit | 410a4c126407c0ce048ad848d09cf4d39f578756 (patch) | |
tree | 541e1c391dc28d1c089e92848747709df0c5d45b /libstdc++-v3/testsuite/std/ranges | |
parent | 459c8a55567b06522e4b9cc0a4ef62f9d3024526 (diff) | |
download | gcc-410a4c126407c0ce048ad848d09cf4d39f578756.zip gcc-410a4c126407c0ce048ad848d09cf4d39f578756.tar.gz gcc-410a4c126407c0ce048ad848d09cf4d39f578756.tar.bz2 |
libstdc++: Implement P3138R5 views::cache_latest
libstdc++-v3/ChangeLog:
* include/bits/version.def (ranges_cache_latest): Define.
* include/bits/version.h: Regenerate.
* include/std/ranges (__detail::__non_propagating_cache::_M_reset):
Export from base class _Optional_base.
(cache_latest_view): Define for C++26.
(cache_latest_view::_Iterator): Likewise.
(cache_latest_view::_Sentinel): Likewise.
(views::__detail::__can_cache_latest): Likewise.
(views::_CacheLatest, views::cache_latest): Likewise.
* testsuite/std/ranges/adaptors/cache_latest/1.cc: New test.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Diffstat (limited to 'libstdc++-v3/testsuite/std/ranges')
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/adaptors/cache_latest/1.cc | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/cache_latest/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/cache_latest/1.cc new file mode 100644 index 0000000..5904831 --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/cache_latest/1.cc @@ -0,0 +1,72 @@ +// { dg-do run { target c++26 } } + +#include <ranges> + +#if __cpp_lib_ranges_cache_latest != 202411L +# error "Feature-test macro __cpp_lib_ranges_cache_latest has wrong value in <ranges>" +#endif + +#include <algorithm> +#include <testsuite_hooks.h> + +namespace ranges = std::ranges; +namespace views = std::views; + +constexpr bool +test01() +{ + int xs[] = {1,2,3,4,5}; + auto v = xs | views::cache_latest; + VERIFY( ranges::equal(v, xs) ); + VERIFY( ranges::size(v) == 5 ); + + auto it = v.begin(); + auto st = v.end(); + VERIFY( st - it == 5 ); + VERIFY( it - st == -5 ); + it++; + VERIFY( st - it == 4 ); + VERIFY( it - st == -4 ); + + auto jt = v.begin(); + ranges::iter_swap(it, jt); + VERIFY( ranges::equal(xs, (int[]){2,1,3,4,5}) ); + int n = ranges::iter_move(it); + VERIFY( n == 1 ); + ranges::iter_swap(it, jt); + + auto w = views::iota(1, 6) | views::cache_latest; + VERIFY( ranges::equal(w, xs) ); + + return true; +} + +constexpr bool +test02() +{ + // Motivating example from P3138R5 + int xs[] = {1, 2, 3, 4, 5}; + int transform_count = 0; + auto v = xs | views::transform([&](int i){ ++transform_count; return i * i; }) + | views::filter([](int i){ return i % 2 == 0; }); + VERIFY( ranges::equal(v, (int[]){4, 16}) ); + VERIFY( transform_count == 7 ); + + transform_count = 0; + auto w = xs | views::transform([&](int i){ ++transform_count; return i * i; }) + | views::cache_latest + | views::filter([](int i){ return i % 2 == 0; }); + VERIFY( ranges::equal(w, (int[]){4, 16}) ); + VERIFY( transform_count == 5 ); + + return true; +} + +int +main() +{ + static_assert(test01()); + static_assert(test02()); + test01(); + test02(); +} |