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 template<class T, class V> friend class AttributeRecorder; 00056 template<class T, class V> friend class SFNodeRecorder; 00057 template<class T, class V> friend class MFNodeRecorder; 00058 00059 public: 00061 static SFType *getTypeOfName(const SFString &sceneGraph, const SFString &component, const SFString &name); 00063 static SFType *getTypeOfId(int id); 00065 static void recomputeIds(); 00066 00068 inline const SFString &getName() const {return _name;}; 00070 inline const SFString &getComponentName() const {return _component->getName();}; 00072 inline const SFString &getSceneGraphName() const {return _component->getSceneGraph()->getName();}; 00074 inline int getId() const {return _id;}; 00076 inline SFType *getParent() const {return _parent;}; 00078 inline const MFType &getChildren() const {return _childList;}; 00080 inline SFComponent *getComponent() const {return _component;}; 00082 inline SFSceneGraph *getSceneGraph() const {return _component->getSceneGraph();}; 00084 static void printInheritanceTree(); 00085 00087 static SFString encodeKey(const SFString &sceneGraph, const SFString &component, const SFString &SFType); 00089 inline SFString getEncodedName() const {return encodeKey(getSceneGraphName(), getComponentName(), getName());}; 00090 00091 private: 00093 SFType(const SFString &name, const SFString &component, const SFString &sceneGraph, X3DNodeCloner *cloner); 00094 ~SFType(); 00095 00097 void setParent(SFType *parent); 00099 void addOneReference(); 00101 void addOneReferenceRecursive(); 00103 static void removeOneReference(SFType *type); 00105 static void defineTypeName(SFType **type, const SFString &name, const SFString &component, const SFString &sceneGraph, X3DNodeCloner *cloner); 00107 X3DMemberFunctor *getMemberFunctor(const SFString &name) const; 00109 X3DFieldLoader *getFieldLoader(const SFString &name) const; 00111 X3DFieldWriter *getFieldWriter(const SFString &name) const; 00112 00114 static void addVisitor(Visitor *visitor); 00116 static void removeVisitor(Visitor *visitor); 00117 00120 static void beginFunctionDefinition(); 00122 static void endFunctionDefinition(); 00123 00125 SFString _name; 00126 int _id; 00127 int _refCount; 00128 SFType *_parent; 00129 MFType _childList; 00130 SFComponent *_component; 00131 X3DNodeCloner *_cloner; 00132 std::map<SFString, FieldManager> _attributesMap; 00133 std::vector<std::pair<SFString, X3DSFNodeFunctor *> > _nodeMap; 00134 std::vector<std::pair<SFString, X3DMFNodeFunctor *> > _nodesMap; 00135 00137 static int count; 00138 static MFType _typeList; 00139 static std::list<Visitor *> _actorList; 00140 static bool _functionDefinition; 00141 00142 void printInheritanceTree(SFString tab) const; 00143 }; 00144 00145 } 00146 00147 #endif