Re: Make vector iterator operators hidden friends

2019-05-11 Thread François Dumont

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(__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 

Re: Make vector iterator operators hidden friends

2019-05-10 Thread Jonathan Wakely

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.




Re: Make vector iterator operators hidden friends

2019-05-10 Thread Jonathan Wakely
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.


Make vector iterator operators hidden friends

2019-05-08 Thread François Dumont

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.

Tested under linux x86_64 normal mode.

Ok to commit ?

François

diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index c60f4f0ef1c..6b9fb2b42b3 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(__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,29 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
   return *this;
 }
 
-const_iterator
-operator+(difference_type __i) const
+const_reference
+operator[](difference_type __i) const
+{