AutoDeleter: introduce HandleDeleter

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 <[email protected]>
Reviewed-by: Axel Dörfler <[email protected]>
This commit is contained in:
X512
2020-12-13 19:14:13 +00:00
committed by Adrien Destugues
parent 74b6097078
commit 84b1893b73
+41 -24
View File
@@ -11,7 +11,8 @@
ArrayDeleter - deletes an array ArrayDeleter - deletes an array
MemoryDeleter - free()s malloc()ed memory MemoryDeleter - free()s malloc()ed memory
CObjectDeleter - calls an arbitrary specified destructor function 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 { template<typename C, typename DestructorResult,
inline FileDescriptorCloser() DestructorResult (*Destructor)(C), C nullValue = -1>
: class HandleDeleter {
fDescriptor(-1) public:
inline HandleDeleter()
: fHandle(nullValue)
{ {
} }
inline FileDescriptorCloser(int descriptor) inline HandleDeleter(C handle)
: : fHandle(handle)
fDescriptor(descriptor)
{ {
} }
inline ~FileDescriptorCloser() inline ~HandleDeleter()
{ {
SetTo(-1); Destructor(fHandle);
} }
inline void SetTo(int descriptor) inline void SetTo(C handle)
{ {
if (fDescriptor >= 0) if (handle != fHandle) {
close(fDescriptor); Destructor(fHandle);
fHandle = handle;
fDescriptor = descriptor; }
} }
inline void Unset() 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; return fHandle;
fDescriptor = -1;
return descriptor;
} }
inline C Detach()
{
C handle = fHandle;
fHandle = nullValue;
return handle;
}
protected:
C fHandle;
private: private:
int fDescriptor; HandleDeleter(const HandleDeleter&);
HandleDeleter& operator=(const HandleDeleter&);
}; };
// FileDescriptorCloser
typedef HandleDeleter<int, int, close, -1> FileDescriptorCloser;
} // namespace BPrivate } // namespace BPrivate
@@ -269,6 +285,7 @@ using ::BPrivate::ArrayDeleter;
using ::BPrivate::MemoryDeleter; using ::BPrivate::MemoryDeleter;
using ::BPrivate::CObjectDeleter; using ::BPrivate::CObjectDeleter;
using ::BPrivate::MethodDeleter; using ::BPrivate::MethodDeleter;
using ::BPrivate::HandleDeleter;
using ::BPrivate::FileDescriptorCloser; using ::BPrivate::FileDescriptorCloser;