[libcxx-commits] [libcxx] [libc++] Implement P2442R1 `std::views::slide` (PR #172948)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Dec 23 22:19:05 PST 2025
https://github.com/anonymouspc updated https://github.com/llvm/llvm-project/pull/172948
>From c8b2b8a978f28e3fe888032de1899a0a020aa765 Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:55:19 +0800
Subject: [PATCH 1/7] Implement header <__ranges/slide.h>
---
libcxx/include/__ranges/slide_view.h | 403 +++++++++++++++++++++++++++
1 file changed, 403 insertions(+)
create mode 100644 libcxx/include/__ranges/slide_view.h
diff --git a/libcxx/include/__ranges/slide_view.h b/libcxx/include/__ranges/slide_view.h
new file mode 100644
index 0000000000000..e9b8666e22150
--- /dev/null
+++ b/libcxx/include/__ranges/slide_view.h
@@ -0,0 +1,403 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___RANGES_SLIDE_VIEW_H
+#define _LIBCPP___RANGES_SLIDE_VIEW_H
+
+#include <__algorithm/ranges_min.h>
+#include <__assert>
+#include <__concepts/constructible.h>
+#include <__concepts/convertible_to.h>
+#include <__config>
+#include <__functional/bind_back.h>
+#include <__iterator/advance.h>
+#include <__iterator/concepts.h>
+#include <__iterator/default_sentinel.h>
+#include <__iterator/distance.h>
+#include <__iterator/iter_move.h>
+#include <__iterator/iter_swap.h>
+#include <__iterator/iterator_traits.h>
+#include <__iterator/next.h>
+#include <__memory/addressof.h>
+#include <__ranges/access.h>
+#include <__ranges/all.h>
+#include <__ranges/concepts.h>
+#include <__ranges/counted.h>
+#include <__ranges/enable_borrowed_range.h>
+#include <__ranges/non_propagating_cache.h>
+#include <__ranges/range_adaptor.h>
+#include <__ranges/take_view.h>
+#include <__ranges/view_interface.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_nothrow_constructible.h>
+#include <__type_traits/make_unsigned.h>
+#include <__utility/forward.h>
+#include <__utility/move.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+_LIBCPP_PUSH_MACROS
+#include <__undef_macros>
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if _LIBCPP_STD_VER >= 23
+
+namespace ranges {
+
+template <class _View>
+concept __slide_caches_nothing = random_access_range<_View> && sized_range<_View>;
+
+template <class _View>
+concept __slide_caches_last = !__slide_caches_nothing<_View> && bidirectional_range<_View> && common_range<_View>;
+
+template <class _View>
+concept __slide_caches_first = !__slide_caches_nothing<_View> && !__slide_caches_last<_View>;
+
+template <forward_range _View>
+ requires view<_View>
+class slide_view : public view_interface<slide_view<_View>> {
+public:
+ _LIBCPP_NO_UNIQUE_ADDRESS _View __base_;
+ _LIBCPP_NO_UNIQUE_ADDRESS range_difference_t<_View> __n_;
+ _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_first<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache> __cached_begin_;
+ _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_last<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache> __cached_end_;
+
+ template <bool _Const>
+ class __iterator;
+ class __sentinel;
+
+public:
+ _LIBCPP_HIDE_FROM_ABI constexpr explicit slide_view(_View __base, range_difference_t<_View> __n)
+ : __base_(std::move(__base)), __n_(__n) {}
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _View base() const&
+ requires copy_constructible<_View>
+ {
+ return __base_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _View base() && {
+ return std::move(__base_);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto begin()
+ requires (!(__simple_view<_View> && __slide_caches_nothing<const _View>))
+ {
+ if constexpr (__slide_caches_first<_View>) {
+ __cached_begin_ = __iterator<false>(
+ ranges::begin(__base_),
+ ranges::next(ranges::begin(__base_), __n_ - 1, ranges::end(__base_)),
+ __n_
+ );
+ return __cached_begin_;
+ }
+ else
+ return __iterator<false>(ranges::begin(__base_), __n_);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDDEN constexpr auto begin() const
+ requires __slide_caches_nothing<const _View>
+ {
+ return __iterator<true>(ranges::begin(__base_), __n_);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto end()
+ requires (!(__simple_view<_View> && __slide_caches_nothing<const _View>))
+ {
+ if constexpr (__slide_caches_nothing<_View>)
+ return __iterator<false>(ranges::begin(__base_) + range_difference_t<_View>(size()), __n_);
+ else if constexpr (__slide_caches_last<_View>) {
+ __cached_end_ = __iterator<false>(ranges::prev(ranges::end(__base_), __n_ - 1, ranges::begin(__base_)), __n_);
+ return __cached_end_;
+ }
+ else if constexpr (common_range<_View>)
+ return __iterator<false>(ranges::end(__base_), ranges::end(__base_), __n_);
+ else
+ return __sentinel(ranges::end(__base_));
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto end() const
+ requires __slide_caches_nothing<const _View>
+ {
+ return begin() + range_difference_t<const _View>(size());
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto size()
+ requires sized_range<_View>
+ {
+ auto __sz = ranges::distance(__base_) - __n_ + 1;
+ if (__sz < 0)
+ __sz = 0;
+ return __to_unsigned_like(__sz);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto size() const
+ requires sized_range<const _View>
+ {
+ auto __sz = ranges::distance(__base_) - __n_ + 1;
+ if (__sz < 0)
+ __sz = 0;
+ return __to_unsigned_like(__sz);
+ }
+};
+
+template <forward_range _View>
+ requires view<_View>
+template <bool _Const>
+class slide_view<_View>::__iterator {
+ friend slide_view;
+ using _Base = _If<_Const, const _View, _View>;
+
+ _LIBCPP_NO_UNIQUE_ADDRESS iterator_t<_Base> __current_;
+ _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_first<_Base>, iterator_t<_Base>, __empty_cache> __last_ele_;
+ _LIBCPP_NO_UNIQUE_ADDRESS range_difference_t<_Base> __n_;
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator(iterator_t<_Base> __current, range_difference_t<_Base> __n)
+ requires (!__slide_caches_first<_Base>)
+ : __current_(__current),
+ __n_(__n) {}
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator(iterator_t<_Base> __current, iterator_t<_Base> __last_ele, range_difference_t<_Base> __n)
+ requires __slide_caches_first<_Base>
+ : __current_(__current),
+ __last_ele_(__last_ele),
+ __n_(__n) {}
+
+ [[nodiscard]] static consteval auto __get_iterator_concept() {
+ if constexpr (random_access_range<_Base>)
+ return random_access_iterator_tag{};
+ else if constexpr (bidirectional_range<_Base>)
+ return bidirectional_iterator_tag{};
+ else
+ return forward_iterator_tag{};
+ }
+
+public:
+ using iterator_category = std::input_iterator_tag;
+ using iterator_concept = decltype(__get_iterator_concept());
+ using value_type = decltype(views::counted(__current_, __n_));
+ using difference_type = range_difference_t<_Base>;
+
+ _LIBCPP_HIDE_FROM_ABI __iterator()
+ : __current_(iterator_t<_Base>()),
+ __last_ele_(_If<__slide_caches_first<_Base>, iterator_t<_Base>, __empty_cache>()),
+ __n_(0) {}
+
+ _LIBCPP_HIDE_FROM_ABI __iterator(__iterator<!_Const> __i)
+ requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
+ : __current_(std::move(__i.__current_)),
+ __n_(__i.__n_) {}
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const {
+ return views::counted(__current_, __n_);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __pos) const
+ requires random_access_range<_Base>
+ {
+ return views::counted(__current_ + __pos, __n_);
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() {
+ __current_ = ranges::next(__current_);
+ if constexpr (__slide_caches_first<_Base>)
+ __last_ele_ = ranges::next(__last_ele_);
+ return *this;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int) {
+ auto __tmp = *this;
+ ++*this;
+ return __tmp;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator--()
+ requires bidirectional_range<_Base>
+ {
+ __current_ = ranges::prev(__current_);
+ if constexpr (__slide_caches_first<_Base>)
+ __last_ele_ = ranges::prev(__last_ele_);
+ return *this;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator--(int)
+ requires bidirectional_range<_Base>
+ {
+ auto __tmp = *this;
+ --*this;
+ return __tmp;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator+=(difference_type __n)
+ requires random_access_range<_Base>
+ {
+ __current_ = __current_ + __n;
+ if constexpr (__slide_caches_first<_Base>)
+ __last_ele_ = __last_ele_ + __n;
+ return *this;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator-=(difference_type __n)
+ requires random_access_range<_Base>
+ {
+ __current_ = __current_ - __n;
+ if constexpr (__slide_caches_first<_Base>)
+ __last_ele_ = __last_ele_ - __n;
+ return *this;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator& __x, const __iterator& __y) {
+ if constexpr (__slide_caches_first<_Base>)
+ return __x.__last_ele_ == __y.__last_ele_;
+ else
+ return __x.__current_ == __y.__current_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<(const __iterator& __x, const __iterator& __y)
+ requires random_access_range<_Base>
+ {
+ return __x.__current_ < __y.__current_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>(const __iterator& __x, const __iterator& __y)
+ requires random_access_range<_Base>
+ {
+ return __y < __x;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<=(const __iterator& __x, const __iterator& __y)
+ requires random_access_range<_Base>
+ {
+ return !(__y < __x);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>=(const __iterator& __x, const __iterator& __y)
+ requires random_access_range<_Base>
+ {
+ return !(__x < __y);
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr auto operator<=>(const __iterator& __x, const __iterator& __y)
+ requires random_access_range<_Base> && three_way_comparable<iterator_t<_Base>>
+ {
+ return __x.__current_ <=> __y.__current_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator
+ operator+(const __iterator& __i, difference_type __pos)
+ requires random_access_range<_Base>
+ {
+ auto __r = __i;
+ __r += __pos;
+ return __r;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator
+ operator+(difference_type __pos, const __iterator& __i)
+ requires random_access_range<_Base>
+ {
+ auto __r = __i;
+ __r += __pos;
+ return __r;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr __iterator
+ operator-(const __iterator& __i, difference_type __pos)
+ requires random_access_range<_Base>
+ {
+ auto __r = __i;
+ __r -= __pos;
+ return __r;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type
+ operator-(const __iterator& __i, const __iterator& __j)
+ requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>>
+ {
+ if constexpr (__slide_caches_first<_View>)
+ return __i.__last_ele_ - __j.__last_ele_;
+ else
+ return __i.__current_ - __j.__current_;
+ }
+};
+
+template <forward_range _View>
+ requires view<_View>
+class slide_view<_View>::__sentinel {
+ sentinel_t<_View> __end_;
+
+ _LIBCPP_HIDE_FROM_ABI constexpr __sentinel(sentinel_t<_View> __end)
+ : __end_(__end) {}
+
+public:
+ _LIBCPP_HIDE_FROM_ABI constexpr __sentinel() = default;
+
+ template <bool _Const>
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator<_Const>& __x, const __sentinel& __y) {
+ return __x.__last_ele_ == __y.__end_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const __iterator<false>& __x, const __sentinel& __y)
+ requires disable_sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
+ {
+ return __x.__last_ele_ - __y.__end_;
+ }
+
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const __sentinel& __y, const __iterator<false>& __x)
+ requires disable_sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
+ {
+ return __y.__end_ - __x.__last_ele_;
+ }
+};
+
+template <class _Range>
+slide_view(_Range&&, range_difference_t<_Range>) -> slide_view<views::all_t<_Range>>;
+
+template <class _View>
+inline constexpr bool enable_borrowed_range<slide_view<_View>> = enable_borrowed_range<_View>;
+
+namespace views {
+namespace __slide {
+struct __fn {
+ template <viewable_range _Range>
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
+ operator()(_Range&& __range, range_difference_t<_Range> __n) noexcept(
+ noexcept(/*-----*/ slide_view(std::forward<_Range>(__range), std::forward<range_difference_t<_Range>>(__n))))
+ -> decltype(/*--*/ slide_view(std::forward<_Range>(__range), std::forward<range_difference_t<_Range>>(__n))) {
+ return /*---------*/ slide_view(std::forward<_Range>(__range), std::forward<range_difference_t<_Range>>(__n));
+ }
+
+ template <class _DifferenceType>
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
+ operator()(_DifferenceType __n) noexcept(is_nothrow_constructible_v<decay_t<_DifferenceType>, _DifferenceType>) {
+ return __pipeable(std::__bind_back(__fn{}, std::forward<_DifferenceType>(__n)));
+ }
+};
+
+} // namespace __slide
+
+inline namespace __cpo {
+inline constexpr auto slide = __slide::__fn{};
+
+} // namespace __cpo
+} // namespace views
+
+} // namespace ranges
+
+#endif // _LIBCPP_STD_VER >= 23
+
+_LIBCPP_END_NAMESPACE_STD
+
+_LIBCPP_POP_MACROS
+
+#endif // _LIBCPP___RANGES_SLIDE_VIEW_H
>From 6ebb863fe59e8cc1eccd72737328a598aae77f61 Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:56:47 +0800
Subject: [PATCH 2/7] Add include info in related headers, e.g. <ranges>
<version> and std-module.
---
libcxx/include/ranges | 8 ++++++++
libcxx/include/version | 2 +-
libcxx/modules/std/ranges.inc | 2 ++
3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/libcxx/include/ranges b/libcxx/include/ranges
index aa7f0b36c3877..7d37dabfd6e19 100644
--- a/libcxx/include/ranges
+++ b/libcxx/include/ranges
@@ -385,6 +385,13 @@ namespace std::ranges {
class chunk_by_view; // C++23
namespace views { inline constexpr unspecified chunk_by = unspecified; } // C++23
+
+ // [range.slide]
+ template <forward_range V>
+ requires view<V>
+ class slide_view<V>; // C++23
+
+ namespace views { inline constexpr unspecified slide = unspecified; } // C++23
}
namespace std {
@@ -473,6 +480,7 @@ namespace std {
# include <__ranges/from_range.h>
# include <__ranges/join_with_view.h>
# include <__ranges/repeat_view.h>
+# include <__ranges/slide_view.h>
# include <__ranges/to.h>
# include <__ranges/zip_transform_view.h>
# include <__ranges/zip_view.h>
diff --git a/libcxx/include/version b/libcxx/include/version
index 05532ea731ff3..632d7a50c7b30 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -529,7 +529,7 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_ranges_iota 202202L
# define __cpp_lib_ranges_join_with 202202L
# define __cpp_lib_ranges_repeat 202207L
-// # define __cpp_lib_ranges_slide 202202L
+# define __cpp_lib_ranges_slide 202202L
# define __cpp_lib_ranges_starts_ends_with 202106L
# define __cpp_lib_ranges_to_container 202202L
// # define __cpp_lib_ranges_zip 202110L
diff --git a/libcxx/modules/std/ranges.inc b/libcxx/modules/std/ranges.inc
index 67e571b9567dd..2c16460679f33 100644
--- a/libcxx/modules/std/ranges.inc
+++ b/libcxx/modules/std/ranges.inc
@@ -325,7 +325,9 @@ export namespace std {
namespace views {
using std::ranges::views::chunk;
}
+#endif
+#if _LIBCPP_STD_VER >= 23
using std::ranges::slide_view;
namespace views {
>From 13a951ad2fefa938f6b18a270d2303a1e3b80d2c Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:57:33 +0800
Subject: [PATCH 3/7] Add build info in related build files, e.g.
CMakeLists.txt
---
libcxx/include/CMakeLists.txt | 1 +
libcxx/include/module.modulemap.in | 4 ++++
libcxx/utils/generate_feature_test_macro_components.py | 1 -
3 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index e6d5d444cc1c2..8f0dbd987c874 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -737,6 +737,7 @@ set(files
__ranges/reverse_view.h
__ranges/single_view.h
__ranges/size.h
+ __ranges/slide_view.h
__ranges/split_view.h
__ranges/subrange.h
__ranges/take_view.h
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index feb6249e1e6db..9d84456ef55c8 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -1913,6 +1913,10 @@ module std [system] {
module reverse_view { header "__ranges/reverse_view.h" }
module single_view { header "__ranges/single_view.h" }
module size { header "__ranges/size.h" }
+ module slide_view {
+ header "__ranges/slide_view.h"
+ export std.functional.bind_back
+ }
module split_view {
header "__ranges/split_view.h"
export std.functional.bind_back
diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py
index 0802f865f9406..29986e50ff635 100644
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -1150,7 +1150,6 @@ def add_version_header(tc):
"name": "__cpp_lib_ranges_slide",
"values": {"c++23": 202202},
"headers": ["ranges"],
- "unimplemented": True,
},
{
"name": "__cpp_lib_ranges_starts_ends_with",
>From 273aa605612cfadc5533ac871c1bc31c54e02a4f Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:58:22 +0800
Subject: [PATCH 4/7] Append std tests for `views::slide`
---
.../range.slide/adaptor.pass.cpp | 77 ++++++++++++++++++
.../range.adaptors/range.slide/base.pass.cpp | 45 +++++++++++
.../range.adaptors/range.slide/begin.pass.cpp | 56 +++++++++++++
.../range.slide/ctad.compile.pass.cpp | 55 +++++++++++++
.../range.adaptors/range.slide/end.pass.cpp | 57 +++++++++++++
.../range.slide/general.pass.cpp | 33 ++++++++
.../range.slide.iter/compare.pass.cpp | 80 +++++++++++++++++++
.../range.slide.iter/decrement.pass.cpp | 58 ++++++++++++++
.../range.slide.iter/deref.pass.cpp | 40 ++++++++++
.../range.slide.iter/increment.pass.cpp | 56 +++++++++++++
10 files changed, 557 insertions(+)
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/ctad.compile.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
create mode 100644 libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
new file mode 100644
index 0000000000000..02ae041ca707c
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
@@ -0,0 +1,77 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// std::views::slide
+
+#include <algorithm>
+#include <array>
+#include <cassert>
+#include <concepts>
+#include <ranges>
+#include <utility>
+
+#include "test_range.h"
+
+constexpr bool test() {
+ std::array<int, 8> array = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::ref_view<std::array<int, 8>> view = array | std::views::all;
+
+ // Test `views::slide(view, n)`
+ {
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) slided =
+ std::views::slide(view, 2);
+ assert(std::ranges::equal(*slided.begin(), std::array{1, 2}));
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) const_slided =
+ std::views::slide(std::as_const(view), 2);
+ assert(std::ranges::equal(*const_slided.begin(), std::array{1, 2}));
+ }
+
+ // Test `views::slide(n)(range)`
+ {
+ static_assert(noexcept(std::views::slide(3)));
+ /*__pipable*/ auto adaptor = std::views::slide(3);
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) slided =
+ adaptor(view);
+ assert(std::ranges::equal(*slided.begin(), std::array{1, 2, 3}));
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) const_slided =
+ adaptor(std::as_const(view));
+ assert(std::ranges::equal(*const_slided.begin(), std::array{1, 2, 3}));
+ }
+
+ // Test `view | views::slide`
+ {
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) slided =
+ view | std::views::slide(4);
+ assert(std::ranges::equal(*slided.begin(), std::array{1, 2, 3, 4}));
+ std::same_as<std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>>> decltype(auto) const_slided =
+ std::as_const(view) | std::views::slide(4);
+ assert(std::ranges::equal(*const_slided.begin(), std::array{1, 2, 3, 4}));
+ }
+
+ // Test `views::slide | adaptor`
+ {
+ /*__pipable*/ auto adaptors = std::views::slide(3) | std::views::join;
+ std::ranges::input_range auto rejoined = view | adaptors;
+ assert(std::ranges::equal(rejoined, std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
+ std::ranges::input_range auto const_rejoined = std::as_const(view) | adaptors;
+ assert(std::ranges::equal(const_rejoined, std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
new file mode 100644
index 0000000000000..7ed0b64d2bc72
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr V base() const& requires copy_constructible<V>;
+// constexpr V base() &&;
+
+#include <array>
+#include <cassert>
+#include <concepts>
+#include <ranges>
+#include <utility>
+
+constexpr bool test() {
+ std::array<int, 8> array = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>> slided = array | std::views::slide(3);
+ std::ranges::slide_view<std::ranges::ref_view<const std::array<int, 8>>> const_slided =
+ std::as_const(array) | std::views::slide(4);
+
+ // Test `slide_view.base()`
+ {
+ std::same_as<std::array<int,8>&> decltype(auto) base = slided.base().base();
+ assert(std::addressof(base) == std::addressof(array));
+
+ std::same_as<const std::array<int,8>&> decltype(auto) const_base = const_slided.base().base();
+ assert(std::addressof(const_base) == std::addressof(array));
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
new file mode 100644
index 0000000000000..ca1ccaed07b3b
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
@@ -0,0 +1,56 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr auto begin() requires (!(__simple_view<V> && __slide_caches_nothing<V>));
+// constexpr auto begin() const requires __slide_caches_nothing<V>;
+
+#include <algorithm>
+#include <cassert>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
+ std::ranges::slide_view<std::ranges::ref_view<const std::vector<int>>> const_slided =
+ std::as_const(vector) | std::views::slide(3);
+
+ // Test `slide_view.begin()`
+ {
+ /*slide_view::__iterator<false>*/ std::forward_iterator auto it = slided.begin();
+ assert(std::ranges::equal( *it, std::vector{1, 2, 3}));
+ assert(std::ranges::equal(*++it, std::vector{2, 3, 4}));
+ assert(std::ranges::equal(*++it, std::vector{3, 4, 5}));
+ assert(std::ranges::equal(*++it, std::vector{4, 5, 6}));
+ assert(std::ranges::equal(*++it, std::vector{5, 6, 7}));
+ assert(std::ranges::equal(*++it, std::vector{6, 7, 8}));
+ assert(++it == slided.end());
+ /*slide_view::__iterator<true>*/ std::forward_iterator auto const_it = const_slided.begin();
+ assert(std::ranges::equal( *const_it, std::vector{1, 2, 3}));
+ assert(std::ranges::equal(*++const_it, std::vector{2, 3, 4}));
+ assert(std::ranges::equal(*++const_it, std::vector{3, 4, 5}));
+ assert(std::ranges::equal(*++const_it, std::vector{4, 5, 6}));
+ assert(std::ranges::equal(*++const_it, std::vector{5, 6, 7}));
+ assert(std::ranges::equal(*++const_it, std::vector{6, 7, 8}));
+ assert(++const_it == const_slided.end());
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/ctad.compile.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/ctad.compile.pass.cpp
new file mode 100644
index 0000000000000..0ddc1e3736835
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/ctad.compile.pass.cpp
@@ -0,0 +1,55 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// template <class R>
+// slide_view(R&&, range_difference_t<R>) -> slide_view<all_t<R>>;
+
+#include <ranges>
+
+struct view : std::ranges::view_base {
+ int* begin() const;
+ int* end() const;
+};
+
+struct range {
+ int* begin() const;
+ int* end() const;
+};
+
+struct borrowed_range {
+ int* begin() const;
+ int* end() const;
+};
+
+template <>
+inline constexpr bool std::ranges::enable_borrowed_range<borrowed_range> = true;
+
+void test_ctad() {
+ view v;
+ range r;
+ borrowed_range br;
+
+ // clang-format off
+ static_assert(std::same_as<decltype(std::ranges::slide_view(v, 0)),
+ std::ranges::slide_view<view>>);
+ static_assert(std::same_as<decltype(std::ranges::slide_view(std::move(v), 0)),
+ std::ranges::slide_view<view>>);
+ static_assert(std::same_as<decltype(std::ranges::slide_view(r, 0)),
+ std::ranges::slide_view<std::ranges::ref_view<range>>>);
+ static_assert(std::same_as<decltype(std::ranges::slide_view(std::move(r), 0)),
+ std::ranges::slide_view<std::ranges::owning_view<range>>>);
+ static_assert(std::same_as<decltype(std::ranges::slide_view(br, 0)),
+ std::ranges::slide_view<std::ranges::ref_view<borrowed_range>>>);
+ static_assert(std::same_as<decltype(std::ranges::slide_view(std::move(br), 0)),
+ std::ranges::slide_view<std::ranges::owning_view<borrowed_range>>>);
+ // clang-format on
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
new file mode 100644
index 0000000000000..00e01c963ec07
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
@@ -0,0 +1,57 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr auto end() requires (!(__simple_view<V> && __slide_caches_nothing<V>));
+// constexpr auto end() const requires __slide_caches_nothing<V>;
+
+#include <algorithm>
+#include <cassert>
+#include <concepts>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
+ std::ranges::slide_view<std::ranges::ref_view<const std::vector<int>>> const_slided =
+ std::as_const(vector) | std::views::slide(3);
+
+ // Test `slide_view.end()` when V models forward_range
+ {
+ /*slide_view::__iterator<false>*/ std::forward_iterator auto it = slided.end();
+ assert(std::ranges::equal(*--it, std::vector{6, 7, 8}));
+ assert(std::ranges::equal(*--it, std::vector{5, 6, 7}));
+ assert(std::ranges::equal(*--it, std::vector{4, 5, 6}));
+ assert(std::ranges::equal(*--it, std::vector{3, 4, 5}));
+ assert(std::ranges::equal(*--it, std::vector{2, 3, 4}));
+ assert(std::ranges::equal(*--it, std::vector{1, 2, 3}));
+ assert(it == slided.begin());
+ /*slide_view::__iterator<true>*/ std::forward_iterator auto const_it = const_slided.end();
+ assert(std::ranges::equal(*--const_it, std::vector{6, 7, 8}));
+ assert(std::ranges::equal(*--const_it, std::vector{5, 6, 7}));
+ assert(std::ranges::equal(*--const_it, std::vector{4, 5, 6}));
+ assert(std::ranges::equal(*--const_it, std::vector{3, 4, 5}));
+ assert(std::ranges::equal(*--const_it, std::vector{2, 3, 4}));
+ assert(std::ranges::equal(*--const_it, std::vector{1, 2, 3}));
+ assert(const_it == const_slided.begin());
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
new file mode 100644
index 0000000000000..73f4c697f0a8d
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// General tests for slide_view. This file does not test anything specifically.
+
+#include <algorithm>
+#include <cassert>
+#include <ranges>
+#include <string_view>
+
+constexpr bool test() {
+ std::string_view str = "amanaplanacanalpanama"; // A man, a plan, a canal, Panama!
+ auto str2 = str | std::views::slide(4) | std::views::join;
+ auto str3 = str | std::views::reverse | std::views::slide(4) | std::views::join;
+ assert(std::ranges::equal(str2, str3));
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
new file mode 100644
index 0000000000000..63efd9bb00d9b
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
@@ -0,0 +1,80 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// friend constexpr bool operator==(const iterator& x, const iterator& y)
+// friend constexpr bool operator<(const iterator& x, const iterator& y)
+// requires random_access_range<Base>;
+// friend constexpr bool operator>(const iterator& x, const iterator& y)
+// requires random_access_range<Base>;
+// friend constexpr bool operator<=(const iterator& x, const iterator& y)
+// requires random_access_range<Base>;
+// friend constexpr bool operator>=(const iterator& x, const iterator& y)
+// requires random_access_range<Base>;
+// friend constexpr auto operator<=>(const iterator& x, const iterator& y)
+// requires random_access_range<Base> &&
+// three_way_comparable<iterator_t<Base>>;
+
+#include <algorithm>
+#include <cassert>
+#include <compare>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
+
+ // Test `friend constexpr bool operator==(const iterator& x, const iterator& y)`
+ {
+ assert(slided.begin() == slided.begin());
+ assert(slided.end() == slided.end());
+ }
+
+ // Test `friend constexpr bool operator<(const iterator& x, const iterator& y)`
+ {
+ assert(slided.begin() < slided.end());
+ }
+
+ // Test `friend constexpr bool operator>(const iterator& x, const iterator& y)`
+ {
+ assert(slided.end() > slided.begin());
+ }
+
+ // Test `friend constexpr bool operator>=(const iterator& x, const iterator& y)`
+ {
+ assert(slided.begin() <= slided.begin());
+ assert(slided.begin() <= slided.end());
+ }
+
+ // Test `friend constexpr bool operator>=(const iterator& x, const iterator& y)`
+ {
+ assert(slided.end() >= slided.end());
+ assert(slided.end() >= slided.begin());
+ }
+
+ // Test `friend constexpr auto operator<=>(const iterator& x, const iterator& y)`
+ {
+ assert((slided.begin() <=> slided.begin()) == std::strong_ordering::equal);
+ assert((slided.begin() <=> slided.end()) == std::strong_ordering::less);
+ assert((slided.end() <=> slided.begin()) == std::strong_ordering::greater);
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
new file mode 100644
index 0000000000000..f24b2dc537af3
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
@@ -0,0 +1,58 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr iterator& operator--()
+// requires bidirectional_range<Base>;
+// constexpr iterator operator--(int)
+// requires bidirectional_range<Base>;
+// constexpr iterator& operator-=(difference_type)
+// requires random_access_range<Base>;
+
+#include <algorithm>
+#include <cassert>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(2);
+
+ // Test `constexpr iterator& operator--();`
+ {
+ /*slide_view::__iterator<false>*/ std::bidirectional_iterator auto it = slided.end();
+ assert(std::ranges::equal(*--it, std::vector{7, 8}));
+ }
+
+ // Test `constexpr iterator operator--(int)`
+ {
+ /*slide_view::__iterator<false>*/ std::bidirectional_iterator auto it = slided.end();
+ it--;
+ assert(std::ranges::equal(*it, std::vector{7, 8}));
+ }
+
+ // Test `constexpr iterator& operator-=(difference_type)`
+ {
+ /*slide_view::__iterator<false>*/ std::random_access_iterator auto it = slided.end();
+ it -= 3;
+ assert(std::ranges::equal(*it, std::vector{5, 6}));
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
new file mode 100644
index 0000000000000..cabe28f58eeb7
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr value_type iterator::operator*() const;
+
+#include <algorithm>
+#include <cassert>
+#include <compare>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
+
+ // Test `constexpr range_reference_v<V> inner_iterator::operator*() const`
+ {
+ std::same_as<std::span<int>> decltype(auto) v = *slided.begin();
+ assert(std::ranges::equal(v, std::vector{1, 2, 3}));
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
new file mode 100644
index 0000000000000..46deb84b1745b
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
@@ -0,0 +1,56 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// constexpr iterator& operator++();
+// constexpr iterator operator++(int);
+// constexpr iterator& operator+=(difference_type)
+// requires random_access_range<Base>;
+
+#include <algorithm>
+#include <cassert>
+#include <iterator>
+#include <ranges>
+#include <vector>
+
+constexpr bool test() {
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(2);
+
+ // Test `constexpr iterator& operator++();`
+ {
+ /*slide_view::__iterator<false>*/ std::forward_iterator auto it = slided.begin();
+ assert(std::ranges::equal(*++it, std::vector{2, 3}));
+ }
+
+ // Test `constexpr iterator operator++(int)`
+ {
+ /*slide_view::__iterator<false>*/ std::forward_iterator auto it = slided.begin();
+ it++;
+ assert(std::ranges::equal(*it, std::vector{2, 3}));
+ }
+
+ // Test `constexpr iterator& operator+=(difference_type)`
+ {
+ /*slide_view::__iterator<false>*/ std::random_access_iterator auto it = slided.begin();
+ it += 3;
+ assert(std::ranges::equal(*it, std::vector{4, 5}));
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
>From 9dfdd92854e915cde20a9b2eeefb7ab47582f514 Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:58:42 +0800
Subject: [PATCH 5/7] Append libcxx tests for `views::slide`
---
.../no_unique_address.compile.pass.cpp | 38 ++++++++
.../range.slide/nodiscard.verify.cpp | 86 +++++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
create mode 100644 libcxx/test/libcxx/ranges/range.adaptors/range.slide/nodiscard.verify.cpp
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
new file mode 100644
index 0000000000000..2319745dcee5e
--- /dev/null
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// This test ensures that we use `[[no_unique_address]]` in `slide_view`.
+
+#include <cstddef>
+#include <ranges>
+#include <string>
+#include <type_traits>
+
+#include "test_iterators.h"
+#include "test_range.h"
+
+struct random_access_view {
+ int* begin() const;
+ int* end() const;
+};
+template <>
+inline constexpr bool std::ranges::enable_view<random_access_view> = true;
+static_assert(std::ranges::forward_range<random_access_view>);
+
+using SV = std::ranges::slide_view<random_access_view>;
+// Expected SV layout:
+// [[no_unique_address]] _View __base_ // size: 0
+// [[no_unique_address]] range_difference_t<_View> __n_ // size: sizeof(ptrdiff_t)
+// [[no_unique_address]] _If<__slide_caches_first, iterator_t<_View>, __empty_cache_> // size: 0, __slide_caches_nothing
+// [[no_unique_address]] _If<__slide_caches_last, iterator_t<_View>, __empty_cache_> // size: 0, __slide_caches_nothing
+ // size: two adjacent __empty_cache has 1 byte.
+static_assert(sizeof(SV) == sizeof(std::ptrdiff_t) * 2);
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.slide/nodiscard.verify.cpp b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/nodiscard.verify.cpp
new file mode 100644
index 0000000000000..efc77242d0e64
--- /dev/null
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/nodiscard.verify.cpp
@@ -0,0 +1,86 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++23
+
+// <ranges>
+
+// Test the libc++ extension that methods in std::ranges::slide_view is marked as [[nodiscard]].
+
+#include <ranges>
+#include <utility>
+
+void test() {
+ char range[6] = {'x', 'x', 'y', 'y', 'z', 'z'};
+ auto view = range | std::views::slide(2);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::slide(3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::slide(range, 3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ range | std::views::slide(3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::reverse | std::views::slide(3);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ view.base();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::as_const(view).base();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::move(std::as_const(view)).base();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::move(view).base();
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ view.begin();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::as_const(view).begin();
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ view.end();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::as_const(view).end();
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::slide(3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::slide(range, 3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ range | std::views::slide(3);
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::views::reverse | std::views::slide(3);
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ *view.begin();
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ *std::as_const(view).begin();
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (view.begin() == view.end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (std::as_const(view).begin() == view.end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (view.begin() == std::as_const(view).end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (std::as_const(view).begin() == std::as_const(view).end());
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (view.begin() == view.end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (std::as_const(view).begin() == view.end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (view.begin() == std::as_const(view).end());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ (std::as_const(view).begin() == std::as_const(view).end());
+
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::ranges::iter_move(view.begin());
+ // expected-warning at +1 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ std::ranges::iter_move(std::as_const(view).begin());
+}
>From 814ce8c87dcb7c0efb10ce0348a4f7199eb87ff1 Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 13:59:26 +0800
Subject: [PATCH 6/7] Change the documents and release-notes on the current
status
---
libcxx/docs/FeatureTestMacroTable.rst | 2 +-
libcxx/docs/ReleaseNotes/22.rst | 1 +
libcxx/docs/Status/Cxx23Papers.csv | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index 756bdf71f8b22..82198ac37509c 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -384,7 +384,7 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_repeat`` ``202207L``
---------------------------------------------------------- -----------------
- ``__cpp_lib_ranges_slide`` *unimplemented*
+ ``__cpp_lib_ranges_slide`` ``202202L``
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_starts_ends_with`` ``202106L``
---------------------------------------------------------- -----------------
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 603551cb0f603..40207d2157777 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -49,6 +49,7 @@ Implemented Papers
- P2835R7: Expose ``std::atomic_ref``'s object address (`Github <https://llvm.org/PR118377>`__)
- P2944R3: Comparisons for ``reference_wrapper`` (`Github <https://llvm.org/PR105424>`__)
- P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__)
+- P2442R1: P2442R1: Windowing range adaptors: ``views::chunk`` and ``views::slide`` (`Github <https://llvm.org/PR172948>`__) (Implemented ``views::slide`` only)
Improvements and New Features
-----------------------------
diff --git a/libcxx/docs/Status/Cxx23Papers.csv b/libcxx/docs/Status/Cxx23Papers.csv
index b655384bad7f2..05b9d3cdc695a 100644
--- a/libcxx/docs/Status/Cxx23Papers.csv
+++ b/libcxx/docs/Status/Cxx23Papers.csv
@@ -48,7 +48,7 @@
"`P2387R3 <https://wg21.link/P2387R3>`__","Pipe support for user-defined range adaptors","2022-02 (Virtual)","|Complete|","19","`#105183 <https://github.com/llvm/llvm-project/issues/105183>`__",""
"`P2440R1 <https://wg21.link/P2440R1>`__","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","2022-02 (Virtual)","|Partial|","","`#105184 <https://github.com/llvm/llvm-project/issues/105184>`__","Only ``ranges::iota`` is implemented."
"`P2441R2 <https://wg21.link/P2441R2>`__","``views::join_with``","2022-02 (Virtual)","|Complete|","21","`#105185 <https://github.com/llvm/llvm-project/issues/105185>`__",""
-"`P2442R1 <https://wg21.link/P2442R1>`__","Windowing range adaptors: ``views::chunk`` and ``views::slide``","2022-02 (Virtual)","","","`#105187 <https://github.com/llvm/llvm-project/issues/105187>`__",""
+"`P2442R1 <https://wg21.link/P2442R1>`__","Windowing range adaptors: ``views::chunk`` and ``views::slide``","2022-02 (Virtual)","|Partial|","22","`#105187 <https://github.com/llvm/llvm-project/issues/105187>`__","Only ``views::slide`` is implemented."
"`P2443R1 <https://wg21.link/P2443R1>`__","``views::chunk_by``","2022-02 (Virtual)","|Complete|","18","`#105188 <https://github.com/llvm/llvm-project/issues/105188>`__",""
"","","","","","",""
"`P0009R18 <https://wg21.link/P0009R18>`__","mdspan: A Non-Owning Multidimensional Array Reference","2022-07 (Virtual)","|Complete|","18","`#105189 <https://github.com/llvm/llvm-project/issues/105189>`__",""
>From dd68896ecf7f3218144722a5e116e95056896144 Mon Sep 17 00:00:00 2001
From: anonymouspc <shyeyian at petalmail.com>
Date: Wed, 24 Dec 2025 14:18:47 +0800
Subject: [PATCH 7/7] Clang-format
---
libcxx/include/__ranges/slide_view.h | 88 +++++++++----------
.../no_unique_address.compile.pass.cpp | 2 +-
.../range.slide/adaptor.pass.cpp | 7 +-
.../range.adaptors/range.slide/base.pass.cpp | 6 +-
.../range.adaptors/range.slide/begin.pass.cpp | 6 +-
.../range.adaptors/range.slide/end.pass.cpp | 2 +-
.../range.slide/general.pass.cpp | 4 +-
.../range.slide.iter/compare.pass.cpp | 2 +-
.../range.slide.iter/decrement.pass.cpp | 2 +-
.../range.slide.iter/deref.pass.cpp | 2 +-
.../range.slide.iter/increment.pass.cpp | 2 +-
11 files changed, 59 insertions(+), 64 deletions(-)
diff --git a/libcxx/include/__ranges/slide_view.h b/libcxx/include/__ranges/slide_view.h
index e9b8666e22150..eceae033a450f 100644
--- a/libcxx/include/__ranges/slide_view.h
+++ b/libcxx/include/__ranges/slide_view.h
@@ -69,8 +69,10 @@ class slide_view : public view_interface<slide_view<_View>> {
public:
_LIBCPP_NO_UNIQUE_ADDRESS _View __base_;
_LIBCPP_NO_UNIQUE_ADDRESS range_difference_t<_View> __n_;
- _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_first<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache> __cached_begin_;
- _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_last<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache> __cached_end_;
+ _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_first<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache>
+ __cached_begin_;
+ _LIBCPP_NO_UNIQUE_ADDRESS _If<__slide_caches_last<_View>, __non_propagating_cache<iterator_t<_View>>, __empty_cache>
+ __cached_end_;
template <bool _Const>
class __iterator;
@@ -86,48 +88,41 @@ class slide_view : public view_interface<slide_view<_View>> {
return __base_;
}
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _View base() && {
- return std::move(__base_);
- }
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto begin()
- requires (!(__simple_view<_View> && __slide_caches_nothing<const _View>))
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto begin()
+ requires(!(__simple_view<_View> && __slide_caches_nothing<const _View>))
{
if constexpr (__slide_caches_first<_View>) {
__cached_begin_ = __iterator<false>(
- ranges::begin(__base_),
- ranges::next(ranges::begin(__base_), __n_ - 1, ranges::end(__base_)),
- __n_
- );
+ ranges::begin(__base_), ranges::next(ranges::begin(__base_), __n_ - 1, ranges::end(__base_)), __n_);
return __cached_begin_;
- }
- else
- return __iterator<false>(ranges::begin(__base_), __n_);
+ } else
+ return __iterator<false>(ranges::begin(__base_), __n_);
}
[[nodiscard]] _LIBCPP_HIDDEN constexpr auto begin() const
- requires __slide_caches_nothing<const _View>
+ requires __slide_caches_nothing<const _View>
{
return __iterator<true>(ranges::begin(__base_), __n_);
}
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto end()
- requires (!(__simple_view<_View> && __slide_caches_nothing<const _View>))
+ requires(!(__simple_view<_View> && __slide_caches_nothing<const _View>))
{
if constexpr (__slide_caches_nothing<_View>)
return __iterator<false>(ranges::begin(__base_) + range_difference_t<_View>(size()), __n_);
else if constexpr (__slide_caches_last<_View>) {
__cached_end_ = __iterator<false>(ranges::prev(ranges::end(__base_), __n_ - 1, ranges::begin(__base_)), __n_);
return __cached_end_;
- }
- else if constexpr (common_range<_View>)
+ } else if constexpr (common_range<_View>)
return __iterator<false>(ranges::end(__base_), ranges::end(__base_), __n_);
else
return __sentinel(ranges::end(__base_));
}
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto end() const
- requires __slide_caches_nothing<const _View>
+ requires __slide_caches_nothing<const _View>
{
return begin() + range_difference_t<const _View>(size());
}
@@ -137,7 +132,7 @@ class slide_view : public view_interface<slide_view<_View>> {
{
auto __sz = ranges::distance(__base_) - __n_ + 1;
if (__sz < 0)
- __sz = 0;
+ __sz = 0;
return __to_unsigned_like(__sz);
}
@@ -146,7 +141,7 @@ class slide_view : public view_interface<slide_view<_View>> {
{
auto __sz = ranges::distance(__base_) - __n_ + 1;
if (__sz < 0)
- __sz = 0;
+ __sz = 0;
return __to_unsigned_like(__sz);
}
};
@@ -163,16 +158,14 @@ class slide_view<_View>::__iterator {
_LIBCPP_NO_UNIQUE_ADDRESS range_difference_t<_Base> __n_;
_LIBCPP_HIDE_FROM_ABI constexpr __iterator(iterator_t<_Base> __current, range_difference_t<_Base> __n)
- requires (!__slide_caches_first<_Base>)
- : __current_(__current),
- __n_(__n) {}
+ requires(!__slide_caches_first<_Base>)
+ : __current_(__current), __n_(__n) {}
- _LIBCPP_HIDE_FROM_ABI constexpr __iterator(iterator_t<_Base> __current, iterator_t<_Base> __last_ele, range_difference_t<_Base> __n)
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator(
+ iterator_t<_Base> __current, iterator_t<_Base> __last_ele, range_difference_t<_Base> __n)
requires __slide_caches_first<_Base>
- : __current_(__current),
- __last_ele_(__last_ele),
- __n_(__n) {}
-
+ : __current_(__current), __last_ele_(__last_ele), __n_(__n) {}
+
[[nodiscard]] static consteval auto __get_iterator_concept() {
if constexpr (random_access_range<_Base>)
return random_access_iterator_tag{};
@@ -189,21 +182,18 @@ class slide_view<_View>::__iterator {
using difference_type = range_difference_t<_Base>;
_LIBCPP_HIDE_FROM_ABI __iterator()
- : __current_(iterator_t<_Base>()),
- __last_ele_(_If<__slide_caches_first<_Base>, iterator_t<_Base>, __empty_cache>()),
- __n_(0) {}
+ : __current_(iterator_t<_Base>()),
+ __last_ele_(_If<__slide_caches_first<_Base>, iterator_t<_Base>, __empty_cache>()),
+ __n_(0) {}
_LIBCPP_HIDE_FROM_ABI __iterator(__iterator<!_Const> __i)
requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
- : __current_(std::move(__i.__current_)),
- __n_(__i.__n_) {}
+ : __current_(std::move(__i.__current_)), __n_(__i.__n_) {}
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const {
- return views::counted(__current_, __n_);
- }
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator*() const { return views::counted(__current_, __n_); }
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __pos) const
- requires random_access_range<_Base>
+ requires random_access_range<_Base>
{
return views::counted(__current_ + __pos, __n_);
}
@@ -215,7 +205,7 @@ class slide_view<_View>::__iterator {
return *this;
}
- _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int) {
+ _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int) {
auto __tmp = *this;
++*this;
return __tmp;
@@ -231,15 +221,15 @@ class slide_view<_View>::__iterator {
}
_LIBCPP_HIDE_FROM_ABI constexpr __iterator operator--(int)
- requires bidirectional_range<_Base>
- {
+ requires bidirectional_range<_Base>
+ {
auto __tmp = *this;
--*this;
return __tmp;
}
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator+=(difference_type __n)
- requires random_access_range<_Base>
+ requires random_access_range<_Base>
{
__current_ = __current_ + __n;
if constexpr (__slide_caches_first<_Base>)
@@ -248,7 +238,7 @@ class slide_view<_View>::__iterator {
}
_LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator-=(difference_type __n)
- requires random_access_range<_Base>
+ requires random_access_range<_Base>
{
__current_ = __current_ - __n;
if constexpr (__slide_caches_first<_Base>)
@@ -336,24 +326,26 @@ template <forward_range _View>
class slide_view<_View>::__sentinel {
sentinel_t<_View> __end_;
- _LIBCPP_HIDE_FROM_ABI constexpr __sentinel(sentinel_t<_View> __end)
- : __end_(__end) {}
+ _LIBCPP_HIDE_FROM_ABI constexpr __sentinel(sentinel_t<_View> __end) : __end_(__end) {}
public:
_LIBCPP_HIDE_FROM_ABI constexpr __sentinel() = default;
template <bool _Const>
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const __iterator<_Const>& __x, const __sentinel& __y) {
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr bool
+ operator==(const __iterator<_Const>& __x, const __sentinel& __y) {
return __x.__last_ele_ == __y.__end_;
}
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const __iterator<false>& __x, const __sentinel& __y)
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View>
+ operator-(const __iterator<false>& __x, const __sentinel& __y)
requires disable_sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
{
return __x.__last_ele_ - __y.__end_;
}
- [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const __sentinel& __y, const __iterator<false>& __x)
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View>
+ operator-(const __sentinel& __y, const __iterator<false>& __x)
requires disable_sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
{
return __y.__end_ - __x.__last_ele_;
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
index 2319745dcee5e..5b76c7af48543 100644
--- a/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.slide/no_unique_address.compile.pass.cpp
@@ -34,5 +34,5 @@ using SV = std::ranges::slide_view<random_access_view>;
// [[no_unique_address]] range_difference_t<_View> __n_ // size: sizeof(ptrdiff_t)
// [[no_unique_address]] _If<__slide_caches_first, iterator_t<_View>, __empty_cache_> // size: 0, __slide_caches_nothing
// [[no_unique_address]] _If<__slide_caches_last, iterator_t<_View>, __empty_cache_> // size: 0, __slide_caches_nothing
- // size: two adjacent __empty_cache has 1 byte.
+// size: two adjacent __empty_cache has 1 byte.
static_assert(sizeof(SV) == sizeof(std::ptrdiff_t) * 2);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
index 02ae041ca707c..4f82a4faeef84 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/adaptor.pass.cpp
@@ -61,9 +61,12 @@ constexpr bool test() {
{
/*__pipable*/ auto adaptors = std::views::slide(3) | std::views::join;
std::ranges::input_range auto rejoined = view | adaptors;
- assert(std::ranges::equal(rejoined, std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
+ assert(std::ranges::equal(
+ rejoined, std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
std::ranges::input_range auto const_rejoined = std::as_const(view) | adaptors;
- assert(std::ranges::equal(const_rejoined, std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
+ assert(std::ranges::equal(
+ const_rejoined,
+ std::array{1, 2, 3, /*|*/ 2, 3, 4, /*|*/ 3, 4, 5, /*|*/ 4, 5, 6, /*|*/ 5, 6, 7, /*|*/ 6, 7, 8}));
}
return true;
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
index 7ed0b64d2bc72..0d6c5c0ae87d4 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/base.pass.cpp
@@ -20,17 +20,17 @@
#include <utility>
constexpr bool test() {
- std::array<int, 8> array = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::array<int, 8> array = {1, 2, 3, 4, 5, 6, 7, 8};
std::ranges::slide_view<std::ranges::ref_view<std::array<int, 8>>> slided = array | std::views::slide(3);
std::ranges::slide_view<std::ranges::ref_view<const std::array<int, 8>>> const_slided =
std::as_const(array) | std::views::slide(4);
// Test `slide_view.base()`
{
- std::same_as<std::array<int,8>&> decltype(auto) base = slided.base().base();
+ std::same_as<std::array<int, 8>&> decltype(auto) base = slided.base().base();
assert(std::addressof(base) == std::addressof(array));
- std::same_as<const std::array<int,8>&> decltype(auto) const_base = const_slided.base().base();
+ std::same_as<const std::array<int, 8>&> decltype(auto) const_base = const_slided.base().base();
assert(std::addressof(const_base) == std::addressof(array));
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
index ca1ccaed07b3b..7da972ee1c44d 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/begin.pass.cpp
@@ -20,7 +20,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
std::ranges::slide_view<std::ranges::ref_view<const std::vector<int>>> const_slided =
std::as_const(vector) | std::views::slide(3);
@@ -28,7 +28,7 @@ constexpr bool test() {
// Test `slide_view.begin()`
{
/*slide_view::__iterator<false>*/ std::forward_iterator auto it = slided.begin();
- assert(std::ranges::equal( *it, std::vector{1, 2, 3}));
+ assert(std::ranges::equal(*it, std::vector{1, 2, 3}));
assert(std::ranges::equal(*++it, std::vector{2, 3, 4}));
assert(std::ranges::equal(*++it, std::vector{3, 4, 5}));
assert(std::ranges::equal(*++it, std::vector{4, 5, 6}));
@@ -36,7 +36,7 @@ constexpr bool test() {
assert(std::ranges::equal(*++it, std::vector{6, 7, 8}));
assert(++it == slided.end());
/*slide_view::__iterator<true>*/ std::forward_iterator auto const_it = const_slided.begin();
- assert(std::ranges::equal( *const_it, std::vector{1, 2, 3}));
+ assert(std::ranges::equal(*const_it, std::vector{1, 2, 3}));
assert(std::ranges::equal(*++const_it, std::vector{2, 3, 4}));
assert(std::ranges::equal(*++const_it, std::vector{3, 4, 5}));
assert(std::ranges::equal(*++const_it, std::vector{4, 5, 6}));
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
index 00e01c963ec07..0c842c444ce72 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/end.pass.cpp
@@ -21,7 +21,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
std::ranges::slide_view<std::ranges::ref_view<const std::vector<int>>> const_slided =
std::as_const(vector) | std::views::slide(3);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
index 73f4c697f0a8d..ae05571c43317 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/general.pass.cpp
@@ -19,8 +19,8 @@
constexpr bool test() {
std::string_view str = "amanaplanacanalpanama"; // A man, a plan, a canal, Panama!
- auto str2 = str | std::views::slide(4) | std::views::join;
- auto str3 = str | std::views::reverse | std::views::slide(4) | std::views::join;
+ auto str2 = str | std::views::slide(4) | std::views::join;
+ auto str3 = str | std::views::reverse | std::views::slide(4) | std::views::join;
assert(std::ranges::equal(str2, str3));
return true;
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
index 63efd9bb00d9b..bde40e71ec1b0 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/compare.pass.cpp
@@ -31,7 +31,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
// Test `friend constexpr bool operator==(const iterator& x, const iterator& y)`
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
index f24b2dc537af3..dea8ff2376bc3 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/decrement.pass.cpp
@@ -24,7 +24,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(2);
// Test `constexpr iterator& operator--();`
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
index cabe28f58eeb7..0141acdf456da 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/deref.pass.cpp
@@ -20,7 +20,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(3);
// Test `constexpr range_reference_v<V> inner_iterator::operator*() const`
diff --git a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
index 46deb84b1745b..23c5cc8917f34 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.slide/range.slide.iter/increment.pass.cpp
@@ -22,7 +22,7 @@
#include <vector>
constexpr bool test() {
- std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
+ std::vector<int> vector = {1, 2, 3, 4, 5, 6, 7, 8};
std::ranges::slide_view<std::ranges::ref_view<std::vector<int>>> slided = vector | std::views::slide(2);
// Test `constexpr iterator& operator++();`
More information about the libcxx-commits
mailing list