Index: src/record/SkRecord.h |
diff --git a/src/record/SkRecord.h b/src/record/SkRecord.h |
index b1e4ae24f8da69b5e60aecad189573dbd448c9fd..1fe2f728085b025558f2ed9e27c089aaac83844a 100644 |
--- a/src/record/SkRecord.h |
+++ b/src/record/SkRecord.h |
@@ -10,6 +10,7 @@ |
#include "SkChunkAlloc.h" |
#include "SkRecords.h" |
+#include "SkTLogic.h" |
#include "SkTemplates.h" |
// SkRecord (REC-ord) represents a sequence of SkCanvas calls, saved for future use. |
@@ -77,7 +78,7 @@ public: |
} |
fTypes[fCount] = T::kType; |
- return fRecords[fCount++].set(this->alloc<T>()); |
+ return fRecords[fCount++].set(this->allocCommand<T>()); |
} |
// Replace the i-th command with a new command of type T. |
@@ -91,7 +92,7 @@ public: |
this->mutate(i, destroyer); |
fTypes[i] = T::kType; |
- return fRecords[i].set(this->alloc<T>()); |
+ return fRecords[i].set(this->allocCommand<T>()); |
} |
// Replace the i-th command with a new command of type T. |
@@ -105,7 +106,7 @@ public: |
SkASSERT(proofOfAdoption == fRecords[i].ptr<Existing>()); |
fTypes[i] = T::kType; |
- return fRecords[i].set(this->alloc<T>()); |
+ return fRecords[i].set(this->allocCommand<T>()); |
} |
private: |
@@ -162,6 +163,13 @@ private: |
uint8_t fType; |
}; |
+ // No point in allocating a single byte we'll never use. |
+ template <typename T> |
+ SK_WHEN(SkTIsEmpty<T>, T*) allocCommand() { return NULL; } |
+ |
+ template <typename T> |
+ SK_WHEN(!SkTIsEmpty<T>, T*) allocCommand() { return this->alloc<T>(); } |
+ |
// An untyped pointer to some bytes in fAlloc. This is the interface for polymorphic dispatch: |
// visit() and mutate() work with the parallel fTypes array to do the work of a vtable. |
struct Record { |