xref: /llvm-project/libcxx/include/__memory/ranges_uninitialized_algorithms.h (revision 59890c13343af9e308281b3c76bac425087f4f8a)
13f630cffSKonstantin Varlamov // -*- C++ -*-
23f630cffSKonstantin Varlamov //===----------------------------------------------------------------------===//
33f630cffSKonstantin Varlamov //
43f630cffSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
53f630cffSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
63f630cffSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73f630cffSKonstantin Varlamov //
83f630cffSKonstantin Varlamov //===----------------------------------------------------------------------===//
93f630cffSKonstantin Varlamov 
103f630cffSKonstantin Varlamov #ifndef _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H
113f630cffSKonstantin Varlamov #define _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H
123f630cffSKonstantin Varlamov 
138d23b742SKonstantin Varlamov #include <__algorithm/in_out_result.h>
143f630cffSKonstantin Varlamov #include <__concepts/constructible.h>
153f630cffSKonstantin Varlamov #include <__config>
168d23b742SKonstantin Varlamov #include <__iterator/concepts.h>
173f630cffSKonstantin Varlamov #include <__iterator/incrementable_traits.h>
188d23b742SKonstantin Varlamov #include <__iterator/iter_move.h>
193f630cffSKonstantin Varlamov #include <__iterator/iterator_traits.h>
203f630cffSKonstantin Varlamov #include <__iterator/readable_traits.h>
213f630cffSKonstantin Varlamov #include <__memory/concepts.h>
223f630cffSKonstantin Varlamov #include <__memory/uninitialized_algorithms.h>
233f630cffSKonstantin Varlamov #include <__ranges/access.h>
243f630cffSKonstantin Varlamov #include <__ranges/concepts.h>
253f630cffSKonstantin Varlamov #include <__ranges/dangling.h>
26e0a66116SNikolas Klauser #include <__type_traits/remove_reference.h>
27754ea6fdSKonstantin Varlamov #include <__utility/move.h>
283f630cffSKonstantin Varlamov 
293f630cffSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
303f630cffSKonstantin Varlamov #  pragma GCC system_header
313f630cffSKonstantin Varlamov #endif
323f630cffSKonstantin Varlamov 
337b462251SLouis Dionne _LIBCPP_PUSH_MACROS
347b462251SLouis Dionne #include <__undef_macros>
357b462251SLouis Dionne 
363f630cffSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
373f630cffSKonstantin Varlamov 
384f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3953406fb6SArthur O'Dwyer 
403f630cffSKonstantin Varlamov namespace ranges {
413f630cffSKonstantin Varlamov 
423f630cffSKonstantin Varlamov // uninitialized_default_construct
433f630cffSKonstantin Varlamov 
44*d10dc5a0SChristopher Di Bella struct __uninitialized_default_construct {
459783f28cSLouis Dionne   template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel>
463f630cffSKonstantin Varlamov     requires default_initializable<iter_value_t<_ForwardIterator>>
4783ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {
483f630cffSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
499783f28cSLouis Dionne     return std::__uninitialized_default_construct<_ValueType>(std::move(__first), std::move(__last));
503f630cffSKonstantin Varlamov   }
513f630cffSKonstantin Varlamov 
523f630cffSKonstantin Varlamov   template <__nothrow_forward_range _ForwardRange>
533f630cffSKonstantin Varlamov     requires default_initializable<range_value_t<_ForwardRange>>
5483ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {
553f630cffSKonstantin Varlamov     return (*this)(ranges::begin(__range), ranges::end(__range));
563f630cffSKonstantin Varlamov   }
573f630cffSKonstantin Varlamov };
583f630cffSKonstantin Varlamov 
593f630cffSKonstantin Varlamov inline namespace __cpo {
60*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_default_construct = __uninitialized_default_construct{};
613f630cffSKonstantin Varlamov } // namespace __cpo
623f630cffSKonstantin Varlamov 
633f630cffSKonstantin Varlamov // uninitialized_default_construct_n
643f630cffSKonstantin Varlamov 
65*d10dc5a0SChristopher Di Bella struct __uninitialized_default_construct_n {
663f630cffSKonstantin Varlamov   template <__nothrow_forward_iterator _ForwardIterator>
673f630cffSKonstantin Varlamov     requires default_initializable<iter_value_t<_ForwardIterator>>
689783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _ForwardIterator
699783f28cSLouis Dionne   operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const {
703f630cffSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
7177a00c0dSLouis Dionne     return std::__uninitialized_default_construct_n<_ValueType>(std::move(__first), __n);
723f630cffSKonstantin Varlamov   }
733f630cffSKonstantin Varlamov };
743f630cffSKonstantin Varlamov 
753f630cffSKonstantin Varlamov inline namespace __cpo {
76*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_default_construct_n = __uninitialized_default_construct_n{};
773f630cffSKonstantin Varlamov } // namespace __cpo
783f630cffSKonstantin Varlamov 
79754ea6fdSKonstantin Varlamov // uninitialized_value_construct
80754ea6fdSKonstantin Varlamov 
81*d10dc5a0SChristopher Di Bella struct __uninitialized_value_construct {
829783f28cSLouis Dionne   template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel>
83754ea6fdSKonstantin Varlamov     requires default_initializable<iter_value_t<_ForwardIterator>>
8483ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last) const {
85754ea6fdSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
869783f28cSLouis Dionne     return std::__uninitialized_value_construct<_ValueType>(std::move(__first), std::move(__last));
87754ea6fdSKonstantin Varlamov   }
88754ea6fdSKonstantin Varlamov 
89754ea6fdSKonstantin Varlamov   template <__nothrow_forward_range _ForwardRange>
90754ea6fdSKonstantin Varlamov     requires default_initializable<range_value_t<_ForwardRange>>
9183ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range) const {
92754ea6fdSKonstantin Varlamov     return (*this)(ranges::begin(__range), ranges::end(__range));
93754ea6fdSKonstantin Varlamov   }
94754ea6fdSKonstantin Varlamov };
95754ea6fdSKonstantin Varlamov 
96754ea6fdSKonstantin Varlamov inline namespace __cpo {
97*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_value_construct = __uninitialized_value_construct{};
98754ea6fdSKonstantin Varlamov } // namespace __cpo
99754ea6fdSKonstantin Varlamov 
100754ea6fdSKonstantin Varlamov // uninitialized_value_construct_n
101754ea6fdSKonstantin Varlamov 
102*d10dc5a0SChristopher Di Bella struct __uninitialized_value_construct_n {
103754ea6fdSKonstantin Varlamov   template <__nothrow_forward_iterator _ForwardIterator>
104754ea6fdSKonstantin Varlamov     requires default_initializable<iter_value_t<_ForwardIterator>>
1059783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _ForwardIterator
1069783f28cSLouis Dionne   operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n) const {
107754ea6fdSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
10877a00c0dSLouis Dionne     return std::__uninitialized_value_construct_n<_ValueType>(std::move(__first), __n);
109754ea6fdSKonstantin Varlamov   }
110754ea6fdSKonstantin Varlamov };
111754ea6fdSKonstantin Varlamov 
112754ea6fdSKonstantin Varlamov inline namespace __cpo {
113*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_value_construct_n = __uninitialized_value_construct_n{};
114754ea6fdSKonstantin Varlamov } // namespace __cpo
115754ea6fdSKonstantin Varlamov 
116754ea6fdSKonstantin Varlamov // uninitialized_fill
117754ea6fdSKonstantin Varlamov 
118*d10dc5a0SChristopher Di Bella struct __uninitialized_fill {
1199783f28cSLouis Dionne   template <__nothrow_forward_iterator _ForwardIterator, __nothrow_sentinel_for<_ForwardIterator> _Sentinel, class _Tp>
120754ea6fdSKonstantin Varlamov     requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>
12183ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI _ForwardIterator operator()(_ForwardIterator __first, _Sentinel __last, const _Tp& __x) const {
122754ea6fdSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
12377a00c0dSLouis Dionne     return std::__uninitialized_fill<_ValueType>(std::move(__first), std::move(__last), __x);
124754ea6fdSKonstantin Varlamov   }
125754ea6fdSKonstantin Varlamov 
126754ea6fdSKonstantin Varlamov   template <__nothrow_forward_range _ForwardRange, class _Tp>
127754ea6fdSKonstantin Varlamov     requires constructible_from<range_value_t<_ForwardRange>, const _Tp&>
12883ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_ForwardRange> operator()(_ForwardRange&& __range, const _Tp& __x) const {
129754ea6fdSKonstantin Varlamov     return (*this)(ranges::begin(__range), ranges::end(__range), __x);
130754ea6fdSKonstantin Varlamov   }
131754ea6fdSKonstantin Varlamov };
132754ea6fdSKonstantin Varlamov 
133754ea6fdSKonstantin Varlamov inline namespace __cpo {
134*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_fill = __uninitialized_fill{};
135754ea6fdSKonstantin Varlamov } // namespace __cpo
136754ea6fdSKonstantin Varlamov 
137754ea6fdSKonstantin Varlamov // uninitialized_fill_n
138754ea6fdSKonstantin Varlamov 
139*d10dc5a0SChristopher Di Bella struct __uninitialized_fill_n {
140754ea6fdSKonstantin Varlamov   template <__nothrow_forward_iterator _ForwardIterator, class _Tp>
141754ea6fdSKonstantin Varlamov     requires constructible_from<iter_value_t<_ForwardIterator>, const _Tp&>
1429783f28cSLouis Dionne   _LIBCPP_HIDE_FROM_ABI _ForwardIterator
1439783f28cSLouis Dionne   operator()(_ForwardIterator __first, iter_difference_t<_ForwardIterator> __n, const _Tp& __x) const {
144754ea6fdSKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_ForwardIterator>>;
14577a00c0dSLouis Dionne     return std::__uninitialized_fill_n<_ValueType>(std::move(__first), __n, __x);
146754ea6fdSKonstantin Varlamov   }
147754ea6fdSKonstantin Varlamov };
148754ea6fdSKonstantin Varlamov 
149754ea6fdSKonstantin Varlamov inline namespace __cpo {
150*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_fill_n = __uninitialized_fill_n{};
151754ea6fdSKonstantin Varlamov } // namespace __cpo
152754ea6fdSKonstantin Varlamov 
1538d23b742SKonstantin Varlamov // uninitialized_copy
1548d23b742SKonstantin Varlamov 
1558d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator>
1568d23b742SKonstantin Varlamov using uninitialized_copy_result = in_out_result<_InputIterator, _OutputIterator>;
1578d23b742SKonstantin Varlamov 
158*d10dc5a0SChristopher Di Bella struct __uninitialized_copy {
1598d23b742SKonstantin Varlamov   template <input_iterator _InputIterator,
1608d23b742SKonstantin Varlamov             sentinel_for<_InputIterator> _Sentinel1,
1618d23b742SKonstantin Varlamov             __nothrow_forward_iterator _OutputIterator,
1628d23b742SKonstantin Varlamov             __nothrow_sentinel_for<_OutputIterator> _Sentinel2>
1638d23b742SKonstantin Varlamov     requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>
16483ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<_InputIterator, _OutputIterator>
1658d23b742SKonstantin Varlamov   operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {
1668d23b742SKonstantin Varlamov     using _ValueType = remove_reference_t<iter_reference_t<_OutputIterator>>;
1678d23b742SKonstantin Varlamov 
16802540b2fSLouis Dionne     auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };
1697961fa36SLouis Dionne     auto __result       = std::__uninitialized_copy<_ValueType>(
1707961fa36SLouis Dionne         std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_copying);
17177a00c0dSLouis Dionne     return {std::move(__result.first), std::move(__result.second)};
1728d23b742SKonstantin Varlamov   }
1738d23b742SKonstantin Varlamov 
1748d23b742SKonstantin Varlamov   template <input_range _InputRange, __nothrow_forward_range _OutputRange>
1758d23b742SKonstantin Varlamov     requires constructible_from<range_value_t<_OutputRange>, range_reference_t<_InputRange>>
17683ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_copy_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>
1778d23b742SKonstantin Varlamov   operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const {
1789783f28cSLouis Dionne     return (*this)(
1799783f28cSLouis Dionne         ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range));
1808d23b742SKonstantin Varlamov   }
1818d23b742SKonstantin Varlamov };
1828d23b742SKonstantin Varlamov 
1838d23b742SKonstantin Varlamov inline namespace __cpo {
184*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_copy = __uninitialized_copy{};
1858d23b742SKonstantin Varlamov } // namespace __cpo
1868d23b742SKonstantin Varlamov 
1878d23b742SKonstantin Varlamov // uninitialized_copy_n
1888d23b742SKonstantin Varlamov 
1898d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator>
1908d23b742SKonstantin Varlamov using uninitialized_copy_n_result = in_out_result<_InputIterator, _OutputIterator>;
1918d23b742SKonstantin Varlamov 
192*d10dc5a0SChristopher Di Bella struct __uninitialized_copy_n {
1938d23b742SKonstantin Varlamov   template <input_iterator _InputIterator,
1948d23b742SKonstantin Varlamov             __nothrow_forward_iterator _OutputIterator,
1958d23b742SKonstantin Varlamov             __nothrow_sentinel_for<_OutputIterator> _Sentinel>
1968d23b742SKonstantin Varlamov     requires constructible_from<iter_value_t<_OutputIterator>, iter_reference_t<_InputIterator>>
19783ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_copy_n_result<_InputIterator, _OutputIterator>
1989783f28cSLouis Dionne   operator()(_InputIterator __ifirst,
1999783f28cSLouis Dionne              iter_difference_t<_InputIterator> __n,
2009783f28cSLouis Dionne              _OutputIterator __ofirst,
2019783f28cSLouis Dionne              _Sentinel __olast) const {
2028d23b742SKonstantin Varlamov     using _ValueType    = remove_reference_t<iter_reference_t<_OutputIterator>>;
20302540b2fSLouis Dionne     auto __stop_copying = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };
2047961fa36SLouis Dionne     auto __result =
2057961fa36SLouis Dionne         std::__uninitialized_copy_n<_ValueType>(std::move(__ifirst), __n, std::move(__ofirst), __stop_copying);
20677a00c0dSLouis Dionne     return {std::move(__result.first), std::move(__result.second)};
2078d23b742SKonstantin Varlamov   }
2088d23b742SKonstantin Varlamov };
2098d23b742SKonstantin Varlamov 
2108d23b742SKonstantin Varlamov inline namespace __cpo {
211*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_copy_n = __uninitialized_copy_n{};
2128d23b742SKonstantin Varlamov } // namespace __cpo
2138d23b742SKonstantin Varlamov 
2148d23b742SKonstantin Varlamov // uninitialized_move
2158d23b742SKonstantin Varlamov 
2168d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator>
2178d23b742SKonstantin Varlamov using uninitialized_move_result = in_out_result<_InputIterator, _OutputIterator>;
2188d23b742SKonstantin Varlamov 
219*d10dc5a0SChristopher Di Bella struct __uninitialized_move {
2208d23b742SKonstantin Varlamov   template <input_iterator _InputIterator,
2218d23b742SKonstantin Varlamov             sentinel_for<_InputIterator> _Sentinel1,
2228d23b742SKonstantin Varlamov             __nothrow_forward_iterator _OutputIterator,
2238d23b742SKonstantin Varlamov             __nothrow_sentinel_for<_OutputIterator> _Sentinel2>
224dff3eba7SNikolas Klauser     requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>
22583ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<_InputIterator, _OutputIterator>
2268d23b742SKonstantin Varlamov   operator()(_InputIterator __ifirst, _Sentinel1 __ilast, _OutputIterator __ofirst, _Sentinel2 __olast) const {
2278d23b742SKonstantin Varlamov     using _ValueType   = remove_reference_t<iter_reference_t<_OutputIterator>>;
2288d23b742SKonstantin Varlamov     auto __iter_move   = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };
22902540b2fSLouis Dionne     auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };
2307961fa36SLouis Dionne     auto __result      = std::__uninitialized_move<_ValueType>(
2317961fa36SLouis Dionne         std::move(__ifirst), std::move(__ilast), std::move(__ofirst), __stop_moving, __iter_move);
23277a00c0dSLouis Dionne     return {std::move(__result.first), std::move(__result.second)};
2338d23b742SKonstantin Varlamov   }
2348d23b742SKonstantin Varlamov 
2358d23b742SKonstantin Varlamov   template <input_range _InputRange, __nothrow_forward_range _OutputRange>
236dff3eba7SNikolas Klauser     requires constructible_from<range_value_t<_OutputRange>, range_rvalue_reference_t<_InputRange>>
23783ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_move_result<borrowed_iterator_t<_InputRange>, borrowed_iterator_t<_OutputRange>>
2388d23b742SKonstantin Varlamov   operator()(_InputRange&& __in_range, _OutputRange&& __out_range) const {
2399783f28cSLouis Dionne     return (*this)(
2409783f28cSLouis Dionne         ranges::begin(__in_range), ranges::end(__in_range), ranges::begin(__out_range), ranges::end(__out_range));
2418d23b742SKonstantin Varlamov   }
2428d23b742SKonstantin Varlamov };
2438d23b742SKonstantin Varlamov 
2448d23b742SKonstantin Varlamov inline namespace __cpo {
245*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_move = __uninitialized_move{};
2468d23b742SKonstantin Varlamov } // namespace __cpo
2478d23b742SKonstantin Varlamov 
2488d23b742SKonstantin Varlamov // uninitialized_move_n
2498d23b742SKonstantin Varlamov 
2508d23b742SKonstantin Varlamov template <class _InputIterator, class _OutputIterator>
2518d23b742SKonstantin Varlamov using uninitialized_move_n_result = in_out_result<_InputIterator, _OutputIterator>;
2528d23b742SKonstantin Varlamov 
253*d10dc5a0SChristopher Di Bella struct __uninitialized_move_n {
2548d23b742SKonstantin Varlamov   template <input_iterator _InputIterator,
2558d23b742SKonstantin Varlamov             __nothrow_forward_iterator _OutputIterator,
2568d23b742SKonstantin Varlamov             __nothrow_sentinel_for<_OutputIterator> _Sentinel>
257dff3eba7SNikolas Klauser     requires constructible_from<iter_value_t<_OutputIterator>, iter_rvalue_reference_t<_InputIterator>>
25883ce1397SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI uninitialized_move_n_result<_InputIterator, _OutputIterator>
2599783f28cSLouis Dionne   operator()(_InputIterator __ifirst,
2609783f28cSLouis Dionne              iter_difference_t<_InputIterator> __n,
2619783f28cSLouis Dionne              _OutputIterator __ofirst,
2629783f28cSLouis Dionne              _Sentinel __olast) const {
2638d23b742SKonstantin Varlamov     using _ValueType   = remove_reference_t<iter_reference_t<_OutputIterator>>;
2648d23b742SKonstantin Varlamov     auto __iter_move   = [](auto&& __iter) -> decltype(auto) { return ranges::iter_move(__iter); };
26502540b2fSLouis Dionne     auto __stop_moving = [&__olast](auto&& __out_iter) -> bool { return __out_iter == __olast; };
2667961fa36SLouis Dionne     auto __result      = std::__uninitialized_move_n<_ValueType>(
2677961fa36SLouis Dionne         std::move(__ifirst), __n, std::move(__ofirst), __stop_moving, __iter_move);
26877a00c0dSLouis Dionne     return {std::move(__result.first), std::move(__result.second)};
2698d23b742SKonstantin Varlamov   }
2708d23b742SKonstantin Varlamov };
2718d23b742SKonstantin Varlamov 
2728d23b742SKonstantin Varlamov inline namespace __cpo {
273*d10dc5a0SChristopher Di Bella inline constexpr auto uninitialized_move_n = __uninitialized_move_n{};
2748d23b742SKonstantin Varlamov } // namespace __cpo
2758d23b742SKonstantin Varlamov 
2763f630cffSKonstantin Varlamov } // namespace ranges
27753406fb6SArthur O'Dwyer 
2784f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
2793f630cffSKonstantin Varlamov 
2803f630cffSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
2813f630cffSKonstantin Varlamov 
2827b462251SLouis Dionne _LIBCPP_POP_MACROS
2837b462251SLouis Dionne 
2843f630cffSKonstantin Varlamov #endif // _LIBCPP___MEMORY_RANGES_UNINITIALIZED_ALGORITHMS_H
285