diff options
author | Edward Smith-Rowland <3dw4rd@verizon.net> | 2009-08-14 17:54:44 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2009-08-14 17:54:44 +0000 |
commit | c105751c468d9a05fb65ad1a22b8899dc1a1ae51 (patch) | |
tree | a8a0aacfec4061b3e5831862f1685d6bac11b510 /libstdc++-v3/include | |
parent | 0942c722b3725ad3ae23ac11c8922860928dd3a3 (diff) | |
download | gcc-c105751c468d9a05fb65ad1a22b8899dc1a1ae51.zip gcc-c105751c468d9a05fb65ad1a22b8899dc1a1ae51.tar.gz gcc-c105751c468d9a05fb65ad1a22b8899dc1a1ae51.tar.bz2 |
stl_tree.h: Make erase return iterator as per DR 130.
2009-08-14 Edward Smith-Rowland <3dw4rd@verizon.net>
* include/bits/stl_tree.h: Make erase return iterator as per DR 130.
* include/bits/stl_set.h: Same.
* include/bits/stl_multiset.h: Same.
* include/bits/stl_map.h: Same.
* include/bits/stl_multimap.h: Same.
* doc/xml/manual/intro.xml: Document.
* testsuite/23_containers/set/dr130.cc: New.
* testsuite/23_containers/multiset/dr130.cc: New.
* testsuite/23_containers/map/dr130.cc: New.
* testsuite/23_containers/multimap/dr130.cc: New.
From-SVN: r150768
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/stl_map.h | 41 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multimap.h | 43 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multiset.h | 41 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_set.h | 40 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_tree.h | 110 |
5 files changed, 273 insertions, 2 deletions
diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h index 5416d82..a26e68a 100644 --- a/libstdc++-v3/include/bits/stl_map.h +++ b/libstdc++-v3/include/bits/stl_map.h @@ -552,6 +552,26 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) insert(_InputIterator __first, _InputIterator __last) { _M_t._M_insert_unique(__first, __last); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases an element from a %map. + * @param position An iterator pointing to the element to be erased. + * @return An iterator pointing to the element immediately following + * @a position prior to the element being erased. If no such + * element exists, end() is returned. + * + * This function erases an element, pointed to by the given + * iterator, from a %map. Note that this function only erases + * the element, and that if the element is itself a pointer, + * the pointed-to memory is not touched in any way. Managing + * the pointer is the user's responsibility. + */ + iterator + erase(iterator __position) + { return _M_t.erase(__position); } +#else /** * @brief Erases an element from a %map. * @param position An iterator pointing to the element to be erased. @@ -565,6 +585,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __position) { _M_t.erase(__position); } +#endif /** * @brief Erases elements according to the provided key. @@ -581,6 +602,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) erase(const key_type& __x) { return _M_t.erase(__x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases a [first,last) range of elements from a %map. + * @param first Iterator pointing to the start of the range to be + * erased. + * @param last Iterator pointing to the end of the range to be erased. + * @return The iterator @a last. + * + * This function erases a sequence of elements from a %map. + * Note that this function only erases the element, and that if + * the element is itself a pointer, the pointed-to memory is not touched + * in any way. Managing the pointer is the user's responsibility. + */ + iterator + erase(iterator __first, iterator __last) + { return _M_t.erase(__first, __last); } +#else /** * @brief Erases a [first,last) range of elements from a %map. * @param first Iterator pointing to the start of the range to be @@ -595,6 +635,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } +#endif /** * @brief Swaps data with another %map. diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h index 91dcfa6..fa3f253 100644 --- a/libstdc++-v3/include/bits/stl_multimap.h +++ b/libstdc++-v3/include/bits/stl_multimap.h @@ -488,6 +488,26 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { this->insert(__l.begin(), __l.end()); } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases an element from a %multimap. + * @param position An iterator pointing to the element to be erased. + * @return An iterator pointing to the element immediately following + * @a position prior to the element being erased. If no such + * element exists, end() is returned. + * + * This function erases an element, pointed to by the given iterator, + * from a %multimap. Note that this function only erases the element, + * and that if the element is itself a pointer, the pointed-to memory is + * not touched in any way. Managing the pointer is the user's + * responsibility. + */ + iterator + erase(iterator __position) + { return _M_t.erase(__position); } +#else /** * @brief Erases an element from a %multimap. * @param position An iterator pointing to the element to be erased. @@ -501,6 +521,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __position) { _M_t.erase(__position); } +#endif /** * @brief Erases elements according to the provided key. @@ -517,6 +538,27 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) erase(const key_type& __x) { return _M_t.erase(__x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases a [first,last) range of elements from a %multimap. + * @param first Iterator pointing to the start of the range to be + * erased. + * @param last Iterator pointing to the end of the range to be erased. + * @return The iterator @a last. + * + * This function erases a sequence of elements from a %multimap. + * Note that this function only erases the elements, and that if + * the elements themselves are pointers, the pointed-to memory is not + * touched in any way. Managing the pointer is the user's responsibility. + */ + iterator + erase(iterator __first, iterator __last) + { return _M_t.erase(__first, __last); } +#else + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. /** * @brief Erases a [first,last) range of elements from a %multimap. * @param first Iterator pointing to the start of the range to be @@ -531,6 +573,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } +#endif /** * @brief Swaps data with another %multimap. diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index be9e248..431cbae 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -445,6 +445,26 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { this->insert(__l.begin(), __l.end()); } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases an element from a %multiset. + * @param position An iterator pointing to the element to be erased. + * @return An iterator pointing to the element immediately following + * @a position prior to the element being erased. If no such + * element exists, end() is returned. + * + * This function erases an element, pointed to by the given iterator, + * from a %multiset. Note that this function only erases the element, + * and that if the element is itself a pointer, the pointed-to memory is + * not touched in any way. Managing the pointer is the user's + * responsibility. + */ + iterator + erase(iterator __position) + { return _M_t.erase(__position); } +#else /** * @brief Erases an element from a %multiset. * @param position An iterator pointing to the element to be erased. @@ -458,6 +478,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __position) { _M_t.erase(__position); } +#endif /** * @brief Erases elements according to the provided key. @@ -474,6 +495,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) erase(const key_type& __x) { return _M_t.erase(__x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases a [first,last) range of elements from a %multiset. + * @param first Iterator pointing to the start of the range to be + * erased. + * @param last Iterator pointing to the end of the range to be erased. + * @return The iterator @a last. + * + * This function erases a sequence of elements from a %multiset. + * Note that this function only erases the elements, and that if + * the elements themselves are pointers, the pointed-to memory is not + * touched in any way. Managing the pointer is the user's responsibility. + */ + iterator + erase(iterator __first, iterator __last) + { return _M_t.erase(__first, __last); } +#else /** * @brief Erases a [first,last) range of elements from a %multiset. * @param first Iterator pointing to the start of the range to be @@ -488,6 +528,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } +#endif /** * Erases all elements in a %multiset. Note that this function only diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index ccd0bc7..e87cccb 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -458,6 +458,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) { this->insert(__l.begin(), __l.end()); } #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases an element from a %set. + * @param position An iterator pointing to the element to be erased. + * @return An iterator pointing to the element immediately following + * @a position prior to the element being erased. If no such + * element exists, end() is returned. + * + * This function erases an element, pointed to by the given iterator, + * from a %set. Note that this function only erases the element, and + * that if the element is itself a pointer, the pointed-to memory is not + * touched in any way. Managing the pointer is the user's responsibility. + */ + iterator + erase(iterator __position) + { return _M_t.erase(__position); } +#else /** * @brief Erases an element from a %set. * @param position An iterator pointing to the element to be erased. @@ -470,6 +489,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __position) { _M_t.erase(__position); } +#endif /** * @brief Erases elements according to the provided key. @@ -486,6 +506,25 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) erase(const key_type& __x) { return _M_t.erase(__x); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + /** + * @brief Erases a [first,last) range of elements from a %set. + * @param first Iterator pointing to the start of the range to be + * erased. + * @param last Iterator pointing to the end of the range to be erased. + * @return The iterator @a last. + * + * This function erases a sequence of elements from a %set. + * Note that this function only erases the element, and that if + * the element is itself a pointer, the pointed-to memory is not touched + * in any way. Managing the pointer is the user's responsibility. + */ + iterator + erase(iterator __first, iterator __last) + { return _M_t.erase(__first, __last); } +#else /** * @brief Erases a [first,last) range of elements from a %set. * @param first Iterator pointing to the start of the range to be @@ -500,6 +539,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) void erase(iterator __first, iterator __last) { _M_t.erase(__first, __last); } +#endif /** * Erases all elements in a %set. Note that this function only erases diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index 1a67b56..d37dc57 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -698,21 +698,43 @@ _GLIBCXX_BEGIN_NAMESPACE(std) void _M_insert_equal(_InputIterator __first, _InputIterator __last); +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + iterator + erase(iterator __position); + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + const_iterator + erase(const_iterator __position); +#else void erase(iterator __position); void erase(const_iterator __position); - +#endif size_type erase(const key_type& __x); +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + iterator + erase(iterator __first, iterator __last); + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + const_iterator + erase(const_iterator __first, const_iterator __last); +#else void erase(iterator __first, iterator __last); void erase(const_iterator __first, const_iterator __last); - +#endif void erase(const key_type* __first, const key_type* __last); @@ -1327,6 +1349,45 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _M_insert_equal_(end(), *__first); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + inline typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + erase(iterator __position) + { + iterator __result = __position; + ++__result; + _Link_type __y = + static_cast<_Link_type>(_Rb_tree_rebalance_for_erase + (__position._M_node, + this->_M_impl._M_header)); + _M_destroy_node(__y); + --_M_impl._M_node_count; + return __result; + } + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + inline typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + erase(const_iterator __position) + { + const_iterator __result = __position; + ++__result; + _Link_type __y = + static_cast<_Link_type>(_Rb_tree_rebalance_for_erase + (const_cast<_Base_ptr>(__position._M_node), + this->_M_impl._M_header)); + _M_destroy_node(__y); + --_M_impl._M_node_count; + return __result; + } +#else template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> inline void @@ -1354,6 +1415,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _M_destroy_node(__y); --_M_impl._M_node_count; } +#endif template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> @@ -1367,6 +1429,49 @@ _GLIBCXX_BEGIN_NAMESPACE(std) return __old_size - size(); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + erase(iterator __first, iterator __last) + { + if (__first == begin() && __last == end()) + { + clear(); + return end(); + } + else + { + while (__first != __last) + erase(__first++); + return __last; + } + } + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // DR 130. Associative erase should return an iterator. + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + erase(const_iterator __first, const_iterator __last) + { + if (__first == begin() && __last == end()) + { + clear(); + return end(); + } + else + { + while (__first != __last) + erase(__first++); + return __last; + } + } +#else template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> void @@ -1392,6 +1497,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) while (__first != __last) erase(__first++); } +#endif template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> |