[gcc(refs/users/ppalka/heads/libstdcxx-constrained-algos)] Implement the move_iterator changes described in P1207R4
Patrick Palka
ppalka@gcc.gnu.org
Wed Jan 22 22:34:00 GMT 2020
https://gcc.gnu.org/g:9a68297e5deafdf404aa6a434b5a706ba50d57cc
commit 9a68297e5deafdf404aa6a434b5a706ba50d57cc
Author: Patrick Palka <ppalka@redhat.com>
Date: Wed Jan 22 16:51:19 2020 -0500
Implement the move_iterator changes described in P1207R4
Diff:
---
libstdc++-v3/include/bits/stl_algobase.h | 6 +++---
libstdc++-v3/include/bits/stl_iterator.h | 13 ++++++++++++-
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index ea8f402..3492ea2 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -334,10 +334,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// remove the __normal_iterator wrapper. See copy, fill, ...
template<typename _Iterator>
_GLIBCXX20_CONSTEXPR
- inline _Iterator
- __niter_base(_Iterator __it)
+ inline _Iterator&&
+ __niter_base(_Iterator&& __it)
_GLIBCXX_NOEXCEPT_IF(std::is_nothrow_copy_constructible<_Iterator>::value)
- { return __it; }
+ { return std::forward<_Iterator>(__it); }
// Reverse the __niter_base transformation to get a
// __normal_iterator back again (this assumes that __normal_iterator
diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
index 784d200..9a737f4 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -1166,16 +1166,27 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
explicit _GLIBCXX17_CONSTEXPR
move_iterator(iterator_type __i)
- : _M_current(__i) { }
+ : _M_current(std::move(__i)) { }
template<typename _Iter>
_GLIBCXX17_CONSTEXPR
move_iterator(const move_iterator<_Iter>& __i)
: _M_current(__i.base()) { }
+#if __cplusplus > 201703L
+ constexpr iterator_type
+ base() const &
+ requires copyable<iterator_type>
+ { return _M_current; }
+
+ constexpr iterator_type
+ base() &&
+ { return std::move(_M_current); }
+#else
_GLIBCXX17_CONSTEXPR iterator_type
base() const
{ return _M_current; }
+#endif
_GLIBCXX17_CONSTEXPR reference
operator*() const
More information about the Libstdc++-cvs
mailing list