Make std::forward_list iterator operators inline friend

Message ID 79be38de-3022-e80a-2552-b9c2c0a3ee2e@gmail.com
State New
Headers show
Series
  • Make std::forward_list iterator operators inline friend
Related show

Commit Message

François Dumont Oct. 10, 2018, 8:55 p.m.
Same patch as for std::list iterators. I only additionally move doc on 
those operators.

I also avoid redefining some typedef that are already defined in 
_Fwd_list_base<>.

     * include/bits/forward_list.h
     (_Fwd_list_iterator<>::operator==): Replace member function with inline
     friend.
     (_Fwd_list_iterator<>::operator!=): Likewise.
     (_Fwd_list_const_iterator<>::operator==): Likewise.
     (_Fwd_list_const_iterator<>::operator!=): Likewise.
     (operator==(const _Fwd_list_iterator<>&,
     const _Fwd_list_const_iterator<>&)): Remove.
     (operator!=(const _Fwd_list_iterator<>&,
     const _Fwd_list_const_iterator<>&)): Remove.
     (forward_list<>::_Node): Take typedef from base type.
     (forward_list<>::iterator): Likewise.
     (forward_list<>::const_iterator): Likewise.

Tested under Linux x86_64.

Ok to commit ?

François

Comments

Jonathan Wakely Oct. 11, 2018, 10:59 a.m. | #1
On 10/10/18 22:55 +0200, François Dumont wrote:
>Same patch as for std::list iterators. I only additionally move doc on 
>those operators.
>
>I also avoid redefining some typedef that are already defined in 
>_Fwd_list_base<>.
>
>    * include/bits/forward_list.h
>    (_Fwd_list_iterator<>::operator==): Replace member function with inline
>    friend.
>    (_Fwd_list_iterator<>::operator!=): Likewise.
>    (_Fwd_list_const_iterator<>::operator==): Likewise.
>    (_Fwd_list_const_iterator<>::operator!=): Likewise.
>    (operator==(const _Fwd_list_iterator<>&,
>    const _Fwd_list_const_iterator<>&)): Remove.
>    (operator!=(const _Fwd_list_iterator<>&,
>    const _Fwd_list_const_iterator<>&)): Remove.
>    (forward_list<>::_Node): Take typedef from base type.
>    (forward_list<>::iterator): Likewise.
>    (forward_list<>::const_iterator): Likewise.
>
>Tested under Linux x86_64.
>
>Ok to commit ?

OK, thanks.

Patch

diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index 84a4ad4d5dc..ebec3b5c818 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -173,13 +173,20 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	return __tmp;
       }
 
-      bool
-      operator==(const _Self& __x) const noexcept
-      { return _M_node == __x._M_node; }
+      /**
+       *  @brief  Forward list iterator equality comparison.
+       */
+      friend bool
+      operator==(const _Self& __x, const _Self& __y) noexcept
+      { return __x._M_node == __y._M_node; }
 
-      bool
-      operator!=(const _Self& __x) const noexcept
-      { return _M_node != __x._M_node; }
+
+      /**
+       *  @brief  Forward list iterator inequality comparison.
+       */
+      friend bool
+      operator!=(const _Self& __x, const _Self& __y) noexcept
+      { return __x._M_node != __y._M_node; }
 
       _Self
       _M_next() const noexcept
@@ -244,13 +251,19 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	return __tmp;
       }
 
-      bool
-      operator==(const _Self& __x) const noexcept
-      { return _M_node == __x._M_node; }
+      /**
+       *  @brief  Forward list const_iterator equality comparison.
+       */
+      friend bool
+      operator==(const _Self& __x, const _Self& __y) noexcept
+      { return __x._M_node == __y._M_node; }
 
-      bool
-      operator!=(const _Self& __x) const noexcept
-      { return _M_node != __x._M_node; }
+      /**
+       *  @brief  Forward list const_iterator inequality comparison.
+       */
+      friend bool
+      operator!=(const _Self& __x, const _Self& __y) noexcept
+      { return __x._M_node != __y._M_node; }
 
       _Self
       _M_next() const noexcept
@@ -264,24 +277,6 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       const _Fwd_list_node_base* _M_node;
     };
 
-  /**
-   *  @brief  Forward list iterator equality comparison.
-   */
-  template<typename _Tp>
-    inline bool
-    operator==(const _Fwd_list_iterator<_Tp>& __x,
-	       const _Fwd_list_const_iterator<_Tp>& __y) noexcept
-    { return __x._M_node == __y._M_node; }
-
-  /**
-   *  @brief  Forward list iterator inequality comparison.
-   */
-  template<typename _Tp>
-    inline bool
-    operator!=(const _Fwd_list_iterator<_Tp>& __x,
-	       const _Fwd_list_const_iterator<_Tp>& __y) noexcept
-    { return __x._M_node != __y._M_node; }
-
   /**
    *  @brief  Base class for %forward_list.
    */
@@ -433,8 +428,8 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
     private:
       typedef _Fwd_list_base<_Tp, _Alloc>		_Base;
-      typedef _Fwd_list_node<_Tp>			_Node;
       typedef _Fwd_list_node_base			_Node_base;
+      typedef typename _Base::_Node			_Node;
       typedef typename _Base::_Node_alloc_type		_Node_alloc_type;
       typedef typename _Base::_Node_alloc_traits	_Node_alloc_traits;
       typedef allocator_traits<__alloc_rebind<_Alloc, _Tp>>	_Alloc_traits;
@@ -447,8 +442,8 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       typedef value_type&				reference;
       typedef const value_type&				const_reference;
 
-      typedef _Fwd_list_iterator<_Tp>			iterator;
-      typedef _Fwd_list_const_iterator<_Tp>		const_iterator;
+      typedef typename _Base::iterator			iterator;
+      typedef typename _Base::const_iterator		const_iterator;
       typedef std::size_t				size_type;
       typedef std::ptrdiff_t				difference_type;
       typedef _Alloc					allocator_type;