[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/debug.hpp>
|
||||
#include <etk/typeInfo.hpp>
|
||||
|
||||
ETK_DECLARE_TYPE(ememory::RefCounter);
|
||||
|
||||
ememory::RefCounter::~RefCounter() {
|
||||
if (m_refCount != 0) {
|
||||
|
@ -327,6 +327,7 @@ namespace ememory {
|
||||
private:
|
||||
void* m_element;
|
||||
ememory::Counter* m_counter;
|
||||
deleterCall m_deleter; //!< Function to call to delete the data pointer
|
||||
public:
|
||||
SharedPtr(void* _element);
|
||||
public:
|
||||
@ -361,13 +362,16 @@ namespace ememory {
|
||||
SharedPtr(SharedPtr<void>&& _obj) {
|
||||
m_element = _obj.m_element;
|
||||
m_counter = _obj.m_counter;
|
||||
m_deleter = _obj.m_deleter;
|
||||
_obj.m_element = null;
|
||||
_obj.m_counter = null;
|
||||
_obj.m_deleter = null;
|
||||
}
|
||||
template<class EMEMORY_TYPE2>
|
||||
SharedPtr(const SharedPtr<EMEMORY_TYPE2>& _obj):
|
||||
m_element((void*)_obj.get()),
|
||||
m_counter(_obj.getCounter()) {
|
||||
m_counter(_obj.getCounter()),
|
||||
m_deleter(_obj.getDeleter()) {
|
||||
if ( m_element == null
|
||||
|| m_counter == null) {
|
||||
m_element = null;
|
||||
@ -382,6 +386,7 @@ namespace ememory {
|
||||
SharedPtr(const SharedPtr<void>& _obj) {
|
||||
m_element = _obj.m_element;
|
||||
m_counter = _obj.m_counter;
|
||||
m_deleter = _obj.m_deleter;
|
||||
if ( m_element == null
|
||||
|| m_counter == null) {
|
||||
m_element = null;
|
||||
@ -398,6 +403,7 @@ namespace ememory {
|
||||
reset();
|
||||
m_element = (void*)_obj.get();
|
||||
m_counter = _obj.getCounter();
|
||||
m_deleter = _obj.getDeleter();
|
||||
if ( m_element == null
|
||||
|| m_counter == null) {
|
||||
m_element = null;
|
||||
@ -414,6 +420,7 @@ namespace ememory {
|
||||
reset();
|
||||
m_element = _obj.m_element;
|
||||
m_counter = _obj.m_counter;
|
||||
m_deleter = _obj.m_deleter;
|
||||
if ( m_element == null
|
||||
|| m_counter == null) {
|
||||
m_element = null;
|
||||
@ -437,10 +444,22 @@ namespace ememory {
|
||||
switch(rmData) {
|
||||
case ememory::Counter::remove::all:
|
||||
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;
|
||||
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;
|
||||
case ememory::Counter::remove::counter:
|
||||
ETK_DELETE(ememory::Counter, m_counter);
|
||||
@ -495,6 +514,9 @@ namespace ememory {
|
||||
ememory::Counter* getCounter() const {
|
||||
return m_counter;
|
||||
}
|
||||
deleterCall getDeleter() const {
|
||||
return m_deleter;
|
||||
}
|
||||
// TODO: unique
|
||||
// TODO: bool
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user