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 <pulkomandy@gmail.com>
Reviewed-by: Axel Dörfler <axeld@pinc-software.de>
This commit is contained in:
X512 2020-07-02 15:16:53 +09:00 committed by Adrien Destugues
parent 74b6097078
commit 84b1893b73

View File

@ -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<typename C, typename DestructorResult,
DestructorResult (*Destructor)(C), C nullValue = -1>
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<int, int, close, -1> 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;