blob: 53242c3453511df7bd486b469828069389ca1d4f [file] [log] [blame]
caryclark@google.comc6825902012-02-03 22:07:47 +00001#include "SkTypes.h"
2
3// FIXME: Move this templated version into SKTSearch.h
4
5template <typename T>
6static void QSort_Partition(T** first, T** last)
7{
8 T** left = first;
9 T** rite = last;
10 T** pivot = left;
11
12 while (left <= rite) {
13 while (left < last && **left < **pivot)
14 left += 1;
15 while (first < rite && **pivot < **rite)
16 rite -= 1;
17 if (left <= rite) {
18 if (left < rite) {
19 SkTSwap(*left, *rite);
20 }
21 left += 1;
22 rite -= 1;
23 }
24 }
25 if (first < rite)
26 QSort_Partition(first, rite);
27 if (left < last)
28 QSort_Partition(left, last);
29}
30
31template <typename T>
32void QSort(T** base, size_t count)
33{
34 SkASSERT(base);
35
36 if (count <= 1) {
37 return;
38 }
39 QSort_Partition(base, base + (count - 1));
40}
41
42template <typename T>
43static void QSort_Partition(T* first, T* last, bool (*lessThan)(const T*, const T*))
44{
45 T* left = first;
46 T* rite = last;
47 T* pivot = left;
48
49 while (left <= rite) {
50 while (left < last && lessThan(left, pivot) < 0)
51 left += 1;
52 while (first < rite && lessThan(rite, pivot) > 0)
53 rite -= 1;
54 if (left <= rite) {
55 if (left < rite) {
56 SkTSwap(*left, *rite);
57 }
58 left += 1;
59 rite -= 1;
60 }
61 }
62 if (first < rite)
63 QSort_Partition(first, rite, lessThan);
64 if (left < last)
65 QSort_Partition(left, last, lessThan);
66}
67
68template <typename T>
69void QSort(T* base, size_t count, bool (*lessThan)(const T*, const T*))
70{
71 SkASSERT(base);
72 SkASSERT(lessThan);
73
74 if (count <= 1) {
75 return;
76 }
77 QSort_Partition(base, base + (count - 1), lessThan);
78}