This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Attachment:
ChangeLog-sort
Description: application/text
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/include/bits/stl_algo.h libstdc++-v3/include/bits/stl_algo.h
--- libstdc++-v3.so_7.clean/include/bits/stl_algo.h 2005-05-25 13:38:47.000000000 +0100
+++ libstdc++-v3/include/bits/stl_algo.h 2005-06-03 21:59:13.000000000 +0100
@@ -1929,20 +1929,109 @@
* This is a helper function for the sort routine.
* @endif
*/
- template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
- void
- __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val,
- _Compare __comp)
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline void
+ __unguarded_linear_insert(_RandomAccessIterator __last, _Compare __comp)
{
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val(__gnu_cxx::__move(*__last));
_RandomAccessIterator __next = __last;
--__next;
while (__comp(__val, *__next))
{
- *__last = *__next;
+ *__last = __gnu_cxx::__move(*__next);
__last = __next;
--__next;
}
- *__last = __val;
+ *__last = __gnu_cxx::__move(__val);
+ }
+
+ /**
+ * @if maint
+ * This is a helper function. It assumes __pivot is not in the range
+ * [__first, __last).
+ * @endif
+ */
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline _RandomAccessIterator
+ __unguarded_nocopy_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _RandomAccessIterator __pivot, _Compare __comp)
+ {
+ while (true)
+ {
+ while (__comp(*__first, *__pivot))
+ ++__first;
+ --__last;
+ while (__comp(*__pivot, *__last))
+ --__last;
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+ }
+
+ /**
+ * @if maint
+ * This is a helper function for the sort routine
+ * @endif
+ */
+ template<typename _RandomAccessIterator, typename _Compare>
+ _RandomAccessIterator
+ __unguarded_mid_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last,
+ _RandomAccessIterator __pivot, _Compare __comp)
+ {
+ while (true)
+ {
+ while (__comp(*__first, *__pivot))
+ ++__first;
+ --__last;
+ while (__comp(*__pivot, *__last))
+ --__last;
+ if (__first == __pivot)
+ {
+ if(__last == __pivot)
+ return __first;
+ ++__first;
+ while(__comp(*__first, *__pivot))
+ ++__first;
+ if(!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ break;
+ }
+
+ if (__last == __pivot)
+ {
+ --__last;
+ while(__comp(*__pivot, *__last))
+ --__last;
+ if(!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ break;
+ }
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
+
+ while (true)
+ {
+ while (__comp(*__first, *__pivot))
+ ++__first;
+ --__last;
+ while (__comp(*__pivot, *__last))
+ --__last;
+
+ if (!(__first < __last))
+ return __first;
+ std::iter_swap(__first, __last);
+ ++__first;
+ }
}
/**
@@ -1959,15 +2048,15 @@
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
- typename iterator_traits<_RandomAccessIterator>::value_type
- __val = *__i;
- if (__comp(__val, *__first))
+ if (__comp(*__i, *__first))
{
- std::copy_backward(__first, __i, __i + 1);
- *__first = __val;
+ typename iterator_traits<_RandomAccessIterator>::value_type
+ __val(__gnu_cxx::__move(*__i));
+ std::__move_backward(__first, __i, __i + 1);
+ *__first = __gnu_cxx::__move(__val);
}
else
- std::__unguarded_linear_insert(__i, __val, __comp);
+ std::__unguarded_linear_insert(__i, __comp);
}
}
@@ -1985,7 +2074,7 @@
_ValueType;
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
- std::__unguarded_linear_insert(__i, _ValueType(*__i), __comp);
+ std::__unguarded_linear_insert(__i, __comp);
}
/**
@@ -2200,6 +2289,65 @@
__gnu_cxx::__ops::less());
}
+
+
+ template<typename _RandomAccessIterator, typename _Compare>
+ inline typename __enable_if<_RandomAccessIterator,
+ !(__gnu_cxx::__is_moveable<typename iterator_traits<_RandomAccessIterator>
+ ::value_type>::value)>::__type
+ __introsort_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+
+ return
+ std::__unguarded_partition(__first, __last,
+ _ValueType(std::__median(*__first,
+ *(__first
+ + (__last
+ - __first)
+ / 2),
+ *(__last - 1),
+ __comp)),
+ __comp);
+ }
+
+template<typename _RandomAccessIterator, typename _Compare>
+ inline typename __enable_if<_RandomAccessIterator,
+ __gnu_cxx::__is_moveable<typename iterator_traits<_RandomAccessIterator>
+ ::value_type>::value>::__type
+ __introsort_partition(_RandomAccessIterator __first,
+ _RandomAccessIterator __last, _Compare __comp)
+ {
+ typedef typename iterator_traits<_RandomAccessIterator>::value_type
+ _ValueType;
+ _RandomAccessIterator __cut, __pivot(__first + (__last - __first)/2);
+ const _ValueType &__a = *__first;
+ const _ValueType &__b = *__pivot;
+ const _ValueType &__c = *(__last - 1);
+
+ if (__comp(__a, __b))
+ if (__comp(__b, __c))
+ __cut = __unguarded_mid_partition(__first, __last, __pivot,
+ __comp);
+ else if (__comp(__a, __c))
+ __cut = __unguarded_nocopy_partition(__first, __last - 1,
+ __last - 1, __comp);
+ else
+ __cut = __unguarded_nocopy_partition(__first + 1, __last,
+ __first, __comp);
+ else if (__comp(__a, __c))
+ __cut = __unguarded_nocopy_partition(__first + 1, __last, __first,
+ __comp);
+ else if (__comp(__b, __c))
+ __cut = __unguarded_nocopy_partition(__first, __last - 1,
+ __last - 1, __comp);
+ else
+ __cut = __unguarded_mid_partition(__first, __last, __pivot, __comp);
+ return __cut;
+ }
+
/**
* @if maint
* This is a helper function for the sort routine.
@@ -2223,15 +2371,7 @@
}
--__depth_limit;
_RandomAccessIterator __cut =
- std::__unguarded_partition(__first, __last,
- _ValueType(std::__median(*__first,
- *(__first
- + (__last
- - __first)
- / 2),
- *(__last - 1),
- __comp)),
- __comp);
+ std::__introsort_partition(__first, __last, __comp);
std::__introsort_loop(__cut, __last, __depth_limit, __comp);
__last = __cut;
}
@@ -3051,14 +3191,7 @@
while (__last - __first > 3)
{
_RandomAccessIterator __cut =
- std::__unguarded_partition(__first, __last,
- _ValueType(std::__median(*__first,
- *(__first
- + (__last
- - __first)
- / 2),
- *(__last - 1),
- __comp)), __comp);
+ __introsort_partition(__first, __last, __comp);
if (__cut <= __nth)
__first = __cut;
else
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/include/bits/stl_algobase.h libstdc++-v3/include/bits/stl_algobase.h
--- libstdc++-v3.so_7.clean/include/bits/stl_algobase.h 2005-05-25 13:38:47.000000000 +0100
+++ libstdc++-v3/include/bits/stl_algobase.h 2005-05-31 21:42:21.000000000 +0100
@@ -381,6 +381,33 @@
return std::__copy_normal<__in, __out>::copy_n(__first, __last,
__result);
}
+
+ template<typename _InputIterator, typename _OutputIterator>
+ inline typename __enable_if<_OutputIterator,
+ __gnu_cxx::__is_moveable<
+ typename std::iterator_traits<_OutputIterator>::value_type>::value &&
+ __are_same<typename std::iterator_traits<_InputIterator>::value_type,
+ typename std::iterator_traits<_OutputIterator>::value_type>
+ ::__value>::__type
+ __move(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ {
+ for(; __first != __last; ++__result, ++__first)
+ *__result = __gnu_cxx::__move(*__first);
+ return __result;
+ }
+
+ template<typename _InputIterator, typename _OutputIterator>
+ inline typename __enable_if<_OutputIterator,
+ !(__gnu_cxx::__is_moveable<
+ typename std::iterator_traits<_OutputIterator>::value_type>::value &&
+ __are_same<typename std::iterator_traits<_InputIterator>::value_type,
+ typename std::iterator_traits<_OutputIterator>::value_type>
+ ::__value)>::__type
+ __move(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ { return std::copy(__first, __last, __result); }
+
template<bool, typename>
struct __copy_backward
@@ -512,6 +539,34 @@
__result);
}
+ template<typename _InputIterator, typename _OutputIterator>
+ inline
+ typename __enable_if<_OutputIterator,
+ __gnu_cxx::__is_moveable<
+ typename iterator_traits<_OutputIterator>::value_type>::value &&
+ __are_same<typename iterator_traits<_InputIterator>::value_type,
+ typename iterator_traits<_OutputIterator>::value_type>
+ ::__value>::__type
+ __move_backward(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ {
+ while (__first != __last)
+ *--__result = __gnu_cxx::__move(*--__last);
+ return __result;
+ }
+
+ template<typename _InputIterator, typename _OutputIterator>
+ inline
+ typename __enable_if<_OutputIterator,
+ !(__gnu_cxx::__is_moveable<
+ typename iterator_traits<_OutputIterator>::value_type>::value &&
+ __are_same<typename iterator_traits<_InputIterator>::value_type,
+ typename iterator_traits<_OutputIterator>::value_type>
+ ::__value)>::__type
+ __move_backward(_InputIterator __first, _InputIterator __last,
+ _OutputIterator __result)
+ { return std::copy_backward(__first, __last, __result); }
+
template<bool>
struct __fill
{
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/25_algorithms/nth_element/moveable.cc libstdc++-v3/testsuite/25_algorithms/nth_element/moveable.cc
--- libstdc++-v3.so_7.clean/testsuite/25_algorithms/nth_element/moveable.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/25_algorithms/nth_element/moveable.cc 2005-05-24 22:51:23.000000000 +0100
@@ -0,0 +1,73 @@
+// Copyright (C) 2005 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 25.3.2 [lib.alg.nth.element]
+
+#undef _GLIBCXX_CONCEPT_CHECKS
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+#include <testsuite_rvalref.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using std::nth_element;
+using __gnu_test::rvalstruct;
+
+typedef test_container<rvalstruct, random_access_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int intarray[] = {6, 5, 4, 3, 2, 1, 0};
+ rvalstruct array[7];
+ std::copy(intarray, intarray + 7, array);
+ Container con(array, array + 7);
+ nth_element(con.begin(), con.it(3), con.end());
+ for(int i = 0; i < 3; ++i)
+ VERIFY(array[i].val < 3);
+ for(int i = 4; i < 7; ++i)
+ VERIFY(array[i].val > 3);
+ for(int i = 0; i < 7; ++i)
+ VERIFY(array[i].valid);
+}
+
+void
+test2()
+{
+ int intarray[] = {0, 6, 1, 5, 2, 4, 3};
+ rvalstruct array[7];
+ std::copy(intarray, intarray + 7, array);
+ Container con(array,array + 7);
+ nth_element(con.begin(), con.it(3), con.end());
+ for(int i = 0; i < 3; ++i)
+ VERIFY(array[i].val < 3);
+ for(int i = 4; i < 7; ++i)
+ VERIFY(array[i].val > 3);
+ for(int i = 0; i < 7; ++i)
+ VERIFY(array[i].valid);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ return 0;
+}
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/25_algorithms/partial_sort/moveable.cc libstdc++-v3/testsuite/25_algorithms/partial_sort/moveable.cc
--- libstdc++-v3.so_7.clean/testsuite/25_algorithms/partial_sort/moveable.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/25_algorithms/partial_sort/moveable.cc 2005-05-22 12:00:46.000000000 +0100
@@ -0,0 +1,67 @@
+// Copyright (C) 2005 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 25.3.1.3 [lib.partial.sort]
+
+#undef _GLIBCXX_CONCEPT_CHECKS
+#define _GLIBCXX_TESTSUITE_ALLOW_RVALREF_ALIASING
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+#include <testsuite_rvalref.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using __gnu_test::rvalstruct;
+using std::partial_sort;
+
+typedef test_container<rvalstruct, random_access_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int intarray[] = {6, 5, 4, 3, 2, 1, 0};
+ rvalstruct array[7];
+ std::copy(intarray, intarray + 7, array);
+ Container con(array, array + 7);
+ partial_sort(con.begin(), con.it(3), con.end());
+ VERIFY(array[0].val == 0 && array[1].val == 1 && array[2].val == 2);
+ for(int i = 0; i < 7; ++i)
+ VERIFY(array[i].valid);
+}
+
+void
+test2()
+{
+ int intarray[] = {0, 6, 1, 5, 2, 4, 3};
+ rvalstruct array[7];
+ std::copy(intarray, intarray + 7, array);
+ Container con(array,array + 7);
+ partial_sort(con.begin(), con.it(3), con.end());
+ VERIFY(array[0].val == 0 && array[1].val == 1 && array[2].val == 2);
+ for(int i = 0; i < 7; ++i)
+ VERIFY(array[i].valid);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+}
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort/moveable.cc libstdc++-v3/testsuite/25_algorithms/sort/moveable.cc
--- libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort/moveable.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/25_algorithms/sort/moveable.cc 2005-05-22 12:41:24.000000000 +0100
@@ -0,0 +1,61 @@
+// Copyright (C) 2001 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 25.3.1 algorithms, sort()
+
+#undef _GLIBCXX_CONCEPT_CHECKS
+#define _GLIBCXX_TESTSUITE_ALLOW_RVALREF_ALIASING
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+#include <testsuite_rvalref.h>
+
+bool test __attribute__((unused)) = true;
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using __gnu_test::rvalstruct;
+using std::partial_sort;
+
+typedef test_container<rvalstruct, random_access_iterator_wrapper> Container;
+
+
+const int A[] = {10, 20, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7,
+ 17, 8, 18, 9, 19};
+const int N = sizeof(A) / sizeof(int);
+
+// 25.3.1.1 sort()
+void
+test01()
+{
+ rvalstruct s1[N];
+ std::copy(A, A + N, s1);
+ Container con(s1, s1 + N);
+ std::sort(con.begin(), con.end());
+ VERIFY(s1[0].valid);
+ for(int i = 1; i < N; ++i)
+ VERIFY(s1[i].val>s1[i-1].val && s1[i].valid);
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort/sort.cc libstdc++-v3/testsuite/25_algorithms/sort/sort.cc
--- libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort/sort.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/25_algorithms/sort/sort.cc 2005-06-04 19:49:08.000000000 +0100
@@ -0,0 +1,171 @@
+// Copyright (C) 2001 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 25.3.1 algorithms, sort()
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+
+bool test __attribute__((unused)) = true;
+
+const int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
+const int B[] = {10, 20, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19};
+const int C[] = {20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
+const int N = sizeof(A) / sizeof(int);
+const int logN = 3; // ln(N) rounded up
+const int P = 7;
+
+// comparison predicate for stable_sort: order by rightmost digit
+struct CompLast
+{
+ bool
+ operator()(const int x, const int y)
+ { return x % 10 < y % 10; }
+};
+
+// This functor has the equivalent functionality of std::geater<>,
+// but there is no dependency on <functional> and it also tracks the
+// number of invocations since creation.
+class Gt
+{
+public:
+ static int count() { return itsCount; }
+ static void reset() { itsCount = 0; }
+
+ bool
+ operator()(const int& x, const int& y)
+ {
+ ++itsCount;
+ return x > y;
+ }
+
+private:
+ static int itsCount;
+};
+
+int Gt::itsCount = 0;
+
+
+// 25.3.1.1 sort()
+void
+test01()
+{
+ int s1[N];
+ std::copy(B, B + N, s1);
+ VERIFY(std::equal(s1, s1 + N, B));
+
+ std::sort(s1, s1 + N);
+ VERIFY(std::equal(s1, s1 + N, A));
+
+ Gt gt;
+ gt.reset();
+ std::sort(s1, s1 + N, gt);
+ VERIFY(std::equal(s1, s1 + N, C));
+}
+
+// 25.3.1.2 stable_sort()
+void
+test02()
+{
+ int s1[N];
+ std::copy(A, A + N, s1);
+ VERIFY(std::equal(s1, s1 + N, A));
+
+ std::stable_sort(s1, s1 + N, CompLast());
+ VERIFY(std::equal(s1, s1 + N, B));
+
+ std::stable_sort(s1, s1 + N);
+ VERIFY(std::equal(s1, s1 + N, A));
+
+ Gt gt;
+ gt.reset();
+ std::stable_sort(s1, s1 + N, gt);
+ VERIFY(std::equal(s1, s1 + N, C));
+ VERIFY(gt.count() <= N * logN * logN);
+}
+
+// 25.3.1.3 partial_sort()
+void
+test03()
+{
+ int s1[N];
+ std::copy(B, B + N, s1);
+ VERIFY(std::equal(s1, s1 + N, B));
+
+ std::partial_sort(s1, s1 + P, s1 + N);
+ VERIFY(std::equal(s1, s1 + P, A));
+
+ Gt gt;
+ gt.reset();
+ std::partial_sort(s1, s1 + P, s1 + N, gt);
+ VERIFY(std::equal(s1, s1 + P, C));
+}
+
+// 25.3.1.4 partial_sort_copy()
+void
+test04()
+{
+ using std::partial_sort_copy;
+
+ int s1[N];
+ std::copy(B, B + N, s1);
+ VERIFY(std::equal(s1, s1 + N, B));
+
+ int s2[2*N];
+
+ partial_sort_copy(s1, s1 + N, s2, s2 + P);
+ VERIFY(std::equal(s2, s2 + P, A));
+
+ Gt gt;
+ gt.reset();
+ partial_sort_copy(s1, s1 + N, s2, s2 + P, gt);
+ VERIFY(std::equal(s2, s2 + P, C));
+
+ VERIFY(std::equal(s2, partial_sort_copy(s1, s1 + N, s2, s2 + 2*N), A));
+}
+
+// 25.3.2 nth_element()
+void
+test05()
+{
+ using std::nth_element;
+
+ int s1[N];
+ std::copy(B, B + N, s1);
+ VERIFY(std::equal(s1, s1 + N, B));
+
+ int* pn = s1 + (N / 2) - 1;
+ nth_element(s1, pn, s1 + N);
+ for (const int* i = pn; i < s1 + N; ++i) VERIFY(!(*i < *pn));
+
+ CompLast pred;
+ nth_element(s1, pn, s1 + N, pred);
+ for (const int* i = pn; i < s1 + N; ++i) VERIFY(!pred(*i, *pn));
+}
+
+int
+main()
+{
+ test01();
+ test02();
+ test03();
+ test04();
+ test05();
+
+ return 0;
+}
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort.cc libstdc++-v3/testsuite/25_algorithms/sort.cc
--- libstdc++-v3.so_7.clean/testsuite/25_algorithms/sort.cc 2003-09-23 21:02:52.000000000 +0100
+++ libstdc++-v3/testsuite/25_algorithms/sort.cc 1970-01-01 01:00:00.000000000 +0100
@@ -1,171 +0,0 @@
-// Copyright (C) 2001 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// 25.3.1 algorithms, sort()
-
-#include <algorithm>
-#include <testsuite_hooks.h>
-
-bool test __attribute__((unused)) = true;
-
-const int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
-const int B[] = {10, 20, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19};
-const int C[] = {20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
-const int N = sizeof(A) / sizeof(int);
-const int logN = 3; // ln(N) rounded up
-const int P = 7;
-
-// comparison predicate for stable_sort: order by rightmost digit
-struct CompLast
-{
- bool
- operator()(const int x, const int y)
- { return x % 10 < y % 10; }
-};
-
-// This functor has the equivalent functionality of std::geater<>,
-// but there is no dependency on <functional> and it also tracks the
-// number of invocations since creation.
-class Gt
-{
-public:
- static int count() { return itsCount; }
- static void reset() { itsCount = 0; }
-
- bool
- operator()(const int& x, const int& y)
- {
- ++itsCount;
- return x > y;
- }
-
-private:
- static int itsCount;
-};
-
-int Gt::itsCount = 0;
-
-
-// 25.3.1.1 sort()
-void
-test01()
-{
- int s1[N];
- std::copy(B, B + N, s1);
- VERIFY(std::equal(s1, s1 + N, B));
-
- std::sort(s1, s1 + N);
- VERIFY(std::equal(s1, s1 + N, A));
-
- Gt gt;
- gt.reset();
- std::sort(s1, s1 + N, gt);
- VERIFY(std::equal(s1, s1 + N, C));
-}
-
-// 25.3.1.2 stable_sort()
-void
-test02()
-{
- int s1[N];
- std::copy(A, A + N, s1);
- VERIFY(std::equal(s1, s1 + N, A));
-
- std::stable_sort(s1, s1 + N, CompLast());
- VERIFY(std::equal(s1, s1 + N, B));
-
- std::stable_sort(s1, s1 + N);
- VERIFY(std::equal(s1, s1 + N, A));
-
- Gt gt;
- gt.reset();
- std::stable_sort(s1, s1 + N, gt);
- VERIFY(std::equal(s1, s1 + N, C));
- VERIFY(gt.count() <= N * logN * logN);
-}
-
-// 25.3.1.3 partial_sort()
-void
-test03()
-{
- int s1[N];
- std::copy(B, B + N, s1);
- VERIFY(std::equal(s1, s1 + N, B));
-
- std::partial_sort(s1, s1 + P, s1 + N);
- VERIFY(std::equal(s1, s1 + P, A));
-
- Gt gt;
- gt.reset();
- std::partial_sort(s1, s1 + P, s1 + N, gt);
- VERIFY(std::equal(s1, s1 + P, C));
-}
-
-// 25.3.1.4 partial_sort_copy()
-void
-test04()
-{
- using std::partial_sort_copy;
-
- int s1[N];
- std::copy(B, B + N, s1);
- VERIFY(std::equal(s1, s1 + N, B));
-
- int s2[2*N];
-
- partial_sort_copy(s1, s1 + N, s2, s2 + P);
- VERIFY(std::equal(s2, s2 + P, A));
-
- Gt gt;
- gt.reset();
- partial_sort_copy(s1, s1 + N, s2, s2 + P, gt);
- VERIFY(std::equal(s2, s2 + P, C));
-
- VERIFY(std::equal(s2, partial_sort_copy(s1, s1 + N, s2, s2 + 2*N), A));
-}
-
-// 25.3.2 nth_element()
-void
-test05()
-{
- using std::nth_element;
-
- int s1[N];
- std::copy(B, B + N, s1);
- VERIFY(std::equal(s1, s1 + N, B));
-
- int* pn = s1 + (N / 2) - 1;
- nth_element(s1, pn, s1 + N);
- for (const int* i = pn; i < s1 + N; ++i) VERIFY(!(*i < *pn));
-
- CompLast pred;
- nth_element(s1, pn, s1 + N, pred);
- for (const int* i = pn; i < s1 + N; ++i) VERIFY(!pred(*i, *pn));
-}
-
-int
-main()
-{
- test01();
- test02();
- test03();
- test04();
- test05();
-
- return 0;
-}
diff -urN -x'*CVS*' libstdc++-v3.so_7.clean/testsuite/performance/25_algorithms/sort.cc libstdc++-v3/testsuite/performance/25_algorithms/sort.cc
--- libstdc++-v3.so_7.clean/testsuite/performance/25_algorithms/sort.cc 1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/performance/25_algorithms/sort.cc 2005-05-28 11:28:50.000000000 +0100
@@ -0,0 +1,227 @@
+// Copyright (C) 2005 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 even 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction. Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License. This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+
+#define DISABLE_ITERATOR_DEBUG
+
+#include<vector>
+#include<algorithm>
+#include<stdio.h>
+#include<string>
+#include<sstream>
+
+#include<testsuite_performance.h>
+#include<testsuite_iterators.h>
+
+using namespace std;
+using namespace __gnu_test;
+
+// Used to stop move symantics
+struct vec_wrap
+{
+ vector<int> v;
+
+ explicit vec_wrap(vector<int> in_vec) : v(in_vec)
+ { }
+
+ vec_wrap()
+ { }
+};
+
+bool inline
+operator<(const vec_wrap& lhs, const vec_wrap& rhs)
+{ return lhs.v == rhs.v; }
+
+
+// Used to perform the move symantics algorithm on an int
+struct int_wrap
+{
+ int i;
+
+ explicit int_wrap(int in_val) : i(in_val)
+ { }
+
+ int_wrap(__gnu_cxx::__rvalref<int_wrap> in) : i(in.__ref.i)
+ { }
+
+ void
+ operator=(int in)
+ { i = in; }
+
+ void
+ operator=(__gnu_cxx::__rvalref<int_wrap> in)
+ { i = in.__ref.i; }
+
+ int_wrap()
+ { }
+};
+
+struct ptr_wrap
+{
+ vector<int>* ptr;
+ ptr_wrap(vector<int>* in_ptr) : ptr(in_ptr)
+ { }
+};
+
+bool inline
+operator<(ptr_wrap lhs, ptr_wrap rhs)
+{ return *(lhs.ptr) < *(rhs.ptr); }
+
+bool inline
+operator<(const int_wrap& lhs, const int_wrap& rhs)
+{ return lhs.i < rhs.i; }
+
+namespace __gnu_cxx
+{
+ template<>
+ struct __is_moveable<int_wrap>
+ { static const bool value = true; };
+}
+
+struct
+dereference_compare
+{
+ template<typename T>
+ bool operator()(T lhs, T rhs)
+ { return *lhs < *rhs; }
+};
+
+template<typename T>
+void sort_and_output(T& vec, std::string description)
+{
+ time_counter time;
+ resource_counter resource;
+ start_counters(time, resource);
+ std::sort(vec.begin(), vec.end());
+ stop_counters(time, resource);
+ report_performance(__FILE__, description.c_str(), time, resource);
+ clear_counters(time, resource);
+
+}
+
+void
+test1(int vec_length, vector<int> sort_vec, string vec_description)
+{
+ vector<vector<int> > moveable_vecs;
+ for(int i = 0; i < sort_vec.size(); i++)
+ {
+ vector<int> vec(vec_length, sort_vec[i]);
+ moveable_vecs.push_back(vec);
+ }
+ ostringstream outputline;
+ outputline << "moveable vector - length " << sort_vec.size() << ":" <<
+ vec_description;
+ sort_and_output(moveable_vecs, outputline.str());
+}
+
+
+void
+test2(int vec_length, vector<int> sort_vec, string vec_description )
+{
+ vector<vec_wrap> unmoveable_vecs;
+ for(int i = 0; i < sort_vec.size(); i++)
+ {
+ vector<int> vec(vec_length, sort_vec[i]);
+ vec_wrap wrap(vec);
+ unmoveable_vecs.push_back(wrap);
+ }
+ ostringstream outputline;
+ outputline << "unmoveable vector - length " << sort_vec.size() << ":" <<
+ vec_description;
+ sort_and_output(unmoveable_vecs, outputline.str());
+}
+
+
+void
+test3(int vec_length, vector<int> sort_vec, string vec_description)
+{
+ vector<vector<int> > primary_vec;
+ vector<ptr_wrap> ptr_vec;
+ for(int i = 0; i < sort_vec.size(); i++)
+ {
+ vector<int> vec(vec_length, sort_vec[i]);
+ primary_vec.push_back(vec);
+ }
+ for(int i = 0; i < sort_vec.size(); i++)
+ ptr_vec.push_back(&primary_vec[i]);
+ ostringstream outputline;
+ outputline << "pointers to vector - length " << sort_vec.size() << ":" <<
+ vec_description;
+ sort_and_output(ptr_vec, outputline.str());
+}
+
+
+void
+test4(vector<int> sort_vec, string vec_description)
+{
+ ostringstream outputline;
+ outputline << "ints - length " << sort_vec.size() << ":" << vec_description;
+ sort_and_output(sort_vec, outputline.str());
+}
+
+void
+test5(vector<int> sort_vec, string vec_description)
+{
+ vector<int_wrap> moveable_int_vec(sort_vec.size());
+ copy(sort_vec.begin(), sort_vec.end(), moveable_int_vec.begin());
+ ostringstream outputline;
+ outputline << "moveable ints - length " << sort_vec.size() << ":" <<
+ vec_description;
+ sort_and_output(moveable_int_vec, outputline.str());
+}
+
+int
+main(void)
+{
+ for(int length = 100000; length < 1000001; length*=10)
+ {
+ vector<int> sort_vec;
+ int val = 1000;
+ for(int i = 0; i < length; ++i)
+ {
+ val = (val * 88888) % 1000003;
+ sort_vec.push_back(val);
+ }
+ test1(1000000/length, sort_vec, "random vector");
+ test2(1000000/length, sort_vec, "random vector");
+ test3(1000000/length, sort_vec, "random vector");
+
+ }
+
+ for(int length = 1000000; length < 10000001; length*=10)
+ {
+ vector<int> sort_vec;
+ int val = 1000;
+ for(int i = 0; i < length; ++i)
+ {
+ val = (val * 88888) % 1000003;
+ sort_vec.push_back(val);
+ }
+ test4(sort_vec, "random vector");
+ test5(sort_vec, "random vector");
+ }
+}
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |