| Index: include/core/SkTemplates.h
|
| diff --git a/include/core/SkTemplates.h b/include/core/SkTemplates.h
|
| index e8a8b61ec88d58c73558bf038791e87f57d67934..3060f9ef274d8940a35f75e7c59244840984a371 100644
|
| --- a/include/core/SkTemplates.h
|
| +++ b/include/core/SkTemplates.h
|
| @@ -228,33 +228,53 @@ private:
|
| */
|
| template <size_t N, typename T> class SkAutoSTArray : SkNoncopyable {
|
| public:
|
| + /** Initialize with no objects */
|
| + SkAutoSTArray() {
|
| + fArray = NULL;
|
| + fCount = 0;
|
| + }
|
| +
|
| /** Allocate count number of T elements
|
| */
|
| SkAutoSTArray(size_t count) {
|
| - fCount = count;
|
| - if (count > N) {
|
| - fArray = (T*) sk_malloc_throw(count * sizeof(T));
|
| - } else if (count > 0) {
|
| - fArray = (T*) fStorage;
|
| - } else {
|
| - fArray = NULL;
|
| - return;
|
| - }
|
| - T* iter = fArray;
|
| - T* stop = fArray + count;
|
| - while (iter < stop) {
|
| - SkNEW_PLACEMENT(iter++, T);
|
| - }
|
| + fArray = NULL;
|
| + fCount = 0;
|
| + this->reset(count);
|
| }
|
|
|
| ~SkAutoSTArray() {
|
| + this->reset(0);
|
| + }
|
| +
|
| + /** Destroys previous objects in the array and default constructs count number of objects */
|
| + void reset(size_t count) {
|
| T* start = fArray;
|
| T* iter = start + fCount;
|
| while (iter > start) {
|
| (--iter)->~T();
|
| }
|
| - if (fCount > N) {
|
| - sk_free(fArray);
|
| +
|
| + if (fCount != count) {
|
| + if (count > N) {
|
| + sk_free(fArray);
|
| + }
|
| +
|
| + if (count > N) {
|
| + fArray = (T*) sk_malloc_throw(count * sizeof(T));
|
| + } else if (count > 0) {
|
| + fArray = (T*) fStorage;
|
| + } else {
|
| + fArray = NULL;
|
| + return;
|
| + }
|
| +
|
| + fCount = count;
|
| + }
|
| +
|
| + iter = fArray;
|
| + T* stop = fArray + count;
|
| + while (iter < stop) {
|
| + SkNEW_PLACEMENT(iter++, T);
|
| }
|
| }
|
|
|
|
|