PR libstdc++/30449 (fill, fill_n)

2007-01-21  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/30449 (fill, fill_n)
	* include/bits/stl_algobase.h (__fill_aux(wchar_t*, wchar_t*,
	const wchar_t&), __fill_n_aux(wchar_t*, _Size, const wchar_t&)): New.
	(fill(signed char*, signed char*, const signed char&),
	fill(unsigned char*, unsigned char*, const unsigned char&),
	fill(char*, char*, char&), fill_n(signed char*, _Size,
	const signed char&), fill_n(unsigned char*, _Size,
	const unsigned char&), fill_n(char*, _Size, char&)): Rename to
	__*_aux.
	(__fill_normal, __fill_n_normal): New, call the latter.
	(fill, fill_n): Adjust, call the latter.	
	* testsuite/25_algorithms/fill/4.cc: New.
	* testsuite/25_algorithms/fill/5.cc: New.

From-SVN: r121027
This commit is contained in:
Paolo Carlini 2007-01-21 09:57:42 +00:00 committed by Paolo Carlini
parent 6004caaf4d
commit e9e90c1f98
4 changed files with 305 additions and 61 deletions

View File

@ -1,3 +1,19 @@
2007-01-21 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/30449 (fill, fill_n)
* include/bits/stl_algobase.h (__fill_aux(wchar_t*, wchar_t*,
const wchar_t&), __fill_n_aux(wchar_t*, _Size, const wchar_t&)): New.
(fill(signed char*, signed char*, const signed char&),
fill(unsigned char*, unsigned char*, const unsigned char&),
fill(char*, char*, char&), fill_n(signed char*, _Size,
const signed char&), fill_n(unsigned char*, _Size,
const unsigned char&), fill_n(char*, _Size, char&)): Rename to
__*_aux.
(__fill_normal, __fill_n_normal): New, call the latter.
(fill, fill_n): Adjust, call the latter.
* testsuite/25_algorithms/fill/4.cc: New.
* testsuite/25_algorithms/fill/5.cc: New.
2007-01-18 Paolo Carlini <pcarlini@suse.de>
* include/bits/basic_string.h (basic_string<>::_S_compare): Add.

View File

@ -1,6 +1,6 @@
// Bits and pieces used in algorithms -*- C++ -*-
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@ -64,6 +64,7 @@
#include <bits/c++config.h>
#include <cstring>
#include <cwchar>
#include <climits>
#include <cstdlib>
#include <cstddef>
@ -540,6 +541,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__result);
}
template<bool>
struct __fill
{
@ -567,6 +569,68 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
};
template<typename _ForwardIterator, typename _Tp>
inline void
__fill_aux(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
const bool __scalar = __is_scalar<_Tp>::__value;
std::__fill<__scalar>::fill(__first, __last, __value);
}
// Specialization: for char types we can use memset (wmemset).
inline void
__fill_aux(unsigned char* __first, unsigned char* __last,
const unsigned char& __c)
{
const unsigned char __tmp = __c;
std::memset(__first, __tmp, __last - __first);
}
inline void
__fill_aux(signed char* __first, signed char* __last,
const signed char& __c)
{
const signed char __tmp = __c;
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
}
inline void
__fill_aux(char* __first, char* __last, const char& __c)
{
const char __tmp = __c;
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
}
#ifdef _GLIBCXX_USE_WCHAR_T
inline void
__fill_aux(wchar_t* __first, wchar_t* __last, const wchar_t& __c)
{
const wchar_t __tmp = __c;
std::wmemset(__first, __tmp, __last - __first);
}
#endif
template<bool>
struct __fill_normal
{
template<typename _ForwardIterator, typename _Tp>
static void
__fill_n(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{ std::__fill_aux(__first, __last, __value); }
};
template<>
struct __fill_normal<true>
{
template<typename _ForwardIterator, typename _Tp>
static void
__fill_n(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{ std::__fill_aux(__first.base(), __last.base(), __value); }
};
/**
* @brief Fills the range [first,last) with copies of value.
* @param first A forward iterator.
@ -574,12 +638,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param value A reference-to-const of arbitrary type.
* @return Nothing.
*
* This function fills a range with copies of the same value. For one-byte
* types filling contiguous areas of memory, this becomes an inline call to
* @c memset.
* This function fills a range with copies of the same value. For char
* types filling contiguous areas of memory, this becomes an inline call
* to @c memset or @c wmemset.
*/
template<typename _ForwardIterator, typename _Tp>
void
inline void
fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
{
// concept requirements
@ -587,34 +651,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_ForwardIterator>)
__glibcxx_requires_valid_range(__first, __last);
const bool __scalar = __is_scalar<_Tp>::__value;
std::__fill<__scalar>::fill(__first, __last, __value);
const bool __fi = __is_normal_iterator<_ForwardIterator>::__value;
std::__fill_normal<__fi>::__fill_n(__first, __last, __value);
}
// Specialization: for one-byte types we can use memset.
inline void
fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)
{
__glibcxx_requires_valid_range(__first, __last);
const unsigned char __tmp = __c;
std::memset(__first, __tmp, __last - __first);
}
inline void
fill(signed char* __first, signed char* __last, const signed char& __c)
{
__glibcxx_requires_valid_range(__first, __last);
const signed char __tmp = __c;
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
}
inline void
fill(char* __first, char* __last, const char& __c)
{
__glibcxx_requires_valid_range(__first, __last);
const char __tmp = __c;
std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
}
template<bool>
struct __fill_n
@ -643,6 +683,66 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
};
template<typename _OutputIterator, typename _Size, typename _Tp>
inline _OutputIterator
__fill_n_aux(_OutputIterator __first, _Size __n, const _Tp& __value)
{
const bool __scalar = __is_scalar<_Tp>::__value;
return std::__fill_n<__scalar>::fill_n(__first, __n, __value);
}
template<typename _Size>
inline unsigned char*
__fill_n_aux(unsigned char* __first, _Size __n, const unsigned char& __c)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline signed char*
__fill_n_aux(signed char* __first, _Size __n, const signed char& __c)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline char*
__fill_n_aux(char* __first, _Size __n, const char& __c)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
#ifdef _GLIBCXX_USE_WCHAR_T
template<typename _Size>
inline wchar_t*
__fill_n_aux(wchar_t* __first, _Size __n, const wchar_t& __c)
{
std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
#endif
template<bool>
struct __fill_n_normal
{
template<typename _OI, typename _Size, typename _Tp>
static _OI
__fill_n_n(_OI __first, _Size __n, const _Tp& __value)
{ return std::__fill_n_aux(__first, __n, __value); }
};
template<>
struct __fill_n_normal<true>
{
template<typename _OI, typename _Size, typename _Tp>
static _OI
__fill_n_n(_OI __first, _Size __n, const _Tp& __value)
{ return _OI(std::__fill_n_aux(__first.base(), __n, __value)); }
};
/**
* @brief Fills the range [first,first+n) with copies of value.
* @param first An output iterator.
@ -650,43 +750,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param value A reference-to-const of arbitrary type.
* @return The iterator at first+n.
*
* This function fills a range with copies of the same value. For one-byte
* types filling contiguous areas of memory, this becomes an inline call to
* @c memset.
* This function fills a range with copies of the same value. For char
* types filling contiguous areas of memory, this becomes an inline call
* to @c memset or @ wmemset.
*/
template<typename _OutputIterator, typename _Size, typename _Tp>
_OutputIterator
inline _OutputIterator
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
{
// concept requirements
__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, _Tp>)
const bool __scalar = __is_scalar<_Tp>::__value;
return std::__fill_n<__scalar>::fill_n(__first, __n, __value);
}
template<typename _Size>
inline unsigned char*
fill_n(unsigned char* __first, _Size __n, const unsigned char& __c)
{
std::fill(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline signed char*
fill_n(signed char* __first, _Size __n, const signed char& __c)
{
std::fill(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline char*
fill_n(char* __first, _Size __n, const char& __c)
{
std::fill(__first, __first + __n, __c);
return __first + __n;
const bool __oi = __is_normal_iterator<_OutputIterator>::__value;
return std::__fill_n_normal<__oi>::__fill_n_n(__first, __n, __value);
}
/**

View File

@ -0,0 +1,76 @@
// 2007-01-19 Paolo Carlini <pcarlini@suse.de>
// Copyright (C) 2007 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.
// 25.2.5 [lib.alg.fill] Fill.
#include <algorithm>
#include <vector>
#include <testsuite_hooks.h>
void
test01()
{
using namespace std;
bool test __attribute__((unused)) = true;
const int A1[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
const int N1 = sizeof(A1) / sizeof(int);
int i1[N1];
fill(i1, i1 + N1, 3);
VERIFY( equal(i1, i1 + N1, A1) );
vector<int> v1(N1);
fill(v1.begin(), v1.end(), 3);
VERIFY( equal(v1.begin(), v1.end(), A1) );
const char A2[] = {'\3', '\3', '\3', '\3', '\3',
'\3', '\3', '\3', '\3', '\3'};
const int N2 = sizeof(A2) / sizeof(char);
char i2[N2];
fill(i2, i2 + N2, '\3');
VERIFY( equal(i2, i2 + N2, A2) );
vector<char> v2(N2);
fill(v2.begin(), v2.end(), '\3');
VERIFY( equal(v2.begin(), v2.end(), A2) );
#ifdef _GLIBCXX_USE_WCHAR_T
const wchar_t A3[] = {L'\3', L'\3', L'\3', L'\3', L'\3',
L'\3', L'\3', L'\3', L'\3', L'\3'};
const int N3 = sizeof(A3) / sizeof(wchar_t);
wchar_t i3[N3];
fill(i3, i3 + N3, L'\3');
VERIFY( equal(i3, i3 + N3, A3) );
vector<wchar_t> v3(N3);
fill(v3.begin(), v3.end(), L'\3');
VERIFY( equal(v3.begin(), v3.end(), A3) );
#endif
}
int
main()
{
test01();
return 0;
}

View File

@ -0,0 +1,76 @@
// 2007-01-19 Paolo Carlini <pcarlini@suse.de>
// Copyright (C) 2007 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without Pred the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING. If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.
// 25.2.5 [lib.alg.fill] Fill_n.
#include <algorithm>
#include <vector>
#include <testsuite_hooks.h>
void
test01()
{
using namespace std;
bool test __attribute__((unused)) = true;
const int A1[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
const int N1 = sizeof(A1) / sizeof(int);
int i1[N1];
fill_n(i1, N1, 3);
VERIFY( equal(i1, i1 + N1, A1) );
vector<int> v1(N1);
fill_n(v1.begin(), N1, 3);
VERIFY( equal(v1.begin(), v1.end(), A1) );
const char A2[] = {'\3', '\3', '\3', '\3', '\3',
'\3', '\3', '\3', '\3', '\3'};
const int N2 = sizeof(A2) / sizeof(char);
char i2[N2];
fill_n(i2, N2, '\3');
VERIFY( equal(i2, i2 + N2, A2) );
vector<char> v2(N2);
fill_n(v2.begin(), N2, '\3');
VERIFY( equal(v2.begin(), v2.end(), A2) );
#ifdef _GLIBCXX_USE_WCHAR_T
const wchar_t A3[] = {L'\3', L'\3', L'\3', L'\3', L'\3',
L'\3', L'\3', L'\3', L'\3', L'\3'};
const int N3 = sizeof(A3) / sizeof(wchar_t);
wchar_t i3[N3];
fill_n(i3, N3, L'\3');
VERIFY( equal(i3, i3 + N3, A3) );
vector<wchar_t> v3(N3);
fill_n(v3.begin(), N3, L'\3');
VERIFY( equal(v3.begin(), v3.end(), A3) );
#endif
}
int
main()
{
test01();
return 0;
}