]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
stl_construct.h (_Construct): Change to variadic in C++0x mode, consistently with...
authorPaolo Carlini <paolo@gcc.gnu.org>
Wed, 16 Jun 2010 12:26:24 +0000 (12:26 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 16 Jun 2010 12:26:24 +0000 (12:26 +0000)
2010-06-16  Paolo Carlini  <paolo.carlini@oracle.com>

* include/bits/stl_construct.h (_Construct): Change to variadic in
C++0x mode, consistently with allocator::construct.
* include/bits/stl_uninitialized.h (__uninitialized_copy_n): Use
_Construct.
(__uninitialized_construct_range): Move to...
* include/bits/stl_tempbuf.h (__uninitialized_construct_buf): ... here.

From-SVN: r160833

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_construct.h
libstdc++-v3/include/bits/stl_tempbuf.h
libstdc++-v3/include/bits/stl_uninitialized.h

index ef09e830603912b02394c8873065ff0cef23e5f7..1a79c2939500a93c6a8f02a278760d01532d2f91 100644 (file)
@@ -1,3 +1,12 @@
+2010-06-16  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/bits/stl_construct.h (_Construct): Change to variadic in
+       C++0x mode, consistently with allocator::construct.
+       * include/bits/stl_uninitialized.h (__uninitialized_copy_n): Use
+       _Construct.
+       (__uninitialized_construct_range): Move to...
+       * include/bits/stl_tempbuf.h (__uninitialized_construct_buf): ... here.
+
 2010-06-16  Matthias Klose  <doko@ubuntu.com>
 
        * src/compatibility.cc: Export long double versions of "C" math
        * testsuite/lib/prune.exp (dg-prune-output): New.
        (libstdc++-dg-prune): Rename from prune_g++_output.
        Add a bunch of prunes from gcc's prune.exp.
-       * testsuite/18_support/headers/cstdbool/std_c++0x_neg.cc: Remove dg-excess-errors.
+       * testsuite/18_support/headers/cstdbool/std_c++0x_neg.cc:
+       Remove dg-excess-errors.
        * testsuite/18_support/headers/cstdint/std_c++0x_neg.cc: Likewise.
        * testsuite/19_diagnostics/error_category/cons/copy_neg.cc: Likewise.
-       * testsuite/19_diagnostics/headers/system_error/std_c++0x_neg.cc: Likewise.
+       * testsuite/19_diagnostics/headers/system_error/std_c++0x_neg.cc:
+       Likewise.
        * testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
        * testsuite/20_util/duration/requirements/typedefs_neg1.cc: Likewise.
        * testsuite/20_util/duration/requirements/typedefs_neg3.cc: Likewise.
        * testsuite/20_util/headers/type_traits/std_c++0x_neg.cc: Likewise.
        * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise.
-       * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise.
+       * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
+       Likewise.
        * testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Likewise.
        * testsuite/20_util/shared_ptr/assign/shared_ptr_neg.cc: Likewise.
        * testsuite/20_util/shared_ptr/cons/43820.cc: Likewise.
        * testsuite/23_containers/headers/array/std_c++0x_neg.cc: Likewise.
        * testsuite/23_containers/headers/tuple/std_c++0x_neg.cc: Likewise.
-       * testsuite/23_containers/headers/unordered_map/std_c++0x_neg.cc: Likewise.
-       * testsuite/23_containers/headers/unordered_set/std_c++0x_neg.cc: Likewise.
+       * testsuite/23_containers/headers/unordered_map/std_c++0x_neg.cc:
+       Likewise.
+       * testsuite/23_containers/headers/unordered_set/std_c++0x_neg.cc:
+       Likewise.
        * testsuite/26_numerics/headers/ccomplex/std_c++0x_neg.cc: Likewise.
        * testsuite/26_numerics/headers/cfenv/std_c++0x_neg.cc: Likewise.
        * testsuite/26_numerics/headers/ctgmath/std_c++0x_neg.cc: Likewise.
        * testsuite/27_io/headers/cinttypes/std_c++0x_neg.cc: Likewise.
        * testsuite/28_regex/headers/regex/std_c++0x_neg.cc: Likewise.
        * testsuite/29_atomics/atomic/cons/copy_neg.cc: Likewise.
-       * testsuite/29_atomics/atomic_integral/operators/decrement_neg.cc: Likewise.
-       * testsuite/29_atomics/atomic_integral/operators/increment_neg.cc: Likewise.
-       * testsuite/30_threads/headers/condition_variable/std_c++0x_neg.cc: Likewise.
+       * testsuite/29_atomics/atomic_integral/operators/decrement_neg.cc:
+       Likewise.
+       * testsuite/29_atomics/atomic_integral/operators/increment_neg.cc:
+       Likewise.
+       * testsuite/30_threads/headers/condition_variable/std_c++0x_neg.cc:
+       Likewise.
        * testsuite/30_threads/headers/future/std_c++0x_neg.cc: Likewise.
        * testsuite/30_threads/headers/mutex/std_c++0x_neg.cc: Likewise.
        * testsuite/30_threads/headers/thread/std_c++0x_neg.cc: Likewise.
@@ -45,7 +62,8 @@
        * testsuite/ext/profile/mutex_extensions.cc: Likewise.
        * testsuite/ext/type_traits/add_unsigned_floating_neg.cc: Likewise.
        * testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: Likewise.
-       * testsuite/tr1/2_general_utilities/shared_ptr/assign/shared_ptr_neg.cc: Likewise.
+       * testsuite/tr1/2_general_utilities/shared_ptr/assign/
+       shared_ptr_neg.cc: Likewise.
        * testsuite/tr1/2_general_utilities/shared_ptr/cons/43820.cc: Likewise.
 
 2010-06-13  Paolo Carlini <paolo.carlini@oracle.com>
index 06a2902ca69fab904418e02bee397a6a6a9dd9e6..d84b8f164fdf1eab9b0a229b68f6dd7513a2db97 100644 (file)
@@ -67,19 +67,21 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
    * Constructs an object in existing memory by invoking an allocated
    * object's constructor with an initializer.
    */
-  template<typename _T1, typename _T2>
-    inline void
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-    // Allow perfect forwarding
-    _Construct(_T1* __p, _T2&& __value)
+  template<typename _T1, typename... _Args>
+    inline void
+    _Construct(_T1* __p, _Args&&... __args)
+    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
 #else
+  template<typename _T1, typename _T2>
+    inline void
     _Construct(_T1* __p, const _T2& __value)
-#endif
     {
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 402. wrong new expression in [some_]allocator::construct
-      ::new(static_cast<void*>(__p)) _T1(_GLIBCXX_FORWARD(_T2, __value));
+      ::new(static_cast<void*>(__p)) _T1(__value);
     }
+#endif
 
   /**
    * Destroy the object pointed to by a pointer type.
index a08b1ee1324ab2c87427ab28e0cb535f1db0e982..47571179c878a5587be9d4c544e85f70bea73dfb 100644 (file)
@@ -59,7 +59,6 @@
 
 #include <bits/stl_algobase.h>
 #include <bits/stl_construct.h>
-#include <bits/stl_uninitialized.h>
 
 _GLIBCXX_BEGIN_NAMESPACE(std)
 
@@ -176,6 +175,70 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       operator=(const _Temporary_buffer&);
     };
 
+
+  template<bool>
+    struct __uninitialized_construct_buf_dispatch
+    {
+      template<typename _ForwardIterator, typename _Tp>
+        static void
+        __ucr(_ForwardIterator __first, _ForwardIterator __last,
+             _Tp& __value)
+        {
+         if(__first == __last)
+           return;
+
+         _ForwardIterator __cur = __first;
+         __try
+           {
+             std::_Construct(std::__addressof(*__first),
+                             _GLIBCXX_MOVE(__value));
+             _ForwardIterator __prev = __cur;
+             ++__cur;
+             for(; __cur != __last; ++__cur, ++__prev)
+               std::_Construct(std::__addressof(*__cur),
+                               _GLIBCXX_MOVE(*__prev));
+             __value = _GLIBCXX_MOVE(*__prev);
+           }
+         __catch(...)
+           {
+             std::_Destroy(__first, __cur);
+             __throw_exception_again;
+           }
+       }
+    };
+
+  template<>
+    struct __uninitialized_construct_buf_dispatch<true>
+    {
+      template<typename _ForwardIterator, typename _Tp>
+        static void
+        __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
+    };
+
+  // Constructs objects in the range [first, last).
+  // Note that while these new objects will take valid values,
+  // their exact value is not defined. In particular they may
+  // be 'moved from'.
+  //
+  // While __value may altered during this algorithm, it will have
+  // the same value when the algorithm finishes, unless one of the
+  // constructions throws.
+  //
+  // Requirements: _ForwardIterator::value_type(_Tp&&) is valid.
+  template<typename _ForwardIterator, typename _Tp>
+    inline void
+    __uninitialized_construct_buf(_ForwardIterator __first,
+                                 _ForwardIterator __last,
+                                 _Tp& __value)
+    {
+      typedef typename std::iterator_traits<_ForwardIterator>::value_type
+       _ValueType;
+
+      std::__uninitialized_construct_buf_dispatch<
+        __has_trivial_constructor(_ValueType)>::
+         __ucr(__first, __last, __value);
+    }
+
   template<typename _ForwardIterator, typename _Tp>
     _Temporary_buffer<_ForwardIterator, _Tp>::
     _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
@@ -189,8 +252,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
          _M_buffer = __p.first;
          _M_len = __p.second;
          if(_M_buffer)
-           std::__uninitialized_construct_range(_M_buffer, _M_buffer + _M_len,
-                                                *__first);
+           std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len,
+                                              *__first);
        }
       __catch(...)
        {
index b78f92025c353f09c0c82a7a9e1ca66977cdc730..7d072d7344d371cbd778ffa405b1b4e2ccaf3dae 100644 (file)
@@ -172,70 +172,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     }
 
 
-  template<bool>
-    struct __uninitialized_construct_range_dispatch
-    {
-      template<typename _ForwardIterator, typename _Tp>
-        static void
-        __ucr(_ForwardIterator __first, _ForwardIterator __last,
-             _Tp& __value)
-        {
-         if(__first == __last)
-           return;
-
-         _ForwardIterator __cur = __first;
-         __try
-           {
-             std::_Construct(std::__addressof(*__first),
-                             _GLIBCXX_MOVE(__value));
-             _ForwardIterator __prev = __cur;
-             ++__cur;
-             for(; __cur != __last; ++__cur, ++__prev)
-               std::_Construct(std::__addressof(*__cur),
-                               _GLIBCXX_MOVE(*__prev));
-             __value = _GLIBCXX_MOVE(*__prev);
-           }
-         __catch(...)
-           {
-             std::_Destroy(__first, __cur);
-             __throw_exception_again;
-           }
-       }
-    };
-
-  template<>
-    struct __uninitialized_construct_range_dispatch<true>
-    {
-      template<typename _ForwardIterator, typename _Tp>
-        static void
-        __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { }
-    };
-
-  // Constructs objects in the range [first, last).
-  // Note that while these new objects will take valid values,
-  // their exact value is not defined. In particular they may
-  // be 'moved from'.
-  //
-  // While __value may altered during this algorithm, it will have
-  // the same value when the algorithm finishes, unless one of the
-  // constructions throws.
-  //
-  // Requirements: _ForwardIterator::value_type(_Tp&&) is valid.
-  template<typename _ForwardIterator, typename _Tp>
-    inline void
-    __uninitialized_construct_range(_ForwardIterator __first,
-                                   _ForwardIterator __last,
-                                   _Tp& __value)
-    {
-      typedef typename std::iterator_traits<_ForwardIterator>::value_type
-       _ValueType;
-
-      std::__uninitialized_construct_range_dispatch<
-        __has_trivial_constructor(_ValueType)>::
-         __ucr(__first, __last, __value);
-    }
-
-
   template<bool>
     struct __uninitialized_fill_n
     {
@@ -501,8 +437,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       __try
        {
          for (; __n > 0; --__n, ++__first, ++__cur)
-           ::new(static_cast<void*>(std::__addressof(*__cur))) typename
-               iterator_traits<_ForwardIterator>::value_type(*__first);
+           std::_Construct(std::__addressof(*__cur), *__first);
          return __cur;
        }
       __catch(...)