17d426a39SNikolas Klauser //===----------------------------------------------------------------------===// 27d426a39SNikolas Klauser // 37d426a39SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47d426a39SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 57d426a39SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67d426a39SNikolas Klauser // 77d426a39SNikolas Klauser //===----------------------------------------------------------------------===// 87d426a39SNikolas Klauser 97d426a39SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H 107d426a39SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H 117d426a39SNikolas Klauser 127d426a39SNikolas Klauser #include <__algorithm/in_out_result.h> 137d426a39SNikolas Klauser #include <__algorithm/ranges_copy.h> 147d426a39SNikolas Klauser #include <__config> 157d426a39SNikolas Klauser #include <__iterator/concepts.h> 167d426a39SNikolas Klauser #include <__iterator/next.h> 177d426a39SNikolas Klauser #include <__iterator/reverse_iterator.h> 187d426a39SNikolas Klauser #include <__ranges/access.h> 197d426a39SNikolas Klauser #include <__ranges/concepts.h> 207d426a39SNikolas Klauser #include <__ranges/dangling.h> 217d426a39SNikolas Klauser #include <__ranges/subrange.h> 227d426a39SNikolas Klauser #include <__utility/move.h> 237d426a39SNikolas Klauser 247d426a39SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 257d426a39SNikolas Klauser # pragma GCC system_header 267d426a39SNikolas Klauser #endif 277d426a39SNikolas Klauser 287b462251SLouis Dionne _LIBCPP_PUSH_MACROS 297b462251SLouis Dionne #include <__undef_macros> 307b462251SLouis Dionne 314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 327d426a39SNikolas Klauser 337d426a39SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 347d426a39SNikolas Klauser 357d426a39SNikolas Klauser namespace ranges { 367d426a39SNikolas Klauser 377d426a39SNikolas Klauser template <class _InIter, class _OutIter> 387d426a39SNikolas Klauser using reverse_copy_result = in_out_result<_InIter, _OutIter>; 397d426a39SNikolas Klauser 40*d10dc5a0SChristopher Di Bella struct __reverse_copy { 417d426a39SNikolas Klauser template <bidirectional_iterator _InIter, sentinel_for<_InIter> _Sent, weakly_incrementable _OutIter> 427d426a39SNikolas Klauser requires indirectly_copyable<_InIter, _OutIter> 435aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr reverse_copy_result<_InIter, _OutIter> 445aa03b64SLouis Dionne operator()(_InIter __first, _Sent __last, _OutIter __result) const { 457d426a39SNikolas Klauser return (*this)(subrange(std::move(__first), std::move(__last)), std::move(__result)); 467d426a39SNikolas Klauser } 477d426a39SNikolas Klauser 487d426a39SNikolas Klauser template <bidirectional_range _Range, weakly_incrementable _OutIter> 497d426a39SNikolas Klauser requires indirectly_copyable<iterator_t<_Range>, _OutIter> 505aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr reverse_copy_result<borrowed_iterator_t<_Range>, _OutIter> 515aa03b64SLouis Dionne operator()(_Range&& __range, _OutIter __result) const { 527d426a39SNikolas Klauser auto __ret = ranges::copy(std::__reverse_range(__range), std::move(__result)); 537d426a39SNikolas Klauser return {ranges::next(ranges::begin(__range), ranges::end(__range)), std::move(__ret.out)}; 547d426a39SNikolas Klauser } 557d426a39SNikolas Klauser }; 567d426a39SNikolas Klauser 577d426a39SNikolas Klauser inline namespace __cpo { 58*d10dc5a0SChristopher Di Bella inline constexpr auto reverse_copy = __reverse_copy{}; 597d426a39SNikolas Klauser } // namespace __cpo 607d426a39SNikolas Klauser } // namespace ranges 617d426a39SNikolas Klauser 627d426a39SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 637d426a39SNikolas Klauser 644f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 657d426a39SNikolas Klauser 667b462251SLouis Dionne _LIBCPP_POP_MACROS 677b462251SLouis Dionne 687d426a39SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H 69