xref: /llvm-project/libcxx/include/__algorithm/ranges_rotate_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_ROTATE_COPY_H
107d426a39SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_ROTATE_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 <__ranges/access.h>
177d426a39SNikolas Klauser #include <__ranges/concepts.h>
187d426a39SNikolas Klauser #include <__ranges/dangling.h>
197d426a39SNikolas Klauser #include <__utility/move.h>
207d426a39SNikolas Klauser 
217d426a39SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
227d426a39SNikolas Klauser #  pragma GCC system_header
237d426a39SNikolas Klauser #endif
247d426a39SNikolas Klauser 
257b462251SLouis Dionne _LIBCPP_PUSH_MACROS
267b462251SLouis Dionne #include <__undef_macros>
277b462251SLouis Dionne 
284f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
297d426a39SNikolas Klauser 
307d426a39SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
317d426a39SNikolas Klauser 
327d426a39SNikolas Klauser namespace ranges {
337d426a39SNikolas Klauser 
347d426a39SNikolas Klauser template <class _InIter, class _OutIter>
357d426a39SNikolas Klauser using rotate_copy_result = in_out_result<_InIter, _OutIter>;
367d426a39SNikolas Klauser 
37*d10dc5a0SChristopher Di Bella struct __rotate_copy {
38bfdc562dSStephan T. Lavavej   template <forward_iterator _InIter, sentinel_for<_InIter> _Sent, weakly_incrementable _OutIter>
397d426a39SNikolas Klauser     requires indirectly_copyable<_InIter, _OutIter>
405aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr rotate_copy_result<_InIter, _OutIter>
417d426a39SNikolas Klauser   operator()(_InIter __first, _InIter __middle, _Sent __last, _OutIter __result) const {
427d426a39SNikolas Klauser     auto __res1 = ranges::copy(__middle, __last, std::move(__result));
437d426a39SNikolas Klauser     auto __res2 = ranges::copy(__first, __middle, std::move(__res1.out));
447d426a39SNikolas Klauser     return {std::move(__res1.in), std::move(__res2.out)};
457d426a39SNikolas Klauser   }
467d426a39SNikolas Klauser 
47bfdc562dSStephan T. Lavavej   template <forward_range _Range, weakly_incrementable _OutIter>
487d426a39SNikolas Klauser     requires indirectly_copyable<iterator_t<_Range>, _OutIter>
495aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr rotate_copy_result<borrowed_iterator_t<_Range>, _OutIter>
507d426a39SNikolas Klauser   operator()(_Range&& __range, iterator_t<_Range> __middle, _OutIter __result) const {
517d426a39SNikolas Klauser     return (*this)(ranges::begin(__range), std::move(__middle), ranges::end(__range), std::move(__result));
527d426a39SNikolas Klauser   }
537d426a39SNikolas Klauser };
547d426a39SNikolas Klauser 
557d426a39SNikolas Klauser inline namespace __cpo {
56*d10dc5a0SChristopher Di Bella inline constexpr auto rotate_copy = __rotate_copy{};
577d426a39SNikolas Klauser } // namespace __cpo
587d426a39SNikolas Klauser } // namespace ranges
597d426a39SNikolas Klauser 
607d426a39SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
617d426a39SNikolas Klauser 
624f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
637d426a39SNikolas Klauser 
647b462251SLouis Dionne _LIBCPP_POP_MACROS
657b462251SLouis Dionne 
667d426a39SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_ROTATE_COPY_H
67