blob: 6952425585397f6ddb7234eb0348e086d4d02930 [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.com73ca6242013-01-17 21:02:47 +000015static T* QSort_Partition(T* left, T* right, T* pivot)
16{
17 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;
24 }
25 left += 1;
26 }
27 SkTSwap(*newPivot, *right);
28 return newPivot;
29}
30
31template <typename T>
32void QSort(T* left, T* right)
33{
34 if (left >= right) {
35 return;
36 }
37 T* pivot = left + (right - left >> 1);
38 pivot = QSort_Partition(left, right, pivot);
39 QSort(left, pivot - 1);
40 QSort(pivot + 1, right);
41}
42
43template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +000044static T** QSort_Partition(T** left, T** right, T** pivot)
caryclark@google.comc6825902012-02-03 22:07:47 +000045{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000046 T* pivotValue = *pivot;
47 SkTSwap(*pivot, *right);
48 T** newPivot = left;
49 while (left < right) {
50 if (**left < *pivotValue) {
51 SkTSwap(*left, *newPivot);
52 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000053 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000054 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000055 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000056 SkTSwap(*newPivot, *right);
57 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000058}
59
60template <typename T>
caryclark@google.comcd4421d2012-03-01 19:16:31 +000061void QSort(T** left, T** right)
caryclark@google.comc6825902012-02-03 22:07:47 +000062{
caryclark@google.comcd4421d2012-03-01 19:16:31 +000063 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000064 return;
65 }
caryclark@google.comcd4421d2012-03-01 19:16:31 +000066 T** pivot = left + (right - left >> 1);
67 pivot = QSort_Partition(left, right, pivot);
68 QSort(left, pivot - 1);
69 QSort(pivot + 1, right);
caryclark@google.comc6825902012-02-03 22:07:47 +000070}
71
caryclark@google.comf8b000d2012-02-09 22:04:27 +000072template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000073static T* QSort_Partition(S& context, T* left, T* right, T* pivot,
74 bool (*lessThan)(S&, const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000075{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000076 T pivotValue = *pivot;
77 SkTSwap(*pivot, *right);
78 T* newPivot = left;
79 while (left < right) {
80 if (lessThan(context, *left, pivotValue)) {
81 SkTSwap(*left, *newPivot);
82 newPivot += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000083 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000084 left += 1;
caryclark@google.comc6825902012-02-03 22:07:47 +000085 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000086 SkTSwap(*newPivot, *right);
87 return newPivot;
caryclark@google.comc6825902012-02-03 22:07:47 +000088}
89
caryclark@google.comf8b000d2012-02-09 22:04:27 +000090template <typename S, typename T>
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000091void QSort(S& context, T* left, T* right,
92 bool (*lessThan)(S& , const T, const T))
caryclark@google.comc6825902012-02-03 22:07:47 +000093{
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000094 if (left >= right) {
caryclark@google.comc6825902012-02-03 22:07:47 +000095 return;
96 }
caryclark@google.comcef7e3f2012-02-28 16:57:05 +000097 T* pivot = left + (right - left >> 1);
98 pivot = QSort_Partition(context, left, right, pivot, lessThan);
99 QSort(context, left, pivot - 1, lessThan);
100 QSort(context, pivot + 1, right, lessThan);
caryclark@google.comc6825902012-02-03 22:07:47 +0000101}
caryclark@google.comd88e0892012-03-27 13:23:51 +0000102
103#endif