aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-10-02 10:51:31 -0400
committerPatrick Palka <ppalka@redhat.com>2020-10-02 10:51:31 -0400
commit080a23bce12fa3f25860631f019777f728d2ef11 (patch)
tree0578968c2bb325e176b4a07a3e3d67030ea37d12 /libstdc++-v3/include
parent251950d899bc3c18b5775fe9fe20bebbdc8d15cb (diff)
downloadgcc-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.h33
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>