Index: skia/sgl/SkTSearch.cpp |
=================================================================== |
--- skia/sgl/SkTSearch.cpp (revision 16859) |
+++ skia/sgl/SkTSearch.cpp (working copy) |
@@ -1,219 +0,0 @@ |
-/* libs/graphics/sgl/SkTSearch.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkTSearch.h" |
-#include <ctype.h> |
- |
-static inline const char* index_into_base(const char*const* base, int index, |
- size_t elemSize) |
-{ |
- return *(const char*const*)((const char*)base + index * elemSize); |
-} |
- |
-int SkStrSearch(const char*const* base, int count, const char target[], |
- size_t target_len, size_t elemSize) |
-{ |
- if (count <= 0) |
- return ~0; |
- |
- SkASSERT(base != NULL); |
- |
- int lo = 0; |
- int hi = count - 1; |
- |
- while (lo < hi) |
- { |
- int mid = (hi + lo) >> 1; |
- const char* elem = index_into_base(base, mid, elemSize); |
- |
- int cmp = strncmp(elem, target, target_len); |
- if (cmp < 0) |
- lo = mid + 1; |
- else if (cmp > 0 || strlen(elem) > target_len) |
- hi = mid; |
- else |
- return mid; |
- } |
- |
- const char* elem = index_into_base(base, hi, elemSize); |
- int cmp = strncmp(elem, target, target_len); |
- if (cmp || strlen(elem) > target_len) |
- { |
- if (cmp < 0) |
- hi += 1; |
- hi = ~hi; |
- } |
- return hi; |
-} |
- |
-int SkStrSearch(const char*const* base, int count, const char target[], |
- size_t elemSize) |
-{ |
- return SkStrSearch(base, count, target, strlen(target), elemSize); |
-} |
- |
-int SkStrLCSearch(const char*const* base, int count, const char target[], |
- size_t len, size_t elemSize) |
-{ |
- SkASSERT(target); |
- |
- SkAutoAsciiToLC tolc(target, len); |
- |
- return SkStrSearch(base, count, tolc.lc(), len, elemSize); |
-} |
- |
-int SkStrLCSearch(const char*const* base, int count, const char target[], |
- size_t elemSize) |
-{ |
- return SkStrLCSearch(base, count, target, strlen(target), elemSize); |
-} |
- |
-////////////////////////////////////////////////////////////////////////////// |
- |
-SkAutoAsciiToLC::SkAutoAsciiToLC(const char str[], size_t len) |
-{ |
- // see if we need to compute the length |
- if ((long)len < 0) { |
- len = strlen(str); |
- } |
- fLength = len; |
- |
- // assign lc to our preallocated storage if len is small enough, or allocate |
- // it on the heap |
- char* lc; |
- if (len <= STORAGE) { |
- lc = fStorage; |
- } else { |
- lc = (char*)sk_malloc_throw(len + 1); |
- } |
- fLC = lc; |
- |
- // convert any asii to lower-case. we let non-ascii (utf8) chars pass |
- // through unchanged |
- for (int i = (int)(len - 1); i >= 0; --i) { |
- int c = str[i]; |
- if ((c & 0x80) == 0) { // is just ascii |
- c = tolower(c); |
- } |
- lc[i] = c; |
- } |
- lc[len] = 0; |
-} |
- |
-SkAutoAsciiToLC::~SkAutoAsciiToLC() |
-{ |
- if (fLC != fStorage) { |
- sk_free(fLC); |
- } |
-} |
- |
-////////////////////////////////////////////////////////////////////////////// |
- |
-#define SK_QSortTempSize 16 |
- |
-static inline void sk_qsort_swap(char a[], char b[], size_t elemSize) |
-{ |
- char tmp[SK_QSortTempSize]; |
- |
- while (elemSize > 0) |
- { |
- size_t size = elemSize; |
- if (size > SK_QSortTempSize) |
- size = SK_QSortTempSize; |
- elemSize -= size; |
- |
- memcpy(tmp, a, size); |
- memcpy(a, b, size); |
- memcpy(b, tmp, size); |
- a += size; |
- b += size; |
- } |
-} |
- |
-static void SkQSort_Partition(char* first, char* last, size_t elemSize, SkQSortCompareProc compare) |
-{ |
- char* left = first; |
- char* rite = last; |
- char* pivot = left; |
- |
- while (left <= rite) |
- { |
- while (left < last && compare(left, pivot) < 0) |
- left += elemSize; |
- while (first < rite && compare(rite, pivot) > 0) |
- rite -= elemSize; |
- if (left <= rite) |
- { |
- if (left < rite) |
- { |
- SkASSERT(compare(left, rite) >= 0); |
- sk_qsort_swap(left, rite, elemSize); |
- } |
- left += elemSize; |
- rite -= elemSize; |
- } |
- } |
- if (first < rite) |
- SkQSort_Partition(first, rite, elemSize, compare); |
- if (left < last) |
- SkQSort_Partition(left, last, elemSize, compare); |
-} |
- |
-void SkQSort(void* base, size_t count, size_t elemSize, SkQSortCompareProc compare) |
-{ |
- SkASSERT(base); |
- SkASSERT(compare); |
- SkASSERT(elemSize > 0); |
- |
- if (count <= 1) |
- return; |
- |
- SkQSort_Partition((char*)base, (char*)base + (count - 1) * elemSize, elemSize, compare); |
-} |
- |
-#ifdef SK_DEBUG |
- |
-#include "SkRandom.h" |
- |
-#ifdef SK_SUPPORT_UNITTEST |
-extern "C" { |
- int compare_int(const void* a, const void* b) |
- { |
- return *(const int*)a - *(const int*)b; |
- } |
-} |
-#endif |
- |
-void SkQSort_UnitTest() |
-{ |
-#ifdef SK_SUPPORT_UNITTEST |
- int array[100]; |
- SkRandom rand; |
- |
- for (int i = 0; i < 1000; i++) |
- { |
- int j, count = rand.nextRangeU(1, SK_ARRAY_COUNT(array)); |
- for (j = 0; j < count; j++) |
- array[j] = rand.nextS() & 0xFF; |
- SkQSort(array, count, sizeof(int), compare_int); |
- for (j = 1; j < count; j++) |
- SkASSERT(array[j-1] <= array[j]); |
- } |
-#endif |
-} |
- |
-#endif |