Re: Make vector 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(__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
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
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
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 +{