1*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric 9*fe6060f1SDimitry Andric #ifndef _LIBCPP___ALGORITHM_COPY_H 10*fe6060f1SDimitry Andric #define _LIBCPP___ALGORITHM_COPY_H 11*fe6060f1SDimitry Andric 12*fe6060f1SDimitry Andric #include <__config> 13*fe6060f1SDimitry Andric #include <__algorithm/unwrap_iter.h> 14*fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h> 15*fe6060f1SDimitry Andric #include <cstring> 16*fe6060f1SDimitry Andric #include <type_traits> 17*fe6060f1SDimitry Andric 18*fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19*fe6060f1SDimitry Andric #pragma GCC system_header 20*fe6060f1SDimitry Andric #endif 21*fe6060f1SDimitry Andric 22*fe6060f1SDimitry Andric _LIBCPP_PUSH_MACROS 23*fe6060f1SDimitry Andric #include <__undef_macros> 24*fe6060f1SDimitry Andric 25*fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 26*fe6060f1SDimitry Andric 27*fe6060f1SDimitry Andric // copy 28*fe6060f1SDimitry Andric 29*fe6060f1SDimitry Andric template <class _InputIterator, class _OutputIterator> 30*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 31*fe6060f1SDimitry Andric _OutputIterator 32*fe6060f1SDimitry Andric __copy_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 33*fe6060f1SDimitry Andric { 34*fe6060f1SDimitry Andric for (; __first != __last; ++__first, (void) ++__result) 35*fe6060f1SDimitry Andric *__result = *__first; 36*fe6060f1SDimitry Andric return __result; 37*fe6060f1SDimitry Andric } 38*fe6060f1SDimitry Andric 39*fe6060f1SDimitry Andric template <class _InputIterator, class _OutputIterator> 40*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 41*fe6060f1SDimitry Andric _OutputIterator 42*fe6060f1SDimitry Andric __copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 43*fe6060f1SDimitry Andric { 44*fe6060f1SDimitry Andric return _VSTD::__copy_constexpr(__first, __last, __result); 45*fe6060f1SDimitry Andric } 46*fe6060f1SDimitry Andric 47*fe6060f1SDimitry Andric template <class _Tp, class _Up> 48*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 49*fe6060f1SDimitry Andric typename enable_if 50*fe6060f1SDimitry Andric < 51*fe6060f1SDimitry Andric is_same<typename remove_const<_Tp>::type, _Up>::value && 52*fe6060f1SDimitry Andric is_trivially_copy_assignable<_Up>::value, 53*fe6060f1SDimitry Andric _Up* 54*fe6060f1SDimitry Andric >::type 55*fe6060f1SDimitry Andric __copy(_Tp* __first, _Tp* __last, _Up* __result) 56*fe6060f1SDimitry Andric { 57*fe6060f1SDimitry Andric const size_t __n = static_cast<size_t>(__last - __first); 58*fe6060f1SDimitry Andric if (__n > 0) 59*fe6060f1SDimitry Andric _VSTD::memmove(__result, __first, __n * sizeof(_Up)); 60*fe6060f1SDimitry Andric return __result + __n; 61*fe6060f1SDimitry Andric } 62*fe6060f1SDimitry Andric 63*fe6060f1SDimitry Andric template <class _InputIterator, class _OutputIterator> 64*fe6060f1SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 65*fe6060f1SDimitry Andric _OutputIterator 66*fe6060f1SDimitry Andric copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 67*fe6060f1SDimitry Andric { 68*fe6060f1SDimitry Andric if (__libcpp_is_constant_evaluated()) { 69*fe6060f1SDimitry Andric return _VSTD::__copy_constexpr(__first, __last, __result); 70*fe6060f1SDimitry Andric } else { 71*fe6060f1SDimitry Andric return _VSTD::__rewrap_iter(__result, 72*fe6060f1SDimitry Andric _VSTD::__copy(_VSTD::__unwrap_iter(__first), 73*fe6060f1SDimitry Andric _VSTD::__unwrap_iter(__last), 74*fe6060f1SDimitry Andric _VSTD::__unwrap_iter(__result))); 75*fe6060f1SDimitry Andric } 76*fe6060f1SDimitry Andric } 77*fe6060f1SDimitry Andric 78*fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 79*fe6060f1SDimitry Andric 80*fe6060f1SDimitry Andric _LIBCPP_POP_MACROS 81*fe6060f1SDimitry Andric 82*fe6060f1SDimitry Andric #endif // _LIBCPP___ALGORITHM_COPY_H 83