xref: /llvm-project/libcxx/include/__algorithm/ranges_move.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_H
102c3bbac0SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_MOVE_H
112c3bbac0SNikolas Klauser 
122c3bbac0SNikolas Klauser #include <__algorithm/in_out_result.h>
1336c746caSKonstantin Varlamov #include <__algorithm/iterator_operations.h>
142c3bbac0SNikolas Klauser #include <__algorithm/move.h>
152c3bbac0SNikolas Klauser #include <__config>
162c3bbac0SNikolas Klauser #include <__iterator/concepts.h>
172c3bbac0SNikolas Klauser #include <__ranges/access.h>
182c3bbac0SNikolas Klauser #include <__ranges/concepts.h>
192c3bbac0SNikolas Klauser #include <__ranges/dangling.h>
202c3bbac0SNikolas Klauser #include <__utility/move.h>
212c3bbac0SNikolas Klauser 
222c3bbac0SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
232c3bbac0SNikolas Klauser #  pragma GCC system_header
242c3bbac0SNikolas Klauser #endif
252c3bbac0SNikolas Klauser 
267b462251SLouis Dionne _LIBCPP_PUSH_MACROS
277b462251SLouis Dionne #include <__undef_macros>
287b462251SLouis Dionne 
294f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
302c3bbac0SNikolas Klauser 
312c3bbac0SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
322c3bbac0SNikolas Klauser 
332c3bbac0SNikolas Klauser namespace ranges {
342c3bbac0SNikolas Klauser 
352c3bbac0SNikolas Klauser template <class _InIter, class _OutIter>
362c3bbac0SNikolas Klauser using move_result = in_out_result<_InIter, _OutIter>;
372c3bbac0SNikolas Klauser 
38*d10dc5a0SChristopher Di Bella struct __move {
392c3bbac0SNikolas Klauser   template <class _InIter, class _Sent, class _OutIter>
405aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr static move_result<_InIter, _OutIter>
415aa03b64SLouis Dionne   __move_impl(_InIter __first, _Sent __last, _OutIter __result) {
4236c746caSKonstantin Varlamov     auto __ret = std::__move<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result));
432c3bbac0SNikolas Klauser     return {std::move(__ret.first), std::move(__ret.second)};
442c3bbac0SNikolas Klauser   }
452c3bbac0SNikolas Klauser 
462c3bbac0SNikolas Klauser   template <input_iterator _InIter, sentinel_for<_InIter> _Sent, weakly_incrementable _OutIter>
472c3bbac0SNikolas Klauser     requires indirectly_movable<_InIter, _OutIter>
485aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr move_result<_InIter, _OutIter>
495aa03b64SLouis Dionne   operator()(_InIter __first, _Sent __last, _OutIter __result) const {
502c3bbac0SNikolas Klauser     return __move_impl(std::move(__first), std::move(__last), std::move(__result));
512c3bbac0SNikolas Klauser   }
522c3bbac0SNikolas Klauser 
532c3bbac0SNikolas Klauser   template <input_range _Range, weakly_incrementable _OutIter>
542c3bbac0SNikolas Klauser     requires indirectly_movable<iterator_t<_Range>, _OutIter>
555aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr move_result<borrowed_iterator_t<_Range>, _OutIter>
565aa03b64SLouis Dionne   operator()(_Range&& __range, _OutIter __result) const {
572c3bbac0SNikolas Klauser     return __move_impl(ranges::begin(__range), ranges::end(__range), std::move(__result));
582c3bbac0SNikolas Klauser   }
592c3bbac0SNikolas Klauser };
602c3bbac0SNikolas Klauser 
612c3bbac0SNikolas Klauser inline namespace __cpo {
62*d10dc5a0SChristopher Di Bella inline constexpr auto move = __move{};
632c3bbac0SNikolas Klauser } // namespace __cpo
642c3bbac0SNikolas Klauser } // namespace ranges
652c3bbac0SNikolas Klauser 
662c3bbac0SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
672c3bbac0SNikolas Klauser 
684f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
692c3bbac0SNikolas Klauser 
707b462251SLouis Dionne _LIBCPP_POP_MACROS
717b462251SLouis Dionne 
722c3bbac0SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_MOVE_H
73