From: paolo Date: Mon, 15 Mar 2010 17:02:16 +0000 (+0000) Subject: 2010-03-15 Paolo Carlini X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=67ab991092a736fa3aa8d2afa61b3884a1770c69;ds=inline 2010-03-15 Paolo Carlini Revert: 2008-11-11 Bob Walters * include/bits/forward_list.h: Support non-standard pointer types (_Fwd_list_node_base): Add _Alloc template parameter. (_Fwd_list_node<>): Likewise. (_Fwd_list_iterator<>): Likewise. (_Fwd_list_const_iterator<>): Likewise. (_Fwd_list_node_base::_M_next, _M_transfer_after, _M_reverse_after): Use _Alloc<_Tp>::pointer. (_Fwd_list_iterator<>::_M_node): Use _Node_base::_Pointer. (_Fwd_list_base<>::_M_get_node, _M_create_node, _M_create_node, _M_insert_after, _M_put_node, _M_erase_after): Likewise. (_Fwd_list_const_iterator<>::_M_node): use _Node_base::_Const_pointer. (forward_list<>): Use __static_pointer_cast in place of static_cast, and __const_pointer_cast in place of const_cast. * include/bits/forward_list.tcc (_Fwd_list_node<>::_M_sort_after): Using _Pointer typedefs in place of standard pointers, __static_pointer_cast in place of static_cast. (_Fwd_list_base<>::_Fwd_list_base, _M_insert_after, _M_erase_after): Likewise. (forward_list<>::_M_initialize_dispatch, _M_fill_initialize, splice_after, remove, remove_if, merge): Likewise. * testsuite/23_containers/forward_list/ext_pointer/modifiers/1.cc: New. * testsuite/23_containers/forward_list/ext_pointer/modifiers/2.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/modifiers/3.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/modifiers/4.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/modifiers/5.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/1.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/2.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/3.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/4.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/5.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/6.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/operations/7.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/requirements/1.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/requirements/ explicit_instantiation/1.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/requirements/ explicit_instantiation/3.cc: Likewise. * testsuite/23_containers/forward_list/ext_pointer/1.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157462 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2b2d0634b9f..794a0bfe7a5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,59 @@ +2010-03-15 Paolo Carlini + + Revert: + 2008-11-11 Bob Walters + + * include/bits/forward_list.h: Support non-standard pointer types + (_Fwd_list_node_base): Add _Alloc template parameter. + (_Fwd_list_node<>): Likewise. + (_Fwd_list_iterator<>): Likewise. + (_Fwd_list_const_iterator<>): Likewise. + (_Fwd_list_node_base::_M_next, _M_transfer_after, _M_reverse_after): + Use _Alloc<_Tp>::pointer. + (_Fwd_list_iterator<>::_M_node): Use _Node_base::_Pointer. + (_Fwd_list_base<>::_M_get_node, _M_create_node, _M_create_node, + _M_insert_after, _M_put_node, _M_erase_after): Likewise. + (_Fwd_list_const_iterator<>::_M_node): use _Node_base::_Const_pointer. + (forward_list<>): Use __static_pointer_cast in place of static_cast, + and __const_pointer_cast in place of const_cast. + * include/bits/forward_list.tcc + (_Fwd_list_node<>::_M_sort_after): Using _Pointer typedefs in place + of standard pointers, __static_pointer_cast in place of static_cast. + (_Fwd_list_base<>::_Fwd_list_base, _M_insert_after, _M_erase_after): + Likewise. + (forward_list<>::_M_initialize_dispatch, _M_fill_initialize, + splice_after, remove, remove_if, merge): Likewise. + * testsuite/23_containers/forward_list/ext_pointer/modifiers/1.cc: New. + * testsuite/23_containers/forward_list/ext_pointer/modifiers/2.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/modifiers/3.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/modifiers/4.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/modifiers/5.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/1.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/2.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/3.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/4.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/5.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/6.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/operations/7.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/requirements/1.cc: + Likewise. + * testsuite/23_containers/forward_list/ext_pointer/requirements/ + explicit_instantiation/1.cc: Likewise. + * testsuite/23_containers/forward_list/ext_pointer/requirements/ + explicit_instantiation/3.cc: Likewise. + * testsuite/23_containers/forward_list/ext_pointer/1.cc: Likewise. + 2010-03-13 Paolo Carlini * include/tr1_impl/array (swap(array<>&, array<>&)): Use member swap. diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h index 57b7836a324..4460d7579de 100644 --- a/libstdc++-v3/include/bits/forward_list.h +++ b/libstdc++-v3/include/bits/forward_list.h @@ -51,29 +51,28 @@ _GLIBCXX_BEGIN_NAMESPACE(std) swap(_Fwd_list_node_base& __x, _Fwd_list_node_base& __y) { std::swap(__x._M_next, __y._M_next); } - _Fwd_list_node_base* - _M_transfer_after(_Fwd_list_node_base* __begin) + void + _M_transfer_after(_Fwd_list_node_base* __bbegin) { - _Fwd_list_node_base* __end = __begin; - while (__end && __end->_M_next) - __end = __end->_M_next; - return _M_transfer_after(__begin, __end); + _Fwd_list_node_base* __bend = __bbegin; + while (__bend && __bend->_M_next) + __bend = __bend->_M_next; + _M_transfer_after(__bbegin, __bend); } - _Fwd_list_node_base* - _M_transfer_after(_Fwd_list_node_base* __begin, - _Fwd_list_node_base* __end) + void + _M_transfer_after(_Fwd_list_node_base* __bbegin, + _Fwd_list_node_base* __bend) { - _Fwd_list_node_base* __keep = __begin->_M_next; - if (__end) + _Fwd_list_node_base* __keep = __bbegin->_M_next; + if (__bend) { - __begin->_M_next = __end->_M_next; - __end->_M_next = _M_next; + __bbegin->_M_next = __bend->_M_next; + __bend->_M_next = _M_next; } else - __begin->_M_next = 0; + __bbegin->_M_next = 0; _M_next = __keep; - return __end; } void @@ -876,7 +875,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * does not invalidate iterators and references. */ iterator - insert_after(const_iterator __pos, size_type __n, const _Tp& __val); + 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)); + } /** * @brief Inserts a range into the %forward_list. @@ -896,7 +900,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template iterator insert_after(const_iterator __pos, - _InputIterator __first, _InputIterator __last); + _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)); + } /** * @brief Inserts the contents of an initializer_list into @@ -914,7 +923,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * does not invalidate iterators and references. */ iterator - insert_after(const_iterator __pos, std::initializer_list<_Tp> __il); + 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)); + } /** * @brief Removes the element pointed to by the iterator following diff --git a/libstdc++-v3/include/bits/forward_list.tcc b/libstdc++-v3/include/bits/forward_list.tcc index 7468a90d1af..5a8b27e3d64 100644 --- a/libstdc++-v3/include/bits/forward_list.tcc +++ b/libstdc++-v3/include/bits/forward_list.tcc @@ -207,9 +207,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std) forward_list<_Tp, _Alloc>:: _M_splice_after(const_iterator __pos, forward_list&& __list) { - _Node_base* __tmp = const_cast<_Node_base*>(__pos._M_node); - iterator __before = __list.before_begin(); - return iterator(__tmp->_M_transfer_after(__before._M_node)); + 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)); + } } template @@ -224,48 +227,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std) } template - 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 - template - 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 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 void forward_list<_Tp, _Alloc>:: remove(const _Tp& __val) 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 8d72db59c8b..5351a5b0788 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 *-*-* } 1194 } +// { dg-error "no matching" "" { target *-*-* } 1201 } // { 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 5f5ac2c7713..b624ab2356f 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 *-*-* } 1194 } +// { dg-error "no matching" "" { target *-*-* } 1201 } // { 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 340a6be65e3..0a593c83a91 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 *-*-* } 1194 } +// { dg-error "no matching" "" { target *-*-* } 1201 } // { 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 1173dc1b697..4739ce77f75 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 *-*-* } 1194 } +// { dg-error "no matching" "" { target *-*-* } 1201 } // { dg-excess-errors "" } // Copyright (C) 2009, 2010 Free Software Foundation