#ifndef VOIDPTR_H #define VOIDPTR_H #include "object.h" class VoidPtr { Object *p_obj; void *p_void; public: inline VoidPtr() : p_obj(0), p_void(0) { } inline VoidPtr(const VoidPtr & vp) : p_obj(vp.p_obj), p_void(vp.p_void) { safeRef(); } template inline VoidPtr(T *p) { p_obj = static_cast(p); p_void = reinterpret_cast(p); safeRef(); } template inline VoidPtr(Ptr p) { p_obj = static_cast( & *p); p_void = reinterpret_cast( & *p); safeRef(); } inline ~VoidPtr() { safeUnref(); } inline VoidPtr & operator= (const VoidPtr & vp) { Object * old_p_obj = p_obj; p_obj = vp.p_obj; p_void = vp.p_void; safeRef(); if (old_p_obj) old_p_obj->unref(); return *this; } inline template operator T * () const { return reinterpret_cast p_void; } inline template T dynamic_cast() { return dynamic_cast(p_void); } protected: void safeRef() { if(p_obj) p_obj->ref(); } void safeUnref() { if(p_obj) p_obj->unref(); } }; #endif