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:
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user