1*4bdff4beSrobert //===----------------------------------------------------------------------===// 2*4bdff4beSrobert // 3*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information. 5*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*4bdff4beSrobert // 7*4bdff4beSrobert //===----------------------------------------------------------------------===// 8*4bdff4beSrobert 9*4bdff4beSrobert #ifndef _LIBCPP___ALGORITHM_RANGES_COPY_N_H 10*4bdff4beSrobert #define _LIBCPP___ALGORITHM_RANGES_COPY_N_H 11*4bdff4beSrobert 12*4bdff4beSrobert #include <__algorithm/copy.h> 13*4bdff4beSrobert #include <__algorithm/in_out_result.h> 14*4bdff4beSrobert #include <__algorithm/iterator_operations.h> 15*4bdff4beSrobert #include <__algorithm/ranges_copy.h> 16*4bdff4beSrobert #include <__config> 17*4bdff4beSrobert #include <__functional/identity.h> 18*4bdff4beSrobert #include <__iterator/concepts.h> 19*4bdff4beSrobert #include <__iterator/incrementable_traits.h> 20*4bdff4beSrobert #include <__iterator/unreachable_sentinel.h> 21*4bdff4beSrobert #include <__iterator/wrap_iter.h> 22*4bdff4beSrobert #include <__utility/move.h> 23*4bdff4beSrobert 24*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25*4bdff4beSrobert # pragma GCC system_header 26*4bdff4beSrobert #endif 27*4bdff4beSrobert 28*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_STD 29*4bdff4beSrobert 30*4bdff4beSrobert #if _LIBCPP_STD_VER > 17 31*4bdff4beSrobert 32*4bdff4beSrobert namespace ranges { 33*4bdff4beSrobert 34*4bdff4beSrobert template <class _Ip, class _Op> 35*4bdff4beSrobert using copy_n_result = in_out_result<_Ip, _Op>; 36*4bdff4beSrobert 37*4bdff4beSrobert namespace __copy_n { 38*4bdff4beSrobert struct __fn { 39*4bdff4beSrobert 40*4bdff4beSrobert template <class _InIter, class _DiffType, class _OutIter> 41*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr static __go__fn42*4bdff4beSrobert copy_n_result<_InIter, _OutIter> __go(_InIter __first, _DiffType __n, _OutIter __result) { 43*4bdff4beSrobert while (__n != 0) { 44*4bdff4beSrobert *__result = *__first; 45*4bdff4beSrobert ++__first; 46*4bdff4beSrobert ++__result; 47*4bdff4beSrobert --__n; 48*4bdff4beSrobert } 49*4bdff4beSrobert return {std::move(__first), std::move(__result)}; 50*4bdff4beSrobert } 51*4bdff4beSrobert 52*4bdff4beSrobert template <random_access_iterator _InIter, class _DiffType, random_access_iterator _OutIter> 53*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr static __go__fn54*4bdff4beSrobert copy_n_result<_InIter, _OutIter> __go(_InIter __first, _DiffType __n, _OutIter __result) { 55*4bdff4beSrobert auto __ret = std::__copy<_RangeAlgPolicy>(__first, __first + __n, __result); 56*4bdff4beSrobert return {__ret.first, __ret.second}; 57*4bdff4beSrobert } 58*4bdff4beSrobert 59*4bdff4beSrobert template <input_iterator _Ip, weakly_incrementable _Op> 60*4bdff4beSrobert requires indirectly_copyable<_Ip, _Op> 61*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr operator__fn62*4bdff4beSrobert copy_n_result<_Ip, _Op> operator()(_Ip __first, iter_difference_t<_Ip> __n, _Op __result) const { 63*4bdff4beSrobert return __go(std::move(__first), __n, std::move(__result)); 64*4bdff4beSrobert } 65*4bdff4beSrobert }; 66*4bdff4beSrobert } // namespace __copy_n 67*4bdff4beSrobert 68*4bdff4beSrobert inline namespace __cpo { 69*4bdff4beSrobert inline constexpr auto copy_n = __copy_n::__fn{}; 70*4bdff4beSrobert } // namespace __cpo 71*4bdff4beSrobert } // namespace ranges 72*4bdff4beSrobert 73*4bdff4beSrobert #endif // _LIBCPP_STD_VER > 17 74*4bdff4beSrobert 75*4bdff4beSrobert _LIBCPP_END_NAMESPACE_STD 76*4bdff4beSrobert 77*4bdff4beSrobert #endif // _LIBCPP___ALGORITHM_RANGES_COPY_N_H 78