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