This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[v3] libstdc++/30085


Hi,

decided to just follow the existing practice for map / set / ..., a bit
of redundant code, but this way things work. Tested x86_64-linux,
-D_GLIBCXX_DEBUG too, committed to mainline.

Paolo.

//////////////////////
2008-09-30  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/30085 (again)
	* include/debug/unordered_map (unordered_map<>, unordered_multimap<>):
	Do not derive from _Safe_association, derive from _GLIBCXX_STD_D::
	unordered_map / unordered_multimap; add missing member functions.
	* include/debug/unordered_set (unordered_set<>, unordered_multiset<>):
	Likewise for _GLIBCXX_STD_D::unordered_set / unordered_multiset.
	* include/debug/safe_association.h: Remove.
	* include/Makefile.am: Adjust.
	* include/Makefile.in: Regenerate.
	* testsuite/23_containers/unordered_multimap/init-list.cc: Remove
	xfail.
Index: include/debug/unordered_map
===================================================================
*** include/debug/unordered_map	(revision 140779)
--- include/debug/unordered_map	(working copy)
***************
*** 1,6 ****
  // Debugging unordered_map/unordered_multimap implementation -*- C++ -*-
  
! // Copyright (C) 2003, 2004, 2005, 2006, 2007
  // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
--- 1,6 ----
  // Debugging unordered_map/unordered_multimap implementation -*- C++ -*-
  
! // Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
  // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
***************
*** 40,82 ****
  #else
  # include <c++0x_warning.h>
  #endif
- #include <initializer_list>
- #include <debug/safe_association.h>
- #include <debug/safe_iterator.h>
  
! #define _GLIBCXX_BASE unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>
! #define _GLIBCXX_STD_BASE _GLIBCXX_STD_D::_GLIBCXX_BASE
  
  namespace std
  {
  namespace __debug
  {
    template<typename _Key, typename _Tp,
! 	   typename _Hash  = std::hash<_Key>,
  	   typename _Pred = std::equal_to<_Key>,
! 	   typename _Alloc =  std::allocator<_Key> >
      class unordered_map
!     : public __gnu_debug::_Safe_association<_GLIBCXX_STD_BASE>,
!       public __gnu_debug::_Safe_sequence<_GLIBCXX_BASE>
      {
!       typedef typename _GLIBCXX_STD_BASE _Base;
!       typedef __gnu_debug::_Safe_association<_Base> _Safe_assoc;
        typedef __gnu_debug::_Safe_sequence<unordered_map> _Safe_base;
  
      public:
!       typedef typename _Safe_assoc::size_type       size_type;
!       typedef typename _Safe_assoc::value_type      value_type;
!       typedef typename _Safe_assoc::hasher          hasher;
!       typedef typename _Safe_assoc::key_equal       key_equal;
!       typedef typename _Safe_assoc::allocator_type allocator_type;
  
        explicit
        unordered_map(size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Safe_assoc(__n, __hf, __eql, __a)
!       { }
  
        template<typename _InputIterator>
          unordered_map(_InputIterator __f, _InputIterator __l, 
--- 40,87 ----
  #else
  # include <c++0x_warning.h>
  #endif
  
! #include <debug/safe_sequence.h>
! #include <debug/safe_iterator.h>
! #include <initializer_list>
  
  namespace std
  {
  namespace __debug
  {
    template<typename _Key, typename _Tp,
! 	   typename _Hash = std::hash<_Key>,
  	   typename _Pred = std::equal_to<_Key>,
! 	   typename _Alloc = std::allocator<_Key> >
      class unordered_map
!     : public _GLIBCXX_STD_D::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>,
!       public __gnu_debug::_Safe_sequence<unordered_map<_Key, _Tp, _Hash,
! 						       _Pred, _Alloc> >
      {
!       typedef _GLIBCXX_STD_D::unordered_map<_Key, _Tp, _Hash,
! 					    _Pred, _Alloc> _Base;
        typedef __gnu_debug::_Safe_sequence<unordered_map> _Safe_base;
  
      public:
!       typedef typename _Base::size_type       size_type;
!       typedef typename _Base::hasher          hasher;
!       typedef typename _Base::key_equal       key_equal;
!       typedef typename _Base::allocator_type  allocator_type;
! 
!       typedef typename _Base::key_type        key_type;
!       typedef typename _Base::value_type      value_type;
! 
!       typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
! 					  unordered_map> iterator;
!       typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
! 					  unordered_map> const_iterator;
  
        explicit
        unordered_map(size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Base(__n, __hf, __eql, __a) { }
  
        template<typename _InputIterator>
          unordered_map(_InputIterator __f, _InputIterator __l, 
*************** namespace __debug
*** 84,104 ****
  		      const hasher& __hf = hasher(), 
  		      const key_equal& __eql = key_equal(), 
  		      const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__f, __l, __n, __hf, __eql, __a)
!         { }
  
!       unordered_map(const _Safe_assoc& __x) 
!       : _Safe_assoc(__x), _Safe_base() { }
  
!       unordered_map(unordered_map&& __x) 
!       : _Safe_assoc(std::forward<_Safe_assoc>(__x)), _Safe_base() { }
  
        unordered_map(initializer_list<value_type> __l,
  		    size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__l, __n, __hf, __eql, __a) { }
  
        unordered_map&
        operator=(unordered_map&& __x)
--- 89,120 ----
  		      const hasher& __hf = hasher(), 
  		      const key_equal& __eql = key_equal(), 
  		      const allocator_type& __a = allocator_type())
! 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
! 		__hf, __eql, __a), _Safe_base() { }
  
!       unordered_map(const unordered_map& __x) 
!       : _Base(__x), _Safe_base() { }
  
!       unordered_map(const _Base& __x)
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_map(unordered_map&& __x)
!       : _Base(std::forward<unordered_map>(__x)), _Safe_base() { }
  
        unordered_map(initializer_list<value_type> __l,
  		    size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
! 
!       unordered_map&
!       operator=(const unordered_map& __x)
!       {
! 	*static_cast<_Base*>(this) = __x;
! 	this->_M_invalidate_all();
! 	return *this;
!       }
  
        unordered_map&
        operator=(unordered_map&& __x)
*************** namespace __debug
*** 120,126 ****
        void
        swap(unordered_map&& __x)
        {
! 	_Safe_assoc::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
--- 136,142 ----
        void
        swap(unordered_map&& __x)
        {
! 	_Base::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
*************** namespace __debug
*** 131,143 ****
  	this->_M_invalidate_all();
        }
  
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(this->_M_base().end()));
        }
      };
  
--- 147,314 ----
  	this->_M_invalidate_all();
        }
  
+       iterator 
+       begin()
+       { return iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       begin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       iterator
+       end()
+       { return iterator(_Base::end(), this); }
+ 
+       const_iterator
+       end() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       const_iterator
+       cbegin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       cend() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       // local versions
+       using _Base::begin;
+       using _Base::end;
+       using _Base::cbegin;
+       using _Base::cend;
+ 
+       std::pair<iterator, bool>
+       insert(const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return std::make_pair(iterator(__res.first, this), __res.second);
+       }
+ 
+       iterator
+       insert(iterator, const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return iterator(__res.first, this);
+       }
+ 
+       const_iterator
+       insert(const_iterator, const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return const_iterator(__res.first, this);
+       }
+ 
+       void
+       insert(std::initializer_list<value_type> __l)
+       { _Base::insert(__l); }
+ 
+       template<typename _InputIterator>
+         void
+         insert(_InputIterator __first, _InputIterator __last)
+         {
+ 	  __glibcxx_check_valid_range(__first, __last);
+ 	  _Base::insert(__first, __last);
+ 	}
+ 
+       iterator
+       find(const key_type& __key)
+       { return iterator(_Base::find(__key), this); }
+ 
+       const_iterator
+       find(const key_type& __key) const
+       { return const_iterator(_Base::find(__key), this); }
+ 
+       std::pair<iterator, iterator>
+       equal_range(const key_type& __key)
+       {
+ 	typedef typename _Base::iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(iterator(__res.first, this),
+ 			      iterator(__res.second, this));
+       }
+ 
+       std::pair<const_iterator, const_iterator>
+       equal_range(const key_type& __key) const
+       {
+ 	typedef typename _Base::const_iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(const_iterator(__res.first, this),
+ 			      const_iterator(__res.second, this));
+       }
+ 
+       size_type
+       erase(const key_type& __key)
+       {
+ 	size_type __ret(0);
+ 	iterator __victim(_Base::find(__key), this);
+ 	if (__victim != end())
+ 	  {
+ 	    this->erase(__victim);
+ 	    __ret = 1;
+ 	  }
+ 	return __ret;
+       }
+ 
+       iterator
+       erase(iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return const_iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       iterator
+       erase(iterator __first, iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return iterator(_Base::erase(__first.base(),
+ 				     __last.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __first, const_iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (const_iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  const_iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return const_iterator(_Base::erase(__first.base(),
+ 					   __last.base()), this);
+       }
+ 
+       _Base&
+       _M_base() { return *this; }
+ 
+       const _Base&
+       _M_base() const { return *this; }
+ 
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(_M_base().end()));
        }
      };
  
*************** namespace __debug
*** 162,220 ****
  	 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&& __y)
      { __x.swap(__y); }
  
- #undef _GLIBCXX_BASE
- #undef _GLIBCXX_STD_BASE
- #define _GLIBCXX_STD_BASE _GLIBCXX_STD_D::_GLIBCXX_BASE
- #define _GLIBCXX_BASE unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>
  
    template<typename _Key, typename _Tp,
! 	   typename _Hash  = std::hash<_Key>,
  	   typename _Pred = std::equal_to<_Key>,
! 	   typename _Alloc =  std::allocator<_Key> >
      class unordered_multimap
!     : public __gnu_debug::_Safe_association<_GLIBCXX_STD_BASE>,
!       public __gnu_debug::_Safe_sequence<_GLIBCXX_BASE>
      {
!       typedef typename _GLIBCXX_STD_BASE _Base;
!       typedef __gnu_debug::_Safe_association<_Base> _Safe_assoc;
        typedef __gnu_debug::_Safe_sequence<unordered_multimap> _Safe_base;
  
      public:
!       typedef typename _Safe_assoc::size_type       size_type;
!       typedef typename _Safe_assoc::value_type      value_type;
!       typedef typename _Safe_assoc::hasher          hasher;
!       typedef typename _Safe_assoc::key_equal       key_equal;
!       typedef typename _Safe_assoc::allocator_type allocator_type;
  
        explicit
        unordered_multimap(size_type __n = 10,
! 		    const hasher& __hf = hasher(),
! 		    const key_equal& __eql = key_equal(),
! 		    const allocator_type& __a = allocator_type())
!       : _Safe_assoc(__n, __hf, __eql, __a)
!       { }
  
        template<typename _InputIterator>
          unordered_multimap(_InputIterator __f, _InputIterator __l, 
! 		      size_type __n = 10,
! 		      const hasher& __hf = hasher(), 
! 		      const key_equal& __eql = key_equal(), 
! 		      const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__f, __l, __n, __hf, __eql, __a)
!         { }
  
        unordered_multimap(initializer_list<value_type> __l,
  			 size_type __n = 10,
  			 const hasher& __hf = hasher(),
  			 const key_equal& __eql = key_equal(),
  			 const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__l, __n, __hf, __eql, __a) { }
  
!       unordered_multimap(const _Safe_assoc& __x) 
!       : _Safe_assoc(__x), _Safe_base() { }
! 
!       unordered_multimap(unordered_multimap&& __x) 
!       : _Safe_assoc(std::forward<_Safe_assoc>(__x)), _Safe_base() { }
  
        unordered_multimap&
        operator=(unordered_multimap&& __x)
--- 333,406 ----
  	 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>&& __y)
      { __x.swap(__y); }
  
  
    template<typename _Key, typename _Tp,
! 	   typename _Hash = std::hash<_Key>,
  	   typename _Pred = std::equal_to<_Key>,
! 	   typename _Alloc = std::allocator<_Key> >
      class unordered_multimap
!     : public _GLIBCXX_STD_D::unordered_multimap<_Key, _Tp, _Hash,
! 						_Pred, _Alloc>,
!       public __gnu_debug::_Safe_sequence<unordered_multimap<_Key, _Tp, _Hash,
! 							    _Pred, _Alloc> >
      {
!       typedef _GLIBCXX_STD_D::unordered_multimap<_Key, _Tp, _Hash,
! 						 _Pred, _Alloc> _Base;
        typedef __gnu_debug::_Safe_sequence<unordered_multimap> _Safe_base;
  
      public:
!       typedef typename _Base::size_type       size_type;
!       typedef typename _Base::hasher          hasher;
!       typedef typename _Base::key_equal       key_equal;
!       typedef typename _Base::allocator_type  allocator_type;
! 
!       typedef typename _Base::key_type        key_type;
!       typedef typename _Base::value_type      value_type;
! 
!       typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
! 					  unordered_multimap> iterator;
!       typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
! 					  unordered_multimap> const_iterator;
  
        explicit
        unordered_multimap(size_type __n = 10,
! 			 const hasher& __hf = hasher(),
! 			 const key_equal& __eql = key_equal(),
! 			 const allocator_type& __a = allocator_type())
!       : _Base(__n, __hf, __eql, __a) { }
  
        template<typename _InputIterator>
          unordered_multimap(_InputIterator __f, _InputIterator __l, 
! 			   size_type __n = 10,
! 			   const hasher& __hf = hasher(), 
! 			   const key_equal& __eql = key_equal(), 
! 			   const allocator_type& __a = allocator_type())
! 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
! 		__hf, __eql, __a), _Safe_base() { }
! 
!       unordered_multimap(const unordered_multimap& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_multimap(const _Base& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_multimap(unordered_multimap&& __x) 
!       : _Base(std::forward<unordered_multimap>(__x)), _Safe_base() { }
  
        unordered_multimap(initializer_list<value_type> __l,
  			 size_type __n = 10,
  			 const hasher& __hf = hasher(),
  			 const key_equal& __eql = key_equal(),
  			 const allocator_type& __a = allocator_type())
!       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
  
!       unordered_multimap&
!       operator=(const unordered_multimap& __x)
!       {
! 	*static_cast<_Base*>(this) = __x;
! 	this->_M_invalidate_all();
! 	return *this;
!       }
  
        unordered_multimap&
        operator=(unordered_multimap&& __x)
*************** namespace __debug
*** 236,242 ****
        void
        swap(unordered_multimap&& __x)
        {
! 	_Safe_assoc::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
--- 422,428 ----
        void
        swap(unordered_multimap&& __x)
        {
! 	_Base::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
*************** namespace __debug
*** 247,259 ****
  	this->_M_invalidate_all();
        }
  
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(this->_M_base().end()));
        }
      };
  
--- 433,588 ----
  	this->_M_invalidate_all();
        }
  
+       iterator 
+       begin()
+       { return iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       begin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       iterator
+       end()
+       { return iterator(_Base::end(), this); }
+ 
+       const_iterator
+       end() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       const_iterator
+       cbegin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       cend() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       // local versions
+       using _Base::begin;
+       using _Base::end;
+       using _Base::cbegin;
+       using _Base::cend;
+ 
+       iterator
+       insert(const value_type& __obj)
+       { return iterator(_Base::insert(__obj), this); }
+ 
+       iterator
+       insert(iterator, const value_type& __obj)
+       { return iterator(_Base::insert(__obj), this); }
+ 
+       const_iterator
+       insert(const_iterator, const value_type& __obj)
+       { return const_iterator(_Base::insert(__obj), this); }
+ 
+       void
+       insert(std::initializer_list<value_type> __l)
+       { _Base::insert(__l); }
+ 
+       template<typename _InputIterator>
+         void
+         insert(_InputIterator __first, _InputIterator __last)
+         {
+ 	  __glibcxx_check_valid_range(__first, __last);
+ 	  _Base::insert(__first, __last);
+ 	}
+ 
+       iterator
+       find(const key_type& __key)
+       { return iterator(_Base::find(__key), this); }
+ 
+       const_iterator
+       find(const key_type& __key) const
+       { return const_iterator(_Base::find(__key), this); }
+ 
+       std::pair<iterator, iterator>
+       equal_range(const key_type& __key)
+       {
+ 	typedef typename _Base::iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(iterator(__res.first, this),
+ 			      iterator(__res.second, this));
+       }
+ 
+       std::pair<const_iterator, const_iterator>
+       equal_range(const key_type& __key) const
+       {
+ 	typedef typename _Base::const_iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(const_iterator(__res.first, this),
+ 			      const_iterator(__res.second, this));
+       }
+ 
+       size_type
+       erase(const key_type& __key)
+       {
+ 	size_type __ret(0);
+ 	iterator __victim(_Base::find(__key), this);
+ 	if (__victim != end())
+ 	  {
+ 	    this->erase(__victim);
+ 	    __ret = 1;
+ 	  }
+ 	return __ret;
+       }
+ 
+       iterator
+       erase(iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return const_iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       iterator
+       erase(iterator __first, iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return iterator(_Base::erase(__first.base(),
+ 				     __last.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __first, const_iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (const_iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  const_iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return const_iterator(_Base::erase(__first.base(),
+ 					   __last.base()), this);
+       }
+ 
+       _Base&
+       _M_base() { return *this; }
+ 
+       const _Base&
+       _M_base() const { return *this; }
+ 
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(_M_base().end()));
        }
      };
  
*************** namespace __debug
*** 281,287 ****
  } // namespace __debug
  } // namespace std
  
- #undef _GLIBCXX_BASE
- #undef _GLIBCXX_STD_BASE
- 
  #endif
--- 610,613 ----
Index: include/debug/safe_association.h
===================================================================
*** include/debug/safe_association.h	(revision 140779)
--- include/debug/safe_association.h	(working copy)
***************
*** 1,222 ****
- // Safe associated container base class implementation  -*- C++ -*-
- 
- // Copyright (C) 2007, 2008 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 2, or (at your option)
- // any later version.
- 
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- 
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING.  If not, write to the Free
- // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- // USA.
- 
- // As a special exception, you may use this file as part of a free software
- // library without restriction.  Specifically, if other files instantiate
- // templates or use macros or inline functions from this file, or you compile
- // this file and link it with other files to produce an executable, this
- // file does not by itself cause the resulting executable to be covered by
- // the GNU General Public License.  This exception does not however
- // invalidate any other reasons why the executable file might be covered by
- // the GNU General Public License.
- 
- /** @file debug/safe_association.h
-  *  This file is a GNU debug extension to the Standard C++ Library.
-  */
- 
- #ifndef _GLIBCXX_DEBUG_SAFE_ASSOCIATION_H
- #define _GLIBCXX_DEBUG_SAFE_ASSOCIATION_H 1
- 
- #include <debug/debug.h>
- #include <debug/macros.h>
- #include <debug/functions.h>
- #include <debug/formatter.h>
- #include <debug/safe_sequence.h>
- 
- namespace __gnu_debug
- {
-   /**
-    * @brief Base class for constructing a "safe" associated container type.
-    *
-    * The class template %_Safe_association simplifies the construction of
-    * "safe" associated containers.
-    */
-   template<typename _Base>
-     class _Safe_association 
-     : public _Base
-     {
-     public:
-       typedef typename _Base::size_type       size_type;
-       typedef typename _Base::hasher          hasher;
-       typedef typename _Base::key_equal       key_equal;
-       typedef typename _Base::allocator_type allocator_type;
- 
-       typedef typename _Base::key_type        key_type;
-       typedef typename _Base::value_type      value_type;
-       typedef typename _Base::difference_type difference_type;
-       typedef typename _Base::reference       reference;
-       typedef typename _Base::const_reference const_reference;
- 
-       typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, 
- 					  _Safe_association>
-                                               iterator;
-       typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
- 					  _Safe_association>
-                                               const_iterator;
- 
-       _Safe_association() { }
- 
-       explicit _Safe_association(size_type __n) : _Base(__n) { }
- 
-       _Safe_association(size_type __n, const hasher& __hf) 
-       : _Base(__n, __hf) { }
- 
-       _Safe_association(size_type __n, const hasher& __hf, 
- 			const key_equal& __eql,
- 			const allocator_type& __a = allocator_type())
-       : _Base(__n, __hf, __eql, __a) { }
- 
-       template<typename _InputIter>
-         _Safe_association(_InputIter __f, _InputIter __l)
- 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l) { }
- 
-       template<typename _InputIter>
-         _Safe_association(_InputIter __f, _InputIter __l, size_type __n)
- 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n) { }
- 
-       template<typename _InputIter>
-         _Safe_association(_InputIter __f, _InputIter __l, size_type __n,
- 		      const hasher& __hf)
- 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n, __hf) 
-         { }
- 
-       template<typename _InputIter>
-         _Safe_association(_InputIter __f, _InputIter __l, size_type __n,
- 			  const hasher& __hf, const key_equal& __eql,
- 			  const allocator_type& __a = allocator_type())
- 	: _Base(__gnu_debug::__check_valid_range(__f, __l), 
- 		__l, __n, __hf, __eql, __a) 
-         { }
- 
-       _Safe_association(std::initializer_list<value_type> __l,
- 			size_type __n,
- 			const hasher& __hf,
- 			const key_equal& __eql,
- 			const allocator_type& __a = allocator_type())
-       : _Base(__l, __n, __hf, __eql, __a)
-       { }
- 
-       _Safe_association(const _Base& __x) : _Base(__x) { }
- 
-       _Safe_association(_Safe_association&& __x)
-       : _Base(std::forward<_Base>(__x)) { }
- 
-       using _Base::size;
-       using _Base::max_size;
-       using _Base::empty;
-       using _Base::get_allocator;
-       using _Base::key_eq;
- 
-       using _Base::count;
-       using _Base::bucket_count;
-       using _Base::max_bucket_count;
-       using _Base::bucket;
-       using _Base::bucket_size;
-       using _Base::load_factor;
- 
-       const_iterator
-       begin() const { return const_iterator(_Base::begin(), this); }
- 
-       const_iterator
-       end() const   { return const_iterator(_Base::end(), this); }
- 
-       std::pair<iterator, bool>
-       insert(const value_type& __obj)
-       {
- 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
- 	__pair_type __res = _Base::insert(__obj);
- 	return std::make_pair(iterator(__res.first, this), __res.second);
-       }
- 
-       void
-       insert(const value_type* __first, const value_type* __last)
-       {
- 	__glibcxx_check_valid_range(__first, __last);
- 	_Base::insert(__first, __last);
-       }
- 
-       template<typename _InputIter>
-         void
-         insert(_InputIter __first, _InputIter __last)
-         {
- 	  __glibcxx_check_valid_range(__first, __last);
- 	  _Base::insert(__first.base(), __last.base());
- 	}
- 
-       void
-       insert(std::initializer_list<value_type> __l)
-       { _Base::insert(__l); }
- 
-       const_iterator
-       find(const key_type& __key) const
-       { return const_iterator(_Base::find(__key), this); }
- 
-       std::pair<const_iterator, const_iterator>
-       equal_range(const key_type& __key) const
-       {
- 	typedef typename _Base::const_iterator _Base_iterator;
- 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
- 	__pair_type __res = _Base::equal_range(__key);
- 	return std::make_pair(const_iterator(__res.first, this),
- 			      const_iterator(__res.second, this));
-       }
- 
-       size_type
-       erase(const key_type& __key)
-       {
- 	size_type __ret(0);
- 	iterator __victim(_Base::find(__key), this);
- 	if (__victim != end())
- 	  {
- 	    this->erase(__victim);
- 	    __ret = 1;
- 	  }
- 	return __ret;
-       }
- 
-       iterator
-       erase(iterator __it)
-       {
- 	__glibcxx_check_erase(__it);
- 	__it._M_invalidate();
- 	return iterator(_Base::erase(__it.base()));
-       }
- 
-       iterator
-       erase(iterator __first, iterator __last)
-       {
- 	__glibcxx_check_erase_range(__first, __last);
- 	for (iterator __tmp = __first; __tmp != __last;)
- 	{
- 	  iterator __victim = __tmp++;
- 	  __victim._M_invalidate();
- 	}
- 	return iterator(_Base::erase(__first.base(), __last.base()));
-       }
- 
-       _Base&
-       _M_base() { return *this; }
- 
-       const _Base&
-       _M_base() const { return *this; }
-     };
- } // namespace __gnu_debug
- 
- #endif
--- 0 ----
Index: include/debug/unordered_set
===================================================================
*** include/debug/unordered_set	(revision 140779)
--- include/debug/unordered_set	(working copy)
***************
*** 1,6 ****
  // Debugging unordered_set/unordered_multiset implementation -*- C++ -*-
  
! // Copyright (C) 2003, 2004, 2005, 2006, 2007
  // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
--- 1,6 ----
  // Debugging unordered_set/unordered_multiset implementation -*- C++ -*-
  
! // Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
  // Free Software Foundation, Inc.
  //
  // This file is part of the GNU ISO C++ Library.  This library is free
***************
*** 41,83 ****
  # include <c++0x_warning.h>
  #endif
  
! #include <initializer_list>
! #include <debug/safe_association.h>
  #include <debug/safe_iterator.h>
! 
! #define _GLIBCXX_BASE unordered_set<_Value, _Hash, _Pred, _Alloc>
! #define _GLIBCXX_STD_BASE _GLIBCXX_STD_D::_GLIBCXX_BASE
  
  namespace std
  {
  namespace __debug
  {
    template<typename _Value,
! 	   typename _Hash  = std::hash<_Value>,
  	   typename _Pred = std::equal_to<_Value>,
! 	   typename _Alloc =  std::allocator<_Value> >
      class unordered_set
!     : public __gnu_debug::_Safe_association<_GLIBCXX_STD_BASE>,
!       public __gnu_debug::_Safe_sequence<_GLIBCXX_BASE>
      {
!       typedef typename _GLIBCXX_STD_BASE _Base;
!       typedef __gnu_debug::_Safe_association<_Base> _Safe_assoc;
        typedef __gnu_debug::_Safe_sequence<unordered_set> _Safe_base;
  
      public:
!       typedef typename _Safe_assoc::size_type       size_type;
!       typedef typename _Safe_assoc::value_type      value_type;
!       typedef typename _Safe_assoc::hasher          hasher;
!       typedef typename _Safe_assoc::key_equal       key_equal;
!       typedef typename _Safe_assoc::allocator_type allocator_type;
  
        explicit
        unordered_set(size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Safe_assoc(__n, __hf, __eql, __a)
!       { }
  
        template<typename _InputIterator>
          unordered_set(_InputIterator __f, _InputIterator __l, 
--- 41,87 ----
  # include <c++0x_warning.h>
  #endif
  
! #include <debug/safe_sequence.h>
  #include <debug/safe_iterator.h>
! #include <initializer_list>
  
  namespace std
  {
  namespace __debug
  {
    template<typename _Value,
! 	   typename _Hash = std::hash<_Value>,
  	   typename _Pred = std::equal_to<_Value>,
! 	   typename _Alloc = std::allocator<_Value> >
      class unordered_set
!     : public _GLIBCXX_STD_D::unordered_set<_Value, _Hash, _Pred, _Alloc>,
!       public __gnu_debug::_Safe_sequence<unordered_set<_Value, _Hash,
! 						       _Pred, _Alloc> >
      {
!       typedef _GLIBCXX_STD_D::unordered_set<_Value, _Hash,
! 					    _Pred, _Alloc> _Base;
        typedef __gnu_debug::_Safe_sequence<unordered_set> _Safe_base;
  
      public:
!       typedef typename _Base::size_type       size_type;
!       typedef typename _Base::hasher          hasher;
!       typedef typename _Base::key_equal       key_equal;
!       typedef typename _Base::allocator_type  allocator_type;
! 
!       typedef typename _Base::key_type        key_type;
!       typedef typename _Base::value_type      value_type;
! 
!       typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
! 					  unordered_set> iterator;
!       typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
! 					  unordered_set> const_iterator;
  
        explicit
        unordered_set(size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Base(__n, __hf, __eql, __a) { }
  
        template<typename _InputIterator>
          unordered_set(_InputIterator __f, _InputIterator __l, 
*************** namespace __debug
*** 85,105 ****
  		      const hasher& __hf = hasher(), 
  		      const key_equal& __eql = key_equal(), 
  		      const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__f, __l, __n, __hf, __eql, __a)
!         { }
  
        unordered_set(initializer_list<value_type> __l,
  		    size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__l, __n, __hf, __eql, __a) { }
  
!       unordered_set(const _Safe_assoc& __x) 
!       : _Safe_assoc(__x), _Safe_base() { }
! 
!       unordered_set(unordered_set&& __x) 
!       : _Safe_assoc(std::forward<_Safe_assoc>(__x)), _Safe_base() { }
  
        unordered_set&
        operator=(unordered_set&& __x)
--- 89,120 ----
  		      const hasher& __hf = hasher(), 
  		      const key_equal& __eql = key_equal(), 
  		      const allocator_type& __a = allocator_type())
! 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
! 		__hf, __eql, __a), _Safe_base() { }
! 
!       unordered_set(const unordered_set& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_set(const _Base& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_set(unordered_set&& __x) 
!       : _Base(std::forward<unordered_set>(__x)), _Safe_base() { }
  
        unordered_set(initializer_list<value_type> __l,
  		    size_type __n = 10,
  		    const hasher& __hf = hasher(),
  		    const key_equal& __eql = key_equal(),
  		    const allocator_type& __a = allocator_type())
!       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
  
!       unordered_set&
!       operator=(const unordered_set& __x)
!       {
! 	*static_cast<_Base*>(this) = __x;
! 	this->_M_invalidate_all();
! 	return *this;
!       }
  
        unordered_set&
        operator=(unordered_set&& __x)
*************** namespace __debug
*** 121,127 ****
        void
        swap(unordered_set&& __x)
        {
! 	_Safe_assoc::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
--- 136,142 ----
        void
        swap(unordered_set&& __x)
        {
! 	_Base::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
*************** namespace __debug
*** 132,144 ****
  	this->_M_invalidate_all();
        }
  
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(this->_M_base().end()));
        }
      };
  
--- 147,314 ----
  	this->_M_invalidate_all();
        }
  
+       iterator 
+       begin()
+       { return iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       begin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       iterator
+       end()
+       { return iterator(_Base::end(), this); }
+ 
+       const_iterator
+       end() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       const_iterator
+       cbegin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       cend() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       // local versions
+       using _Base::begin;
+       using _Base::end;
+       using _Base::cbegin;
+       using _Base::cend;
+ 
+       std::pair<iterator, bool>
+       insert(const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return std::make_pair(iterator(__res.first, this), __res.second);
+       }
+ 
+       iterator
+       insert(iterator, const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return iterator(__res.first, this);
+       }
+ 
+       const_iterator
+       insert(const_iterator, const value_type& __obj)
+       {
+ 	typedef std::pair<typename _Base::iterator, bool> __pair_type;
+ 	__pair_type __res = _Base::insert(__obj);
+ 	return const_iterator(__res.first, this);
+       }
+ 
+       void
+       insert(std::initializer_list<value_type> __l)
+       { _Base::insert(__l); }
+ 
+       template<typename _InputIterator>
+         void
+         insert(_InputIterator __first, _InputIterator __last)
+         {
+ 	  __glibcxx_check_valid_range(__first, __last);
+ 	  _Base::insert(__first, __last);
+ 	}
+ 
+       iterator
+       find(const key_type& __key)
+       { return iterator(_Base::find(__key), this); }
+ 
+       const_iterator
+       find(const key_type& __key) const
+       { return const_iterator(_Base::find(__key), this); }
+ 
+       std::pair<iterator, iterator>
+       equal_range(const key_type& __key)
+       {
+ 	typedef typename _Base::iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(iterator(__res.first, this),
+ 			      iterator(__res.second, this));
+       }
+ 
+       std::pair<const_iterator, const_iterator>
+       equal_range(const key_type& __key) const
+       {
+ 	typedef typename _Base::const_iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(const_iterator(__res.first, this),
+ 			      const_iterator(__res.second, this));
+       }
+ 
+       size_type
+       erase(const key_type& __key)
+       {
+ 	size_type __ret(0);
+ 	iterator __victim(_Base::find(__key), this);
+ 	if (__victim != end())
+ 	  {
+ 	    this->erase(__victim);
+ 	    __ret = 1;
+ 	  }
+ 	return __ret;
+       }
+ 
+       iterator
+       erase(iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return const_iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       iterator
+       erase(iterator __first, iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return iterator(_Base::erase(__first.base(),
+ 				     __last.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __first, const_iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (const_iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  const_iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return const_iterator(_Base::erase(__first.base(),
+ 					   __last.base()), this);
+       }
+ 
+       _Base&
+       _M_base() { return *this; }
+ 
+       const _Base&
+       _M_base() const { return *this; }
+ 
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(_M_base().end()));
        }
      };
  
*************** namespace __debug
*** 160,218 ****
  	 unordered_set<_Value, _Hash, _Pred, _Alloc>&& __y)
      { __x.swap(__y); }
  
- #undef _GLIBCXX_BASE
- #undef _GLIBCXX_STD_BASE
- #define _GLIBCXX_STD_BASE _GLIBCXX_STD_D::_GLIBCXX_BASE
- #define _GLIBCXX_BASE unordered_multiset<_Value, _Hash, _Pred, _Alloc>
  
    template<typename _Value,
! 	   typename _Hash  = std::hash<_Value>,
  	   typename _Pred = std::equal_to<_Value>,
! 	   typename _Alloc =  std::allocator<_Value> >
      class unordered_multiset
!     : public __gnu_debug::_Safe_association<_GLIBCXX_STD_BASE>,
!       public __gnu_debug::_Safe_sequence<_GLIBCXX_BASE>
      {
!       typedef typename _GLIBCXX_STD_BASE _Base;
!       typedef __gnu_debug::_Safe_association<_Base> _Safe_assoc;
        typedef __gnu_debug::_Safe_sequence<unordered_multiset> _Safe_base;
  
      public:
!       typedef typename _Safe_assoc::size_type       size_type;
!       typedef typename _Safe_assoc::value_type      value_type;
!       typedef typename _Safe_assoc::hasher          hasher;
!       typedef typename _Safe_assoc::key_equal       key_equal;
!       typedef typename _Safe_assoc::allocator_type allocator_type;
  
        explicit
        unordered_multiset(size_type __n = 10,
! 		    const hasher& __hf = hasher(),
! 		    const key_equal& __eql = key_equal(),
! 		    const allocator_type& __a = allocator_type())
!       : _Safe_assoc(__n, __hf, __eql, __a)
!       { }
  
        template<typename _InputIterator>
          unordered_multiset(_InputIterator __f, _InputIterator __l, 
! 		      size_type __n = 10,
! 		      const hasher& __hf = hasher(), 
! 		      const key_equal& __eql = key_equal(), 
! 		      const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__f, __l, __n, __hf, __eql, __a)
!         { }
  
        unordered_multiset(initializer_list<value_type> __l,
  			 size_type __n = 10,
  			 const hasher& __hf = hasher(),
  			 const key_equal& __eql = key_equal(),
  			 const allocator_type& __a = allocator_type())
! 	: _Safe_assoc(__l, __n, __hf, __eql, __a) { }
! 
!       unordered_multiset(const _Safe_assoc& __x) 
!       : _Safe_assoc(__x), _Safe_base() { }
  
!       unordered_multiset(unordered_multiset&& __x) 
!       : _Safe_assoc(std::forward<_Safe_assoc>(__x)), _Safe_base() { }
  
        unordered_multiset&
        operator=(unordered_multiset&& __x)
--- 330,402 ----
  	 unordered_set<_Value, _Hash, _Pred, _Alloc>&& __y)
      { __x.swap(__y); }
  
  
    template<typename _Value,
! 	   typename _Hash = std::hash<_Value>,
  	   typename _Pred = std::equal_to<_Value>,
! 	   typename _Alloc = std::allocator<_Value> >
      class unordered_multiset
!     : public _GLIBCXX_STD_D::unordered_multiset<_Value, _Hash, _Pred, _Alloc>,
!       public __gnu_debug::_Safe_sequence<unordered_multiset<_Value, _Hash,
! 							    _Pred, _Alloc> >
      {
!       typedef _GLIBCXX_STD_D::unordered_multiset<_Value, _Hash,
! 						 _Pred, _Alloc> _Base;
        typedef __gnu_debug::_Safe_sequence<unordered_multiset> _Safe_base;
  
      public:
!       typedef typename _Base::size_type       size_type;
!       typedef typename _Base::hasher          hasher;
!       typedef typename _Base::key_equal       key_equal;
!       typedef typename _Base::allocator_type  allocator_type;
! 
!       typedef typename _Base::key_type        key_type;
!       typedef typename _Base::value_type      value_type;
! 
!       typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,
! 					  unordered_multiset> iterator;
!       typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator,
! 					  unordered_multiset> const_iterator;
  
        explicit
        unordered_multiset(size_type __n = 10,
! 			 const hasher& __hf = hasher(),
! 			 const key_equal& __eql = key_equal(),
! 			 const allocator_type& __a = allocator_type())
!       : _Base(__n, __hf, __eql, __a) { }
  
        template<typename _InputIterator>
          unordered_multiset(_InputIterator __f, _InputIterator __l, 
! 			   size_type __n = 10,
! 			   const hasher& __hf = hasher(), 
! 			   const key_equal& __eql = key_equal(), 
! 			   const allocator_type& __a = allocator_type())
! 	: _Base(__gnu_debug::__check_valid_range(__f, __l), __l, __n,
! 		__hf, __eql, __a), _Safe_base() { }
! 
!       unordered_multiset(const unordered_multiset& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_multiset(const _Base& __x) 
!       : _Base(__x), _Safe_base() { }
! 
!       unordered_multiset(unordered_multiset&& __x) 
!       : _Base(std::forward<unordered_multiset>(__x)), _Safe_base() { }
  
        unordered_multiset(initializer_list<value_type> __l,
  			 size_type __n = 10,
  			 const hasher& __hf = hasher(),
  			 const key_equal& __eql = key_equal(),
  			 const allocator_type& __a = allocator_type())
!       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
  
!       unordered_multiset&
!       operator=(const unordered_multiset& __x)
!       {
! 	*static_cast<_Base*>(this) = __x;
! 	this->_M_invalidate_all();
! 	return *this;
!       }
  
        unordered_multiset&
        operator=(unordered_multiset&& __x)
*************** namespace __debug
*** 234,257 ****
        void
        swap(unordered_multiset&& __x)
        {
! 	_Safe_assoc::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
!      void
        clear()
        {
  	_Base::clear();
  	this->_M_invalidate_all();
        }
  
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(this->_M_base().end()));
        }
      };
  
--- 418,584 ----
        void
        swap(unordered_multiset&& __x)
        {
! 	_Base::swap(__x);
  	_Safe_base::_M_swap(__x);
        }
  
!       void
        clear()
        {
  	_Base::clear();
  	this->_M_invalidate_all();
        }
  
+       iterator
+       begin()
+       { return iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       begin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       iterator
+       end()
+       { return iterator(_Base::end(), this); }
+ 
+       const_iterator
+       end() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       const_iterator
+       cbegin() const
+       { return const_iterator(_Base::begin(), this); }
+ 
+       const_iterator
+       cend() const
+       { return const_iterator(_Base::end(), this); }
+ 
+       // local versions
+       using _Base::begin;
+       using _Base::end;
+       using _Base::cbegin;
+       using _Base::cend;
+ 
+       iterator
+       insert(const value_type& __obj)
+       { return iterator(_Base::insert(__obj), this); }
+ 
+       iterator
+       insert(iterator, const value_type& __obj)
+       { return iterator(_Base::insert(__obj), this); }
+ 
+       const_iterator
+       insert(const_iterator, const value_type& __obj)
+       { return const_iterator(_Base::insert(__obj), this); }
+ 
+       void
+       insert(std::initializer_list<value_type> __l)
+       { _Base::insert(__l); }
+ 
+       template<typename _InputIterator>
+         void
+         insert(_InputIterator __first, _InputIterator __last)
+         {
+ 	  __glibcxx_check_valid_range(__first, __last);
+ 	  _Base::insert(__first, __last);
+ 	}
+ 
+       iterator
+       find(const key_type& __key)
+       { return iterator(_Base::find(__key), this); }
+ 
+       const_iterator
+       find(const key_type& __key) const
+       { return const_iterator(_Base::find(__key), this); }
+ 
+       std::pair<iterator, iterator>
+       equal_range(const key_type& __key)
+       {
+ 	typedef typename _Base::iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(iterator(__res.first, this),
+ 			      iterator(__res.second, this));
+       }
+ 
+       std::pair<const_iterator, const_iterator>
+       equal_range(const key_type& __key) const
+       {
+ 	typedef typename _Base::const_iterator _Base_iterator;
+ 	typedef std::pair<_Base_iterator, _Base_iterator> __pair_type;
+ 	__pair_type __res = _Base::equal_range(__key);
+ 	return std::make_pair(const_iterator(__res.first, this),
+ 			      const_iterator(__res.second, this));
+       }
+ 
+       size_type
+       erase(const key_type& __key)
+       {
+ 	size_type __ret(0);
+ 	iterator __victim(_Base::find(__key), this);
+ 	if (__victim != end())
+ 	  {
+ 	    this->erase(__victim);
+ 	    __ret = 1;
+ 	  }
+ 	return __ret;
+       }
+ 
+       iterator
+       erase(iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __it)
+       {
+ 	__glibcxx_check_erase(__it);
+ 	__it._M_invalidate();
+ 	return const_iterator(_Base::erase(__it.base()), this);
+       }
+ 
+       iterator
+       erase(iterator __first, iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return iterator(_Base::erase(__first.base(),
+ 				     __last.base()), this);
+       }
+ 
+       const_iterator
+       erase(const_iterator __first, const_iterator __last)
+       {
+ 	__glibcxx_check_erase_range(__first, __last);
+ 	for (const_iterator __tmp = __first; __tmp != __last;)
+ 	{
+ 	  const_iterator __victim = __tmp++;
+ 	  __victim._M_invalidate();
+ 	}
+ 	return const_iterator(_Base::erase(__first.base(),
+ 					   __last.base()), this);
+       }
+ 
+       _Base&
+       _M_base() { return *this; }
+ 
+       const _Base&
+       _M_base() const { return *this; }
+ 
      private:
        void
        _M_invalidate_all()
        {
  	typedef typename _Base::const_iterator _Base_const_iterator;
  	typedef __gnu_debug::_Not_equal_to<_Base_const_iterator> _Not_equal;
! 	this->_M_invalidate_if(_Not_equal(_M_base().end()));
        }
      };
  
*************** namespace __debug
*** 276,282 ****
  } // namespace __debug
  } // namespace std
  
- #undef _GLIBCXX_BASE
- #undef _GLIBCXX_STD_BASE
- 
  #endif
--- 603,606 ----
Index: include/Makefile.am
===================================================================
*** include/Makefile.am	(revision 140779)
--- include/Makefile.am	(working copy)
*************** debug_headers = \
*** 696,702 ****
  	${debug_srcdir}/map.h \
  	${debug_srcdir}/multimap.h \
  	${debug_srcdir}/multiset.h \
- 	${debug_srcdir}/safe_association.h \
  	${debug_srcdir}/safe_base.h \
  	${debug_srcdir}/safe_iterator.h \
  	${debug_srcdir}/safe_iterator.tcc \
--- 696,701 ----
Index: testsuite/23_containers/unordered_multimap/init-list.cc
===================================================================
*** testsuite/23_containers/unordered_multimap/init-list.cc	(revision 140779)
--- testsuite/23_containers/unordered_multimap/init-list.cc	(working copy)
***************
*** 26,33 ****
  // the GNU General Public License.
  
  // { dg-options "-std=gnu++0x" }
- // XFAIL this test until debug mode container is fixed.
- // { dg-excess-errors "" }
  
  #include <set>
  #include <unordered_map>
--- 26,31 ----

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