Index: include/core/SkTArray.h |
diff --git a/include/core/SkTArray.h b/include/core/SkTArray.h |
index 86c5eaacf02535953f4581c50d2293c6f746974f..bd255e3868add398809d233b107b76d299b33fd3 100644 |
--- a/include/core/SkTArray.h |
+++ b/include/core/SkTArray.h |
@@ -8,7 +8,6 @@ |
#ifndef SkTArray_DEFINED |
#define SkTArray_DEFINED |
-#include "../private/SkTLogic.h" |
#include "../private/SkTemplates.h" |
#include "SkTypes.h" |
@@ -16,6 +15,42 @@ |
#include <utility> |
template <typename T, bool MEM_COPY = false> class SkTArray; |
+ |
+namespace SkTArrayExt { |
+ |
+template<typename T> |
+inline void copy(SkTArray<T, true>* self, int dst, int src) { |
+ memcpy(&self->fItemArray[dst], &self->fItemArray[src], sizeof(T)); |
+} |
+template<typename T> |
+inline void copy(SkTArray<T, true>* self, const T* array) { |
+ sk_careful_memcpy(self->fMemArray, array, self->fCount * sizeof(T)); |
+} |
+template<typename T> |
+inline void copyAndDelete(SkTArray<T, true>* self, char* newMemArray) { |
+ sk_careful_memcpy(newMemArray, self->fMemArray, self->fCount * sizeof(T)); |
+} |
+ |
+template<typename T> |
+inline void copy(SkTArray<T, false>* self, int dst, int src) { |
+ new (&self->fItemArray[dst]) T(self->fItemArray[src]); |
+} |
+template<typename T> |
+inline void copy(SkTArray<T, false>* self, const T* array) { |
+ for (int i = 0; i < self->fCount; ++i) { |
+ new (self->fItemArray + i) T(array[i]); |
+ } |
+} |
+template<typename T> |
+inline void copyAndDelete(SkTArray<T, false>* self, char* newMemArray) { |
+ for (int i = 0; i < self->fCount; ++i) { |
+ new (newMemArray + sizeof(T) * i) T(self->fItemArray[i]); |
+ self->fItemArray[i].~T(); |
+ } |
+} |
+ |
+} |
+ |
template <typename T, bool MEM_COPY> void* operator new(size_t, SkTArray<T, MEM_COPY>*, int); |
/** When MEM_COPY is true T will be bit copied when moved. |
@@ -70,7 +105,7 @@ |
fCount = 0; |
this->checkRealloc((int)array.count()); |
fCount = array.count(); |
- this->copy(static_cast<const T*>(array.fMemArray)); |
+ SkTArrayExt::copy(this, static_cast<const T*>(array.fMemArray)); |
return *this; |
} |
@@ -115,7 +150,7 @@ |
int delta = count - fCount; |
this->checkRealloc(delta); |
fCount = count; |
- this->copy(array); |
+ SkTArrayExt::copy(this, array); |
} |
void removeShuffle(int n) { |
@@ -124,7 +159,8 @@ |
fCount = newCount; |
fItemArray[n].~T(); |
if (n != newCount) { |
- this->move(n, newCount); |
+ SkTArrayExt::copy(this, n, newCount); |
+ fItemArray[newCount].~T(); |
} |
} |
@@ -386,38 +422,10 @@ |
fMemArray = sk_malloc_throw(fAllocCount * sizeof(T)); |
} |
- this->copy(array); |
+ SkTArrayExt::copy(this, array); |
} |
private: |
- /** In the following move and copy methods, 'dst' is assumed to be uninitialized raw storage. |
- * In the following move methods, 'src' is destroyed leaving behind uninitialized raw storage. |
- */ |
- template <bool E = MEM_COPY> SK_WHEN(E, void) copy(const T* src) { |
- sk_careful_memcpy(fMemArray, src, fCount * sizeof(T)); |
- } |
- 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) { |
- sk_careful_memcpy(dst, fMemArray, fCount * sizeof(T)); |
- } |
- |
- template <bool E = MEM_COPY> SK_WHEN(!E, void) copy(const T* src) { |
- for (int i = 0; i < fCount; ++i) { |
- new (fItemArray + i) T(src[i]); |
- } |
- } |
- template <bool E = MEM_COPY> SK_WHEN(!E, void) move(int dst, int src) { |
- new (&fItemArray[dst]) T(std::move(fItemArray[src])); |
- fItemArray[src].~T(); |
- } |
- template <bool E = MEM_COPY> SK_WHEN(!E, void) move(char* dst) { |
- for (int i = 0; i < fCount; ++i) { |
- new (dst + sizeof(T) * i) T(std::move(fItemArray[i])); |
- fItemArray[i].~T(); |
- } |
- } |
static const int gMIN_ALLOC_COUNT = 8; |
@@ -455,7 +463,7 @@ |
newMemArray = (char*) sk_malloc_throw(fAllocCount*sizeof(T)); |
} |
- this->move(newMemArray); |
+ SkTArrayExt::copyAndDelete<T>(this, newMemArray); |
if (fMemArray != fPreAllocMemArray) { |
sk_free(fMemArray); |
@@ -465,6 +473,14 @@ |
} |
friend void* operator new<T>(size_t, SkTArray*, int); |
+ |
+ template<typename X> friend void SkTArrayExt::copy(SkTArray<X, true>* that, int dst, int src); |
+ template<typename X> friend void SkTArrayExt::copy(SkTArray<X, true>* that, const X*); |
+ template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, true>* that, char*); |
+ |
+ template<typename X> friend void SkTArrayExt::copy(SkTArray<X, false>* that, int dst, int src); |
+ template<typename X> friend void SkTArrayExt::copy(SkTArray<X, false>* that, const X*); |
+ template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, false>* that, char*); |
int fReserveCount; |
int fCount; |