From 080a23bce12fa3f25860631f019777f728d2ef11 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 2 Oct 2020 10:51:31 -0400 Subject: libstdc++: Add missing P0896 changes to I noticed that the following changes from this paper were not yet implemented. libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (reverse_iterator::iter_move): Define for C++20 as per P0896. (reverse_iterator::iter_swap): Likewise. (move_iterator::operator*): Apply P0896 changes for C++20. (move_iterator::operator[]): Likewise. * testsuite/24_iterators/reverse_iterator/cust.cc: New test. --- libstdc++-v3/include/bits/stl_iterator.h | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'libstdc++-v3/include') diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index f29bae9..2259f7c 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -362,6 +362,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator[](difference_type __n) const { return *(*this + __n); } +#if __cplusplus > 201703L && __cpp_lib_concepts + friend constexpr iter_rvalue_reference_t<_Iterator> + iter_move(const reverse_iterator& __i) + noexcept(is_nothrow_copy_constructible_v<_Iterator> + && noexcept(ranges::iter_move(--std::declval<_Iterator&>()))) + { + auto __tmp = __i.base(); + return ranges::iter_move(--__tmp); + } + + template _Iter2> + friend constexpr void + iter_swap(const reverse_iterator& __x, + const reverse_iterator<_Iter2>& __y) + noexcept(is_nothrow_copy_constructible_v<_Iterator> + && is_nothrow_copy_constructible_v<_Iter2> + && noexcept(ranges::iter_swap(--std::declval<_Iterator&>(), + --std::declval<_Iter2&>()))) + { + auto __xtmp = __x.base(); + auto __ytmp = __y.base(); + ranges::iter_swap(--__xtmp, --__ytmp); + } +#endif + private: template static _GLIBCXX17_CONSTEXPR _Tp* @@ -1379,7 +1404,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX17_CONSTEXPR reference operator*() const +#if __cplusplus > 201703L && __cpp_lib_concepts + { return ranges::iter_move(_M_current); } +#else { return static_cast(*_M_current); } +#endif _GLIBCXX17_CONSTEXPR pointer operator->() const @@ -1445,7 +1474,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX17_CONSTEXPR reference operator[](difference_type __n) const +#if __cplusplus > 201703L && __cpp_lib_concepts + { return ranges::iter_move(_M_current + __n); } +#else { return std::move(_M_current[__n]); } +#endif #if __cplusplus > 201703L && __cpp_lib_concepts template _Sent> -- cgit v1.1