1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _LIBCPP___ALGORITHM_COPY_BACKWARD_H 10 #define _LIBCPP___ALGORITHM_COPY_BACKWARD_H 11 12 #include <__algorithm/copy.h> 13 #include <__algorithm/unwrap_iter.h> 14 #include <__config> 15 #include <__iterator/iterator_traits.h> 16 #include <__iterator/reverse_iterator.h> 17 #include <cstring> 18 #include <type_traits> 19 20 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 21 # pragma GCC system_header 22 #endif 23 24 _LIBCPP_BEGIN_NAMESPACE_STD 25 26 template <class _Iter1, class _Sent1, class _Iter2> 27 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 28 pair<_Iter1, _Iter2> __copy_backward_impl(_Iter1 __first, _Sent1 __last, _Iter2 __result) { 29 auto __ret = std::__copy(reverse_iterator<_Iter1>(__last), 30 reverse_iterator<_Sent1>(__first), 31 reverse_iterator<_Iter2>(__result)); 32 return pair<_Iter1, _Iter2>(__ret.first.base(), __ret.second.base()); 33 } 34 35 template <class _Iter1, class _Sent1, class _Iter2> 36 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 37 pair<_Iter1, _Iter2> __copy_backward(_Iter1 __first, _Sent1 __last, _Iter2 __result) { 38 auto __ret = std::__copy_backward_impl(std::__unwrap_iter(__first), 39 std::__unwrap_iter(__last), 40 std::__unwrap_iter(__result)); 41 return pair<_Iter1, _Iter2>(std::__rewrap_iter(__first, __ret.first), std::__rewrap_iter(__result, __ret.second)); 42 } 43 44 template <class _BidirectionalIterator1, class _BidirectionalIterator2> 45 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 46 _BidirectionalIterator2 47 copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, _BidirectionalIterator2 __result) { 48 return std::__copy_backward(__first, __last, __result).second; 49 } 50 51 _LIBCPP_END_NAMESPACE_STD 52 53 #endif // _LIBCPP___ALGORITHM_COPY_BACKWARD_H 54