aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/std/ranges
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2025-03-05 16:46:15 -0500
committerPatrick Palka <ppalka@redhat.com>2025-03-05 16:46:15 -0500
commit410a4c126407c0ce048ad848d09cf4d39f578756 (patch)
tree541e1c391dc28d1c089e92848747709df0c5d45b /libstdc++-v3/testsuite/std/ranges
parent459c8a55567b06522e4b9cc0a4ef62f9d3024526 (diff)
downloadgcc-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.cc72
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();
+}