Chromium Code Reviews| Index: include/private/SkTArray.h |
| diff --git a/include/private/SkTArray.h b/include/private/SkTArray.h |
| index d12ab1af05e54c8cf98674c7ca45b625a2923846..043784f093a2169ce5d640ea11c020eee2d8d1ac 100644 |
| --- a/include/private/SkTArray.h |
| +++ b/include/private/SkTArray.h |
| @@ -38,14 +38,20 @@ public: |
| * elements. |
| */ |
| explicit SkTArray(int reserveCount) { |
| - this->init(NULL, 0, NULL, reserveCount); |
| + this->init(0, NULL, reserveCount); |
| } |
| /** |
| * Copies one array to another. The new array will be heap allocated. |
| */ |
| - explicit SkTArray(const SkTArray& array) { |
| - this->init(array.fItemArray, array.fCount, NULL, 0); |
| + explicit SkTArray(const SkTArray& that) { |
| + this->init(that.fCount, NULL, 0); |
| + this->copy(that.fItemArray); |
| + } |
| + explicit SkTArray(SkTArray&& that) { |
| + this->init(that.fCount, NULL, 0); |
| + that.move(fMemArray); |
| + that.fCount = 0; |
| } |
| /** |
| @@ -54,20 +60,32 @@ public: |
| * when you really want the (void*, int) version. |
| */ |
| SkTArray(const T* array, int count) { |
| - this->init(array, count, NULL, 0); |
| + this->init(count, NULL, 0); |
| + this->copy(array); |
| } |
| /** |
| * assign copy of array to this |
| */ |
| - SkTArray& operator =(const SkTArray& array) { |
| + SkTArray& operator =(const SkTArray& that) { |
| + for (int i = 0; i < fCount; ++i) { |
| + fItemArray[i].~T(); |
| + } |
| + fCount = 0; |
| + this->checkRealloc(that.count()); |
| + fCount = that.count(); |
| + this->copy(that.fItemArray); |
| + return *this; |
| + } |
| + SkTArray& operator =(SkTArray&& that) { |
| for (int i = 0; i < fCount; ++i) { |
| fItemArray[i].~T(); |
| } |
| fCount = 0; |
| - this->checkRealloc((int)array.count()); |
| - fCount = array.count(); |
| - this->copy(static_cast<const T*>(array.fMemArray)); |
| + this->checkRealloc(that.count()); |
| + fCount = that.count(); |
| + that.move(fMemArray); |
| + that.fCount = 0; |
| return *this; |
| } |
| @@ -93,7 +111,7 @@ public: |
| for (int i = 0; i < fCount; ++i) { |
| fItemArray[i].~T(); |
| } |
| - // set fCount to 0 before calling checkRealloc so that no copy cons. are called. |
| + // Set fCount to 0 before calling checkRealloc so that no elements are moved. |
| fCount = 0; |
| this->checkRealloc(n); |
| fCount = n; |
| @@ -109,8 +127,8 @@ public: |
| for (int i = 0; i < fCount; ++i) { |
| fItemArray[i].~T(); |
| } |
| - int delta = count - fCount; |
| - this->checkRealloc(delta); |
| + fCount = 0; |
| + this->checkRealloc(count); |
| fCount = count; |
| this->copy(array); |
| } |
| @@ -264,9 +282,9 @@ public: |
| SkTSwap(fAllocCount, that->fAllocCount); |
| } else { |
| // This could be more optimal... |
|
mtklein
2016/04/20 15:50:44
Still true?
bungeman-skia
2016/04/20 17:21:12
It could be. We could avoid dome destructor/constr
|
| - SkTArray copy(*that); |
| - *that = *this; |
| - *this = copy; |
| + SkTArray copy(std::move(*that)); |
| + *that = std::move(*this); |
| + *this = std::move(copy); |
| } |
| } |
| @@ -351,7 +369,7 @@ protected: |
| */ |
| template <int N> |
| SkTArray(SkAlignedSTStorage<N,T>* storage) { |
| - this->init(NULL, 0, storage->get(), N); |
| + this->init(0, storage->get(), N); |
| } |
| /** |
| @@ -361,7 +379,8 @@ protected: |
| */ |
| template <int N> |
| SkTArray(const SkTArray& array, SkAlignedSTStorage<N,T>* storage) { |
| - this->init(array.fItemArray, array.fCount, storage->get(), N); |
| + this->init(array.fCount, storage->get(), N); |
| + this->copy(array.fItemArray); |
| } |
| /** |
| @@ -371,11 +390,11 @@ protected: |
| */ |
| template <int N> |
| SkTArray(const T* array, int count, SkAlignedSTStorage<N,T>* storage) { |
| - this->init(array, count, storage->get(), N); |
| + this->init(count, storage->get(), N); |
| + this->copy(array); |
| } |
| - void init(const T* array, int count, |
| - void* preAllocStorage, int preAllocOrReserveCount) { |
| + void init(int count, void* preAllocStorage, int preAllocOrReserveCount) { |
| SkASSERT(count >= 0); |
| SkASSERT(preAllocOrReserveCount >= 0); |
| fCount = count; |
| @@ -391,8 +410,6 @@ protected: |
| fAllocCount = SkMax32(fCount, fReserveCount); |
| fMemArray = sk_malloc_throw(fAllocCount * sizeof(T)); |
| } |
| - |
| - this->copy(array); |
| } |
| private: |
| @@ -405,7 +422,7 @@ private: |
| template <bool E = MEM_COPY> SK_WHEN(E, void) move(int dst, int src) { |
| memcpy(&fItemArray[dst], &fItemArray[src], sizeof(T)); |
| } |
| - template <bool E = MEM_COPY> SK_WHEN(E, void) move(char* dst) { |
| + template <bool E = MEM_COPY> SK_WHEN(E, void) move(void* dst) { |
| sk_careful_memcpy(dst, fMemArray, fCount * sizeof(T)); |
| } |
| @@ -418,9 +435,9 @@ private: |
| new (&fItemArray[dst]) T(std::move(fItemArray[src])); |
| fItemArray[src].~T(); |
| } |
| - template <bool E = MEM_COPY> SK_WHEN(!E, void) move(char* dst) { |
| + template <bool E = MEM_COPY> SK_WHEN(!E, void) move(void* dst) { |
| for (int i = 0; i < fCount; ++i) { |
| - new (dst + sizeof(T) * i) T(std::move(fItemArray[i])); |
| + new (static_cast<char*>(dst) + sizeof(T) * i) T(std::move(fItemArray[i])); |
| fItemArray[i].~T(); |
| } |
| } |
| @@ -453,12 +470,12 @@ private: |
| if (newAllocCount != fAllocCount) { |
| fAllocCount = newAllocCount; |
| - char* newMemArray; |
| + void* newMemArray; |
| if (fAllocCount == fReserveCount && fPreAllocMemArray) { |
| - newMemArray = (char*) fPreAllocMemArray; |
| + newMemArray = fPreAllocMemArray; |
| } else { |
| - newMemArray = (char*) sk_malloc_throw(fAllocCount*sizeof(T)); |
| + newMemArray = sk_malloc_throw(fAllocCount*sizeof(T)); |
| } |
| this->move(newMemArray); |