diff --git a/headers/private/shared/AutoDeleter.h b/headers/private/shared/AutoDeleter.h index 45cc8107d6..167d29d3c5 100644 --- a/headers/private/shared/AutoDeleter.h +++ b/headers/private/shared/AutoDeleter.h @@ -6,9 +6,10 @@ #define _AUTO_DELETER_H /*! Scope-based automatic deletion of objects/arrays. - ObjectDeleter - deletes an object - ArrayDeleter - deletes an array - MemoryDeleter - free()s malloc()ed memory + ObjectDeleter - deletes an object + ArrayDeleter - deletes an array + MemoryDeleter - free()s malloc()ed memory + CObjectDeleter - calls an arbitrary specified destructor function */ #include @@ -65,7 +66,7 @@ public: return object; } -private: +protected: C *fObject; DeleteFunc fDelete; }; @@ -125,10 +126,52 @@ struct MemoryDeleter : AutoDeleter MemoryDeleter(void *memory) : AutoDeleter(memory) {} }; + +// CObjectDeleter + +template +struct CObjectDelete +{ + inline void operator()(Type *object) + { + if (fDestructor != NULL) + fDestructor(object); + } + + template + inline void operator=(Destructor destructor) + { + fDestructor = /*(void (*)(Type*))*/destructor; + } + +private: + DestructorReturnType (*fDestructor)(Type*); +}; + +template +struct CObjectDeleter + : AutoDeleter > +{ + typedef AutoDeleter > Base; + + template + CObjectDeleter(Destructor destructor) : Base() + { + Base::fDelete = destructor; + } + + template + CObjectDeleter(Type *object, Destructor destructor) : Base(object) + { + Base::fDelete = destructor; + } +}; + } // namespace BPrivate using BPrivate::ObjectDeleter; using BPrivate::ArrayDeleter; using BPrivate::MemoryDeleter; +using BPrivate::CObjectDeleter; #endif // _AUTO_DELETER_H