summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-21 09:57:42 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-21 09:57:42 +0000
commite836bf5a6e73e844eda95280f470528aee7961b0 (patch)
tree4b0eb4567c4e5d30813186d23802313935982f90 /libstdc++-v3
parente51f51369523d5faab32134f260cca822e323ba2 (diff)
downloadgcc-e836bf5a6e73e844eda95280f470528aee7961b0.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121027 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog16
-rw-r--r--libstdc++-v3/include/bits/stl_algobase.h172
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/fill/4.cc76
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/fill/5.cc76
4 files changed, 292 insertions, 48 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 53fc417c2bc..80b49e1c209 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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.
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index b5a0039f393..c0107fc3d9f 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -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,55 +569,93 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
};
- /**
- * @brief Fills the range [first,last) with copies of value.
- * @param first A forward iterator.
- * @param last A forward iterator.
- * @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.
- */
template<typename _ForwardIterator, typename _Tp>
- void
- fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ inline void
+ __fill_aux(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
{
- // concept requirements
- __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
- _ForwardIterator>)
- __glibcxx_requires_valid_range(__first, __last);
-
const bool __scalar = __is_scalar<_Tp>::__value;
std::__fill<__scalar>::fill(__first, __last, __value);
}
- // Specialization: for one-byte types we can use memset.
+ // Specialization: for char types we can use memset (wmemset).
inline void
- fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)
+ __fill_aux(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)
+ __fill_aux(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)
+ __fill_aux(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);
}
+#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.
+ * @param last A forward iterator.
+ * @param value A reference-to-const of arbitrary type.
+ * @return Nothing.
+ *
+ * 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>
+ inline void
+ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
+ {
+ // concept requirements
+ __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
+ _ForwardIterator>)
+ __glibcxx_requires_valid_range(__first, __last);
+
+ const bool __fi = __is_normal_iterator<_ForwardIterator>::__value;
+ std::__fill_normal<__fi>::__fill_n(__first, __last, __value);
+ }
+
+
template<bool>
struct __fill_n
{
@@ -643,51 +683,87 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
};
- /**
- * @brief Fills the range [first,first+n) with copies of value.
- * @param first An output iterator.
- * @param n The count of copies to perform.
- * @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.
- */
template<typename _OutputIterator, typename _Size, typename _Tp>
- _OutputIterator
- fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
+ inline _OutputIterator
+ __fill_n_aux(_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)
+ __fill_n_aux(unsigned char* __first, _Size __n, const unsigned char& __c)
{
- std::fill(__first, __first + __n, __c);
+ std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline signed char*
- fill_n(signed char* __first, _Size __n, const signed char& __c)
+ __fill_n_aux(signed char* __first, _Size __n, const signed char& __c)
{
- std::fill(__first, __first + __n, __c);
+ std::__fill_aux(__first, __first + __n, __c);
return __first + __n;
}
template<typename _Size>
inline char*
- fill_n(char* __first, _Size __n, const char& __c)
+ __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(__first, __first + __n, __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.
+ * @param n The count of copies to perform.
+ * @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 char
+ * types filling contiguous areas of memory, this becomes an inline call
+ * to @c memset or @ wmemset.
+ */
+ template<typename _OutputIterator, typename _Size, typename _Tp>
+ inline _OutputIterator
+ fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
+ {
+ // concept requirements
+ __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, _Tp>)
+
+ const bool __oi = __is_normal_iterator<_OutputIterator>::__value;
+ return std::__fill_n_normal<__oi>::__fill_n_n(__first, __n, __value);
+ }
/**
* @brief Finds the places in ranges which don't match.
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill/4.cc b/libstdc++-v3/testsuite/25_algorithms/fill/4.cc
new file mode 100644
index 00000000000..e8d52389cdc
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/fill/4.cc
@@ -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;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill/5.cc b/libstdc++-v3/testsuite/25_algorithms/fill/5.cc
new file mode 100644
index 00000000000..8fdb153b383
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/fill/5.cc
@@ -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;
+}