00001 #ifndef X3DTK_VISITOR_H 00002 #define X3DTK_VISITOR_H 00003 00004 #include "X3DAbstractNode.h" 00005 #include "VisitingFunctions.h" 00006 #include "EnterFunction.h" 00007 #include "WalkOnFunction.h" 00008 #include "LeaveFunction.h" 00009 #include "X3DActor.h" 00010 00011 #include <list> 00012 00013 namespace X3DTK { 00014 00015 class SFType; 00016 class X3DComponentVisitor; 00017 00024 class Visitor : public X3DActor 00025 { 00026 public: 00028 Visitor(); 00030 virtual ~Visitor(); 00031 00033 void setComponentVisitor(X3DComponentVisitor *component); 00035 inline void enter(SFAbstractNode N) const {_visitingArray[N->getType()->getId()]->enter(N);}; 00037 inline bool walkOn(SFAbstractNode N, SFAbstractNode child = 0) const {return _visitingArray[N->getType()->getId()]->walkOn(N, child);}; 00039 inline void leave(SFAbstractNode N) const {_visitingArray[N->getType()->getId()]->leave(N);}; 00041 void reset(); 00042 00044 friend Visitor *joinVisitors(Visitor *N0, Visitor *N1); 00045 00046 private: 00048 virtual void addType(const SFType *type); 00050 EnterFunction *getEnterFunctionOf(const SFType *type) const; 00051 WalkOnFunction *getWalkOnFunctionOf(const SFType *type) const; 00052 LeaveFunction *getLeaveFunctionOf(const SFType *type) const; 00053 00054 //Dictionary of all the creation functions used. 00055 VisitingArray _visitingArray; 00056 std::list<X3DComponentVisitor *> _componentList; 00057 }; 00058 00059 } 00060 00061 #endif