From e378ab1c094dd0ef8da406665ae60cc3ac03b2f0 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 20 Apr 2008 02:54:38 +0000 Subject: [PATCH] Added MethodDeleter class, which calls a specified method on the object when destroyed. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25067 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/shared/AutoDeleter.h | 45 +++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/headers/private/shared/AutoDeleter.h b/headers/private/shared/AutoDeleter.h index 167d29d3c5..182501738b 100644 --- a/headers/private/shared/AutoDeleter.h +++ b/headers/private/shared/AutoDeleter.h @@ -141,7 +141,7 @@ struct CObjectDelete template inline void operator=(Destructor destructor) { - fDestructor = /*(void (*)(Type*))*/destructor; + fDestructor = destructor; } private: @@ -167,11 +167,54 @@ struct CObjectDeleter } }; + +// MethodDeleter + +template +struct MethodDelete +{ + inline void operator()(Type *object) + { + if (fDestructor) + (object->*fDestructor)(); + } + + template + inline void operator=(Destructor destructor) + { + fDestructor = destructor; + } + +private: + DestructorReturnType (Type::*fDestructor)(); +}; + + +template +struct MethodDeleter + : AutoDeleter > +{ + typedef AutoDeleter > Base; + + template + MethodDeleter(Destructor destructor) : Base() + { + Base::fDelete = destructor; + } + + template + MethodDeleter(Type *object, Destructor destructor) : Base(object) + { + Base::fDelete = destructor; + } +}; + } // namespace BPrivate using BPrivate::ObjectDeleter; using BPrivate::ArrayDeleter; using BPrivate::MemoryDeleter; using BPrivate::CObjectDeleter; +using BPrivate::MethodDeleter; #endif // _AUTO_DELETER_H