xref: /llvm-project/libcxx/include/__algorithm/ranges_reverse_copy.h (revision d10dc5a06fac4dcabf2264c64c8672c6f6ae36fb)
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