aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorEdward Smith-Rowland <3dw4rd@verizon.net>2009-08-14 17:54:44 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2009-08-14 17:54:44 +0000
commitc105751c468d9a05fb65ad1a22b8899dc1a1ae51 (patch)
treea8a0aacfec4061b3e5831862f1685d6bac11b510 /libstdc++-v3/include
parent0942c722b3725ad3ae23ac11c8922860928dd3a3 (diff)
downloadgcc-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.h41
-rw-r--r--libstdc++-v3/include/bits/stl_multimap.h43
-rw-r--r--libstdc++-v3/include/bits/stl_multiset.h41
-rw-r--r--libstdc++-v3/include/bits/stl_set.h40
-rw-r--r--libstdc++-v3/include/bits/stl_tree.h110
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>