From 84b1893b732027989e8432a49e465355a318b4d2 Mon Sep 17 00:00:00 2001 From: X512 Date: Thu, 2 Jul 2020 15:16:53 +0900 Subject: [PATCH] AutoDeleter: introduce HandleDeleter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It allow to use arbitrary handle type, null value and destructor function. Change-Id: I87c444cb7ef1b08d1dbed7fe4171700171d651d2 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2977 Reviewed-by: Adrien Destugues Reviewed-by: Axel Dörfler --- headers/private/shared/AutoDeleter.h | 65 ++++++++++++++++++---------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/headers/private/shared/AutoDeleter.h b/headers/private/shared/AutoDeleter.h index d4f7d98d64..cbf81b1de1 100644 --- a/headers/private/shared/AutoDeleter.h +++ b/headers/private/shared/AutoDeleter.h @@ -11,7 +11,8 @@ ArrayDeleter - deletes an array MemoryDeleter - free()s malloc()ed memory CObjectDeleter - calls an arbitrary specified destructor function - FileDescriptorCloser - closes a file descriptor + HandleDeleter - use arbitrary handle type and destructor function + FileDescriptorCloser - closes a file descriptor, based on HandleDeleter */ @@ -211,56 +212,71 @@ struct MethodDeleter }; -// FileDescriptorCloser +// HandleDeleter -struct FileDescriptorCloser { - inline FileDescriptorCloser() - : - fDescriptor(-1) +template +class HandleDeleter { +public: + inline HandleDeleter() + : fHandle(nullValue) { } - inline FileDescriptorCloser(int descriptor) - : - fDescriptor(descriptor) + inline HandleDeleter(C handle) + : fHandle(handle) { } - inline ~FileDescriptorCloser() + inline ~HandleDeleter() { - SetTo(-1); + Destructor(fHandle); } - inline void SetTo(int descriptor) + inline void SetTo(C handle) { - if (fDescriptor >= 0) - close(fDescriptor); - - fDescriptor = descriptor; + if (handle != fHandle) { + Destructor(fHandle); + fHandle = handle; + } } inline void Unset() { - SetTo(-1); + SetTo(nullValue); } - inline int Get() + inline void Delete() { - return fDescriptor; + SetTo(nullValue); } - inline int Detach() + inline C Get() const { - int descriptor = fDescriptor; - fDescriptor = -1; - return descriptor; + return fHandle; } + inline C Detach() + { + C handle = fHandle; + fHandle = nullValue; + return handle; + } + +protected: + C fHandle; + private: - int fDescriptor; + HandleDeleter(const HandleDeleter&); + HandleDeleter& operator=(const HandleDeleter&); }; +// FileDescriptorCloser + +typedef HandleDeleter FileDescriptorCloser; + + } // namespace BPrivate @@ -269,6 +285,7 @@ using ::BPrivate::ArrayDeleter; using ::BPrivate::MemoryDeleter; using ::BPrivate::CObjectDeleter; using ::BPrivate::MethodDeleter; +using ::BPrivate::HandleDeleter; using ::BPrivate::FileDescriptorCloser;