diff options
Diffstat (limited to 'include/core')
-rw-r--r-- | include/core/SkTDArray.h | 83 |
1 files changed, 21 insertions, 62 deletions
diff --git a/include/core/SkTDArray.h b/include/core/SkTDArray.h index e51f2cd008..67254ccc9a 100644 --- a/include/core/SkTDArray.h +++ b/include/core/SkTDArray.h @@ -151,43 +151,25 @@ public: fCount = 0; } - /** - * Sets the number of elements in the array. - * If the array does not have space for count elements, it will increase - * the storage allocated to some amount greater than that required. - * It will never shrink the shrink the storage. - */ void setCount(int count) { - // TODO(mtklein): eliminate this method, setCountExact -> setCount - SkASSERT(count >= 0); if (count > fReserve) { - resizeStorageToAtLeast(count); - } - fCount = count; - } - - /** - * Sets the number of elements in the array. - * If the array does not have space for count elements, it will increase - * the storage allocated to exactly the amount required, with no remaining - * reserved space. - * It will never shrink the shrink the storage. - */ - void setCountExact(int count) { - if (count > fReserve) { - this->resizeStorageToExact(count); + this->growBy(count - fCount); + } else { + fCount = count; } - fCount = count; } void setReserve(int reserve) { if (reserve > fReserve) { - resizeStorageToAtLeast(reserve); + SkASSERT(reserve > fCount); + int count = fCount; + this->growBy(reserve - fCount); + fCount = count; } } T* prepend() { - this->adjustCount(1); + this->growBy(1); memmove(fArray + 1, fArray, (fCount - 1) * sizeof(T)); return fArray; } @@ -201,7 +183,7 @@ public: SkASSERT(src == NULL || fArray == NULL || src + count <= fArray || fArray + oldCount <= src); - this->adjustCount(count); + this->growBy(count); if (src) { memcpy(fArray + oldCount, src, sizeof(T) * count); } @@ -222,7 +204,7 @@ public: SkASSERT(count); SkASSERT(index <= fCount); size_t oldCount = fCount; - this->adjustCount(count); + this->growBy(count); T* dst = fArray + index; memmove(dst + count, dst, sizeof(T) * (oldCount - index)); if (src) { @@ -374,43 +356,20 @@ private: int fReserve; int fCount; - /** - * Adjusts the number of elements in the array. - * This is the same as calling setCount(count() + delta). - */ - void adjustCount(int delta) { - setCount(fCount + delta); - } + void growBy(int extra) { + SkASSERT(extra); - /** - * This resizes the storage to *exactly* count elements, growing or - * shrinking the allocation as needed. It does not ASSERT anything about - * the previous allocation size, or about fCount. - * - * note: does NOT modify fCount - */ - void resizeStorageToExact(int count) { - SkASSERT(count >= 0); - fArray = (T*)sk_realloc_throw(fArray, count * sizeof(T)); + if (fCount + extra > fReserve) { + int size = fCount + extra + 4; + size += size >> 2; + + fArray = (T*)sk_realloc_throw(fArray, size * sizeof(T)); #ifdef SK_DEBUG - fData = (ArrayT*)fArray; + fData = (ArrayT*)fArray; #endif - fReserve = count; - } - - /** - * Increase the storage allocation such that it can hold (fCount + extra) - * elements. - * It never shrinks the allocation, and it may increase the allocation by - * more than is strictly required, based on a private growth heuristic. - * - * note: does NOT modify fCount - */ - void resizeStorageToAtLeast(int count) { - SkASSERT(count > fReserve); - int space = count + 4; - space += space>>2; - resizeStorageToExact(space); + fReserve = size; + } + fCount += extra; } }; |