[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