stl_construct.h (_Construct): Change to variadic in C++0x mode, consistently with allocator::construct.

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
This commit is contained in:
Paolo Carlini 2010-06-16 12:26:24 +00:00
parent 29be383567
commit fe27aa8bc4
4 changed files with 102 additions and 84 deletions

View 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
@ -11,23 +20,28 @@
* 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.
@ -35,9 +49,12 @@
* 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>

View 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.
*/
#ifdef __GXX_EXPERIMENTAL_CXX0X__
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
#ifdef __GXX_EXPERIMENTAL_CXX0X__
// Allow perfect forwarding
_Construct(_T1* __p, _T2&& __value)
#else
_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.

View 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(...)
{

View 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(...)