[DEV] add a worker interface

This commit is contained in:
Edouard DUPIN 2014-09-12 21:22:18 +02:00
parent 7c4d4ff1dc
commit 942b3a155d
9 changed files with 148 additions and 15 deletions

View File

@ -21,6 +21,7 @@ ewol::object::Manager::Manager(ewol::Context& _context) :
}
ewol::object::Manager::~Manager() {
m_workerList.clear();
bool hasError = false;
if (m_eObjectList.size()!=0) {
EWOL_ERROR("Must not have anymore eObject !!!");
@ -44,6 +45,10 @@ void ewol::object::Manager::displayListObject() {
void ewol::object::Manager::unInit() {
EWOL_DEBUG(" == > Un-Init Object-Manager");
if (m_workerList.size() > 0) {
EWOL_DEBUG(" == > Remove all workers");
m_workerList.clear();
}
for (auto &it : m_eObjectList) {
std::shared_ptr<ewol::Object> element = it.lock();
if (element != nullptr) {
@ -74,8 +79,7 @@ void ewol::object::Manager::cleanInternalRemoved() {
auto it(m_eObjectList.begin());
while (it != m_eObjectList.end()) {
if (it->expired() == true) {
m_eObjectList.erase(it);
it = m_eObjectList.begin();
it = m_eObjectList.erase(it);
} else {
++it;
}
@ -104,3 +108,18 @@ std::shared_ptr<ewol::Object> ewol::object::Manager::getObjectNamed(const std::s
return ewol::object::Manager::get(_name);
}
void ewol::object::Manager::workerAdd(const std::shared_ptr<ewol::Object>& _worker) {
m_workerList.push_back(_worker);
}
void ewol::object::Manager::workerRemove(const std::shared_ptr<ewol::Object>& _worker) {
auto it(m_workerList.begin());
while (it != m_workerList.end()) {
if (*it == _worker) {
it = m_workerList.erase(it);
} else {
++it;
}
}
}

View File

@ -52,6 +52,19 @@ namespace ewol {
* @return the requested object or nullptr
*/
std::shared_ptr<ewol::Object> getObjectNamed(const std::string& _name);
private:
std::vector<std::shared_ptr<ewol::Object>> m_workerList;
public:
/**
* @brief Add a worker on the system list.
* @param[in] _worker Worker to add in the list.
*/
void workerAdd(const std::shared_ptr<ewol::Object>& _worker);
/**
* @brief Remove a worker on the system list.
* @param[in] _worker Worker to add in the list.
*/
void workerRemove(const std::shared_ptr<ewol::Object>& _worker);
};
};
};

View File

@ -85,7 +85,7 @@ namespace ewol {
*/
void autoDestroy();
public:
void destroy() {
virtual void destroy() {
autoDestroy();
}
public:

View File

@ -72,10 +72,12 @@ namespace ewol {
* @param[in] _obj shared pointer on the removing object
*/
void release(std::shared_ptr<ewol::Object> _obj) {
for (auto it(m_callerList.begin()) ; it != m_callerList.end(); ++it) {
auto it(m_callerList.begin());
while(it != m_callerList.end()) {
if (it->first.lock() == _obj) {
m_callerList.erase(it);
it = m_callerList.begin();
it = m_callerList.erase(it);
} else {
++it;
}
}
}
@ -84,6 +86,15 @@ namespace ewol {
* @param[in] _data data to emit
*/
void emit(const T& _data) {
#ifdef DEBUG
int32_t tmpID = m_uidSignal++;
ewol::Object* srcObject = dynamic_cast<ewol::Object*>(&m_objectLink);
if (srcObject != nullptr) {
EWOL_DEBUG("emit signal{" << tmpID << "} : " << srcObject->getObjectType() << " signal='" << m_name << "' data='" << etk::to_string(_data) << "' to:");
} else {
EWOL_DEBUG("emit signal{" << tmpID << "} : signal='" << m_name << "' data='" << etk::to_string(_data) << "' to:");
}
#endif
for (auto &it : m_callerList) {
std::shared_ptr<ewol::Object> destObject = it.first.lock();
if (destObject == nullptr) {
@ -92,11 +103,10 @@ namespace ewol {
continue;
}
#ifdef DEBUG
ewol::Object* srcObject = dynamic_cast<ewol::Object*>(&m_objectLink);
if (srcObject != nullptr) {
EWOL_DEBUG("emit signal : " << srcObject->getObjectType() << " '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " data='" << etk::to_string(_data) << "'");
EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType());
} else {
EWOL_DEBUG("emit signal : '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " data='" << etk::to_string(_data) << "'");
EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType());
}
#endif
it.second(_data);
@ -157,14 +167,25 @@ namespace ewol {
* @param[in] _obj shared pointer on the removing object
*/
void release(std::shared_ptr<ewol::Object> _obj) {
for (auto it(m_callerList.begin()) ; it != m_callerList.end(); ++it) {
auto it(m_callerList.begin());
while(it != m_callerList.end()) {
if (it->first.lock() == _obj) {
m_callerList.erase(it);
it = m_callerList.begin();
it = m_callerList.erase(it);
} else {
++it;
}
}
}
void emit() {
#ifdef DEBUG
int32_t tmpID = m_uidSignal++;
ewol::Object* srcObject = dynamic_cast<ewol::Object*>(&m_objectLink);
if (srcObject != nullptr) {
EWOL_DEBUG("emit signal{" << tmpID << "} : " << srcObject->getObjectType() << " signal='" << m_name << "' BANG!!! to:");
} else {
EWOL_DEBUG("emit signal{" << tmpID << "} : signal='" << m_name << "' to:");
}
#endif
for (auto &it : m_callerList) {
std::shared_ptr<ewol::Object> destObject = it.first.lock();
if (destObject == nullptr) {
@ -173,11 +194,10 @@ namespace ewol {
continue;
}
#ifdef DEBUG
ewol::Object* srcObject = dynamic_cast<ewol::Object*>(&m_objectLink);
if (srcObject != nullptr) {
EWOL_DEBUG("emit signal : " << srcObject->getObjectType() << " '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " BANG!!!");
EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType());
} else {
EWOL_DEBUG("emit signal : '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " BANG!!!");
EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType());
}
#endif
it.second();

View File

@ -12,6 +12,7 @@
#include <ewol/object/SignalList.h>
#include <ewol/object/SignalBase.h>
int32_t ewol::object::SignalBase::m_uidSignal = 0;
ewol::object::SignalBase::SignalBase(ewol::object::SignalList& _objectLink,
const std::string& _name,
const std::string& _description) :

View File

@ -21,6 +21,7 @@ namespace ewol {
ewol::object::SignalList& m_objectLink;
std::string m_name;
std::string m_description;
static int32_t m_uidSignal;
public:
/**
* @brief Create a parameter with a specific type.

View File

@ -0,0 +1,34 @@
/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license APACHE v2.0 (see license file)
*/
#include <ewol/debug.h>
#include <ewol/object/Worker.h>
#include <ewol/object/Manager.h>
ewol::object::Worker::Worker() {
addObjectType("ewol::Worker");
}
void ewol::object::Worker::init() {
ewol::Object::init();
getObjectManager().workerAdd(shared_from_this());
}
//! @previous
void ewol::object::Worker::init(const std::string& _name) {
ewol::Object::init(_name);
getObjectManager().workerAdd(shared_from_this());
}
ewol::object::Worker::~Worker() {
// nothing to do ...
}
void ewol::object::Worker::destroy() {
ewol::Object::destroy();
getObjectManager().workerRemove(shared_from_this());
}

View File

@ -0,0 +1,44 @@
/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license APACHE v2.0 (see license file)
*/
#ifndef __EWOL_WORKER_H__
#define __EWOL_WORKER_H__
#include <ewol/debug.h>
#include <ewol/object/Object.h>
namespace ewol {
namespace object {
/**
* @brief A worker might not been possesed by someone, then the system might keep a pointer on it.
*/
class Worker : public ewol::Object {
protected:
/**
* @brief Constructor.
*/
Worker();
void init();
//! @previous
void init(const std::string& _name);
public:
/**
* @brief Factory
*/
DECLARE_FACTORY(Worker);
/**
* @brief Destructor
*/
virtual ~Worker();
public:
virtual void destroy();
};
};
};
#endif

View File

@ -90,6 +90,7 @@ def create(target):
myModule.add_src_file([
'ewol/object/Manager.cpp',
'ewol/object/Object.cpp',
'ewol/object/Worker.cpp',
'ewol/object/Parameter.cpp',
'ewol/object/ParameterList.cpp',
'ewol/object/ParamList.cpp',