Index: include/core/SkTDArray.h |
diff --git a/include/core/SkTDArray.h b/include/core/SkTDArray.h |
index 67254ccc9a88fa93fe6489ea82bccb6efe8959e6..804b84f669df4e3d1e5ae7b645d9c6ea94e582e1 100644 |
--- a/include/core/SkTDArray.h |
+++ b/include/core/SkTDArray.h |
@@ -151,25 +151,43 @@ 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) { |
- this->growBy(count - fCount); |
- } else { |
- fCount = count; |
+ this->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); |
+ } |
+ fCount = count; |
} |
void setReserve(int reserve) { |
if (reserve > fReserve) { |
- SkASSERT(reserve > fCount); |
- int count = fCount; |
- this->growBy(reserve - fCount); |
- fCount = count; |
+ this->resizeStorageToAtLeast(reserve); |
} |
} |
T* prepend() { |
- this->growBy(1); |
+ this->adjustCount(1); |
memmove(fArray + 1, fArray, (fCount - 1) * sizeof(T)); |
return fArray; |
} |
@@ -183,7 +201,7 @@ public: |
SkASSERT(src == NULL || fArray == NULL || |
src + count <= fArray || fArray + oldCount <= src); |
- this->growBy(count); |
+ this->adjustCount(count); |
if (src) { |
memcpy(fArray + oldCount, src, sizeof(T) * count); |
} |
@@ -204,7 +222,7 @@ public: |
SkASSERT(count); |
SkASSERT(index <= fCount); |
size_t oldCount = fCount; |
- this->growBy(count); |
+ this->adjustCount(count); |
T* dst = fArray + index; |
memmove(dst + count, dst, sizeof(T) * (oldCount - index)); |
if (src) { |
@@ -356,20 +374,43 @@ private: |
int fReserve; |
int fCount; |
- void growBy(int extra) { |
- SkASSERT(extra); |
- |
- if (fCount + extra > fReserve) { |
- int size = fCount + extra + 4; |
- size += size >> 2; |
+ /** |
+ * Adjusts the number of elements in the array. |
+ * This is the same as calling setCount(count() + delta). |
+ */ |
+ void adjustCount(int delta) { |
+ this->setCount(fCount + delta); |
+ } |
- fArray = (T*)sk_realloc_throw(fArray, size * sizeof(T)); |
+ /** |
+ * 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)); |
#ifdef SK_DEBUG |
- fData = (ArrayT*)fArray; |
+ fData = (ArrayT*)fArray; |
#endif |
- fReserve = size; |
- } |
- fCount += extra; |
+ 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; |
+ this->resizeStorageToExact(space); |
} |
}; |