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