00001 #ifndef X3DTK_SFTYPE_H
00002 #define X3DTK_SFTYPE_H
00003
00004 #include <map>
00005 #include <vector>
00006
00007 #include "X3DTypes.h"
00008 #include "SFSceneGraph.h"
00009 #include "SFComponent.h"
00010 #include "Singleton.h"
00011 #include "X3DNodeCloner.h"
00012 #include "X3DMemberFunctor.h"
00013 #include "X3DSFNodeFunctor.h"
00014 #include "X3DMFNodeFunctor.h"
00015
00016 namespace X3DTK {
00017
00018 class Visitor;
00019 class BaseRecorder;
00020
00021 namespace X3D {
00022 class Creator;
00023 class X3DComponentCreator;
00024 }
00025
00026 struct FieldManager
00027 {
00028 X3DMemberFunctor *memberFunctor;
00029 X3DFieldLoader *loader;
00030 X3DFieldWriter *writer;
00031 SFString init;
00032 };
00033
00044 class SFType
00045 {
00046 friend class X3D::Creator;
00047 friend class Walker;
00048 friend class Visitor;
00049 friend class BaseRecorder;
00050 friend class X3D::X3DComponentCreator;
00051 friend class X3DComponentWalker;
00052 friend class X3DComponentVisitor;
00053 friend class X3DAbstractNode;
00054 friend class X3DRoute;
00055
00056 public:
00058 static SFType *getTypeOfName(const SFString &sceneGraph, const SFString &component, const SFString &name);
00060 static SFType *getTypeOfId(int id);
00062 static void recomputeIds();
00063
00065 inline const SFString &getName() const {return _name;};
00067 inline const SFString &getComponentName() const {return _component->getName();};
00069 inline const SFString &getSceneGraphName() const {return _component->getSceneGraph()->getName();};
00071 inline int getId() const {return _id;};
00073 inline SFType *getParent() const {return _parent;};
00075 inline const MFType &getChildren() const {return _childList;};
00077 inline SFComponent *getComponent() const {return _component;};
00079 inline SFSceneGraph *getSceneGraph() const {return _component->getSceneGraph();};
00081 static void printInheritanceTree();
00082
00084 static SFString encodeKey(const SFString &sceneGraph, const SFString &component, const SFString &SFType);
00086 inline SFString getEncodedName() const {return encodeKey(getSceneGraphName(), getComponentName(), getName());};
00087
00089 SFString getEventIn(const SFString &name) const;
00091 SFString getEventOut(const SFString &name) const;
00092
00094 std::map<SFString, FieldManager> &attributesMap() {return _attributesMap;};
00096 std::vector<std::pair<SFString, X3DSFNodeFunctor *> > &nodeMap() {return _nodeMap;};
00098 std::vector<std::pair<SFString, X3DMFNodeFunctor *> > &nodesMap() {return _nodesMap;};
00099
00100 private:
00102 SFType(const SFString &name, const SFString &component, const SFString &sceneGraph, X3DNodeCloner *cloner);
00103 ~SFType();
00104
00106 void setParent(SFType *parent);
00108 void addOneReference();
00110 void addOneReferenceRecursive();
00112 static void removeOneReference(SFType *type);
00114 static void defineTypeName(SFType **type, const SFString &name, const SFString &component, const SFString &sceneGraph, X3DNodeCloner *cloner);
00116 X3DMemberFunctor *getMemberFunctor(const SFString &name) const;
00118 X3DFieldLoader *getFieldLoader(const SFString &name) const;
00120 X3DFieldWriter *getFieldWriter(const SFString &name) const;
00121
00123 static void addVisitor(Visitor *visitor);
00125 static void removeVisitor(Visitor *visitor);
00126
00129 static void beginFunctionDefinition();
00131 static void endFunctionDefinition();
00132
00134 SFString _name;
00135 int _id;
00136 int _refCount;
00137 SFType *_parent;
00138 MFType _childList;
00139 SFComponent *_component;
00140 X3DNodeCloner *_cloner;
00141 std::map<SFString, FieldManager> _attributesMap;
00142 std::vector<std::pair<SFString, X3DSFNodeFunctor *> > _nodeMap;
00143 std::vector<std::pair<SFString, X3DMFNodeFunctor *> > _nodesMap;
00144
00146 static int count;
00147 static MFType _typeList;
00148 static std::list<Visitor *> _actorList;
00149 static bool _functionDefinition;
00150
00151 void printInheritanceTree(SFString tab) const;
00152 };
00153
00154 }
00155
00156 #endif