* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157471
138bc75d-0d04-0410-961f-
82ee72b054a4
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/
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
* 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.
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
* 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
forward_list<_Tp, _Alloc>::
_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>
}
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)
// { 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
// { 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
// { 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
// { 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