This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Make vector<bool> iterator operators hidden friends


On 5/10/19 3:59 PM, Jonathan Wakely wrote:
On 10/05/19 14:40 +0100, Jonathan Wakely wrote:
On Thu, 9 May 2019 at 06:49, François Dumont wrote:

Hi

     Patch similar to the one I just apply for deque iterator including
NRVO copy ellision fix.

     * include/bits/stl_bvector.h
     (operator==(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Make hidden friend.
     (operator<(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (operator!=(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (operator>(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (operator<=(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (operator>=(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (operator-(const _Bit_iterator_base&, const _Bit_iterator_base&)):
     Likewise.
     (_Bit_iterator::operator+(difference_type)): Likewise and allow NRVO
     copy elision.
     (_Bit_iterator::operator-(difference_type)): Likewise.
     (operator+(ptrdiff_t, const _Bit_iterator&)): Make hidden friend.
     (_Bit_const_iterator::operator+(difference_type)): Likewise and allow
     NRVO copy elision.
     (_Bit_const_iterator::operator-(difference_type)): Likewise.
     (operator+(ptrdiff_t, const _Bit_const_iterator&)): Make hidden friend.

These const_iterator overloads seem to be missing the NRVO fix.

But the patch looks good otherwise, so OK for trunk with the NRVO
changes. Thanks.

Indeed, I had put it in the ChangeLog but forgotten to adapt code.

Attached patch committed.

François


diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index c60f4f0ef1c..280d40f60c5 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -182,40 +182,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       _M_offset = static_cast<unsigned int>(__n);
     }
 
-    bool
-    operator==(const _Bit_iterator_base& __i) const
-    { return _M_p == __i._M_p && _M_offset == __i._M_offset; }
+    friend bool
+    operator==(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    { return __x._M_p == __y._M_p && __x._M_offset == __y._M_offset; }
 
-    bool
-    operator<(const _Bit_iterator_base& __i) const
+    friend bool
+    operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
     {
-      return _M_p < __i._M_p
-	    || (_M_p == __i._M_p && _M_offset < __i._M_offset);
+      return __x._M_p < __y._M_p
+	    || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
     }
 
-    bool
-    operator!=(const _Bit_iterator_base& __i) const
-    { return !(*this == __i); }
+    friend bool
+    operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    { return !(__x == __y); }
 
-    bool
-    operator>(const _Bit_iterator_base& __i) const
-    { return __i < *this; }
+    friend bool
+    operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    { return __y < __x; }
 
-    bool
-    operator<=(const _Bit_iterator_base& __i) const
-    { return !(__i < *this); }
+    friend bool
+    operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    { return !(__y < __x); }
 
-    bool
-    operator>=(const _Bit_iterator_base& __i) const
-    { return !(*this < __i); }
-  };
+    friend bool
+    operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    { return !(__x < __y); }
 
-  inline ptrdiff_t
-  operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
-  {
-    return (int(_S_word_bit) * (__x._M_p - __y._M_p)
-	    + __x._M_offset - __y._M_offset);
-  }
+    friend ptrdiff_t
+    operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
+    {
+      return (int(_S_word_bit) * (__x._M_p - __y._M_p)
+	      + __x._M_offset - __y._M_offset);
+    }
+  };
 
   struct _Bit_iterator : public _Bit_iterator_base
   {
@@ -280,29 +280,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }
 
-    iterator
-    operator+(difference_type __i) const
+    reference
+    operator[](difference_type __i) const
+    { return *(*this + __i); }
+
+    friend iterator
+    operator+(const iterator& __x, difference_type __n)
     {
-      iterator __tmp = *this;
-      return __tmp += __i;
+      iterator __tmp = __x;
+      __tmp += __n;
+      return __tmp;
     }
 
-    iterator
-    operator-(difference_type __i) const
+    friend iterator
+    operator+(difference_type __n, const iterator& __x)
+    { return __x + __n; }
+
+    friend iterator
+    operator-(const iterator& __x, difference_type __n)
     {
-      iterator __tmp = *this;
-      return __tmp -= __i;
+      iterator __tmp = __x;
+      __tmp -= __n;
+      return __tmp;
     }
-
-    reference
-    operator[](difference_type __i) const
-    { return *(*this + __i); }
   };
 
-  inline _Bit_iterator
-  operator+(ptrdiff_t __n, const _Bit_iterator& __x)
-  { return __x + __n; }
-
   struct _Bit_const_iterator : public _Bit_iterator_base
   {
     typedef bool                 reference;
@@ -370,29 +372,31 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       return *this;
     }
 
-    const_iterator
-    operator+(difference_type __i) const
+    const_reference
+    operator[](difference_type __i) const
+    { return *(*this + __i); }
+
+    friend const_iterator
+    operator+(const const_iterator& __x, difference_type __n)
     {
-      const_iterator __tmp = *this;
-      return __tmp += __i;
+      const_iterator __tmp = __x;
+      __tmp += __n;
+      return __tmp;
     }
 
-    const_iterator
-    operator-(difference_type __i) const
+    friend const_iterator
+    operator-(const const_iterator& __x, difference_type __n)
     {
-      const_iterator __tmp = *this;
-      return __tmp -= __i;
+      const_iterator __tmp = __x;
+      __tmp -= __n;
+      return __tmp;
     }
 
-    const_reference
-    operator[](difference_type __i) const
-    { return *(*this + __i); }
+    friend const_iterator
+    operator+(difference_type __n, const const_iterator& __x)
+    { return __x + __n; }
   };
 
-  inline _Bit_const_iterator
-  operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
-  { return __x + __n; }
-
   inline void
   __fill_bvector(_Bit_type * __v,
 		 unsigned int __first, unsigned int __last, bool __x)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]