cpp_type_traits.h (__is_byte): Add.

2007-10-17  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/cpp_type_traits.h (__is_byte): Add.
	* include/bits/stl_algobase.h (struct __fill, struct __fill_n,
	__fill_aux, __fill_n_aux): Remove.
	(__fill_a, __fill_n_a): Add.
	(fill, fill_n): Adjust.

From-SVN: r129421
This commit is contained in:
Paolo Carlini 2007-10-17 21:21:13 +00:00 committed by Paolo Carlini
parent f8da819086
commit 394033f804
3 changed files with 82 additions and 100 deletions

View File

@ -1,3 +1,11 @@
2007-10-17 Paolo Carlini <pcarlini@suse.de>
* include/bits/cpp_type_traits.h (__is_byte): Add.
* include/bits/stl_algobase.h (struct __fill, struct __fill_n,
__fill_aux, __fill_n_aux): Remove.
(__fill_a, __fill_n_a): Add.
(fill, fill_n): Adjust.
2007-10-17 Paolo Carlini <pcarlini@suse.de>
* include/bits/stl_iterator.h (back_insert_iterator<>::operator=

View File

@ -353,6 +353,34 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
};
#endif
template<typename _Tp>
struct __is_byte
{
enum { __value = 0 };
typedef __false_type __type;
};
template<>
struct __is_byte<char>
{
enum { __value = 1 };
typedef __true_type __type;
};
template<>
struct __is_byte<signed char>
{
enum { __value = 1 };
typedef __true_type __type;
};
template<>
struct __is_byte<unsigned char>
{
enum { __value = 1 };
typedef __true_type __type;
};
_GLIBCXX_END_NAMESPACE
#endif //_CPP_TYPE_TRAITS_H

View File

@ -500,56 +500,32 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
template<bool>
struct __fill
{
template<typename _ForwardIterator, typename _Tp>
static void
fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
for (; __first != __last; ++__first)
*__first = __value;
}
};
template<>
struct __fill<true>
{
template<typename _ForwardIterator, typename _Tp>
static void
fill(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
const _Tp __tmp = __value;
for (; __first != __last; ++__first)
*__first = __tmp;
}
};
template<typename _ForwardIterator, typename _Tp>
inline void
__fill_aux(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
inline typename
__gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, void>::__type
__fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
const bool __scalar = __is_scalar<_Tp>::__value;
std::__fill<__scalar>::fill(__first, __last, __value);
for (; __first != __last; ++__first)
*__first = __value;
}
template<typename _ForwardIterator, typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
__fill_a(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
{
for (; __first != __last; ++__first)
*__first = __value;
}
// Specialization: for char types we can use memset.
inline void
__fill_aux(unsigned char* __first, unsigned char* __last, unsigned char __c)
{ __builtin_memset(__first, __c, __last - __first); }
inline void
__fill_aux(signed char* __first, signed char* __last, signed char __c)
{ __builtin_memset(__first, static_cast<unsigned char>(__c),
__last - __first); }
inline void
__fill_aux(char* __first, char* __last, char __c)
{ __builtin_memset(__first, static_cast<unsigned char>(__c),
__last - __first); }
template<typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
__fill_a(_Tp* __first, _Tp* __last, _Tp __c)
{ __builtin_memset(__first, static_cast<unsigned char>(__c),
__last - __first); }
/**
* @brief Fills the range [first,last) with copies of value.
@ -571,66 +547,36 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_ForwardIterator>)
__glibcxx_requires_valid_range(__first, __last);
std::__fill_aux(__niter_base<_ForwardIterator>::__b(__first),
__niter_base<_ForwardIterator>::__b(__last), __value);
std::__fill_a(std::__niter_base<_ForwardIterator>::__b(__first),
std::__niter_base<_ForwardIterator>::__b(__last), __value);
}
template<bool>
struct __fill_n
{
template<typename _OutputIterator, typename _Size, typename _Tp>
static _OutputIterator
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
{
for (; __n > 0; --__n, ++__first)
*__first = __value;
return __first;
}
};
template<>
struct __fill_n<true>
{
template<typename _OutputIterator, typename _Size, typename _Tp>
static _OutputIterator
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
{
const _Tp __tmp = __value;
for (; __n > 0; --__n, ++__first)
*__first = __tmp;
return __first;
}
};
template<typename _OutputIterator, typename _Size, typename _Tp>
inline _OutputIterator
__fill_n_aux(_OutputIterator __first, _Size __n, const _Tp& __value)
inline typename
__gnu_cxx::__enable_if<!__is_scalar<_Tp>::__value, _OutputIterator>::__type
__fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
{
const bool __scalar = __is_scalar<_Tp>::__value;
return std::__fill_n<__scalar>::fill_n(__first, __n, __value);
for (; __n > 0; --__n, ++__first)
*__first = __value;
return __first;
}
template<typename _Size>
inline unsigned char*
__fill_n_aux(unsigned char* __first, _Size __n, unsigned char __c)
template<typename _OutputIterator, typename _Size, typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
__fill_n_a(_OutputIterator __first, _Size __n, _Tp __value)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
for (; __n > 0; --__n, ++__first)
*__first = __value;
return __first;
}
template<typename _Size>
inline signed char*
__fill_n_aux(signed char* __first, _Size __n, signed char __c)
template<typename _Size, typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_byte<_Tp>::__value, _Tp*>::__type
__fill_n_a(_Tp* __first, _Size __n, _Tp __c)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline char*
__fill_n_aux(char* __first, _Size __n, char __c)
{
std::__fill_aux(__first, __first + __n, __c);
std::__fill_a(__first, __first + __n, __c);
return __first + __n;
}
@ -652,8 +598,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// concept requirements
__glibcxx_function_requires(_OutputIteratorConcept<_OI, _Tp>)
return _OI(std::__fill_n_aux(__niter_base<_OI>::__b(__first), __n,
__value));
return _OI(std::__fill_n_a(std::__niter_base<_OI>::__b(__first),
__n, __value));
}
template<bool _BoolType>
@ -803,9 +749,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P)
typename iterator_traits<_II2>::value_type>)
__glibcxx_requires_valid_range(__first1, __last1);
return std::__equal_aux(__niter_base<_II1>::__b(__first1),
__niter_base<_II1>::__b(__last1),
__niter_base<_II2>::__b(__first2));
return std::__equal_aux(std::__niter_base<_II1>::__b(__first1),
std::__niter_base<_II1>::__b(__last1),
std::__niter_base<_II2>::__b(__first2));
}
/**