OSDN Git Service

2010-03-15 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Mar 2010 01:32:53 +0000 (01:32 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:12:43 +0000 (14:12 +0900)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/forward_list.h
libstdc++-v3/include/bits/forward_list.tcc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc

index 1a4e99a..24543b0 100644 (file)
@@ -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/
index 4460d75..57b7836 100644 (file)
@@ -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
@@ -875,12 +876,7 @@ _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.
@@ -900,12 +896,7 @@ _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
@@ -923,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
index 5a8b27e..7468a90 100644 (file)
@@ -207,12 +207,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     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>
@@ -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)
index 5351a5b..8d72db5 100644 (file)
@@ -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
index b624ab2..5f5ac2c 100644 (file)
@@ -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
index 0a593c8..340a6be 100644 (file)
@@ -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
index 4739ce7..1173dc1 100644 (file)
@@ -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