Newer
Older
/*
* Copyright 2010,
* François Bleibel,
* Olivier Stasse,
Francois Bleibel
committed
*
Francois Bleibel
committed
*
Francois Bleibel
committed
/* --------------------------------------------------------------------- */
/* --- INCLUDE --------------------------------------------------------- */
/* --------------------------------------------------------------------- */
Francois Bleibel
committed
#include <list>
#include <typeinfo>
#include <sstream>
#include <string>
#include "dynamic-graph/pool.h"
#include "dynamic-graph/debug.h"
#include "dynamic-graph/entity.h"
Francois Bleibel
committed
using namespace dynamicgraph;
/* --------------------------------------------------------------------- */
/* --- CLASS ----------------------------------------------------------- */
/* --------------------------------------------------------------------- */
if (instance_ == 0) {
instance_ = new PoolStorage;
}
return instance_;
}
delete instance_;
instance_ = NULL;
}
Francois Bleibel
committed
dgDEBUGIN(15);
for (Entities::iterator iter = entityMap.begin(); iter != entityMap.end();
// Here, this is normal that the next iteration is at the beginning
// of the map as deregisterEntity remove the element iter from the map.
iter = entityMap.begin()) {
dgDEBUG(15) << "Delete \"" << (iter->first) << "\"" << std::endl;
Entity* entity = iter->second;
deregisterEntity(iter);
delete (entity);
}
Francois Bleibel
committed
dgDEBUGOUT(15);
}
/* --------------------------------------------------------------------- */
void PoolStorage::registerEntity(const std::string& entname, Entity* ent) {
Entities::iterator entkey = entityMap.find(entname);
if (entkey != entityMap.end()) // key does exist
{
throw ExceptionFactory(ExceptionFactory::OBJECT_CONFLICT, "Another entity already defined with the same name. ",
"Entity name is <%s>.", entname.c_str());
} else {
dgDEBUG(10) << "Register entity <" << entname << "> in the pool." << std::endl;
entityMap[entname] = ent;
}
Francois Bleibel
committed
}
void PoolStorage::deregisterEntity(const std::string& entname) {
Entities::iterator entkey = entityMap.find(entname);
if (entkey == entityMap.end()) // key doesnot exist
{
throw ExceptionFactory(ExceptionFactory::OBJECT_CONFLICT, "Entity not defined yet. ", "Entity name is <%s>.",
entname.c_str());
} else {
dgDEBUG(10) << "Deregister entity <" << entname << "> from the pool." << std::endl;
deregisterEntity(entkey);
}
Francois Bleibel
committed
}
void PoolStorage::deregisterEntity(const Entities::iterator& entity) { entityMap.erase(entity); }
Entity& PoolStorage::getEntity(const std::string& name) {
dgDEBUG(25) << "Get <" << name << ">" << std::endl;
Entities::iterator entPtr = entityMap.find(name);
if (entPtr == entityMap.end()) {
DG_THROW ExceptionFactory(ExceptionFactory::UNREFERED_OBJECT, "Unknown entity.", " (while calling <%s>)",
name.c_str());
} else
return *entPtr->second;
Francois Bleibel
committed
}
const PoolStorage::Entities& PoolStorage::getEntityMap() const { return entityMap; }
bool PoolStorage::existEntity(const std::string& name) { return entityMap.find(name) != entityMap.end(); }
bool PoolStorage::existEntity(const std::string& name, Entity*& ptr) {
Entities::iterator entPtr = entityMap.find(name);
if (entPtr == entityMap.end())
return false;
else {
ptr = entPtr->second;
return true;
}
Francois Bleibel
committed
dgDEBUGIN(5);
Francois Bleibel
committed
for (Entities::iterator entPtr = entityMap.begin(); entPtr != entityMap.end(); ++entPtr)
if (entPtr->second->getClassName() == name) toDelete.push_back(entPtr->second);
Francois Bleibel
committed
for (std::list<Entity*>::iterator iter = toDelete.begin(); iter != toDelete.end(); ++iter) delete (Entity*)*iter;
Francois Bleibel
committed
dgDEBUGOUT(5);
}
/* --------------------------------------------------------------------- */
Francois Bleibel
committed
#include <dynamic-graph/entity.h>
Francois Bleibel
committed
#ifdef WIN32
#include <time.h>
#endif /*WIN32*/
void PoolStorage::writeGraph(const std::string& aFileName) {
Francois Bleibel
committed
size_t IdxPointFound = aFileName.rfind(".");
Francois Bleibel
committed
size_t IdxSeparatorFound = aFileName.rfind("/");
std::string GenericName;
if (IdxSeparatorFound != std::string::npos)
GenericName = tmp1.substr(IdxSeparatorFound, tmp1.length());
Francois Bleibel
committed
else
GenericName = tmp1;
/* Reading local time */
time_t ltime;
ltime = time(NULL);
struct tm ltimeformatted;
#ifdef WIN32
Francois Bleibel
committed
#else
Francois Bleibel
committed
#endif /*WIN32*/
/* Opening the file and writing the first comment. */
std::ofstream GraphFile(aFileName.c_str(), std::ofstream::out);
Francois Bleibel
committed
GraphFile << "/* This graph has been automatically generated. " << std::endl;
GraphFile << " " << 1900 + ltimeformatted.tm_year << " Month: " << 1 + ltimeformatted.tm_mon
<< " Day: " << ltimeformatted.tm_mday << " Time: " << ltimeformatted.tm_hour << ":"
<< ltimeformatted.tm_min;
Francois Bleibel
committed
GraphFile << " */" << std::endl;
GraphFile << "digraph \"" << GenericName << "\" { ";
Francois Bleibel
committed
GraphFile << "\t graph [ label=\"" << GenericName << "\" bgcolor = white rankdir=LR ]" << std::endl
<< "\t node [ fontcolor = black, color = black, fillcolor = gold1, style=filled, shape=box ] ; "
<< std::endl;
Francois Bleibel
committed
GraphFile << "\tsubgraph cluster_Entities { " << std::endl;
GraphFile << "\t} " << std::endl;
for (Entities::iterator iter = entityMap.begin(); iter != entityMap.end(); ++iter) {
Entity* ent = iter->second;
GraphFile << "\"" << ent->getName() << "\""
<< " [ label = \"" << ent->getName() << "\" ," << std::endl
<< " fontcolor = black, color = black, fillcolor=cyan, style=filled, shape=box ]" << std::endl;
ent->writeGraph(GraphFile);
}
Francois Bleibel
committed
Francois Bleibel
committed
Francois Bleibel
committed
}
void PoolStorage::writeCompletionList(std::ostream& os) {
for (Entities::iterator iter = entityMap.begin(); iter != entityMap.end(); ++iter) {
Entity* ent = iter->second;
ent->writeCompletionList(os);
}
Francois Bleibel
committed
}
static bool objectNameParser(std::istringstream& cmdparse, std::string& objName, std::string& funName) {
const int SIZE = 128;
char buffer[SIZE];
cmdparse >> std::ws;
cmdparse.getline(buffer, SIZE, '.');
if (!cmdparse.good()) // The callback is not an object method
return false;
objName = buffer;
// cmdparse.getline( buffer,SIZE );
// funName = buffer;
cmdparse >> funName;
return true;
}
SignalBase<int>& PoolStorage::getSignal(std::istringstream& sigpath) {
std::string objname, signame;
if (!objectNameParser(sigpath, objname, signame)) {
DG_THROW ExceptionFactory(ExceptionFactory::UNREFERED_SIGNAL, "Parse error in signal name");
}
Entity& ent = getEntity(objname);
return ent.getSignal(signame);
PoolStorage* PoolStorage::instance_ = 0;