From b51d5605b1817fdce33c5f30316b0b5a5aef5116 Mon Sep 17 00:00:00 2001 From: Zoe Carver <z.zoelec2@gmail.com> Date: Wed, 11 Sep 2019 17:39:24 +0000 Subject: [PATCH] Consolidate swap, swap_ranges, and iter_swap in <type_traits>. NFC. Thanks to @Quuxplusone (Arthur O'Dwyer) for this change. llvm-svn: 371639 --- libcxx/include/type_traits | 24 +++++++++++++++++++++++- libcxx/include/utility | 24 +++--------------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 657c0d568dd4..03e8bba5ec81 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -3652,6 +3652,13 @@ _LIBCPP_INLINE_VAR constexpr bool is_nothrow_invocable_r_v template <class _Tp> struct __is_swappable; template <class _Tp> struct __is_nothrow_swappable; +// swap, swap_ranges + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_ForwardIterator2 +swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2); + template <class _Tp> inline _LIBCPP_INLINE_VISIBILITY #ifndef _LIBCPP_CXX03_LANG @@ -3677,7 +3684,22 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 typename enable_if< __is_swappable<_Tp>::value >::type -swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value); +swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) +{ + _VSTD::swap_ranges(__a, __a + _Np, __b); +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_ForwardIterator2 +swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) +{ + for(; __first1 != __last1; ++__first1, (void) ++__first2) + swap(*__first1, *__first2); + return __first2; +} + +// iter_swap template <class _ForwardIterator1, class _ForwardIterator2> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 diff --git a/libcxx/include/utility b/libcxx/include/utility index a185818b6fca..64599c8d55d0 100644 --- a/libcxx/include/utility +++ b/libcxx/include/utility @@ -248,29 +248,11 @@ operator>=(const _Tp& __x, const _Tp& __y) } // rel_ops -// swap_ranges +// swap_ranges is defined in <type_traits>` +// swap is defined in <type_traits> -template <class _ForwardIterator1, class _ForwardIterator2> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_ForwardIterator2 -swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) -{ - for(; __first1 != __last1; ++__first1, (void) ++__first2) - swap(*__first1, *__first2); - return __first2; -} - -// forward declared in <type_traits> -template<class _Tp, size_t _Np> -inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -typename enable_if< - __is_swappable<_Tp>::value ->::type -swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) -{ - _VSTD::swap_ranges(__a, __a + _Np, __b); -} +// move_if_noexcept template <class _Tp> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11