1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkTDArray_DEFINED 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkTDArray_DEFINED 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkTypes.h" 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergertemplate <typename T> class SK_API SkTDArray { 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray() { 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray(const T src[], size_t count) { 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(src || count == 0); 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (count) { 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = (T*)sk_malloc_throw(count * sizeof(T)); 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = (ArrayT*)fArray; 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray, src, sizeof(T) * count); 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = count; 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray(const SkTDArray<T>& src) { 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray<T> tmp(src.fArray, src.fCount); 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->swap(tmp); 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ~SkTDArray() { 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger sk_free(fArray); 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray<T>& operator=(const SkTDArray<T>& src) { 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (this != &src) { 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src.fCount > fReserve) { 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTDArray<T> tmp(src.fArray, src.fCount); 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->swap(tmp); 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } else { 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray, src.fArray, sizeof(T) * src.fCount); 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = src.fCount; 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return *this; 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger friend bool operator==(const SkTDArray<T>& a, const SkTDArray<T>& b) { 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return a.fCount == b.fCount && 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (a.fCount == 0 || 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger !memcmp(a.fArray, b.fArray, a.fCount * sizeof(T))); 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void swap(SkTDArray<T>& other) { 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fArray, other.fArray); 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fData, other.fData); 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fReserve, other.fReserve); 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkTSwap(fCount, other.fCount); 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return a ptr to the array of data, to be freed with sk_free. This also 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger resets the SkTDArray to be empty. 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* detach() { 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* array = fArray; 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDEBUGCODE(fData = NULL;) 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return array; 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isEmpty() const { return fCount == 0; } 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Return the number of elements in the array 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int count() const { return fCount; } 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * return the number of bytes in the array: count * sizeof(T) 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t bytes() const { return fCount * sizeof(T); } 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* begin() const { return fArray; } 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* end() const { return fArray ? fArray + fCount : NULL; } 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T& operator[](int index) const { 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT((unsigned)index < fCount); 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fArray[index]; 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void reset() { 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fArray) { 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger sk_free(fArray); 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = NULL; 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = NULL; 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = fCount = 0; 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } else { 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fReserve == 0 && fCount == 0); 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void rewind() { 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // same as setCount(0) 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = 0; 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setCount(size_t count) { 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (count > fReserve) { 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(count - fCount); 133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } else { 134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = count; 135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setReserve(size_t reserve) { 139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (reserve > fReserve) { 140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(reserve > fCount); 141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t count = fCount; 142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(reserve - fCount); 143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = count; 144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* prepend() { 148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(1); 149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memmove(fArray + 1, fArray, (fCount - 1) * sizeof(T)); 150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fArray; 151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* append() { 154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->append(1, NULL); 155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* append(size_t count, const T* src = NULL) { 157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger unsigned oldCount = fCount; 158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (count) { 159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(src == NULL || fArray == NULL || 160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger src + count <= fArray || fArray + oldCount <= src); 161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(count); 163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src) { 164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray + oldCount, src, sizeof(T) * count); 165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fArray + oldCount; 168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* appendClear() { 171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* result = this->append(); 172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *result = 0; 173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return result; 174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* insert(size_t index) { 177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->insert(index, 1, NULL); 178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* insert(size_t index, size_t count, const T* src = NULL) { 180f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(count); 181f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(index <= fCount); 182f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int oldCount = fCount; 183f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->growBy(count); 184f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* dst = fArray + index; 185f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memmove(dst + count, dst, sizeof(T) * (oldCount - index)); 186f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (src) { 187f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(dst, src, sizeof(T) * count); 188f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 189f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return dst; 190f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 191f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 192f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void remove(size_t index, size_t count = 1) { 193f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(index + count <= fCount); 194f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = fCount - count; 195f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memmove(fArray + index, fArray + index + count, sizeof(T) * (fCount - index)); 196f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 197f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 198f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void removeShuffle(size_t index) { 199f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(index < fCount); 200f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger unsigned newCount = fCount - 1; 201f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount = newCount; 202f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (index != newCount) { 203f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger memcpy(fArray + index, fArray + newCount, sizeof(T)); 204f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 205f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 206f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 207f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int find(const T& elem) const { 208f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const T* iter = fArray; 209f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const T* stop = fArray + fCount; 210f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 211f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger for (; iter < stop; iter++) { 212f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (*iter == elem) { 213f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return (int) (iter - fArray); 214f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 215f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 216f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return -1; 217f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 218f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 219f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger int rfind(const T& elem) const { 220f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const T* iter = fArray + fCount; 221f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const T* stop = fArray; 222f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 223f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter > stop) { 224f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (*--iter == elem) { 225f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return iter - stop; 226f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 227f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 228f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return -1; 229f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 230f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 231f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // routines to treat the array like a stack 232f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* push() { return this->append(); } 233f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void push(const T& elem) { *this->append() = elem; } 234f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const T& top() const { return (*this)[fCount - 1]; } 235f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T& top() { return (*this)[fCount - 1]; } 236f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void pop(T* elem) { if (elem) *elem = (*this)[fCount - 1]; --fCount; } 237f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void pop() { --fCount; } 238f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 239f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void deleteAll() { 240f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* iter = fArray; 241f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* stop = fArray + fCount; 242f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter < stop) { 243f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger delete (*iter); 244f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger iter += 1; 245f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 246f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->reset(); 247f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 248f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 249f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void freeAll() { 250f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* iter = fArray; 251f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* stop = fArray + fCount; 252f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter < stop) { 253f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger sk_free(*iter); 254f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger iter += 1; 255f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 256f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->reset(); 257f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 258f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 259f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void unrefAll() { 260f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* iter = fArray; 261f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* stop = fArray + fCount; 262f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter < stop) { 263f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (*iter)->unref(); 264f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger iter += 1; 265f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 266f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->reset(); 267f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 268f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 269f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void safeUnrefAll() { 270f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* iter = fArray; 271f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* stop = fArray + fCount; 272f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger while (iter < stop) { 273f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkSafeUnref(*iter); 274f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger iter += 1; 275f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 276f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->reset(); 277f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 278f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 279f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 280f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void validate() const { 281f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT((fReserve == 0 && fArray == NULL) || 282f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger (fReserve > 0 && fArray != NULL)); 283f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fCount <= fReserve); 284f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fData == (ArrayT*)fArray); 285f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 286f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 287f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 288f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 289f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 290f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger enum { 291f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger kDebugArraySize = 16 292f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger }; 293f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger typedef T ArrayT[kDebugArraySize]; 294f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ArrayT* fData; 295f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 296f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger T* fArray; 297f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t fReserve, fCount; 298f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 299f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void growBy(size_t extra) { 300f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(extra); 301f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 302f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (fCount + extra > fReserve) { 303f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size_t size = fCount + extra + 4; 304f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger size += size >> 2; 305f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 306f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fArray = (T*)sk_realloc_throw(fArray, size * sizeof(T)); 307f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 308f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fData = (ArrayT*)fArray; 309f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 310f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fReserve = size; 311f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 312f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fCount += extra; 313f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 314f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 315f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 316f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 317f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 318