[DEV] start rework remove object
This commit is contained in:
parent
4c68791bdd
commit
03336135d6
@ -89,6 +89,41 @@ void ewol::object::Manager::add(const ewol::object::Shared<ewol::Object>& _objec
|
|||||||
m_eObjectList.push_back(_object);
|
m_eObjectList.push_back(_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ewol::object::Manager::rm(const ewol::object::Shared<ewol::Object>& _object) {
|
||||||
|
if (_object == nullptr) {
|
||||||
|
EWOL_ERROR("Try to remove (nullptr) Object");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
|
||||||
|
if (m_eObjectList[iii] == _object) {
|
||||||
|
// remove Element
|
||||||
|
m_eObjectList[iii] = nullptr;
|
||||||
|
m_eObjectList.erase(m_eObjectList.begin()+iii);
|
||||||
|
informOneObjectIsRemoved(_object);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check if the object has not been auto removed ... or remove in defered time ...
|
||||||
|
for (size_t iii=0; iii<m_eObjectAutoRemoveList.size(); iii++) {
|
||||||
|
if( m_eObjectAutoRemoveList[iii] != nullptr
|
||||||
|
&& m_eObjectAutoRemoveList[iii] == _object) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// in this case, we have an error ...
|
||||||
|
EWOL_ERROR("Try to remove Object that is not referenced ...");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ewol::object::Manager::addOwned(const ewol::object::Shared<ewol::Object>& _object) {
|
||||||
|
// What I need to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
void ewol::object::Manager::rmOwned(const ewol::object::Shared<ewol::Object>& _object) {
|
||||||
|
// What I need to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ewol::object::Manager::getNumberObject() {
|
int32_t ewol::object::Manager::getNumberObject() {
|
||||||
return m_eObjectList.size() + m_eObjectAutoRemoveList.size();
|
return m_eObjectList.size() + m_eObjectAutoRemoveList.size();
|
||||||
}
|
}
|
||||||
@ -125,29 +160,8 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared<
|
|||||||
ewol::getContext().onObjectRemove(_object);
|
ewol::getContext().onObjectRemove(_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ewol::object::Manager::rm(const ewol::object::Shared<ewol::Object>& _object) {
|
void ewol::object::Manager::autoRespown(const ewol::object::Shared<ewol::Object>& _object){
|
||||||
if (_object == nullptr) {
|
|
||||||
EWOL_ERROR("Try to remove (nullptr) Object");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
|
|
||||||
if (m_eObjectList[iii] == _object) {
|
|
||||||
// remove Element
|
|
||||||
m_eObjectList[iii] = nullptr;
|
|
||||||
m_eObjectList.erase(m_eObjectList.begin()+iii);
|
|
||||||
informOneObjectIsRemoved(_object);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// check if the object has not been auto removed ... or remove in defered time ...
|
|
||||||
for (size_t iii=0; iii<m_eObjectAutoRemoveList.size(); iii++) {
|
|
||||||
if( m_eObjectAutoRemoveList[iii] != nullptr
|
|
||||||
&& m_eObjectAutoRemoveList[iii] == _object) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// in this case, we have an error ...
|
|
||||||
EWOL_ERROR("Try to remove Object that is not referenced ...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ewol::object::Manager::autoRemove(const ewol::object::Shared<ewol::Object>& _object) {
|
void ewol::object::Manager::autoRemove(const ewol::object::Shared<ewol::Object>& _object) {
|
||||||
|
@ -29,9 +29,12 @@ namespace ewol {
|
|||||||
|
|
||||||
void add(const ewol::object::Shared<ewol::Object>& _object);
|
void add(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
void rm(const ewol::object::Shared<ewol::Object>& _object);
|
void rm(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
|
void addOwned(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
|
void rmOwned(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
int32_t getNumberObject();
|
int32_t getNumberObject();
|
||||||
|
|
||||||
void autoRemove(const ewol::object::Shared<ewol::Object>& _object);
|
void autoRemove(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
|
void autoRespown(const ewol::object::Shared<ewol::Object>& _object);
|
||||||
void removeAllAutoRemove();
|
void removeAllAutoRemove();
|
||||||
|
|
||||||
ewol::object::Shared<ewol::Object> get(const std::string& _name);
|
ewol::object::Shared<ewol::Object> get(const std::string& _name);
|
||||||
|
@ -38,12 +38,14 @@ bool ewol::Object::setRefOwner(bool _haveOwner) {
|
|||||||
return false;;
|
return false;;
|
||||||
}
|
}
|
||||||
m_hasReferenceOwner = true;
|
m_hasReferenceOwner = true;
|
||||||
|
getObjectManager().addOwned(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (m_hasReferenceOwner == false) {
|
if (m_hasReferenceOwner == false) {
|
||||||
EWOL_CRITICAL("Object have already NO owner");
|
EWOL_CRITICAL("Object have already NO owner");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
getObjectManager().rmOwned(this);
|
||||||
m_hasReferenceOwner = false;
|
m_hasReferenceOwner = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -68,6 +70,31 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) {
|
|||||||
::operator delete(_ptr);
|
::operator delete(_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ewol::Object::autoDestroy() {
|
||||||
|
std::unique_lock<std::mutex> lock(m_lockRefCount);
|
||||||
|
if (m_isDestroyed == true) {
|
||||||
|
EWOL_WARNING("Request remove of a removed object");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_isDestroyed = true;
|
||||||
|
getObjectManager().autoRemove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ewol::Object::removeObject() {
|
||||||
|
autoDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void respownObject() {
|
||||||
|
std::unique_lock<std::mutex> lock(m_lockRefCount);
|
||||||
|
if (m_isDestroyed == false) {
|
||||||
|
EWOL_WARNING("Respawn an alive object");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_isDestroyed = false;
|
||||||
|
getObjectManager().autoRespown(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ewol::Object::Object() :
|
ewol::Object::Object() :
|
||||||
@ -143,14 +170,6 @@ bool ewol::Object::isTypeCompatible(const std::string& _type) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ewol::Object::autoDestroy() {
|
|
||||||
getObjectManager().autoRemove(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::Object::removeObject() {
|
|
||||||
getObjectManager().autoRemove(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::Object::addEventId(const char * _generateEventId) {
|
void ewol::Object::addEventId(const char * _generateEventId) {
|
||||||
if (nullptr != _generateEventId) {
|
if (nullptr != _generateEventId) {
|
||||||
m_availlableEventId.push_back(_generateEventId);
|
m_availlableEventId.push_back(_generateEventId);
|
||||||
|
@ -93,6 +93,8 @@ namespace ewol {
|
|||||||
* @brief Destructor
|
* @brief Destructor
|
||||||
*/
|
*/
|
||||||
virtual ~Object();
|
virtual ~Object();
|
||||||
|
private:
|
||||||
|
bool m_isDestroyed;
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* @brief Auto-destroy the object
|
* @brief Auto-destroy the object
|
||||||
@ -103,6 +105,11 @@ namespace ewol {
|
|||||||
* @brief Asynchronous removing the object
|
* @brief Asynchronous removing the object
|
||||||
*/
|
*/
|
||||||
void removeObject();
|
void removeObject();
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Respown a removed object
|
||||||
|
*/
|
||||||
|
void respownObject();
|
||||||
private:
|
private:
|
||||||
std::vector<const char*> m_listType;
|
std::vector<const char*> m_listType;
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user