SkTDArray.h revision b530ef5869c5c64af8f3b3c62ed7711fe4325c9c
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Copyright (C) 2006 The Android Open Source Project 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Licensed under the Apache License, Version 2.0 (the "License"); 58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * you may not use this file except in compliance with the License. 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * You may obtain a copy of the License at 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * http://www.apache.org/licenses/LICENSE-2.0 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Unless required by applicable law or agreed to in writing, software 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * distributed under the License is distributed on an "AS IS" BASIS, 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * See the License for the specific language governing permissions and 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * limitations under the License. 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkTDArray_DEFINED 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkTDArray_DEFINED 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypes.h" 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 227ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgtemplate <typename T> class SK_API SkTDArray { 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray() { 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = fCount = 0; 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = NULL; 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = NULL; 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray(const T src[], size_t count) { 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(src || count == 0); 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = fCount = 0; 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = NULL; 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = NULL; 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (count) { 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = (T*)sk_malloc_throw(count * sizeof(T)); 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = (ArrayT*)fArray; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(fArray, src, sizeof(T) * count); 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = fCount = count; 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray(const SkTDArray<T>& src) { 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = fCount = 0; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = NULL; 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = NULL; 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray<T> tmp(src.fArray, src.fCount); 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->swap(tmp); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ~SkTDArray() { 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_free(fArray); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray<T>& operator=(const SkTDArray<T>& src) { 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (this != &src) { 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (src.fCount > fReserve) { 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTDArray<T> tmp(src.fArray, src.fCount); 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->swap(tmp); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(fArray, src.fArray, sizeof(T) * src.fCount); 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = src.fCount; 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return *this; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 74b530ef5869c5c64af8f3b3c62ed7711fe4325c9creed@google.com friend bool operator==(const SkTDArray<T>& a, const SkTDArray<T>& b) { 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return a.fCount == b.fCount && 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com (a.fCount == 0 || 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com !memcmp(a.fArray, b.fArray, a.fCount * sizeof(T))); 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void swap(SkTDArray<T>& other) { 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTSwap(fArray, other.fArray); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTSwap(fData, other.fData); 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTSwap(fReserve, other.fReserve); 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTSwap(fCount, other.fCount); 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 890da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com /** Return a ptr to the array of data, to be freed with sk_free. This also 900da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com resets the SkTDArray to be empty. 910da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com */ 920da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com T* detach() { 930da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com T* array = fArray; 940da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com fArray = NULL; 950da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com fReserve = fCount = 0; 960da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com SkDEBUGCODE(fData = NULL;) 970da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com return array; 980da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com } 990da41dbf5bdf9614a3d2f1d3ebd959221bbac44breed@android.com 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool isEmpty() const { return fCount == 0; } 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count() const { return fCount; } 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* begin() const { return fArray; } 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* end() const { return fArray ? fArray + fCount : NULL; } 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T& operator[](int index) const { 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT((unsigned)index < fCount); 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fArray[index]; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void reset() { 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fArray) { 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_free(fArray); 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = NULL; 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = NULL; 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = fCount = 0; 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(fReserve == 0 && fCount == 0); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void rewind() { 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // same as setCount(0) 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = 0; 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setCount(size_t count) { 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (count > fReserve) { 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->growBy(count - fCount); 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = count; 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setReserve(size_t reserve) { 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (reserve > fReserve) { 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(reserve > fCount); 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t count = fCount; 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->growBy(reserve - fCount); 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = count; 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* prepend() { 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->growBy(1); 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memmove(fArray + 1, fArray, (fCount - 1) * sizeof(T)); 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fArray; 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* append() { 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->append(1, NULL); 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* append(size_t count, const T* src = NULL) { 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com unsigned oldCount = fCount; 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (count) { 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(src == NULL || fArray == NULL || 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com src + count <= fArray || fArray + oldCount <= src); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->growBy(count); 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (src) { 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(fArray + oldCount, src, sizeof(T) * count); 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return fArray + oldCount; 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* appendClear() { 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* result = this->append(); 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *result = 0; 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* insert(size_t index) { 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->insert(index, 1, NULL); 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* insert(size_t index, size_t count, const T* src = NULL) { 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(count); 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(index <= fCount); 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int oldCount = fCount; 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->growBy(count); 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* dst = fArray + index; 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memmove(dst + count, dst, sizeof(T) * (oldCount - index)); 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (src) { 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(dst, src, sizeof(T) * count); 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return dst; 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void remove(size_t index, size_t count = 1) { 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(index + count <= fCount); 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = fCount - count; 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memmove(fArray + index, fArray + index + count, sizeof(T) * (fCount - index)); 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void removeShuffle(size_t index) { 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(index < fCount); 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com unsigned newCount = fCount - 1; 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount = newCount; 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (index != newCount) { 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(fArray + index, fArray + newCount, sizeof(T)); 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int find(const T& elem) const { 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const T* iter = fArray; 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const T* stop = fArray + fCount; 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (; iter < stop; iter++) { 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (*iter == elem) { 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (int) (iter - fArray); 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return -1; 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int rfind(const T& elem) const { 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const T* iter = fArray + fCount; 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const T* stop = fArray; 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (iter > stop) { 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (*--iter == elem) { 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return iter - stop; 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return -1; 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // routines to treat the array like a stack 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* push() { return this->append(); } 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void push(const T& elem) { *this->append() = elem; } 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const T& top() const { return (*this)[fCount - 1]; } 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T& top() { return (*this)[fCount - 1]; } 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void pop(T* elem) { if (elem) *elem = (*this)[fCount - 1]; --fCount; } 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void pop() { --fCount; } 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void deleteAll() { 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* iter = fArray; 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* stop = fArray + fCount; 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (iter < stop) { 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com delete (*iter); 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com iter += 1; 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->reset(); 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void freeAll() { 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* iter = fArray; 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* stop = fArray + fCount; 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (iter < stop) { 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com sk_free(*iter); 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com iter += 1; 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->reset(); 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void unrefAll() { 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* iter = fArray; 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* stop = fArray + fCount; 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (iter < stop) { 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com (*iter)->unref(); 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com iter += 1; 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->reset(); 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2658433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com 2668433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com void safeUnrefAll() { 2678433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com T* iter = fArray; 2688433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com T* stop = fArray + fCount; 2698433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com while (iter < stop) { 2708433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com SkSafeUnref(*iter); 2718433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com iter += 1; 2728433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com } 2738433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com this->reset(); 2748433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com } 2758433b5db1a0f94cd92d2606817d5374ab899b87areed@android.com 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void validate() const { 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT((fReserve == 0 && fArray == NULL) || 2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com (fReserve > 0 && fArray != NULL)); 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(fCount <= fReserve); 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(fData == (ArrayT*)fArray); 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum { 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kDebugArraySize = 16 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef T ArrayT[kDebugArraySize]; 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ArrayT* fData; 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com T* fArray; 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t fReserve, fCount; 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void growBy(size_t extra) { 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(extra); 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fCount + extra > fReserve) { 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t size = fCount + extra + 4; 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size += size >> 2; 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fArray = (T*)sk_realloc_throw(fArray, size * sizeof(T)); 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fData = (ArrayT*)fArray; 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fReserve = size; 3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fCount += extra; 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 315