From: Paolo Carlini Date: Thu, 11 Feb 2010 18:11:01 +0000 (+0000) Subject: PR libstdc++/41975, DR 579 X-Git-Tag: releases/gcc-4.5.0~812 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=932b650839a319e0f4236d74252cad0bd0b017b2;p=thirdparty%2Fgcc.git PR libstdc++/41975, DR 579 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. From-SVN: r156705 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1f2d5e1da828..a57153119d5e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,23 @@ +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-02-11 Paolo Carlini * config/abi/pre/gnu.ver: Avoid exporting inadvertently diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 96bb8ac63e66..6d4693223616 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -385,9 +385,6 @@ namespace std iterator _M_insert(const value_type&, std::false_type); - void - _M_erase_node(_Node*, _Node**); - public: // Insert and erase _Insert_Return_Type @@ -407,13 +404,13 @@ namespace std insert(initializer_list __l) { this->insert(__l.begin(), __l.end()); } - iterator + void erase(const_iterator); size_type erase(const key_type&); - iterator + void erase(const_iterator, const_iterator); void @@ -977,34 +974,6 @@ 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 - typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, - __chc, __cit, __uk>::iterator + void _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: erase(const_iterator __it) { - iterator __result(__it._M_cur_node, __it._M_cur_bucket); - ++__result; - _M_erase_node(__it._M_cur_node, __it._M_cur_bucket); - return __result; + _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; } template - typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, - __chc, __cit, __uk>::iterator + void _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: erase(const_iterator __first, const_iterator __last) { - while (__first != __last) - __first = this->erase(__first); - return iterator(__last._M_cur_node, __last._M_cur_bucket); - } + if (__first == begin() && __last == end()) + clear(); + else + while (__first != __last) + erase(__first++); + } template