diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-03-09 01:56:42 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-03-09 01:56:42 +0000 |
commit | 22364bde8558390587e708606e976800e6e7430e (patch) | |
tree | 7b4ab3323cd7e2deb3c657e1214ad0e38e3149fe /libstdc++-v3 | |
parent | e91a9c3f45deac186f0b137b2679eb0efd8add86 (diff) | |
download | ppe42-gcc-22364bde8558390587e708606e976800e6e7430e.tar.gz ppe42-gcc-22364bde8558390587e708606e976800e6e7430e.zip |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157300 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
13 files changed, 184 insertions, 97 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c677c05b3ed..2a4c464e121 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 6d469322361..96bb8ac63e6 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -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, diff --git a/libstdc++-v3/include/debug/unordered_map b/libstdc++-v3/include/debug/unordered_map index 5f49aa6059b..a5e6174fe6a 100644 --- a/libstdc++-v3/include/debug/unordered_map +++ b/libstdc++-v3/include/debug/unordered_map @@ -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& diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index 8efe3fb51ad..f8517184023 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -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& diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc index 70fb41e68e7..f9b74e08c8d 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/1.cc @@ -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 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc index 759602b9086..87ab474a826 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/erase/24061-map.cc @@ -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() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc index 0e60b8a7c68..0aa1a071871 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/1.cc @@ -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 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc index 0fe4eee9c17..545d08278d6 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/erase/24061-multimap.cc @@ -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() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc index fbd8899e67f..9951838e9de 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/1.cc @@ -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 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc index 568862f4458..c5eea6eeebc 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/erase/24061-multiset.cc @@ -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() diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc index 9bfa771462f..8f59773d802 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/1.cc @@ -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 ); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc index 6d892085778..b4cdde62d57 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/erase/24061-set.cc @@ -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() diff --git a/libstdc++-v3/testsuite/util/exception/safety.h b/libstdc++-v3/testsuite/util/exception/safety.h index a17b755ce52..aef58b621c7 100644 --- a/libstdc++-v3/testsuite/util/exception/safety.h +++ b/libstdc++-v3/testsuite/util/exception/safety.h @@ -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), |