Added SmartHandle.h

This commit is contained in:
Samer Afach 2017-04-23 20:44:09 +02:00
parent bfdd4ef8ec
commit 580e0a53e3
1 changed files with 91 additions and 0 deletions

91
include/SmartHandle.h Normal file
View 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