stl_uninitialized.h (__uninitialized_default, [...]): Add.

2010-06-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/stl_uninitialized.h (__uninitialized_default,
	__uninitialized_default_n, __uninitialized_default_a,
	__uninitialized_default_n_a): Add.

	* include/bits/stl_uninitialized.h (uninitialized_copy,
	uninitialized_fill, uninitialized_fill_n): Use __is_trivial
	instead of __is_pod.
	* include/bits/valarray_array.h: Likewise.
	* include/bits/stl_algobase.h (__copy_move_backward_a,
	__copy_move_a): Likewise.

From-SVN: r160882
This commit is contained in:
Paolo Carlini 2010-06-17 08:34:17 +00:00 committed by Paolo Carlini
parent b26be063b3
commit cc86c05a59
4 changed files with 204 additions and 31 deletions

View File

@ -1,3 +1,16 @@
2010-06-17 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/stl_uninitialized.h (__uninitialized_default,
__uninitialized_default_n, __uninitialized_default_a,
__uninitialized_default_n_a): Add.
* include/bits/stl_uninitialized.h (uninitialized_copy,
uninitialized_fill, uninitialized_fill_n): Use __is_trivial
instead of __is_pod.
* include/bits/valarray_array.h: Likewise.
* include/bits/stl_algobase.h (__copy_move_backward_a,
__copy_move_a): Likewise.
2010-06-16 Paolo Carlini <paolo.carlini@oracle.com> 2010-06-16 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/stl_construct.h (_Construct): Change to variadic in * include/bits/stl_construct.h (_Construct): Change to variadic in

View File

@ -394,7 +394,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef typename iterator_traits<_II>::value_type _ValueTypeI; typedef typename iterator_traits<_II>::value_type _ValueTypeI;
typedef typename iterator_traits<_OI>::value_type _ValueTypeO; typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
typedef typename iterator_traits<_II>::iterator_category _Category; typedef typename iterator_traits<_II>::iterator_category _Category;
const bool __simple = (__is_pod(_ValueTypeI) const bool __simple = (__is_trivial(_ValueTypeI)
&& __is_pointer<_II>::__value && __is_pointer<_II>::__value
&& __is_pointer<_OI>::__value && __is_pointer<_OI>::__value
&& __are_same<_ValueTypeI, _ValueTypeO>::__value); && __are_same<_ValueTypeI, _ValueTypeO>::__value);
@ -589,7 +589,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef typename iterator_traits<_BI1>::value_type _ValueType1; typedef typename iterator_traits<_BI1>::value_type _ValueType1;
typedef typename iterator_traits<_BI2>::value_type _ValueType2; typedef typename iterator_traits<_BI2>::value_type _ValueType2;
typedef typename iterator_traits<_BI1>::iterator_category _Category; typedef typename iterator_traits<_BI1>::iterator_category _Category;
const bool __simple = (__is_pod(_ValueType1) const bool __simple = (__is_trivial(_ValueType1)
&& __is_pointer<_BI1>::__value && __is_pointer<_BI1>::__value
&& __is_pointer<_BI2>::__value && __is_pointer<_BI2>::__value
&& __are_same<_ValueType1, _ValueType2>::__value); && __are_same<_ValueType1, _ValueType2>::__value);

View File

@ -60,12 +60,12 @@
_GLIBCXX_BEGIN_NAMESPACE(std) _GLIBCXX_BEGIN_NAMESPACE(std)
template<bool> template<bool _TrivialValueTypes>
struct __uninitialized_copy struct __uninitialized_copy
{ {
template<typename _InputIterator, typename _ForwardIterator> template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator static _ForwardIterator
uninitialized_copy(_InputIterator __first, _InputIterator __last, __uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result) _ForwardIterator __result)
{ {
_ForwardIterator __cur = __result; _ForwardIterator __cur = __result;
@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{ {
template<typename _InputIterator, typename _ForwardIterator> template<typename _InputIterator, typename _ForwardIterator>
static _ForwardIterator static _ForwardIterator
uninitialized_copy(_InputIterator __first, _InputIterator __last, __uninit_copy(_InputIterator __first, _InputIterator __last,
_ForwardIterator __result) _ForwardIterator __result)
{ return std::copy(__first, __last, __result); } { return std::copy(__first, __last, __result); }
}; };
@ -112,19 +112,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef typename iterator_traits<_ForwardIterator>::value_type typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType2; _ValueType2;
return std::__uninitialized_copy<(__is_pod(_ValueType1) return std::__uninitialized_copy<(__is_trivial(_ValueType1)
&& __is_pod(_ValueType2))>:: && __is_trivial(_ValueType2))>::
uninitialized_copy(__first, __last, __result); __uninit_copy(__first, __last, __result);
} }
template<bool> template<bool _TrivialValueType>
struct __uninitialized_fill struct __uninitialized_fill
{ {
template<typename _ForwardIterator, typename _Tp> template<typename _ForwardIterator, typename _Tp>
static void static void
uninitialized_fill(_ForwardIterator __first, __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
_ForwardIterator __last, const _Tp& __x) const _Tp& __x)
{ {
_ForwardIterator __cur = __first; _ForwardIterator __cur = __first;
__try __try
@ -145,8 +145,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{ {
template<typename _ForwardIterator, typename _Tp> template<typename _ForwardIterator, typename _Tp>
static void static void
uninitialized_fill(_ForwardIterator __first, __uninit_fill(_ForwardIterator __first, _ForwardIterator __last,
_ForwardIterator __last, const _Tp& __x) const _Tp& __x)
{ std::fill(__first, __last, __x); } { std::fill(__first, __last, __x); }
}; };
@ -167,17 +167,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef typename iterator_traits<_ForwardIterator>::value_type typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType; _ValueType;
std::__uninitialized_fill<__is_pod(_ValueType)>:: std::__uninitialized_fill<__is_trivial(_ValueType)>::
uninitialized_fill(__first, __last, __x); __uninit_fill(__first, __last, __x);
} }
template<bool> template<bool _TrivialValueType>
struct __uninitialized_fill_n struct __uninitialized_fill_n
{ {
template<typename _ForwardIterator, typename _Size, typename _Tp> template<typename _ForwardIterator, typename _Size, typename _Tp>
static void static void
uninitialized_fill_n(_ForwardIterator __first, _Size __n, __uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x) const _Tp& __x)
{ {
_ForwardIterator __cur = __first; _ForwardIterator __cur = __first;
@ -199,7 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{ {
template<typename _ForwardIterator, typename _Size, typename _Tp> template<typename _ForwardIterator, typename _Size, typename _Tp>
static void static void
uninitialized_fill_n(_ForwardIterator __first, _Size __n, __uninit_fill_n(_ForwardIterator __first, _Size __n,
const _Tp& __x) const _Tp& __x)
{ std::fill_n(__first, __n, __x); } { std::fill_n(__first, __n, __x); }
}; };
@ -220,8 +220,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef typename iterator_traits<_ForwardIterator>::value_type typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType; _ValueType;
std::__uninitialized_fill_n<__is_pod(_ValueType)>:: std::__uninitialized_fill_n<__is_trivial(_ValueType)>::
uninitialized_fill_n(__first, __n, __x); __uninit_fill_n(__first, __n, __x);
} }
// Extensions: versions of uninitialized_copy, uninitialized_fill, // Extensions: versions of uninitialized_copy, uninitialized_fill,
@ -427,6 +427,166 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
} }
#ifdef __GXX_EXPERIMENTAL_CXX0X__ #ifdef __GXX_EXPERIMENTAL_CXX0X__
// Extensions: __uninitialized_default, __uninitialized_default_n,
// __uninitialized_default_a, __uninitialized_default_n_a.
template<bool _TrivialValueType>
struct __uninitialized_default_1
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
std::_Construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_1<true>
{
template<typename _ForwardIterator>
static void
__uninit_default(_ForwardIterator __first, _ForwardIterator __last)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
std::fill(__first, __last, _ValueType());
}
};
template<bool _TrivialValueType>
struct __uninitialized_default_n_1
{
template<typename _ForwardIterator, typename _Size>
static void
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, ++__cur)
std::_Construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur);
__throw_exception_again;
}
}
};
template<>
struct __uninitialized_default_n_1<true>
{
template<typename _ForwardIterator, typename _Size>
static void
__uninit_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
std::fill_n(__first, __n, _ValueType());
}
};
// __uninitialized_default
// Fills [first, last) with std::distance(first, last) default
// constructed value_types(s).
template<typename _ForwardIterator>
inline void
__uninitialized_default(_ForwardIterator __first,
_ForwardIterator __last)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
std::__uninitialized_default_1<__is_trivial(_ValueType)>::
__uninit_default(__first, __last);
}
// __uninitialized_default_n
// Fills [first, first + n) with n default constructed value_type(s).
template<typename _ForwardIterator, typename _Size>
inline void
__uninitialized_default_n(_ForwardIterator __first, _Size __n)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
std::__uninitialized_default_n_1<__is_trivial(_ValueType)>::
__uninit_default_n(__first, __n);
}
// __uninitialized_default_a
// Fills [first, last) with std::distance(first, last) default
// constructed value_types(s), constructed with the allocator alloc.
template<typename _ForwardIterator, typename _Allocator>
void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
for (; __cur != __last; ++__cur)
__alloc.construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Tp>
inline void
__uninitialized_default_a(_ForwardIterator __first,
_ForwardIterator __last,
allocator<_Tp>&)
{ std::__uninitialized_default(__first, __last); }
// __uninitialized_default_n_a
// Fills [first, first + n) with n default constructed value_types(s),
// constructed with the allocator alloc.
template<typename _ForwardIterator, typename _Size, typename _Allocator>
void
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
_Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
for (; __n > 0; --__n, ++__cur)
__alloc.construct(std::__addressof(*__cur));
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp>
inline void
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
allocator<_Tp>&)
{ std::__uninitialized_default_n(__first, __n); }
template<typename _InputIterator, typename _Size, template<typename _InputIterator, typename _Size,
typename _ForwardIterator> typename _ForwardIterator>
_ForwardIterator _ForwardIterator

View File

@ -1,7 +1,7 @@
// The template and inlines for the -*- C++ -*- internal _Array helper class. // The template and inlines for the -*- C++ -*- internal _Array helper class.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
// 2006, 2007, 2008, 2009 // 2006, 2007, 2008, 2009, 2010
// Free Software Foundation, Inc. // Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
@ -127,7 +127,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
inline void inline void
__valarray_fill_construct(_Tp* __b, _Tp* __e, const _Tp __t) __valarray_fill_construct(_Tp* __b, _Tp* __e, const _Tp __t)
{ {
_Array_init_ctor<_Tp, __is_pod(_Tp)>::_S_do_it(__b, __e, __t); _Array_init_ctor<_Tp, __is_trivial(_Tp)>::_S_do_it(__b, __e, __t);
} }
// //
@ -160,7 +160,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__valarray_copy_construct(const _Tp* __b, const _Tp* __e, __valarray_copy_construct(const _Tp* __b, const _Tp* __e,
_Tp* __restrict__ __o) _Tp* __restrict__ __o)
{ {
_Array_copy_ctor<_Tp, __is_pod(_Tp)>::_S_do_it(__b, __e, __o); _Array_copy_ctor<_Tp, __is_trivial(_Tp)>::_S_do_it(__b, __e, __o);
} }
// copy-construct raw array [__o, *) from strided array __a[<__n : __s>] // copy-construct raw array [__o, *) from strided array __a[<__n : __s>]
@ -169,7 +169,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__valarray_copy_construct (const _Tp* __restrict__ __a, size_t __n, __valarray_copy_construct (const _Tp* __restrict__ __a, size_t __n,
size_t __s, _Tp* __restrict__ __o) size_t __s, _Tp* __restrict__ __o)
{ {
if (__is_pod(_Tp)) if (__is_trivial(_Tp))
while (__n--) while (__n--)
{ {
*__o++ = *__a; *__o++ = *__a;
@ -190,7 +190,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_t* __restrict__ __i, const size_t* __restrict__ __i,
_Tp* __restrict__ __o, size_t __n) _Tp* __restrict__ __o, size_t __n)
{ {
if (__is_pod(_Tp)) if (__is_trivial(_Tp))
while (__n--) while (__n--)
*__o++ = __a[*__i++]; *__o++ = __a[*__i++];
else else
@ -203,7 +203,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
inline void inline void
__valarray_destroy_elements(_Tp* __b, _Tp* __e) __valarray_destroy_elements(_Tp* __b, _Tp* __e)
{ {
if (!__is_pod(_Tp)) if (!__is_trivial(_Tp))
while (__b != __e) while (__b != __e)
{ {
__b->~_Tp(); __b->~_Tp();
@ -267,7 +267,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__valarray_copy(const _Tp* __restrict__ __a, size_t __n, __valarray_copy(const _Tp* __restrict__ __a, size_t __n,
_Tp* __restrict__ __b) _Tp* __restrict__ __b)
{ {
_Array_copier<_Tp, __is_pod(_Tp)>::_S_do_it(__a, __n, __b); _Array_copier<_Tp, __is_trivial(_Tp)>::_S_do_it(__a, __n, __b);
} }
// Copy strided array __a[<__n : __s>] in plain __b[<__n>] // Copy strided array __a[<__n : __s>] in plain __b[<__n>]