#include "SFComponent.h" #include "SFType.h" #include "SFSceneGraph.h" #include #include using namespace std; using namespace X3DTK; MFComponent SFComponent::_componentList = MFComponent(); SFComponent::SFComponent(const SFString &name, const SFString &sceneGraph) : _name(name), _refCount(0) { //cout << "build SFComponent " << name << ": " << this << endl; _sceneGraph = SFSceneGraph::getSceneGraph(sceneGraph); if (_sceneGraph == 0) _sceneGraph = new SFSceneGraph(sceneGraph); _sceneGraph->addOneReference(); _componentList[getEncodedName()] = this; } SFComponent::~SFComponent() { //cout << "destr SFComponent " << _name << endl; SFSceneGraph::removeOneReference(_sceneGraph); } SFComponent *SFComponent::getComponent(const SFString &sceneGraph, const SFString &name) { MFComponent::const_iterator it = _componentList.find(encodeKey(sceneGraph, name)); if (it != _componentList.end()) return (*it).second; //the SFType doesn't exist. return 0; } void SFComponent::addOneReference() { ++_refCount; //cout << "add ref SFComponent " << _name << " = " << _refCount << endl; } void SFComponent::removeOneReference(SFComponent *component) { --component->_refCount; //cout << "remove ref SFComponent " << component->getName() << " = " << component->_refCount << endl; if (component->_refCount == 0) { // delete component _componentList.erase(component->getEncodedName()); delete component; } } SFString SFComponent::encodeKey(const SFString &sceneGraph, const SFString &name) { return sceneGraph + "_" + name; } void SFComponent::addType(SFType *type) { _typeList[type->getName()] = type; }