From 22364bde8558390587e708606e976800e6e7430e Mon Sep 17 00:00:00 2001 From: paolo Date: Tue, 9 Mar 2010 01:56:42 +0000 Subject: 2010-03-08 Paolo Carlini Revert: 2010-02-11 Paolo Carlini 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 --- libstdc++-v3/ChangeLog | 23 +++++++ libstdc++-v3/include/bits/hashtable.h | 76 +++++++++++++--------- libstdc++-v3/include/debug/unordered_map | 34 +++++----- libstdc++-v3/include/debug/unordered_set | 34 +++++----- .../23_containers/unordered_map/erase/1.cc | 2 +- .../23_containers/unordered_map/erase/24061-map.cc | 21 ++++-- .../23_containers/unordered_multimap/erase/1.cc | 2 +- .../unordered_multimap/erase/24061-multimap.cc | 20 ++++-- .../23_containers/unordered_multiset/erase/1.cc | 2 +- .../unordered_multiset/erase/24061-multiset.cc | 20 ++++-- .../23_containers/unordered_set/erase/1.cc | 2 +- .../23_containers/unordered_set/erase/24061-set.cc | 21 ++++-- libstdc++-v3/testsuite/util/exception/safety.h | 24 +++---- 13 files changed, 184 insertions(+), 97 deletions(-) (limited to 'libstdc++-v3') 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 + + Revert: + 2010-02-11 Paolo Carlini + + 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 * 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 __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 + 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 - 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 - 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