blob: 010e69f5e7120f3de1882e72ff5d03e6a6ec3b74 [file] [log] [blame]
caryclark@google.com9e49fb62012-08-27 14:11:33 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
caryclark@google.comd88e0892012-03-27 13:23:51 +00007#ifndef TSearch_DEFINED
8#define TSearch_DEFINED
9
caryclark@google.comc6825902012-02-03 22:07:47 +000010#include "SkTypes.h"
11
12// FIXME: Move this templated version into SKTSearch.h
13
14template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +000015static T** QSort_Partition(T** left, T** right, T** pivot)
caryclark@google.comc6825902012-02-03 22:07:47 +000016{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000017 T* pivotValue = *pivot;
18 SkTSwap(*pivot, *right);
19 T** newPivot = left;
20 while (left < right) {
21 if (**left < *pivotValue) {
22 SkTSwap(*left, *newPivot);
23 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000024 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000025 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000026 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000027 SkTSwap(*newPivot, *right);
28 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000029}
30
31template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +000032void QSort(T** left, T** right)
caryclark@google.comc6825902012-02-03 22:07:47 +000033{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000034 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000035 return;
36 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000037 T** pivot = left + (right - left >> 1);
38 pivot = QSort_Partition(left, right, pivot);
39 QSort(left, pivot - 1);
40 QSort(pivot + 1, right);
caryclark@google.comc6825902012-02-03 22:07:47 +000041}
42
caryclark@google.comf8b000d2012-02-09 22:04:27 +000043template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000044static T* QSort_Partition(S& context, T* left, T* right, T* pivot,
45 bool (*lessThan)(S&, const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000046{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000047 T pivotValue = *pivot;
48 SkTSwap(*pivot, *right);
49 T* newPivot = left;
50 while (left < right) {
51 if (lessThan(context, *left, pivotValue)) {
52 SkTSwap(*left, *newPivot);
53 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000054 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000055 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000056 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000057 SkTSwap(*newPivot, *right);
58 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000059}
60
caryclark@google.comf8b000d2012-02-09 22:04:27 +000061template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000062void QSort(S& context, T* left, T* right,
63 bool (*lessThan)(S& , const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000064{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000065 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000066 return;
67 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000068 T* pivot = left + (right - left >> 1);
69 pivot = QSort_Partition(context, left, right, pivot, lessThan);
70 QSort(context, left, pivot - 1, lessThan);
71 QSort(context, pivot + 1, right, lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +000072}
caryclark@google.comd88e0892012-03-27 13:23:51 +000073
74#endif