12c3bbac0SNikolas Klauser //===----------------------------------------------------------------------===// 22c3bbac0SNikolas Klauser // 32c3bbac0SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42c3bbac0SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 52c3bbac0SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62c3bbac0SNikolas Klauser // 72c3bbac0SNikolas Klauser //===----------------------------------------------------------------------===// 82c3bbac0SNikolas Klauser 92c3bbac0SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H 102c3bbac0SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H 112c3bbac0SNikolas Klauser 122c3bbac0SNikolas Klauser #include <__algorithm/in_out_result.h> 135629d492Svarconst #include <__algorithm/iterator_operations.h> 145629d492Svarconst #include <__algorithm/move_backward.h> 152c3bbac0SNikolas Klauser #include <__config> 162c3bbac0SNikolas Klauser #include <__iterator/concepts.h> 172c3bbac0SNikolas Klauser #include <__iterator/iter_move.h> 182c3bbac0SNikolas Klauser #include <__iterator/next.h> 192c3bbac0SNikolas Klauser #include <__ranges/access.h> 202c3bbac0SNikolas Klauser #include <__ranges/concepts.h> 212c3bbac0SNikolas Klauser #include <__ranges/dangling.h> 222c3bbac0SNikolas Klauser #include <__utility/move.h> 232c3bbac0SNikolas Klauser 242c3bbac0SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 252c3bbac0SNikolas Klauser # pragma GCC system_header 262c3bbac0SNikolas Klauser #endif 272c3bbac0SNikolas Klauser 287b462251SLouis Dionne _LIBCPP_PUSH_MACROS 297b462251SLouis Dionne #include <__undef_macros> 307b462251SLouis Dionne 314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 322c3bbac0SNikolas Klauser 332c3bbac0SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 342c3bbac0SNikolas Klauser 352c3bbac0SNikolas Klauser namespace ranges { 362c3bbac0SNikolas Klauser 372c3bbac0SNikolas Klauser template <class _InIter, class _OutIter> 382c3bbac0SNikolas Klauser using move_backward_result = in_out_result<_InIter, _OutIter>; 392c3bbac0SNikolas Klauser 40*d10dc5a0SChristopher Di Bella struct __move_backward { 412c3bbac0SNikolas Klauser template <class _InIter, class _Sent, class _OutIter> 425aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr static move_backward_result<_InIter, _OutIter> 435aa03b64SLouis Dionne __move_backward_impl(_InIter __first, _Sent __last, _OutIter __result) { 445629d492Svarconst auto __ret = std::__move_backward<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)); 455629d492Svarconst return {std::move(__ret.first), std::move(__ret.second)}; 462c3bbac0SNikolas Klauser } 472c3bbac0SNikolas Klauser 482c3bbac0SNikolas Klauser template <bidirectional_iterator _InIter, sentinel_for<_InIter> _Sent, bidirectional_iterator _OutIter> 492c3bbac0SNikolas Klauser requires indirectly_movable<_InIter, _OutIter> 505aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr move_backward_result<_InIter, _OutIter> 515aa03b64SLouis Dionne operator()(_InIter __first, _Sent __last, _OutIter __result) const { 522c3bbac0SNikolas Klauser return __move_backward_impl(std::move(__first), std::move(__last), std::move(__result)); 532c3bbac0SNikolas Klauser } 542c3bbac0SNikolas Klauser 552c3bbac0SNikolas Klauser template <bidirectional_range _Range, bidirectional_iterator _Iter> 562c3bbac0SNikolas Klauser requires indirectly_movable<iterator_t<_Range>, _Iter> 575aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr move_backward_result<borrowed_iterator_t<_Range>, _Iter> 585aa03b64SLouis Dionne operator()(_Range&& __range, _Iter __result) const { 592c3bbac0SNikolas Klauser return __move_backward_impl(ranges::begin(__range), ranges::end(__range), std::move(__result)); 602c3bbac0SNikolas Klauser } 612c3bbac0SNikolas Klauser }; 622c3bbac0SNikolas Klauser 632c3bbac0SNikolas Klauser inline namespace __cpo { 64*d10dc5a0SChristopher Di Bella inline constexpr auto move_backward = __move_backward{}; 652c3bbac0SNikolas Klauser } // namespace __cpo 662c3bbac0SNikolas Klauser } // namespace ranges 672c3bbac0SNikolas Klauser 682c3bbac0SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 692c3bbac0SNikolas Klauser 704f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 712c3bbac0SNikolas Klauser 727b462251SLouis Dionne _LIBCPP_POP_MACROS 737b462251SLouis Dionne 742c3bbac0SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H 75