From 34cbfd39d3e0641a1fa046d58d1facefcb41aa50 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 13 Apr 2008 22:33:44 +0000 Subject: [PATCH] Added CObjectDeleter class, which invokes a given destructor function. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24963 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/shared/AutoDeleter.h | 51 +++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) 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