blob: c1ba59c67f3658f43c5e41c969e94689f58b68de [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
caryclark@google.comf8b000d2012-02-09 22:04:27 +000042template <typename S, typename T>
43static void QSort_Partition(const S& context, T* first, T* last,
44 bool (*lessThan)(const S&, const T*, const T*))
caryclark@google.comc6825902012-02-03 22:07:47 +000045{
46 T* left = first;
47 T* rite = last;
48 T* pivot = left;
49
50 while (left <= rite) {
caryclark@google.comf8b000d2012-02-09 22:04:27 +000051 while (left < last && lessThan(context, left, pivot) < 0)
caryclark@google.comc6825902012-02-03 22:07:47 +000052 left += 1;
caryclark@google.comf8b000d2012-02-09 22:04:27 +000053 while (first < rite && lessThan(context, rite, pivot) > 0)
caryclark@google.comc6825902012-02-03 22:07:47 +000054 rite -= 1;
55 if (left <= rite) {
56 if (left < rite) {
57 SkTSwap(*left, *rite);
58 }
59 left += 1;
60 rite -= 1;
61 }
62 }
63 if (first < rite)
caryclark@google.comf8b000d2012-02-09 22:04:27 +000064 QSort_Partition(context, first, rite, lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +000065 if (left < last)
caryclark@google.comf8b000d2012-02-09 22:04:27 +000066 QSort_Partition(context, left, last, lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +000067}
68
caryclark@google.comf8b000d2012-02-09 22:04:27 +000069template <typename S, typename T>
70void QSort(const S& context, T* base, size_t count,
71 bool (*lessThan)(const S& , const T*, const T*))
caryclark@google.comc6825902012-02-03 22:07:47 +000072{
73 SkASSERT(base);
74 SkASSERT(lessThan);
75
76 if (count <= 1) {
77 return;
78 }
caryclark@google.comf8b000d2012-02-09 22:04:27 +000079 QSort_Partition(context, base, base + (count - 1), lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +000080}