revert: re PR libstdc++/49561 ([C++0x] std::list::size complexity)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 3 Jul 2012 00:47:17 +0000 (00:47 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 3 Jul 2012 00:47:17 +0000 (00:47 +0000)
2012-07-02  Paolo Carlini  <paolo.carlini@oracle.com>

Revert:
2011-10-04  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/49561
* include/bits/stl_list.h (_List_base<>::_List_impl::_M_size):
Add in C++0x mode.
(_List_base<>::_List_impl, _List_base<>::_M_get_node,
_List_base<>::_M_put_node, _List_base<>::_List_base(_List_base&&),
list<>::size, list<>::swap, list<>::splice): Use it.
(operator==(const list<>&, const list<>&)): Rewrite in C++0x mode.
* include/bits/list.tcc (list<>::erase): Likewise.
(list<>::merge): Adjust in C++0x mode.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc:
Adjust dg-error line number.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc:
Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Likewise.

From-SVN: r189185

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

index 4598181352456fda316c04a2d1ecf1d5cd837397..94a0ad485760a67383c06cdd52cb50f6913835d0 100644 (file)
@@ -1,3 +1,26 @@
+2012-07-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       Revert:
+       2011-10-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/49561
+       * include/bits/stl_list.h (_List_base<>::_List_impl::_M_size):
+       Add in C++0x mode.
+       (_List_base<>::_List_impl, _List_base<>::_M_get_node,
+       _List_base<>::_M_put_node, _List_base<>::_List_base(_List_base&&),
+       list<>::size, list<>::swap, list<>::splice): Use it.
+       (operator==(const list<>&, const list<>&)): Rewrite in C++0x mode.
+       * include/bits/list.tcc (list<>::erase): Likewise.
+       (list<>::merge): Adjust in C++0x mode.
+       * testsuite/23_containers/list/requirements/dr438/assign_neg.cc:
+       Adjust dg-error line number.
+       * testsuite/23_containers/list/requirements/dr438/insert_neg.cc:
+       Likewise.
+       * testsuite/23_containers/list/requirements/dr438/
+       constructor_1_neg.cc: Likewise.
+       * testsuite/23_containers/list/requirements/dr438/
+       constructor_2_neg.cc: Likewise.
+
 2012-06-27  Benjamin Kosnik  <bkoz@redhat.com>
 
        * include/bits/c++config: Remove __regex nested namespace.
index 55156bbf062d1ab6f2558fdd16e52acb8a71b801..727e82d3d8dda34e9094fd78511d4243902a76bb 100644 (file)
@@ -1,7 +1,7 @@
 // List implementation (out of line) -*- C++ -*-
 
 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-// 2011 Free Software Foundation, Inc.
+// 2011, 2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -139,14 +139,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     list<_Tp, _Alloc>::
     resize(size_type __new_size)
     {
-      if (__new_size > size())
-       _M_default_append(__new_size - size());
-      else if (__new_size < size())
-       {
-         iterator __i = begin();
-         std::advance(__i, __new_size);
-         erase(__i, end());
-       }
+      iterator __i = begin();
+      size_type __len = 0;
+      for (; __i != end() && __len < __new_size; ++__i, ++__len)
+        ;
+      if (__len == __new_size)
+        erase(__i, end());
+      else                          // __i == end()
+       _M_default_append(__new_size - __len);
     }
 
   template<typename _Tp, typename _Alloc>
@@ -154,14 +154,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     list<_Tp, _Alloc>::
     resize(size_type __new_size, const value_type& __x)
     {
-      if (__new_size > size())
-       insert(end(), __new_size - size(), __x);
-      else if (__new_size < size())
-       {
-         iterator __i = begin();
-         std::advance(__i, __new_size);
-         erase(__i, end());
-       }
+      iterator __i = begin();
+      size_type __len = 0;
+      for (; __i != end() && __len < __new_size; ++__i, ++__len)
+        ;
+      if (__len == __new_size)
+        erase(__i, end());
+      else                          // __i == end()
+        insert(end(), __new_size - __len, __x);
     }
 #else
   template<typename _Tp, typename _Alloc>
@@ -312,11 +312,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
              ++__first1;
          if (__first2 != __last2)
            _M_transfer(__last1, __first2, __last2);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-         this->_M_impl._M_size += __x.size();
-         __x._M_impl._M_size = 0;
-#endif
        }
     }
 
@@ -351,11 +346,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                ++__first1;
            if (__first2 != __last2)
              _M_transfer(__last1, __first2, __last2);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-           this->_M_impl._M_size += __x.size();
-           __x._M_impl._M_size = 0;
-#endif
          }
       }
 
index b568cd701b07675d39730f0b3033097389a9bcbe..5fdaec91d17ccc0fa6b49b7fae10eef96301e00e 100644 (file)
@@ -313,10 +313,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
        __detail::_List_node_base _M_node;
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-       size_t                    _M_size = 0;
-#endif
-
        _List_impl()
        : _Node_alloc_type(), _M_node()
        { }
@@ -336,23 +332,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
       _List_node<_Tp>*
       _M_get_node()
-      {
-       _List_node<_Tp>* __tmp = _M_impl._Node_alloc_type::allocate(1);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-       ++_M_impl._M_size;
-#endif 
-       return __tmp;
-      }
+      { return _M_impl._Node_alloc_type::allocate(1); }
 
       void
       _M_put_node(_List_node<_Tp>* __p)
-      {
-       _M_impl._Node_alloc_type::deallocate(__p, 1);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-       --_M_impl._M_size;
-#endif
-      }
-      
+      { _M_impl._Node_alloc_type::deallocate(__p, 1); }
+
   public:
       typedef _Alloc allocator_type;
 
@@ -386,7 +371,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
        _M_init();
        __detail::_List_node_base::swap(_M_impl._M_node, __x._M_impl._M_node);
-       std::swap(_M_impl._M_size, __x._M_impl._M_size);
       }
 #endif
 
@@ -888,13 +872,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       /**  Returns the number of elements in the %list.  */
       size_type
       size() const _GLIBCXX_NOEXCEPT
-      {
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-       return this->_M_impl._M_size;
-#else
-       return std::distance(begin(), end());
-#endif
-      }
+      { return std::distance(begin(), end()); }
 
       /**  Returns the size() of the largest possible %list.  */
       size_type
@@ -1234,9 +1212,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
        __detail::_List_node_base::swap(this->_M_impl._M_node, 
                                        __x._M_impl._M_node);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-       std::swap(this->_M_impl._M_size, __x._M_impl._M_size);
-#endif
 
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 431. Swapping containers with unequal allocators.
@@ -1281,11 +1256,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
            _M_check_equal_allocators(__x);
 
            this->_M_transfer(__position, __x.begin(), __x.end());
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-           this->_M_impl._M_size += __x.size();
-           __x._M_impl._M_size = 0;
-#endif
          }
       }
 
@@ -1317,14 +1287,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          return;
 
        if (this != &__x)
-         {
-           _M_check_equal_allocators(__x);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-           ++this->_M_impl._M_size;
-           --__x._M_impl._M_size;
-#endif
-         }
+         _M_check_equal_allocators(__x);
 
        this->_M_transfer(__position, __i, __j);
       }
@@ -1359,15 +1322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        if (__first != __last)
          {
            if (this != &__x)
-             {
-               _M_check_equal_allocators(__x);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-               const size_type __size = std::distance(__first, __last);
-               this->_M_impl._M_size += __size;
-               __x._M_impl._M_size -= __size;
-#endif
-             }
+             _M_check_equal_allocators(__x);
 
            this->_M_transfer(__position, __first, __last);
          }
@@ -1643,10 +1598,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     inline bool
     operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
     {
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      return (__x.size() == __y.size()
-             && std::equal(__x.begin(), __x.end(), __y.begin()));
-#else
       typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
       const_iterator __end1 = __x.end();
       const_iterator __end2 = __y.end();
@@ -1659,7 +1610,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          ++__i2;
        }
       return __i1 == __end1 && __i2 == __end2;
-#endif
     }
 
   /**
index 65a6d41201463230d7b036d019fcad83e8ae6152..17af9cfe4d51e50cea7932951cfaf8fc442bccac 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1571 }
+// { dg-error "no matching" "" { target *-*-* } 1526 }
 
 #include <list>
 
index 34caa3b5d2f47f156ac92ce85d5b062cee739819..cf303f9daeb19e3fd3fe5e48788b384de655a847 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #include <list>
 
index d1709c32ace5d4a7b968cdd07a8fc6a18d49a5b4..3e74bcfeb02c1946955a2c1aaaf2ae579da8b60c 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #include <list>
 #include <utility>
index 2651f3b62ca68ad1b30f5da01fac225e6499f841..ac33bff79027e5657cf30f795ef25426e3ea4902 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #include <list>