diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-10-02 10:51:31 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-10-02 10:51:31 -0400 |
commit | 080a23bce12fa3f25860631f019777f728d2ef11 (patch) | |
tree | 0578968c2bb325e176b4a07a3e3d67030ea37d12 /libstdc++-v3/include | |
parent | 251950d899bc3c18b5775fe9fe20bebbdc8d15cb (diff) | |
download | gcc-080a23bce12fa3f25860631f019777f728d2ef11.zip gcc-080a23bce12fa3f25860631f019777f728d2ef11.tar.gz gcc-080a23bce12fa3f25860631f019777f728d2ef11.tar.bz2 |
libstdc++: Add missing P0896 changes to <iterator>
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.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/stl_iterator.h | 33 |
1 files changed, 33 insertions, 0 deletions
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<indirectly_swappable<_Iterator> _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<typename _Tp> 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<reference>(*_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<sentinel_for<_Iterator> _Sent> |