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)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Mar 2010 01:32:53 +0000 (01:32 +0000)
* 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/modifiers/2.cc
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 1dcbefd..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
@@ -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);
     };
 
   /**
index e3af42e..7468a90 100644 (file)
@@ -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)
index 92678f3..b6ae3f3 100644 (file)
@@ -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
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