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