[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