OSDN Git Service

2010-03-08 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Mar 2010 01:56:42 +0000 (01:56 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Mar 2010 01:56:42 +0000 (01:56 +0000)
Revert:
2010-02-11  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/41975, DR 579
* include/bits/hashtable.h (_Hashtable<>::_M_erase_node): Remove.
(erase(const_iterator), erase(const_iterator, const_iterator)):
Change return type to void.
* include/debug/unordered_map: Adjust.
* include/debug/unordered_set: Likewise.
* testsuite/util/exception/safety.h: Likewise.
* testsuite/23_containers/unordered_map/erase/1.cc: Likewise.
* testsuite/23_containers/unordered_map/erase/24061-map.cc: Likewise.
* testsuite/23_containers/unordered_set/erase/1.cc:  Likewise.
* testsuite/23_containers/unordered_set/erase/24061-map.cc: Likewise.
* testsuite/23_containers/unordered_multimap/erase/1.cc:  Likewise.
* testsuite/23_containers/unordered_multimap/erase/24061-map.cc:
Likewise.
* testsuite/23_containers/unordered_multiset/erase/1.cc:  Likewise.
* testsuite/23_containers/unordered_multiset/erase/24061-map.cc:
Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157300 138bc75d-0d04-0410-961f-82ee72b054a4

13 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/hashtable.h
libstdc++-v3/include/debug/unordered_map
libstdc++-v3/include/debug/unordered_set
libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc
libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc
libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc
libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc
libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc
libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc
libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc
libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc
libstdc++-v3/testsuite/util/exception/safety.h

index c677c05..2a4c464 100644 (file)
@@ -1,3 +1,26 @@
+2010-03-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       Revert:
+       2010-02-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/41975, DR 579
+       * include/bits/hashtable.h (_Hashtable<>::_M_erase_node): Remove.
+       (erase(const_iterator), erase(const_iterator, const_iterator)):
+       Change return type to void.
+       * include/debug/unordered_map: Adjust.
+       * include/debug/unordered_set: Likewise.
+       * testsuite/util/exception/safety.h: Likewise.
+       * testsuite/23_containers/unordered_map/erase/1.cc: Likewise.
+       * testsuite/23_containers/unordered_map/erase/24061-map.cc: Likewise.
+       * testsuite/23_containers/unordered_set/erase/1.cc:  Likewise.
+       * testsuite/23_containers/unordered_set/erase/24061-map.cc: Likewise.
+       * testsuite/23_containers/unordered_multimap/erase/1.cc:  Likewise.
+       * testsuite/23_containers/unordered_multimap/erase/24061-map.cc:
+       Likewise.
+       * testsuite/23_containers/unordered_multiset/erase/1.cc:  Likewise.
+       * testsuite/23_containers/unordered_multiset/erase/24061-map.cc:
+       Likewise.
+
 2010-03-04  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * testsuite/util/testsuite_container_traits.h (traits_base): Add
index 6d46932..96bb8ac 100644 (file)
@@ -385,6 +385,9 @@ namespace std
       iterator
       _M_insert(const value_type&, std::false_type);
 
+      void
+      _M_erase_node(_Node*, _Node**);
+
     public:                            
       // Insert and erase
       _Insert_Return_Type
@@ -404,13 +407,13 @@ namespace std
       insert(initializer_list<value_type> __l)
       { this->insert(__l.begin(), __l.end()); }
 
-      void
+      iterator
       erase(const_iterator);
 
       size_type
       erase(const key_type&);
 
-      void
+      iterator
       erase(const_iterator, const_iterator);
 
       void
@@ -974,6 +977,34 @@ namespace std
       return iterator(__new_node, _M_buckets + __n);
     }
 
+  // For erase(iterator) and erase(const_iterator).
+  template<typename _Key, typename _Value, 
+          typename _Allocator, typename _ExtractKey, typename _Equal,
+          typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
+          bool __chc, bool __cit, bool __uk>
+    void
+    _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
+              _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
+    _M_erase_node(_Node* __p, _Node** __b)
+    {
+      _Node* __cur = *__b;
+      if (__cur == __p)
+       *__b = __cur->_M_next;
+      else
+       {
+         _Node* __next = __cur->_M_next;
+         while (__next != __p)
+           {
+             __cur = __next;
+             __next = __cur->_M_next;
+           }
+         __cur->_M_next = __next->_M_next;
+       }
+
+      _M_deallocate_node(__p);
+      --_M_element_count;
+    }
+
   template<typename _Key, typename _Value, 
           typename _Allocator, typename _ExtractKey, typename _Equal,
           typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
@@ -999,30 +1030,17 @@ namespace std
           typename _Allocator, typename _ExtractKey, typename _Equal,
           typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
           bool __chc, bool __cit, bool __uk>
-    void
+    typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
+                       _H1, _H2, _Hash, _RehashPolicy,
+                       __chc, __cit, __uk>::iterator
     _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
               _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
     erase(const_iterator __it)
     {
-      _Node* __p = __it._M_cur_node;
-      _Node** __b = __it._M_cur_bucket;
-
-      _Node* __cur = *__b;
-      if (__cur == __p)
-       *__b = __cur->_M_next;
-      else
-       {
-         _Node* __next = __cur->_M_next;
-         while (__next != __p)
-           {
-             __cur = __next;
-             __next = __cur->_M_next;
-           }
-         __cur->_M_next = __next->_M_next;
-       }
-
-      _M_deallocate_node(__p);
-      --_M_element_count;
+      iterator __result(__it._M_cur_node, __it._M_cur_bucket);
+      ++__result;
+      _M_erase_node(__it._M_cur_node, __it._M_cur_bucket);
+      return __result;
     }
 
   template<typename _Key, typename _Value, 
@@ -1084,17 +1102,17 @@ namespace std
           typename _Allocator, typename _ExtractKey, typename _Equal,
           typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
           bool __chc, bool __cit, bool __uk>
-    void
+    typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
+                       _H1, _H2, _Hash, _RehashPolicy,
+                       __chc, __cit, __uk>::iterator
     _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
               _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
     erase(const_iterator __first, const_iterator __last)
     {
-      if (__first == begin() && __last == end())
-       clear();
-      else
-       while (__first != __last)
-         erase(__first++);
-     }
+      while (__first != __last)
+       __first = this->erase(__first);
+      return iterator(__last._M_cur_node, __last._M_cur_bucket);
+    }
 
   template<typename _Key, typename _Value, 
           typename _Allocator, typename _ExtractKey, typename _Equal,
index 5f49aa6..a5e6174 100644 (file)
@@ -243,24 +243,25 @@ namespace __debug
        return __ret;
       }
 
-      void
+      iterator
       erase(const_iterator __it)
       {
        __glibcxx_check_erase(__it);
        __it._M_invalidate();
-       _Base::erase(__it.base());
+       return iterator(_Base::erase(__it.base()), this);
       }
 
-      void
+      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();
-         }
-       _Base::erase(__first.base(), __last.base());
+       {
+         const_iterator __victim = __tmp++;
+         __victim._M_invalidate();
+       }
+       return iterator(_Base::erase(__first.base(),
+                                    __last.base()), this);
       }
 
       _Base&
@@ -479,24 +480,25 @@ namespace __debug
        return __ret;
       }
 
-      void
+      iterator
       erase(const_iterator __it)
       {
        __glibcxx_check_erase(__it);
        __it._M_invalidate();
-       _Base::erase(__it.base());
+       return iterator(_Base::erase(__it.base()), this);
       }
 
-      void
+      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();
-         }
-       _Base::erase(__first.base(), __last.base());
+       {
+         const_iterator __victim = __tmp++;
+         __victim._M_invalidate();
+       }
+       return iterator(_Base::erase(__first.base(),
+                                    __last.base()), this);
       }
 
       _Base&
index 8efe3fb..f851718 100644 (file)
@@ -243,24 +243,25 @@ namespace __debug
        return __ret;
       }
 
-      void
+      iterator
       erase(const_iterator __it)
       {
        __glibcxx_check_erase(__it);
        __it._M_invalidate();
-       _Base::erase(__it.base());
+       return iterator(_Base::erase(__it.base()), this);
       }
 
-      void
+      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();
-         }
-       _Base::erase(__first.base(), __last.base());
+       {
+         const_iterator __victim = __tmp++;
+         __victim._M_invalidate();
+       }
+       return iterator(_Base::erase(__first.base(),
+                                    __last.base()), this);
       }
 
       _Base&
@@ -477,24 +478,25 @@ namespace __debug
        return __ret;
       }
 
-      void
+      iterator
       erase(const_iterator __it)
       {
        __glibcxx_check_erase(__it);
        __it._M_invalidate();
-       _Base::erase(__it.base());
+       return iterator(_Base::erase(__it.base()), this);
       }
 
-      void
+      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();
-         }
-       _Base::erase(__first.base(), __last.base());
+       {
+         const_iterator __victim = __tmp++;
+         __victim._M_invalidate();
+       }
+       return iterator(_Base::erase(__first.base(),
+                                    __last.base()), this);
       }
 
       _Base&
index 70fb41e..f9b74e0 100644 (file)
@@ -113,7 +113,7 @@ void test01()
   VERIFY( m1.size() == 2 );
   VERIFY( ++it10 == m1.end() );
 
-  m1.erase(m1.begin());
+  VERIFY( m1.erase(m1.begin()) != m1.end() );  
   VERIFY( m1.size() == 1 );
   VERIFY( m1.begin() == it11 );
 
index 759602b..87ab474 100644 (file)
@@ -51,8 +51,10 @@ void test01()
   ++it1;
   iterator it2 = it1;
   ++it2;
-  m1.erase(it1);
+  iterator it3 = m1.erase(it1);
   VERIFY( m1.size() == 9 );
+  VERIFY( it3 == it2 );
+  VERIFY( *it3 == *it2 );
 
   iterator it4 = m1.begin();
   ++it4;
@@ -61,8 +63,10 @@ void test01()
   iterator it5 = it4;
   ++it5;
   ++it5;
-  m1.erase(it4, it5);
+  iterator it6 = m1.erase(it4, it5);
   VERIFY( m1.size() == 7 );
+  VERIFY( it6 == it5 );
+  VERIFY( *it6 == *it5 );
 
   const_iterator it7 = m1.begin();
   ++it7;
@@ -70,8 +74,10 @@ void test01()
   ++it7;
   const_iterator it8 = it7;
   ++it8;
-  m1.erase(it7);
+  const_iterator it9 = m1.erase(it7);
   VERIFY( m1.size() == 6 );
+  VERIFY( it9 == it8 );
+  VERIFY( *it9 == *it8 );
 
   const_iterator it10 = m1.begin();
   ++it10;
@@ -80,11 +86,16 @@ void test01()
   ++it11;
   ++it11;
   ++it11;
-  m1.erase(it10, it11);
+  const_iterator it12 = m1.erase(it10, it11);
   VERIFY( m1.size() == 2 );
+  VERIFY( it12 == it11 );
+  VERIFY( *it12 == *it11 );
+  VERIFY( ++it12 == m1.end() );
 
-  m1.erase(m1.begin(), m1.end());
+  iterator it13 = m1.erase(m1.begin(), m1.end());
   VERIFY( m1.size() == 0 );
+  VERIFY( it13 == it12 );
+  VERIFY( it13 == m1.begin() );
 }
   
 int main()
index 0e60b8a..0aa1a07 100644 (file)
@@ -113,7 +113,7 @@ void test01()
   VERIFY( mm1.size() == 2 );
   VERIFY( ++it10 == mm1.end() );
 
-  mm1.erase(mm1.begin());
+  VERIFY( mm1.erase(mm1.begin()) != mm1.end() );  
   VERIFY( mm1.size() == 1 );
   VERIFY( mm1.begin() == it11 );
 
index 0fe4eee..545d082 100644 (file)
@@ -55,8 +55,10 @@ void test01()
   ++it1;
   iterator it2 = it1;
   ++it2;
-  mm1.erase(it1);
+  iterator it3 = mm1.erase(it1);
   VERIFY( mm1.size() == 12 );
+  VERIFY( it3 == it2 );
+  VERIFY( *it3 == *it2 );
 
   iterator it4 = mm1.begin();
   ++it4;
@@ -65,8 +67,10 @@ void test01()
   iterator it5 = it4;
   ++it5;
   ++it5;
-  mm1.erase(it4, it5);
+  iterator it6 = mm1.erase(it4, it5);
   VERIFY( mm1.size() == 10 );
+  VERIFY( it6 == it5 );
+  VERIFY( *it6 == *it5 );
 
   const_iterator it7 = mm1.begin();
   ++it7;
@@ -74,8 +78,10 @@ void test01()
   ++it7;
   const_iterator it8 = it7;
   ++it8;
-  mm1.erase(it7);
+  const_iterator it9 = mm1.erase(it7);
   VERIFY( mm1.size() == 9 );
+  VERIFY( it9 == it8 );
+  VERIFY( *it9 == *it8 );
 
   const_iterator it10 = mm1.begin();
   ++it10;
@@ -84,11 +90,15 @@ void test01()
   ++it11;
   ++it11;
   ++it11;
-  mm1.erase(it10, it11);
+  const_iterator it12 = mm1.erase(it10, it11);
   VERIFY( mm1.size() == 5 );
+  VERIFY( it12 == it11 );
+  VERIFY( *it12 == *it11 );
 
-  mm1.erase(mm1.begin(), mm1.end());
+  iterator it13 = mm1.erase(mm1.begin(), mm1.end());
   VERIFY( mm1.size() == 0 );
+  VERIFY( it13 == mm1.end() );
+  VERIFY( it13 == mm1.begin() );
 }
   
 int main()
index fbd8899..9951838 100644 (file)
@@ -112,7 +112,7 @@ void test01()
   VERIFY( ms1.size() == 2 );
   VERIFY( ++it10 == ms1.end() );
 
-  ms1.erase(ms1.begin());
+  VERIFY( ms1.erase(ms1.begin()) != ms1.end() );  
   VERIFY( ms1.size() == 1 );
   VERIFY( ms1.begin() == it11 );
 
index 568862f..c5eea6e 100644 (file)
@@ -54,8 +54,10 @@ void test01()
   ++it1;
   iterator it2 = it1;
   ++it2;
-  ms1.erase(it1);
+  iterator it3 = ms1.erase(it1);
   VERIFY( ms1.size() == 12 );
+  VERIFY( it3 == it2 );
+  VERIFY( *it3 == *it2 );
 
   iterator it4 = ms1.begin();
   ++it4;
@@ -64,8 +66,10 @@ void test01()
   iterator it5 = it4;
   ++it5;
   ++it5;
-  ms1.erase(it4, it5);
+  iterator it6 = ms1.erase(it4, it5);
   VERIFY( ms1.size() == 10 );
+  VERIFY( it6 == it5 );
+  VERIFY( *it6 == *it5 );
 
   const_iterator it7 = ms1.begin();
   ++it7;
@@ -73,8 +77,10 @@ void test01()
   ++it7;
   const_iterator it8 = it7;
   ++it8;
-  ms1.erase(it7);
+  const_iterator it9 = ms1.erase(it7);
   VERIFY( ms1.size() == 9 );
+  VERIFY( it9 == it8 );
+  VERIFY( *it9 == *it8 );
 
   const_iterator it10 = ms1.begin();
   ++it10;
@@ -83,11 +89,15 @@ void test01()
   ++it11;
   ++it11;
   ++it11;
-  ms1.erase(it10, it11);
+  const_iterator it12 = ms1.erase(it10, it11);
   VERIFY( ms1.size() == 5 );
+  VERIFY( it12 == it11 );
+  VERIFY( *it12 == *it11 );
 
-  ms1.erase(ms1.begin(), ms1.end());
+  iterator it13 = ms1.erase(ms1.begin(), ms1.end());
   VERIFY( ms1.size() == 0 );
+  VERIFY( it13 == ms1.end() );
+  VERIFY( it13 == ms1.begin() );
 }
   
 int main()
index 9bfa771..8f59773 100644 (file)
@@ -112,7 +112,7 @@ void test01()
   VERIFY( s1.size() == 2 );
   VERIFY( ++it10 == s1.end() );
 
-  s1.erase(s1.begin());
+  VERIFY( s1.erase(s1.begin()) != s1.end() );  
   VERIFY( s1.size() == 1 );
   VERIFY( s1.begin() == it11 );
 
index 6d89208..b4cdde6 100644 (file)
@@ -50,8 +50,10 @@ void test01()
   ++it1;
   iterator it2 = it1;
   ++it2;
-  s1.erase(it1);
+  iterator it3 = s1.erase(it1);
   VERIFY( s1.size() == 9 );
+  VERIFY( it3 == it2 );
+  VERIFY( *it3 == *it2 );
 
   iterator it4 = s1.begin();
   ++it4;
@@ -60,8 +62,10 @@ void test01()
   iterator it5 = it4;
   ++it5;
   ++it5;
-  s1.erase(it4, it5);
+  iterator it6 = s1.erase(it4, it5);
   VERIFY( s1.size() == 7 );
+  VERIFY( it6 == it5 );
+  VERIFY( *it6 == *it5 );
 
   const_iterator it7 = s1.begin();
   ++it7;
@@ -69,8 +73,10 @@ void test01()
   ++it7;
   const_iterator it8 = it7;
   ++it8;
-  s1.erase(it7);
+  const_iterator it9 = s1.erase(it7);
   VERIFY( s1.size() == 6 );
+  VERIFY( it9 == it8 );
+  VERIFY( *it9 == *it8 );
 
   const_iterator it10 = s1.begin();
   ++it10;
@@ -79,11 +85,16 @@ void test01()
   ++it11;
   ++it11;
   ++it11;
-  s1.erase(it10, it11);
+  const_iterator it12 = s1.erase(it10, it11);
   VERIFY( s1.size() == 2 );
+  VERIFY( it12 == it11 );
+  VERIFY( *it12 == *it11 );
+  VERIFY( ++it12 == s1.end() );
 
-  s1.erase(s1.begin(), s1.end());
+  iterator it13 = s1.erase(s1.begin(), s1.end());
   VERIFY( s1.size() == 0 );
+  VERIFY( it13 == s1.end() );
+  VERIFY( it13 == s1.begin() );
 }
   
 int main()
index a17b755..aef58b6 100644 (file)
@@ -285,9 +285,9 @@ namespace __gnu_test
        typedef typename container_type::iterator       iterator;
        typedef typename container_type::const_iterator const_iterator;
 
-       void (container_type::* _F_erase_point)(const_iterator);
-       void (container_type::* _F_erase_range)(const_iterator,
-                                               const_iterator);
+       iterator (container_type::* _F_erase_point)(const_iterator);
+       iterator (container_type::* _F_erase_range)(const_iterator,
+                                                   const_iterator);
 
        erase_base()
        : _F_erase_point(&container_type::erase),
@@ -304,9 +304,9 @@ namespace __gnu_test
        typedef typename container_type::iterator       iterator;
        typedef typename container_type::const_iterator const_iterator;
 
-       void (container_type::* _F_erase_point)(const_iterator);
-       void (container_type::* _F_erase_range)(const_iterator,
-                                               const_iterator);
+       iterator (container_type::* _F_erase_point)(const_iterator);
+       iterator (container_type::* _F_erase_range)(const_iterator,
+                                                   const_iterator);
 
        erase_base()
        : _F_erase_point(&container_type::erase),
@@ -321,9 +321,9 @@ namespace __gnu_test
        typedef typename container_type::iterator       iterator;
        typedef typename container_type::const_iterator const_iterator;
 
-       void (container_type::* _F_erase_point)(const_iterator);
-       void (container_type::* _F_erase_range)(const_iterator,
-                                               const_iterator);
+       iterator (container_type::* _F_erase_point)(const_iterator);
+       iterator (container_type::* _F_erase_range)(const_iterator,
+                                                   const_iterator);
 
        erase_base()
        : _F_erase_point(&container_type::erase),
@@ -338,9 +338,9 @@ namespace __gnu_test
        typedef typename container_type::iterator       iterator;
        typedef typename container_type::const_iterator const_iterator;
 
-       void (container_type::* _F_erase_point)(const_iterator);
-       void (container_type::* _F_erase_range)(const_iterator,
-                                               const_iterator);
+       iterator (container_type::* _F_erase_point)(const_iterator);
+       iterator (container_type::* _F_erase_range)(const_iterator,
+                                                   const_iterator);
 
        erase_base()
        : _F_erase_point(&container_type::erase),