diff options
author | mtklein <mtklein@google.com> | 2016-02-09 05:14:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-09 05:14:04 -0800 |
commit | 4984b85037bf0733d848318dfaff03ab85204a6f (patch) | |
tree | d53504318963da3e91195353a9ccbfdd86d9cf8f | |
parent | 4f0379444db31421894d2fce7c85889fe5eaa01a (diff) |
Revert of SkTArray to move when moving. (patchset #3 id:40001 of https://codereview.chromium.org/1672063002/ )
Reason for revert:
Broke the Chrome roll:
https://codereview.chromium.org/1680563005
Original issue's description:
> SkTArray to move when moving.
>
> This updates SkTArray to move elements when possible, instead of always
> copying them.
>
> TBR=reed
> Agreed moving is good. This should also become private.
>
> Committed: https://skia.googlesource.com/skia/+/3c69348e725131150e4ab962dec1b3ff1148a6bd
TBR=reed@google.com,bungeman@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Review URL: https://codereview.chromium.org/1683693002
-rw-r--r-- | include/core/SkTArray.h | 84 | ||||
-rw-r--r-- | include/ports/SkFontMgr_indirect.h | 3 |
2 files changed, 52 insertions, 35 deletions
diff --git a/include/core/SkTArray.h b/include/core/SkTArray.h index 86c5eaacf0..bd255e3868 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 @@ public: 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 @@ public: int delta = count - fCount; this->checkRealloc(delta); fCount = count; - this->copy(array); + SkTArrayExt::copy(this, array); } void removeShuffle(int n) { @@ -124,7 +159,8 @@ public: fCount = newCount; fItemArray[n].~T(); if (n != newCount) { - this->move(n, newCount); + SkTArrayExt::copy(this, n, newCount); + fItemArray[newCount].~T(); } } @@ -386,38 +422,10 @@ protected: 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 @@ private: newMemArray = (char*) sk_malloc_throw(fAllocCount*sizeof(T)); } - this->move(newMemArray); + SkTArrayExt::copyAndDelete<T>(this, newMemArray); if (fMemArray != fPreAllocMemArray) { sk_free(fMemArray); @@ -466,6 +474,14 @@ private: 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; int fAllocCount; diff --git a/include/ports/SkFontMgr_indirect.h b/include/ports/SkFontMgr_indirect.h index 9d96fee687..81cd7739a9 100644 --- a/include/ports/SkFontMgr_indirect.h +++ b/include/ports/SkFontMgr_indirect.h @@ -70,7 +70,8 @@ private: DataEntry() { } - DataEntry(DataEntry&& that) + // This is a move!!! + DataEntry(DataEntry& that) : fDataId(that.fDataId) , fTtcIndex(that.fTtcIndex) , fTypeface(that.fTypeface) |