[DEV] add deleter at the sharedPtr<void>

This commit is contained in:
Edouard DUPIN 2018-08-12 14:53:30 +02:00
parent 2a211653e0
commit 934356875e
2 changed files with 28 additions and 3 deletions

View File

@ -6,6 +6,9 @@
#include <ememory/RefCounter.hpp> #include <ememory/RefCounter.hpp>
#include <ememory/debug.hpp> #include <ememory/debug.hpp>
#include <etk/typeInfo.hpp>
ETK_DECLARE_TYPE(ememory::RefCounter);
ememory::RefCounter::~RefCounter() { ememory::RefCounter::~RefCounter() {
if (m_refCount != 0) { if (m_refCount != 0) {

View File

@ -327,6 +327,7 @@ namespace ememory {
private: private:
void* m_element; void* m_element;
ememory::Counter* m_counter; ememory::Counter* m_counter;
deleterCall m_deleter; //!< Function to call to delete the data pointer
public: public:
SharedPtr(void* _element); SharedPtr(void* _element);
public: public:
@ -361,13 +362,16 @@ namespace ememory {
SharedPtr(SharedPtr<void>&& _obj) { SharedPtr(SharedPtr<void>&& _obj) {
m_element = _obj.m_element; m_element = _obj.m_element;
m_counter = _obj.m_counter; m_counter = _obj.m_counter;
m_deleter = _obj.m_deleter;
_obj.m_element = null; _obj.m_element = null;
_obj.m_counter = null; _obj.m_counter = null;
_obj.m_deleter = null;
} }
template<class EMEMORY_TYPE2> template<class EMEMORY_TYPE2>
SharedPtr(const SharedPtr<EMEMORY_TYPE2>& _obj): SharedPtr(const SharedPtr<EMEMORY_TYPE2>& _obj):
m_element((void*)_obj.get()), m_element((void*)_obj.get()),
m_counter(_obj.getCounter()) { m_counter(_obj.getCounter()),
m_deleter(_obj.getDeleter()) {
if ( m_element == null if ( m_element == null
|| m_counter == null) { || m_counter == null) {
m_element = null; m_element = null;
@ -382,6 +386,7 @@ namespace ememory {
SharedPtr(const SharedPtr<void>& _obj) { SharedPtr(const SharedPtr<void>& _obj) {
m_element = _obj.m_element; m_element = _obj.m_element;
m_counter = _obj.m_counter; m_counter = _obj.m_counter;
m_deleter = _obj.m_deleter;
if ( m_element == null if ( m_element == null
|| m_counter == null) { || m_counter == null) {
m_element = null; m_element = null;
@ -398,6 +403,7 @@ namespace ememory {
reset(); reset();
m_element = (void*)_obj.get(); m_element = (void*)_obj.get();
m_counter = _obj.getCounter(); m_counter = _obj.getCounter();
m_deleter = _obj.getDeleter();
if ( m_element == null if ( m_element == null
|| m_counter == null) { || m_counter == null) {
m_element = null; m_element = null;
@ -414,6 +420,7 @@ namespace ememory {
reset(); reset();
m_element = _obj.m_element; m_element = _obj.m_element;
m_counter = _obj.m_counter; m_counter = _obj.m_counter;
m_deleter = _obj.m_deleter;
if ( m_element == null if ( m_element == null
|| m_counter == null) { || m_counter == null) {
m_element = null; m_element = null;
@ -437,10 +444,22 @@ namespace ememory {
switch(rmData) { switch(rmData) {
case ememory::Counter::remove::all: case ememory::Counter::remove::all:
ETK_DELETE(ememory::Counter, m_counter); ETK_DELETE(ememory::Counter, m_counter);
EMEMORY_WARNING("Maybe a leak ==> no deleter of the SharedPtr<void>"); if (m_deleter != null) {
if (m_element != null) {
m_deleter((void*)m_element);
}
} else {
EMEMORY_WARNING("Maybe a leak ==> no deleter of the SharedPtr<void>");
}
break; break;
case ememory::Counter::remove::data: case ememory::Counter::remove::data:
EMEMORY_WARNING("Maybe a leak ==> no deleter of the SharedPtr<void>"); if (m_deleter != null) {
if (m_element != null) {
m_deleter((void*)m_element);
}
} else {
EMEMORY_WARNING("Maybe a leak ==> no deleter of the SharedPtr<void>");
}
break; break;
case ememory::Counter::remove::counter: case ememory::Counter::remove::counter:
ETK_DELETE(ememory::Counter, m_counter); ETK_DELETE(ememory::Counter, m_counter);
@ -495,6 +514,9 @@ namespace ememory {
ememory::Counter* getCounter() const { ememory::Counter* getCounter() const {
return m_counter; return m_counter;
} }
deleterCall getDeleter() const {
return m_deleter;
}
// TODO: unique // TODO: unique
// TODO: bool // TODO: bool
}; };