diff options
Diffstat (limited to 'include/core/SkPtrRecorder.h')
-rw-r--r-- | include/core/SkPtrRecorder.h | 70 |
1 files changed, 63 insertions, 7 deletions
diff --git a/include/core/SkPtrRecorder.h b/include/core/SkPtrRecorder.h index ff1e14d..db6c64d 100644 --- a/include/core/SkPtrRecorder.h +++ b/include/core/SkPtrRecorder.h @@ -14,19 +14,52 @@ * limitations under the License. */ -#ifndef SkPtrRecorder_DEFINED -#define SkPtrRecorder_DEFINED +#ifndef SkPtrSet_DEFINED +#define SkPtrSet_DEFINED #include "SkRefCnt.h" #include "SkTDArray.h" -class SkPtrRecorder : public SkRefCnt { +/** + * Maintains a set of ptrs, assigning each a unique ID [1...N]. Duplicate ptrs + * return the same ID (since its a set). Subclasses can override inPtr() + * and decPtr(). incPtr() is called each time a unique ptr is added ot the + * set. decPtr() is called on each ptr when the set is destroyed or reset. + */ +class SkPtrSet : public SkRefCnt { public: - uint32_t recordPtr(void*); + /** + * Search for the specified ptr in the set. If it is found, return its + * 32bit ID [1..N], or if not found, return 0. Always returns 0 for NULL. + */ + uint32_t find(void*) const; + + /** + * Add the specified ptr to the set, returning a unique 32bit ID for it + * [1...N]. Duplicate ptrs will return the same ID. + * + * If the ptr is NULL, it is not added, and 0 is returned. + */ + uint32_t add(void*); + /** + * Return the number of (non-null) ptrs in the set. + */ int count() const { return fList.count(); } - void getPtrs(void* array[]) const; + /** + * Copy the ptrs in the set into the specified array (allocated by the + * caller). The ptrs are assgined to the array based on their corresponding + * ID. e.g. array[ptr.ID - 1] = ptr. + * + * incPtr() and decPtr() are not called during this operation. + */ + void copyToArray(void* array[]) const; + + /** + * Call decPtr() on each ptr in the set, and the reset the size of the set + * to 0. + */ void reset(); protected: @@ -35,9 +68,14 @@ protected: private: struct Pair { - void* fPtr; - uint32_t fIndex; + void* fPtr; // never NULL + uint32_t fIndex; // 1...N }; + + // we store the ptrs in sorted-order (using Cmp) so that we can efficiently + // detect duplicates when add() is called. Hence we need to store the + // ptr and its ID/fIndex explicitly, since the ptr's position in the array + // is not related to its "index". SkTDArray<Pair> fList; static int Cmp(const Pair& a, const Pair& b); @@ -45,4 +83,22 @@ private: typedef SkRefCnt INHERITED; }; +/** + * Templated wrapper for SkPtrSet, just meant to automate typecasting + * parameters to and from void* (which the base class expects). + */ +template <typename T> class SkTPtrSet : public SkPtrSet { +public: + uint32_t add(T ptr) { + return this->INHERITED::add((void*)ptr); + } + + void copyToArray(T* array) const { + this->INHERITED::copyToArray((void**)array); + } + +private: + typedef SkPtrSet INHERITED; +}; + #endif |