Added SmartHandle.h
This commit is contained in:
parent
bfdd4ef8ec
commit
580e0a53e3
91
include/SmartHandle.h
Normal file
91
include/SmartHandle.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#ifndef SMARTHANDLE_H
|
||||||
|
#define SMARTHANDLE_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smart handle is like a smart pointer. It simply deletes the object on destruction using a custom deleter
|
||||||
|
* It differs from `std::unique_ptr` by that it doesn't expect a pointer
|
||||||
|
*/
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
class SmartHandle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef T value_type;
|
||||||
|
typedef Deleter deleter_function;
|
||||||
|
private:
|
||||||
|
T _value;
|
||||||
|
Deleter _deleter;
|
||||||
|
bool _doDelete;
|
||||||
|
void _delete();
|
||||||
|
public:
|
||||||
|
SmartHandle();
|
||||||
|
SmartHandle(T value, Deleter deleter);
|
||||||
|
SmartHandle(const SmartHandle& orig) = delete;
|
||||||
|
SmartHandle& operator=(const SmartHandle& orig) = delete;
|
||||||
|
SmartHandle(SmartHandle&& src);
|
||||||
|
~SmartHandle();
|
||||||
|
T get() const;
|
||||||
|
void reset();
|
||||||
|
void reset(T value, Deleter deleter);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
SmartHandle<T,Deleter>::SmartHandle()
|
||||||
|
{
|
||||||
|
this->_doDelete = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
SmartHandle<T,Deleter>::SmartHandle(T value, Deleter deleter)
|
||||||
|
{
|
||||||
|
this->_doDelete = 0;
|
||||||
|
this->reset(value,deleter);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename Deleter>
|
||||||
|
SmartHandle<T,Deleter>::SmartHandle(SmartHandle&& src)
|
||||||
|
{
|
||||||
|
this->reset(src._value,src._deleter);
|
||||||
|
src._doDelete = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
void SmartHandle<T,Deleter>::reset(T value, Deleter deleter)
|
||||||
|
{
|
||||||
|
if(this->_doDelete) {
|
||||||
|
this->_delete();
|
||||||
|
}
|
||||||
|
this->_value = value;
|
||||||
|
this->_deleter = deleter;
|
||||||
|
this->_doDelete = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
void SmartHandle<T,Deleter>::reset()
|
||||||
|
{
|
||||||
|
if(this->_doDelete) {
|
||||||
|
this->_delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
T SmartHandle<T,Deleter>::get() const
|
||||||
|
{
|
||||||
|
return _value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
void SmartHandle<T,Deleter>::_delete()
|
||||||
|
{
|
||||||
|
_deleter(_value);
|
||||||
|
this->_doDelete = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Deleter>
|
||||||
|
SmartHandle<T,Deleter>::~SmartHandle()
|
||||||
|
{
|
||||||
|
if(this->_doDelete) {
|
||||||
|
_delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SMARTHANDLE_H
|
Loading…
Reference in New Issue
Block a user