blob: e963373d3ad7c05e39d4662efba17598e63ff34f [file] [log] [blame]
caryclark@google.comd88e0892012-03-27 13:23:51 +00001#ifndef TSearch_DEFINED
2#define TSearch_DEFINED
3
caryclark@google.comc6825902012-02-03 22:07:47 +00004#include "SkTypes.h"
5
6// FIXME: Move this templated version into SKTSearch.h
7
8template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +00009static T** QSort_Partition(T** left, T** right, T** pivot)
caryclark@google.comc6825902012-02-03 22:07:47 +000010{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000011 T* pivotValue = *pivot;
12 SkTSwap(*pivot, *right);
13 T** newPivot = left;
14 while (left < right) {
15 if (**left < *pivotValue) {
16 SkTSwap(*left, *newPivot);
17 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000018 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000019 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000020 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000021 SkTSwap(*newPivot, *right);
22 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000023}
24
25template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +000026void QSort(T** left, T** right)
caryclark@google.comc6825902012-02-03 22:07:47 +000027{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000028 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000029 return;
30 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000031 T** pivot = left + (right - left >> 1);
32 pivot = QSort_Partition(left, right, pivot);
33 QSort(left, pivot - 1);
34 QSort(pivot + 1, right);
caryclark@google.comc6825902012-02-03 22:07:47 +000035}
36
caryclark@google.comf8b000d2012-02-09 22:04:27 +000037template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000038static T* QSort_Partition(S& context, T* left, T* right, T* pivot,
39 bool (*lessThan)(S&, const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000040{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000041 T pivotValue = *pivot;
42 SkTSwap(*pivot, *right);
43 T* newPivot = left;
44 while (left < right) {
45 if (lessThan(context, *left, pivotValue)) {
46 SkTSwap(*left, *newPivot);
47 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000048 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000049 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000050 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000051 SkTSwap(*newPivot, *right);
52 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000053}
54
caryclark@google.comf8b000d2012-02-09 22:04:27 +000055template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000056void QSort(S& context, T* left, T* right,
57 bool (*lessThan)(S& , const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000058{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000059 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000060 return;
61 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000062 T* pivot = left + (right - left >> 1);
63 pivot = QSort_Partition(context, left, right, pivot, lessThan);
64 QSort(context, left, pivot - 1, lessThan);
65 QSort(context, pivot + 1, right, lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +000066}
caryclark@google.comd88e0892012-03-27 13:23:51 +000067
68#endif