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