00001
00002
00004
00005 #ifndef VISITOR_H
00006 #define VISITOR_H
00007
00008 #include "X3DAbstractNode.h"
00009 #include "VisitingFunctions.h"
00010 #include "EnterFunction.h"
00011 #include "WalkOnFunction.h"
00012 #include "LeaveFunction.h"
00013 #include "X3DActor.h"
00014
00015 #include <list>
00016
00017 namespace X3DTK {
00018
00019 class SFType;
00020 class X3DComponentVisitor;
00021
00023
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
00043 friend Visitor *joinVisitors(Visitor *N0, Visitor *N1);
00044
00045 private:
00047 virtual void addType(const SFType *type);
00049 EnterFunction *getEnterFunctionOf(const SFType *type) const;
00050 WalkOnFunction *getWalkOnFunctionOf(const SFType *type) const;
00051 LeaveFunction *getLeaveFunctionOf(const SFType *type) const;
00052
00053
00054 VisitingArray _visitingArray;
00055 std::list<X3DComponentVisitor *> _componentList;
00056 };
00057
00058 }
00059
00060 #endif