[DEV] add deleter at the sharedPtr<void>
This commit is contained in:
parent
2a211653e0
commit
934356875e
@ -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) {
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user