diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-07-15 15:25:22 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-07-15 15:25:22 +0000 |
commit | 7f6d6d4571c0682c81f8508ac4862b2dfea20aec (patch) | |
tree | 541e664adc6bcf8fc196dee10c202ffae668ff63 | |
parent | e36ddf01311802dd5c5fe85d47a9bd84b2b84565 (diff) |
add validate() and SkAutoRef
git-svn-id: http://skia.googlecode.com/svn/trunk@1872 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | include/core/SkRefCnt.h | 72 |
1 files changed, 43 insertions, 29 deletions
diff --git a/include/core/SkRefCnt.h b/include/core/SkRefCnt.h index 36f4249f21..b18602964b 100644 --- a/include/core/SkRefCnt.h +++ b/include/core/SkRefCnt.h @@ -63,10 +63,46 @@ public: } } + void validate() const { + SkASSERT(fRefCnt > 0); + } + private: mutable int32_t fRefCnt; }; +/////////////////////////////////////////////////////////////////////////////// + +/** Helper macro to safely assign one SkRefCnt[TS]* to another, checking for + null in on each side of the assignment, and ensuring that ref() is called + before unref(), in case the two pointers point to the same object. + */ +#define SkRefCnt_SafeAssign(dst, src) \ + do { \ + if (src) src->ref(); \ + if (dst) dst->unref(); \ + dst = src; \ + } while (0) + + +/** Check if the argument is non-null, and if so, call obj->ref() + */ +template <typename T> static inline void SkSafeRef(T* obj) { + if (obj) { + obj->ref(); + } +} + +/** Check if the argument is non-null, and if so, call obj->unref() + */ +template <typename T> static inline void SkSafeUnref(T* obj) { + if (obj) { + obj->unref(); + } +} + +/////////////////////////////////////////////////////////////////////////////// + /** * Utility class that simply unref's its argument in the destructor. */ @@ -98,35 +134,13 @@ public: SkAutoUnref(SkRefCnt* obj) : SkAutoTUnref<SkRefCnt>(obj) {} }; -/////////////////////////////////////////////////////////////////////////////// - -/** Helper macro to safely assign one SkRefCnt[TS]* to another, checking for - null in on each side of the assignment, and ensuring that ref() is called - before unref(), in case the two pointers point to the same object. -*/ -#define SkRefCnt_SafeAssign(dst, src) \ - do { \ - if (src) src->ref(); \ - if (dst) dst->unref(); \ - dst = src; \ - } while (0) - - -/** Check if the argument is non-null, and if so, call obj->ref() - */ -template <typename T> static inline void SkSafeRef(T* obj) { - if (obj) { - obj->ref(); - } -} - -/** Check if the argument is non-null, and if so, call obj->unref() - */ -template <typename T> static inline void SkSafeUnref(T* obj) { - if (obj) { - obj->unref(); - } -} +class SkAutoRef : SkNoncopyable { +public: + SkAutoRef(SkRefCnt* obj) : fObj(obj) { SkSafeRef(obj); } + ~SkAutoRef() { SkSafeUnref(fObj); } +private: + SkRefCnt* fObj; +}; /** Wrapper class for SkRefCnt pointers. This manages ref/unref of a pointer to a SkRefCnt (or subclass) object. |