aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2010-03-16 01:32:53 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2010-03-16 01:32:53 +0000
commit1692089663b0feffa054f594afe91dc2d5b8416a (patch)
treeee2c7ad82ea64831a119dc46ef71194c61adf96b /libstdc++-v3
parent92ff10839d2e16a47dba083f1d030af662b4d1bc (diff)
downloadgcc-1692089663b0feffa054f594afe91dc2d5b8416a.zip
gcc-1692089663b0feffa054f594afe91dc2d5b8416a.tar.gz
gcc-1692089663b0feffa054f594afe91dc2d5b8416a.tar.bz2
forward_list.tcc (_Fwd_list_node_base:: _M_transfer_after): Return _Fwd_list_node_base*.
2010-03-15 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/forward_list.tcc (_Fwd_list_node_base:: _M_transfer_after): Return _Fwd_list_node_base*. (forward_list<>::_M_splice_after): Add. (forward_list<>::insert_after(const_iterator, size_type, const _Tp&), insert_after(const_iterator, _InputIterator, _InputIterator), insert_after(const_iterator, initializer_list<>)): Use the above, implement DR 1278 ([Ready] in Pittsburgh). * include/bits/forward_list.h (insert_after(const_iterator, size_type, const _Tp&), insert_after(const_iterator, _InputIterator, _InputIterator), insert_after(const_iterator, initializer_list<>)): Only declare. * testsuite/23_containers/forward_list/modifiers/2.cc: Adjust. * testsuite/23_containers/forward_list/requirements/dr438/ assign_neg.cc: Adjust dg-error line number. * testsuite/23_containers/forward_list/requirements/dr438/ insert_neg.cc: Likewise. * testsuite/23_containers/forward_list/requirements/dr438/ constructor_1_neg.cc: Likewise. * testsuite/23_containers/forward_list/requirements/dr438/ constructor_2_neg.cc: Likewise. From-SVN: r157471
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog23
-rw-r--r--libstdc++-v3/include/bits/forward_list.h69
-rw-r--r--libstdc++-v3/include/bits/forward_list.tcc57
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/modifiers/2.cc66
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc2
8 files changed, 147 insertions, 76 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1a4e99a..24543b0 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,28 @@
2010-03-15 Paolo Carlini <paolo.carlini@oracle.com>
+ * include/bits/forward_list.tcc (_Fwd_list_node_base::
+ _M_transfer_after): Return _Fwd_list_node_base*.
+ (forward_list<>::_M_splice_after): Add.
+ (forward_list<>::insert_after(const_iterator, size_type, const _Tp&),
+ insert_after(const_iterator, _InputIterator, _InputIterator),
+ insert_after(const_iterator, initializer_list<>)): Use the above,
+ implement DR 1278 ([Ready] in Pittsburgh).
+ * include/bits/forward_list.h (insert_after(const_iterator,
+ size_type, const _Tp&), insert_after(const_iterator, _InputIterator,
+ _InputIterator), insert_after(const_iterator, initializer_list<>)):
+ Only declare.
+ * testsuite/23_containers/forward_list/modifiers/2.cc: Adjust.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ assign_neg.cc: Adjust dg-error line number.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ insert_neg.cc: Likewise.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/forward_list/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+
+2010-03-15 Paolo Carlini <paolo.carlini@oracle.com>
+
* testsuite/23_containers/forward_list/requirements/dr438/
assign_neg.cc: Adjust dg-error line number.
* testsuite/23_containers/forward_list/requirements/dr438/
diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index 1dcbefd..57b7836 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -51,28 +51,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
swap(_Fwd_list_node_base& __x, _Fwd_list_node_base& __y)
{ std::swap(__x._M_next, __y._M_next); }
- void
- _M_transfer_after(_Fwd_list_node_base* __bbegin)
+ _Fwd_list_node_base*
+ _M_transfer_after(_Fwd_list_node_base* __begin)
{
- _Fwd_list_node_base* __bend = __bbegin;
- while (__bend && __bend->_M_next)
- __bend = __bend->_M_next;
- _M_transfer_after(__bbegin, __bend);
+ _Fwd_list_node_base* __end = __begin;
+ while (__end && __end->_M_next)
+ __end = __end->_M_next;
+ return _M_transfer_after(__begin, __end);
}
- void
- _M_transfer_after(_Fwd_list_node_base* __bbegin,
- _Fwd_list_node_base* __bend)
+ _Fwd_list_node_base*
+ _M_transfer_after(_Fwd_list_node_base* __begin,
+ _Fwd_list_node_base* __end)
{
- _Fwd_list_node_base* __keep = __bbegin->_M_next;
- if (__bend)
+ _Fwd_list_node_base* __keep = __begin->_M_next;
+ if (__end)
{
- __bbegin->_M_next = __bend->_M_next;
- __bend->_M_next = _M_next;
+ __begin->_M_next = __end->_M_next;
+ __end->_M_next = _M_next;
}
else
- __bbegin->_M_next = 0;
+ __begin->_M_next = 0;
_M_next = __keep;
+ return __end;
}
void
@@ -865,7 +866,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param pos An iterator into the %forward_list.
* @param n Number of elements to be inserted.
* @param val Data to be inserted.
- * @return pos.
+ * @return An iterator pointing to the last inserted copy of
+ * @a val or @a pos if @a n == 0.
*
* This function will insert a specified number of copies of the
* given data after the location specified by @a pos.
@@ -874,19 +876,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* does not invalidate iterators and references.
*/
iterator
- insert_after(const_iterator __pos, size_type __n, const _Tp& __val)
- {
- forward_list __tmp(__n, __val, this->_M_get_Node_allocator());
- splice_after(__pos, std::move(__tmp));
- return iterator(const_cast<_Node_base*>(__pos._M_node));
- }
+ insert_after(const_iterator __pos, size_type __n, const _Tp& __val);
/**
* @brief Inserts a range into the %forward_list.
* @param position An iterator into the %forward_list.
* @param first An input iterator.
* @param last An input iterator.
- * @return pos.
+ * @return An iterator pointing to the last inserted element or
+ * @a pos if @a first == @a last.
*
* This function will insert copies of the data in the range [@a
* first,@a last) into the %forward_list after the location specified
@@ -898,19 +896,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template<typename _InputIterator>
iterator
insert_after(const_iterator __pos,
- _InputIterator __first, _InputIterator __last)
- {
- forward_list __tmp(__first, __last, this->_M_get_Node_allocator());
- splice_after(__pos, std::move(__tmp));
- return iterator(const_cast<_Node_base*>(__pos._M_node));
- }
+ _InputIterator __first, _InputIterator __last);
/**
* @brief Inserts the contents of an initializer_list into
* %forward_list after the specified iterator.
* @param pos An iterator into the %forward_list.
* @param il An initializer_list of value_type.
- * @return pos.
+ * @return An iterator pointing to the last inserted element
+ * or @a pos if @a il is empty.
*
* This function will insert copies of the data in the
* initializer_list @a il into the %forward_list before the location
@@ -920,12 +914,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* does not invalidate iterators and references.
*/
iterator
- insert_after(const_iterator __pos, std::initializer_list<_Tp> __il)
- {
- forward_list __tmp(__il, this->_M_get_Node_allocator());
- splice_after(__pos, std::move(__tmp));
- return iterator(const_cast<_Node_base*>(__pos._M_node));
- }
+ insert_after(const_iterator __pos, std::initializer_list<_Tp> __il);
/**
* @brief Removes the element pointed to by the iterator following
@@ -1037,7 +1026,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* Requires this != @a x.
*/
void
- splice_after(const_iterator __pos, forward_list&& __list);
+ splice_after(const_iterator __pos, forward_list&& __list)
+ {
+ if (!__list.empty())
+ _M_splice_after(__pos, std::move(__list));
+ }
/**
* @brief Insert element from another %forward_list.
@@ -1210,6 +1203,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// turns out to be the same thing.
void
_M_fill_initialize(size_type __n, const value_type& __value);
+
+ // Called by splice_after and insert_after.
+ iterator
+ _M_splice_after(const_iterator __pos, forward_list&& __list);
};
/**
diff --git a/libstdc++-v3/include/bits/forward_list.tcc b/libstdc++-v3/include/bits/forward_list.tcc
index e3af42e1..7468a90 100644
--- a/libstdc++-v3/include/bits/forward_list.tcc
+++ b/libstdc++-v3/include/bits/forward_list.tcc
@@ -203,22 +203,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
template<typename _Tp, typename _Alloc>
- void
+ typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::
- splice_after(const_iterator __pos, forward_list&& __list)
+ _M_splice_after(const_iterator __pos, forward_list&& __list)
{
- if (!__list.empty() && &__list != this)
- {
- _Node_base* __tmp = const_cast<_Node_base*>(__pos._M_node);
- const_iterator __before = __list.cbefore_begin();
- __tmp->_M_transfer_after(const_cast<_Node_base*>(__before._M_node));
- }
+ _Node_base* __tmp = const_cast<_Node_base*>(__pos._M_node);
+ iterator __before = __list.before_begin();
+ return iterator(__tmp->_M_transfer_after(__before._M_node));
}
template<typename _Tp, typename _Alloc>
void
forward_list<_Tp, _Alloc>::
- splice_after(const_iterator __pos, forward_list&& __list,
+ splice_after(const_iterator __pos, forward_list&&,
const_iterator __before, const_iterator __last)
{
_Node_base* __tmp = const_cast<_Node_base*>(__pos._M_node);
@@ -227,6 +224,48 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
template<typename _Tp, typename _Alloc>
+ typename forward_list<_Tp, _Alloc>::iterator
+ forward_list<_Tp, _Alloc>::
+ insert_after(const_iterator __pos, size_type __n, const _Tp& __val)
+ {
+ if (__n)
+ {
+ forward_list __tmp(__n, __val, this->_M_get_Node_allocator());
+ return _M_splice_after(__pos, std::move(__tmp));
+ }
+ else
+ return iterator(const_cast<_Node_base*>(__pos._M_node));
+ }
+
+ template<typename _Tp, typename _Alloc>
+ template<typename _InputIterator>
+ typename forward_list<_Tp, _Alloc>::iterator
+ forward_list<_Tp, _Alloc>::
+ insert_after(const_iterator __pos,
+ _InputIterator __first, _InputIterator __last)
+ {
+ forward_list __tmp(__first, __last, this->_M_get_Node_allocator());
+ if (!__tmp.empty())
+ return _M_splice_after(__pos, std::move(__tmp));
+ else
+ return iterator(const_cast<_Node_base*>(__pos._M_node));
+ }
+
+ template<typename _Tp, typename _Alloc>
+ typename forward_list<_Tp, _Alloc>::iterator
+ forward_list<_Tp, _Alloc>::
+ insert_after(const_iterator __pos, std::initializer_list<_Tp> __il)
+ {
+ if (__il.size())
+ {
+ forward_list __tmp(__il, this->_M_get_Node_allocator());
+ return _M_splice_after(__pos, std::move(__tmp));
+ }
+ else
+ return iterator(const_cast<_Node_base*>(__pos._M_node));
+ }
+
+ template<typename _Tp, typename _Alloc>
void
forward_list<_Tp, _Alloc>::
remove(const _Tp& __val)
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/modifiers/2.cc b/libstdc++-v3/testsuite/23_containers/forward_list/modifiers/2.cc
index 92678f3..b6ae3f3 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/modifiers/2.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/modifiers/2.cc
@@ -36,8 +36,8 @@ test01()
std::forward_list<int>::iterator ret = fl.insert_after(fl.before_begin(),
42);
- VERIFY(ret == fl.begin());
- VERIFY(fl.front() == 42);
+ VERIFY( ret == fl.begin() );
+ VERIFY( fl.front() == 42 );
}
// This test verifies the following:
@@ -48,21 +48,24 @@ test02()
std::forward_list<int>::const_iterator pos = fl.cbegin();
++pos;
- VERIFY(*pos == 1);
+ VERIFY( *pos == 1 );
- // Note: Calling l.insert_after(pos, 5, 42); without the long five
- // gets resolved to the iterator range version and fails to compile!
- std::forward_list<int>::iterator ret = fl.insert_after(pos, 5, 42);
- VERIFY(ret == pos);
- VERIFY(*pos == 1);
+ std::forward_list<int>::iterator ret = fl.insert_after(pos, 0, 42);
+ VERIFY( ret == pos );
+ ret = fl.insert_after(pos, 5, 42);
+ VERIFY( *pos == 1 );
+
+ ++pos;
+ VERIFY( *pos == 42 );
++pos;
- VERIFY(*pos == 42);
++pos;
++pos;
++pos;
+ VERIFY( *pos == 42 );
+ VERIFY( ret == pos );
++pos;
- VERIFY(*pos == 42);
+ VERIFY( *pos == 2 );
}
// This test verifies the following:
@@ -73,19 +76,22 @@ test03()
std::forward_list<int>::const_iterator pos = fl.cbegin();
++pos;
- VERIFY(*pos == 1);
+ VERIFY( *pos == 1 );
int i[3] = {666, 777, 888};
- std::forward_list<int>::iterator ret = fl.insert_after(pos, i, i + 3);
- VERIFY(ret == pos);
- VERIFY(*pos == 1);
+ std::forward_list<int>::iterator ret = fl.insert_after(pos, i, i);
+ VERIFY( ret == pos );
+
+ ret = fl.insert_after(pos, i, i + 3);
+ VERIFY( *pos == 1 );
++pos;
++pos;
++pos;
- VERIFY(*pos == 888);
+ VERIFY( *pos == 888 );
+ VERIFY( ret == pos );
++pos;
- VERIFY(*pos == 2);
+ VERIFY( *pos == 2 );
}
// This test verifies the following:
@@ -96,17 +102,23 @@ test04()
std::forward_list<int>::const_iterator pos = fl.cbegin();
++pos;
- VERIFY(*pos == 1);
+ VERIFY( *pos == 1 );
+
+ std::forward_list<int>::iterator ret = fl.insert_after(pos, { });
+ VERIFY( ret == pos);
- std::forward_list<int>::iterator ret
- = fl.insert_after(pos, {-1, -2, -3, -4, -5});
- VERIFY(ret == pos);
- VERIFY(*pos == 1);
+ ret = fl.insert_after(pos, {-1, -2, -3, -4, -5});
+ VERIFY( *pos == 1);
++pos;
++pos;
++pos;
- VERIFY(*pos == -3);
+ VERIFY( *pos == -3 );
+ ++pos;
+ ++pos;
+ VERIFY( ret == pos );
+ ++pos;
+ VERIFY( *pos == 2 );
}
// This test verifies the following:
@@ -117,17 +129,17 @@ test05()
std::forward_list<std::string>::const_iterator pos = fl.cbegin();
++pos;
- VERIFY(*pos == "BBB");
+ VERIFY( *pos == "BBB" );
std::string x( "XXX" );
std::forward_list<std::string>::iterator ret
= fl.insert_after(pos, std::move(x));
- VERIFY(*pos == "BBB");
+ VERIFY( *pos == "BBB" );
++pos;
- VERIFY(ret == pos);
- VERIFY(*pos == "XXX");
+ VERIFY( ret == pos );
+ VERIFY( *pos == "XXX" );
++pos;
- VERIFY(*pos == "CCC");
+ VERIFY( *pos == "CCC" );
}
int
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
index 5351a5b..8d72db5 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
@@ -1,6 +1,6 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1201 }
+// { dg-error "no matching" "" { target *-*-* } 1194 }
// { dg-excess-errors "" }
// Copyright (C) 2009, 2010 Free Software Foundation
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
index b624ab2..5f5ac2c 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
@@ -1,6 +1,6 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1201 }
+// { dg-error "no matching" "" { target *-*-* } 1194 }
// { dg-excess-errors "" }
// Copyright (C) 2009, 2010 Free Software Foundation
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
index 0a593c8..340a6be 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
@@ -1,6 +1,6 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1201 }
+// { dg-error "no matching" "" { target *-*-* } 1194 }
// { dg-excess-errors "" }
// Copyright (C) 2009, 2010 Free Software Foundation
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc
index 4739ce7..1173dc1 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc
@@ -1,6 +1,6 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1201 }
+// { dg-error "no matching" "" { target *-*-* } 1194 }
// { dg-excess-errors "" }
// Copyright (C) 2009, 2010 Free Software Foundation