ememory/ememory/UniquePtr.hpp

153 lines
4.8 KiB
C++

#pragma once
#include <etk/types.hpp>
namespace ememory {
template <class EMEM_UPTR_TYPE>
class UniquePtr {
public:
using deleterCall = etk::Function<void(void* _data)>;
//private: Do it better ...
public:
EMEM_UPTR_TYPE* m_pointer;
deleterCall m_deleter; //!< Function to call to delete the data pointer
private:
template <class EMEM_UPTR_TYPE_2>
UniquePtr(UniquePtr<EMEM_UPTR_TYPE_2> &) = delete;
template <class EMEM_UPTR_TYPE_2>
UniquePtr &operator=(UniquePtr<EMEM_UPTR_TYPE_2> &) = delete;
public:
UniquePtr() :
m_pointer(nullptr),
m_deleter(nullptr) {
}
UniquePtr(etk::NullPtr) :
m_pointer(nullptr),
m_deleter(nullptr) {
}
explicit UniquePtr(EMEM_UPTR_TYPE* _obj, deleterCall&& _deleter = [](void* _data) { ETK_DELETE(EMEM_UPTR_TYPE, _data);}) :
m_pointer(_obj),
m_deleter(_deleter) {
ETK_MEM_CHECK_POINTER(_obj);
}
template <class EMEM_UPTR_TYPE_2>
UniquePtr(UniquePtr<EMEM_UPTR_TYPE_2>&& _obj) :
m_pointer(nullptr),
m_deleter(nullptr) {
etk::swap(_obj.m_pointer, m_pointer);
etk::swap(_obj.m_deleter, m_deleter);
}
~UniquePtr() {
reset();
}
UniquePtr& operator=(etk::NullPtr) {
reset();
return *this;
}
UniquePtr& operator=(UniquePtr&& _obj) {
reset();
etk::swap(_obj.m_pointer, m_pointer);
etk::swap(_obj.m_deleter, m_deleter);
return *this;
}
/*
template <class EMEM_UPTR_TYPE_2>
UniquePtr& operator=(UniquePtr<EMEM_UPTR_TYPE_2>& _obj){
reset();
m_pointer = _obj.m_pointer;
_obj.m_pointer = nullptr;
return *this;
}*/
const EMEM_UPTR_TYPE& operator*() const {
return *m_pointer;
}
EMEM_UPTR_TYPE& operator*() {
return *m_pointer;
}
const EMEM_UPTR_TYPE* operator->() const {
return m_pointer;
}
EMEM_UPTR_TYPE* operator->() {
return m_pointer;
}
EMEM_UPTR_TYPE* get() const{
return m_pointer;
}
EMEM_UPTR_TYPE *release(){
EMEM_UPTR_TYPE *tmp = m_pointer;
m_pointer = nullptr;
return tmp;
}
void reset(){
if (m_deleter != nullptr) {
m_deleter(m_pointer);
}
m_pointer = nullptr;
}
void swap(UniquePtr &_obj){
etk::swap(_obj.m_pointer, m_pointer);
etk::swap(_obj.m_deleter, m_deleter);
}
/**
* @brief Check if the UniquePtr have an internal data (not nullptr)
* @return true The pointer is not asigned, false otherwise
*/
bool operator==(etk::NullPtr) const {
return m_pointer == nullptr;
}
/**
* @brief Check if the UniquePtr have not an internal data (equal nullptr)
* @return true The pointer is asigned, false otherwise
*/
bool operator!=(etk::NullPtr) const {
return m_pointer != nullptr;
}
/*
template <class EMEM_UPTR_TYPE_2>
void swap(UniquePtr<EMEM_UPTR_TYPE_2>& _obj) {
etk::swap(m_pointer, _obj.m_pointer);
}
*/
};
template<class EMEM_UPTR_TYPE, class... EMEM_UPTR_ARG>
UniquePtr<EMEM_UPTR_TYPE> makeUniquePtr(EMEM_UPTR_ARG ... _obj) {
return ememory::UniquePtr<EMEM_UPTR_TYPE>(ETK_NEW(EMEM_UPTR_TYPE, _obj...));
}
template <class EMEM_UPTR_TYPE>
inline void swap(UniquePtr<EMEM_UPTR_TYPE> &_obj1, UniquePtr<EMEM_UPTR_TYPE> &_obj2) {
_obj1.swap(_obj2);
}
/*
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator==(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() == y.get();
}
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator!=(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() != y.get();
}
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator<(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() < y.get();
}
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator<=(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() <= y.get();
}
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator>(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() > y.get();
}
template <class EMEM_UPTR_TYPE_1, class EMEM_UPTR_DELETER_1, class EMEM_UPTR_TYPE_2, class EMEM_UPTR_DELETER_2>
bool operator>=(const UniquePtr<EMEM_UPTR_TYPE_1, EMEM_UPTR_DELETER_1> &x, const UniquePtr<EMEM_UPTR_TYPE_2, EMEM_UPTR_DELETER_2> &y) {
return x.get() >= y.get();
}
*/
}