From 058b29ac34fdbdf6a81645d0c2dac4681dd3b721 Mon Sep 17 00:00:00 2001 From: X512 Date: Wed, 9 Dec 2020 18:33:38 +0900 Subject: [PATCH] AutoDeleter: introduce MethodObjectDeleter It allows to call destructor function stored in struct object such as device_manager_info::put_node. Change-Id: If9162f2f449d2b1c52c39509fa8732f21debf04a Reviewed-on: https://review.haiku-os.org/c/haiku/+/3484 Reviewed-by: Alex von Gluck IV --- headers/private/shared/AutoDeleter.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/headers/private/shared/AutoDeleter.h b/headers/private/shared/AutoDeleter.h index 2d24368f2b..ac8a441e73 100644 --- a/headers/private/shared/AutoDeleter.h +++ b/headers/private/shared/AutoDeleter.h @@ -11,6 +11,7 @@ ArrayDeleter - deletes an array MemoryDeleter - free()s malloc()ed memory CObjectDeleter - calls an arbitrary specified destructor function + MethodObjectDeleter - calls an arbitrary object function in given struct ptr HandleDeleter - use arbitrary handle type and destructor function FileDescriptorCloser - closes a file descriptor, based on HandleDeleter */ @@ -218,6 +219,31 @@ struct MethodDeleter }; +// MethodObjectDeleter + +template +struct MethodObjectDelete { + inline void operator()(Type *object) + { + if (object != NULL) + ((**table).*Deleter)(object); + } +}; + +template +struct MethodObjectDeleter + : AutoDeleter > +{ + typedef AutoDeleter > Base; + + MethodObjectDeleter() : Base() {} + MethodObjectDeleter(Type *object) : Base(object) {} +}; + + // HandleDeleter struct StatusHandleChecker @@ -308,6 +334,7 @@ using ::BPrivate::ArrayDeleter; using ::BPrivate::MemoryDeleter; using ::BPrivate::CObjectDeleter; using ::BPrivate::MethodDeleter; +using ::BPrivate::MethodObjectDeleter; using ::BPrivate::HandleDeleter; using ::BPrivate::FileDescriptorCloser;