| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkTArray_DEFINED | 8 #ifndef SkTArray_DEFINED |
| 9 #define SkTArray_DEFINED | 9 #define SkTArray_DEFINED |
| 10 | 10 |
| 11 #include <new> | 11 #include <new> |
| 12 #include "SkTypes.h" | 12 #include "SkTypes.h" |
| 13 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
| 14 | 14 |
| 15 template <typename T, bool MEM_COPY = false> class SkTArray; | 15 template <typename T, bool MEM_COPY = false> class SkTArray; |
| 16 | 16 |
| 17 namespace SkTArrayExt { | 17 namespace SkTArrayExt { |
| 18 | 18 |
| 19 template<typename T> | 19 template<typename T> |
| 20 inline void copy(SkTArray<T, true>* self, int dst, int src) { |
| 21 memcpy(&self->fItemArray[dst], &self->fItemArray[src], sizeof(T)); |
| 22 } |
| 23 template<typename T> |
| 20 inline void copy(SkTArray<T, true>* self, const T* array) { | 24 inline void copy(SkTArray<T, true>* self, const T* array) { |
| 21 memcpy(self->fMemArray, array, self->fCount * sizeof(T)); | 25 memcpy(self->fMemArray, array, self->fCount * sizeof(T)); |
| 22 } | 26 } |
| 23 template<typename T> | 27 template<typename T> |
| 24 inline void copyAndDelete(SkTArray<T, true>* self, char* newMemArray) { | 28 inline void copyAndDelete(SkTArray<T, true>* self, char* newMemArray) { |
| 25 memcpy(newMemArray, self->fMemArray, self->fCount * sizeof(T)); | 29 memcpy(newMemArray, self->fMemArray, self->fCount * sizeof(T)); |
| 26 } | 30 } |
| 27 | 31 |
| 28 template<typename T> | 32 template<typename T> |
| 33 inline void copy(SkTArray<T, false>* self, int dst, int src) { |
| 34 SkNEW_PLACEMENT_ARGS(&self->fItemArray[dst], T, (self->fItemArray[src])); |
| 35 } |
| 36 template<typename T> |
| 29 inline void copy(SkTArray<T, false>* self, const T* array) { | 37 inline void copy(SkTArray<T, false>* self, const T* array) { |
| 30 for (int i = 0; i < self->fCount; ++i) { | 38 for (int i = 0; i < self->fCount; ++i) { |
| 31 SkNEW_PLACEMENT_ARGS(self->fItemArray + i, T, (array[i])); | 39 SkNEW_PLACEMENT_ARGS(self->fItemArray + i, T, (array[i])); |
| 32 } | 40 } |
| 33 } | 41 } |
| 34 template<typename T> | 42 template<typename T> |
| 35 inline void copyAndDelete(SkTArray<T, false>* self, char* newMemArray) { | 43 inline void copyAndDelete(SkTArray<T, false>* self, char* newMemArray) { |
| 36 for (int i = 0; i < self->fCount; ++i) { | 44 for (int i = 0; i < self->fCount; ++i) { |
| 37 SkNEW_PLACEMENT_ARGS(newMemArray + sizeof(T) * i, T, (self->fItemArray[i
])); | 45 SkNEW_PLACEMENT_ARGS(newMemArray + sizeof(T) * i, T, (self->fItemArray[i
])); |
| 38 self->fItemArray[i].~T(); | 46 self->fItemArray[i].~T(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 /** | 141 /** |
| 134 * Resets to a copy of a C array. | 142 * Resets to a copy of a C array. |
| 135 */ | 143 */ |
| 136 void reset(const T* array, int count) { | 144 void reset(const T* array, int count) { |
| 137 for (int i = 0; i < fCount; ++i) { | 145 for (int i = 0; i < fCount; ++i) { |
| 138 fItemArray[i].~T(); | 146 fItemArray[i].~T(); |
| 139 } | 147 } |
| 140 int delta = count - fCount; | 148 int delta = count - fCount; |
| 141 this->checkRealloc(delta); | 149 this->checkRealloc(delta); |
| 142 fCount = count; | 150 fCount = count; |
| 143 for (int i = 0; i < count; ++i) { | 151 SkTArrayExt::copy(this, array); |
| 144 SkTArrayExt::copy(this, array); | 152 } |
| 153 |
| 154 void removeShuffle(int n) { |
| 155 SkASSERT(n < fCount); |
| 156 int newCount = fCount - 1; |
| 157 fCount = newCount; |
| 158 fItemArray[n].~T(); |
| 159 if (n != newCount) { |
| 160 SkTArrayExt::copy(this, n, newCount); |
| 161 fItemArray[newCount].~T(); |
| 145 } | 162 } |
| 146 } | 163 } |
| 147 | 164 |
| 148 /** | 165 /** |
| 149 * Number of elements in the array. | 166 * Number of elements in the array. |
| 150 */ | 167 */ |
| 151 int count() const { return fCount; } | 168 int count() const { return fCount; } |
| 152 | 169 |
| 153 /** | 170 /** |
| 154 * Is the array empty. | 171 * Is the array empty. |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 | 437 |
| 421 if (fMemArray != fPreAllocMemArray) { | 438 if (fMemArray != fPreAllocMemArray) { |
| 422 sk_free(fMemArray); | 439 sk_free(fMemArray); |
| 423 } | 440 } |
| 424 fMemArray = newMemArray; | 441 fMemArray = newMemArray; |
| 425 } | 442 } |
| 426 } | 443 } |
| 427 | 444 |
| 428 friend void* operator new<T>(size_t, SkTArray*, int); | 445 friend void* operator new<T>(size_t, SkTArray*, int); |
| 429 | 446 |
| 447 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, true>* that,
int dst, int src); |
| 430 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, true>* that,
const X*); | 448 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, true>* that,
const X*); |
| 431 template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, true
>* that, char*); | 449 template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, true
>* that, char*); |
| 432 | 450 |
| 451 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, false>* that,
int dst, int src); |
| 433 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, false>* that,
const X*); | 452 template<typename X> friend void SkTArrayExt::copy(SkTArray<X, false>* that,
const X*); |
| 434 template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, fals
e>* that, char*); | 453 template<typename X> friend void SkTArrayExt::copyAndDelete(SkTArray<X, fals
e>* that, char*); |
| 435 | 454 |
| 436 int fReserveCount; | 455 int fReserveCount; |
| 437 int fCount; | 456 int fCount; |
| 438 int fAllocCount; | 457 int fAllocCount; |
| 439 void* fPreAllocMemArray; | 458 void* fPreAllocMemArray; |
| 440 union { | 459 union { |
| 441 T* fItemArray; | 460 T* fItemArray; |
| 442 void* fMemArray; | 461 void* fMemArray; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 SkSTArray& operator= (const INHERITED& array) { | 520 SkSTArray& operator= (const INHERITED& array) { |
| 502 INHERITED::operator=(array); | 521 INHERITED::operator=(array); |
| 503 return *this; | 522 return *this; |
| 504 } | 523 } |
| 505 | 524 |
| 506 private: | 525 private: |
| 507 SkAlignedSTStorage<N,T> fStorage; | 526 SkAlignedSTStorage<N,T> fStorage; |
| 508 }; | 527 }; |
| 509 | 528 |
| 510 #endif | 529 #endif |
| OLD | NEW |