From: paolo Date: Thu, 11 Feb 2010 18:11:01 +0000 (+0000) Subject: 2010-02-11 Paolo Carlini X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=2289c2a5ae59bca9477dcd8e1f2a74d09f91a154 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@156705 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1f2d5e1da82..a57153119d5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,25 @@ 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 std::nested_exception symbols at GLIBCXX_3.4. diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 96bb8ac63e6..6d469322361 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