Index: include/private/SkTemplates.h |
diff --git a/include/private/SkTemplates.h b/include/private/SkTemplates.h |
index e36910e81446365e15c9cb2a2aa8124da7605f16..496cf427337664d82ed499412e67168af14f8f5b 100644 |
--- a/include/private/SkTemplates.h |
+++ b/include/private/SkTemplates.h |
@@ -164,9 +164,9 @@ |
SkDEBUGCODE(int fCount;) |
}; |
-/** Wraps SkAutoTArray, with room for kCountRequested elements preallocated. |
- */ |
-template <int kCountRequested, typename T> class SkAutoSTArray : SkNoncopyable { |
+/** Wraps SkAutoTArray, with room for up to N elements preallocated |
+ */ |
+template <int N, typename T> class SkAutoSTArray : SkNoncopyable { |
public: |
/** Initialize with no objects */ |
SkAutoSTArray() { |
@@ -195,13 +195,13 @@ |
} |
if (fCount != count) { |
- if (fCount > kCount) { |
+ if (fCount > N) { |
// 'fArray' was allocated last time so free it now |
SkASSERT((T*) fStorage != fArray); |
sk_free(fArray); |
} |
- if (count > kCount) { |
+ if (count > N) { |
const uint64_t size64 = sk_64_mul(count, sizeof(T)); |
const size_t size = static_cast<size_t>(size64); |
if (size != size64) { |
@@ -240,21 +240,10 @@ |
} |
private: |
-#if defined(GOOGLE3) |
- // Stack frame size is limited for GOOGLE3. 4k is less than the actual max, but some functions |
- // have multiple large stack allocations. |
- static const int kMaxBytes = 4 * 1024; |
- static const int kCount = kCountRequested * sizeof(T) > kMaxBytes |
- ? kMaxBytes / sizeof(T) |
- : kCountRequested; |
-#else |
- static const int kCount = kCountRequested; |
-#endif |
- |
int fCount; |
T* fArray; |
// since we come right after fArray, fStorage should be properly aligned |
- char fStorage[kCount * sizeof(T)]; |
+ char fStorage[N * sizeof(T)]; |
}; |
/** Manages an array of T elements, freeing the array in the destructor. |
@@ -328,12 +317,12 @@ |
T* fPtr; |
}; |
-template <size_t kCountRequested, typename T> class SkAutoSTMalloc : SkNoncopyable { |
+template <size_t N, typename T> class SkAutoSTMalloc : SkNoncopyable { |
public: |
SkAutoSTMalloc() : fPtr(fTStorage) {} |
SkAutoSTMalloc(size_t count) { |
- if (count > kCount) { |
+ if (count > N) { |
fPtr = (T*)sk_malloc_flags(count * sizeof(T), SK_MALLOC_THROW | SK_MALLOC_TEMP); |
} else { |
fPtr = fTStorage; |
@@ -351,7 +340,7 @@ |
if (fPtr != fTStorage) { |
sk_free(fPtr); |
} |
- if (count > kCount) { |
+ if (count > N) { |
fPtr = (T*)sk_malloc_throw(count * sizeof(T)); |
} else { |
fPtr = fTStorage; |
@@ -379,10 +368,10 @@ |
// Reallocs the array, can be used to shrink the allocation. Makes no attempt to be intelligent |
void realloc(size_t count) { |
- if (count > kCount) { |
+ if (count > N) { |
if (fPtr == fTStorage) { |
fPtr = (T*)sk_malloc_throw(count * sizeof(T)); |
- memcpy(fPtr, fTStorage, kCount * sizeof(T)); |
+ memcpy(fPtr, fTStorage, N * sizeof(T)); |
} else { |
fPtr = (T*)sk_realloc_throw(fPtr, count * sizeof(T)); |
} |
@@ -392,22 +381,9 @@ |
} |
private: |
- // Since we use uint32_t storage, we might be able to get more elements for free. |
- static const size_t kCountWithPadding = SkAlign4(kCountRequested*sizeof(T)) / sizeof(T); |
-#if defined(GOOGLE3) |
- // Stack frame size is limited for GOOGLE3. 4k is less than the actual max, but some functions |
- // have multiple large stack allocations. |
- static const size_t kMaxBytes = 4 * 1024; |
- static const size_t kCount = kCountRequested * sizeof(T) > kMaxBytes |
- ? kMaxBytes / sizeof(T) |
- : kCountWithPadding; |
-#else |
- static const size_t kCount = kCountWithPadding; |
-#endif |
- |
T* fPtr; |
union { |
- uint32_t fStorage32[SkAlign4(kCount*sizeof(T)) >> 2]; |
+ uint32_t fStorage32[(N*sizeof(T) + 3) >> 2]; |
T fTStorage[1]; // do NOT want to invoke T::T() |
}; |
}; |