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]

[Patch/RFC] Fix libstdc++/15775


Hi,

in my reading of the standard, due to the requirements for allocators (20.1.5,
in particular Table 32 and 20.1.5, p4) strictly speaking the library is
correct as is, in the sense that, f.i.,


typedef value_type* pointer;

is equivalent to

typedef typename _Alloc::pointer pointer;

However, we are already using the latter syntax (exactly that specified in the
standard) in set e multiset and seems good, for consistency, to use it also for
the other containers.


Anything I'm missing?

Otherwise I'll commit soon the below to mainline, tested x86-linux.

Thanks,
Paolo.

//////////////
2004-06-09  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/15775
	* include/bits/stl_deque.h: Consistently with stl_set.h, define
	pointer as allocator's pointer, likewise for reference,
	const_pointer, and const_reference.
	* include/bits/stl_list.h: Likewise.
	* include/bits/stl_map.h: Likewise.
	* include/bits/stl_multimap.h: Likewise.
	* include/bits/stl_vector.h: Likewise.
diff -prN libstdc++-v3-orig/include/bits/stl_deque.h libstdc++-v3/include/bits/stl_deque.h
*** libstdc++-v3-orig/include/bits/stl_deque.h	Wed Apr 21 16:06:00 2004
--- libstdc++-v3/include/bits/stl_deque.h	Wed Jun  9 14:05:33 2004
*************** namespace _GLIBCXX_STD
*** 595,608 ****
  
      public:
        typedef _Tp                                value_type;
!       typedef value_type*                        pointer;
!       typedef const value_type*                  const_pointer;
        typedef typename _Base::iterator           iterator;
        typedef typename _Base::const_iterator     const_iterator;
        typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
        typedef std::reverse_iterator<iterator>         reverse_iterator;
-       typedef value_type&                        reference;
-       typedef const value_type&                  const_reference;
        typedef size_t                             size_type;
        typedef ptrdiff_t                          difference_type;
        typedef typename _Base::allocator_type     allocator_type;
--- 595,608 ----
  
      public:
        typedef _Tp                                value_type;
!       typedef typename _Alloc::pointer           pointer;
!       typedef typename _Alloc::const_pointer     const_pointer;
!       typedef typename _Alloc::reference         reference;
!       typedef typename _Alloc::const_reference   const_reference;
        typedef typename _Base::iterator           iterator;
        typedef typename _Base::const_iterator     const_iterator;
        typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
        typedef std::reverse_iterator<iterator>         reverse_iterator;
        typedef size_t                             size_type;
        typedef ptrdiff_t                          difference_type;
        typedef typename _Base::allocator_type     allocator_type;
diff -prN libstdc++-v3-orig/include/bits/stl_list.h libstdc++-v3/include/bits/stl_list.h
*** libstdc++-v3-orig/include/bits/stl_list.h	Wed Apr 21 16:06:00 2004
--- libstdc++-v3/include/bits/stl_list.h	Wed Jun  9 14:06:35 2004
*************** namespace _GLIBCXX_STD
*** 394,411 ****
        typedef _List_base<_Tp, _Alloc>                   _Base;
  
      public:
!       typedef _Tp                                       value_type;
!       typedef value_type*                               pointer;
!       typedef const value_type*                         const_pointer;
!       typedef _List_iterator<_Tp>                       iterator;
!       typedef _List_const_iterator<_Tp>                 const_iterator;
!       typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;
!       typedef std::reverse_iterator<iterator>           reverse_iterator;
!       typedef value_type&                               reference;
!       typedef const value_type&                         const_reference;
!       typedef size_t                                    size_type;
!       typedef ptrdiff_t                                 difference_type;
!       typedef typename _Base::allocator_type            allocator_type;
  
      protected:
        // Note that pointers-to-_Node's can be ctor-converted to
--- 394,411 ----
        typedef _List_base<_Tp, _Alloc>                   _Base;
  
      public:
!       typedef _Tp                                        value_type;
!       typedef typename _Alloc::pointer                   pointer;
!       typedef typename _Alloc::const_pointer             const_pointer;
!       typedef typename _Alloc::reference                 reference;
!       typedef typename _Alloc::const_reference           const_reference;
!       typedef _List_iterator<_Tp>                        iterator;
!       typedef _List_const_iterator<_Tp>                  const_iterator;
!       typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
!       typedef std::reverse_iterator<iterator>            reverse_iterator;
!       typedef size_t                                     size_type;
!       typedef ptrdiff_t                                  difference_type;
!       typedef typename _Base::allocator_type             allocator_type;
  
      protected:
        // Note that pointers-to-_Node's can be ctor-converted to
diff -prN libstdc++-v3-orig/include/bits/stl_map.h libstdc++-v3/include/bits/stl_map.h
*** libstdc++-v3-orig/include/bits/stl_map.h	Fri Apr 16 21:04:03 2004
--- libstdc++-v3/include/bits/stl_map.h	Wed Jun  9 14:02:22 2004
*************** namespace _GLIBCXX_STD
*** 126,142 ****
      public:
        // many of these are specified differently in ISO, but the following are
        // "functionally equivalent"
!       typedef typename _Rep_type::allocator_type           allocator_type;
!       typedef typename _Rep_type::reference                reference;
!       typedef typename _Rep_type::const_reference          const_reference;
!       typedef typename _Rep_type::iterator                 iterator;
!       typedef typename _Rep_type::const_iterator           const_iterator;
!       typedef typename _Rep_type::size_type                size_type;
!       typedef typename _Rep_type::difference_type          difference_type;
!       typedef typename _Rep_type::pointer                  pointer;
!       typedef typename _Rep_type::const_pointer            const_pointer;
!       typedef typename _Rep_type::reverse_iterator         reverse_iterator;
!       typedef typename _Rep_type::const_reverse_iterator   const_reverse_iterator;
  
        // [23.3.1.1] construct/copy/destroy
        // (get_allocator() is normally listed in this section, but seems to have
--- 126,142 ----
      public:
        // many of these are specified differently in ISO, but the following are
        // "functionally equivalent"
!       typedef typename _Alloc::pointer                   pointer;
!       typedef typename _Alloc::const_pointer             const_pointer;
!       typedef typename _Alloc::reference                 reference;
!       typedef typename _Alloc::const_reference           const_reference;
!       typedef typename _Rep_type::allocator_type         allocator_type;
!       typedef typename _Rep_type::iterator               iterator;
!       typedef typename _Rep_type::const_iterator         const_iterator;
!       typedef typename _Rep_type::size_type              size_type;
!       typedef typename _Rep_type::difference_type        difference_type;
!       typedef typename _Rep_type::reverse_iterator       reverse_iterator;
!       typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
  
        // [23.3.1.1] construct/copy/destroy
        // (get_allocator() is normally listed in this section, but seems to have
diff -prN libstdc++-v3-orig/include/bits/stl_multimap.h libstdc++-v3/include/bits/stl_multimap.h
*** libstdc++-v3-orig/include/bits/stl_multimap.h	Fri Apr 16 21:04:03 2004
--- libstdc++-v3/include/bits/stl_multimap.h	Wed Jun  9 14:02:05 2004
*************** namespace _GLIBCXX_STD
*** 142,160 ****
      public:
        // many of these are specified differently in ISO, but the following are
        // "functionally equivalent"
        typedef typename _Rep_type::allocator_type         allocator_type;
-       typedef typename _Rep_type::reference              reference;
-       typedef typename _Rep_type::const_reference        const_reference;
        typedef typename _Rep_type::iterator               iterator;
        typedef typename _Rep_type::const_iterator         const_iterator;
        typedef typename _Rep_type::size_type              size_type;
        typedef typename _Rep_type::difference_type        difference_type;
-       typedef typename _Rep_type::pointer                pointer;
-       typedef typename _Rep_type::const_pointer          const_pointer;
        typedef typename _Rep_type::reverse_iterator       reverse_iterator;
        typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
  
- 
        // [23.3.2] construct/copy/destroy
        // (get_allocator() is also listed in this section)
        /**
--- 142,159 ----
      public:
        // many of these are specified differently in ISO, but the following are
        // "functionally equivalent"
+       typedef typename _Alloc::pointer                   pointer;
+       typedef typename _Alloc::const_pointer             const_pointer;
+       typedef typename _Alloc::reference                 reference;
+       typedef typename _Alloc::const_reference           const_reference;
        typedef typename _Rep_type::allocator_type         allocator_type;
        typedef typename _Rep_type::iterator               iterator;
        typedef typename _Rep_type::const_iterator         const_iterator;
        typedef typename _Rep_type::size_type              size_type;
        typedef typename _Rep_type::difference_type        difference_type;
        typedef typename _Rep_type::reverse_iterator       reverse_iterator;
        typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
  
        // [23.3.2] construct/copy/destroy
        // (get_allocator() is also listed in this section)
        /**
diff -prN libstdc++-v3-orig/include/bits/stl_vector.h libstdc++-v3/include/bits/stl_vector.h
*** libstdc++-v3-orig/include/bits/stl_vector.h	Mon Apr 26 11:02:43 2004
--- libstdc++-v3/include/bits/stl_vector.h	Wed Jun  9 14:03:49 2004
*************** namespace _GLIBCXX_STD
*** 153,171 ****
        typedef vector<_Tp, _Alloc>			vector_type;
  
      public:
!       typedef _Tp					value_type;
!       typedef value_type*				pointer;
!       typedef const value_type*				const_pointer;
        typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;
        typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>
        const_iterator;
!       typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
!       typedef std::reverse_iterator<iterator>		reverse_iterator;
!       typedef value_type&				reference;
!       typedef const value_type&				const_reference;
!       typedef size_t					size_type;
!       typedef ptrdiff_t					difference_type;
!       typedef typename _Base::allocator_type		allocator_type;
  
      protected:
        /** @if maint
--- 153,171 ----
        typedef vector<_Tp, _Alloc>			vector_type;
  
      public:
!       typedef _Tp					 value_type;
!       typedef typename _Alloc::pointer                   pointer;
!       typedef typename _Alloc::const_pointer             const_pointer;
!       typedef typename _Alloc::reference                 reference;
!       typedef typename _Alloc::const_reference           const_reference;
        typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;
        typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>
        const_iterator;
!       typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
!       typedef std::reverse_iterator<iterator>		 reverse_iterator;
!       typedef size_t					 size_type;
!       typedef ptrdiff_t					 difference_type;
!       typedef typename _Base::allocator_type		 allocator_type;
  
      protected:
        /** @if maint

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