1 // $Id: ossimVisitor.h 22790 2014-05-16 19:19:30Z gpotts $
2 
3 #ifndef ossimVisitor_HEADER
4 #define ossimVisitor_HEADER 1
5 #include <ossim/base/ossimObject.h>
6 #include <ossim/base/ossimString.h>
7 #include <ossim/base/ossimId.h>
8 #include <ossim/base/ossimEvent.h>
9 #include <ossim/base/ossimRefPtr.h>
10 #include <set>
11 #include <vector>
12 
13 class ossimConnectableObject;
14 
15 
16 class OSSIM_DLL ossimVisitor : public ossimReferenced
17 {
18 public:
19    typedef std::set<ossimRefPtr<ossimObject> >    MarkCollectionRef;
20    typedef std::set<ossimRefPtr<ossimObject> >    CollectionRef;
21    typedef std::vector<ossimRefPtr<ossimObject> > ListRef;
22    typedef std::set<ossimObject*>                 Collection;
23    typedef std::vector<ossimObject* >             List;
24    /**
25     * Enumeration type can be a mask and will traverse a graph of connectables based on the values.
26     */
27    enum VisitorType
28    {
29       VISIT_NONE     = 0,
30       VISIT_CHILDREN = 1,
31       VISIT_INPUTS   = 2,
32       VISIT_OUTPUTS  = 4,
33       VISIT_ALL      = (VISIT_CHILDREN|VISIT_INPUTS|VISIT_OUTPUTS)
34    };
35 
36    ossimVisitor(int visitorType = VISIT_NONE);
37    ossimVisitor(const ossimVisitor& src);
38    virtual void reset();
39    virtual ossimRefPtr<ossimVisitor> dup()const=0;
40    virtual void visit(ossimObject* obj);
41    virtual void visit(ossimConnectableObject* obj);
42    VisitorType getVisitorType()const;
43    void setVisitorType(int vType, bool on=true);
44    void turnOffVisitorType(int vType);
45    bool hasVisited(ossimObject* obj)const;
46    bool stopTraversal()const;
47 protected:
48    VisitorType            m_visitorType;
49    mutable Collection     m_markNode;
50    mutable bool           m_stopTraversalFlag;
51 };
52 
53 class OSSIM_DLL ossimCollectionVisitor : public ossimVisitor
54 {
55 public:
56    ossimCollectionVisitor(int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
57    ossimCollectionVisitor(const ossimCollectionVisitor& src);
58    ListRef& getObjects();
59    const ListRef& getObjects()const;
60    ossimObject* getObject(ossim_uint32 idx = 0);
61    const ossimObject* getObject(ossim_uint32 idx = 0)const;
62 
63    // Inlined to force template instantiation.
64    template <class T> T* getObjectAs(ossim_uint32 idx=0)
65    {
66       if(idx < m_collection.size())
67       {
68          return dynamic_cast<T*>(m_collection[idx].get());
69       }
70       return 0;
71    }
72 
73    // Inlined to force template instantiation.
74    template<class T> const T* getObjectAs(ossim_uint32 idx=0)const
75    {
76       if(idx < m_collection.size())
77       {
78          return dynamic_cast<const T*>(m_collection[idx].get());
79       }
80       return 0;
81    }
82 
83    virtual void reset();
84 
85 protected:
86    ListRef m_collection;
87 
88 };
89 
90 class OSSIM_DLL ossimIdVisitor : public ossimVisitor
91 {
92 public:
93    /**
94     * @brief Default constructor
95     * Constructs with id of 0 and vistor type of VISIT_INPUTS|VISIT_CHILDREN.
96     */
97    ossimIdVisitor();
98 
99    ossimIdVisitor(int visitorType);
100    ossimIdVisitor(const ossimId& id, int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
101    ossimIdVisitor(const ossimIdVisitor& src);
102 
103    virtual ossimRefPtr<ossimVisitor> dup()const;
104    virtual void visit(ossimConnectableObject* obj);
105 
106    /** @brief Resets m_object to 0, calls ossimVisitor::reset(). */
107    virtual void reset();
108 
109    ossimConnectableObject* getObject();
110    const ossimConnectableObject* getObject()const;
111    void setId(const ossimId& id);
112    const ossimId& getId()const;
113 protected:
114    ossimConnectableObject* m_object;
115    ossimId m_id;
116 };
117 
118 class OSSIM_DLL ossimTypeNameVisitor : public ossimCollectionVisitor
119 {
120 public:
121    ossimTypeNameVisitor(int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
122    ossimTypeNameVisitor(const ossimString& typeName, bool firstofTypeFlag=false, int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
123    ossimTypeNameVisitor(const ossimTypeNameVisitor& src);
124    virtual ossimRefPtr<ossimVisitor> dup()const;
125    virtual void visit(ossimObject* obj);
126    void setTypeName(const ossimString& typeName);
127    const ossimString& getTypeName()const;
128 
129    /**
130     * @brief Set the m_firstOfTypeFlag.
131     *
132     * @param flag If flag is true, ossimTypeNameVisitor::visit will stop traversing if it
133     * finds an object of m_typeName.
134     */
135    void setFirstOfTypeFlag(bool flag);
136 
137    /** @return m_firstOfTypeFlag */
138    bool getFirstOfTypeFlag() const;
139 
140 protected:
141    ossimString m_typeName;
142    bool        m_firstOfTypeFlag;
143 };
144 
145 class OSSIM_DLL ossimTypeIdVisitor : public ossimCollectionVisitor
146 {
147 public:
148    ossimTypeIdVisitor(int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
149    ossimTypeIdVisitor(const RTTItypeid& typeId, bool firstofTypeFlag=false, int visitorType =(VISIT_INPUTS|VISIT_CHILDREN));
150    ossimTypeIdVisitor(const ossimTypeIdVisitor& src);
151    virtual ossimRefPtr<ossimVisitor> dup()const;
152    virtual void visit(ossimObject* obj);
153    void setTypeId(const RTTItypeid& typeId);
154    const RTTItypeid& getTypeId()const;
155 protected:
156    RTTItypeid m_typeId;
157    bool        m_firstOfTypeFlag;
158 };
159 
160 class OSSIM_DLL ossimEventVisitor : public ossimVisitor
161 {
162 public:
163    ossimEventVisitor(ossimEvent* evt,
164                       int visitorType =(VISIT_OUTPUTS|VISIT_CHILDREN));
165    ossimEventVisitor(const ossimEventVisitor& src);
166    virtual ossimRefPtr<ossimVisitor> dup()const;
167    virtual void visit(ossimObject* obj);
168 
169 protected:
170    ossimRefPtr<ossimEvent> m_event;
171 
172 };
173 
174 /**
175  * @class ossimViewInterfaceVisitor
176  *
177  * Visitor to update view and then propagate property event to outputs.
178  */
179 class OSSIM_DLL ossimViewInterfaceVisitor : public ossimVisitor
180 {
181 public:
182    ossimViewInterfaceVisitor(ossimObject* view,
183                              int visitorType =(VISIT_OUTPUTS|VISIT_CHILDREN));
184    ossimViewInterfaceVisitor(const ossimViewInterfaceVisitor& src);
185    virtual ossimRefPtr<ossimVisitor> dup()const;
186 
187    /**
188     * @brief Calls ossimViewInterface::setView if obj cast to
189     * ossimViewInterface*.  On success a property event is sent to
190     * output side so that things like ossimCombiner can reinitialize if
191     * needed.
192     *
193     * @param obj Object to visit.
194     */
195    virtual void visit(ossimObject* obj);
196 
197 
198    ossimObject* getView();
199    const ossimObject* getView()const;
200 protected:
201    ossimRefPtr<ossimObject> m_view;
202 };
203 
204 /**
205  * @class ossimSourceInitializeVisitor
206  *
207  * Visitor to update view and then propagate property event to outputs.
208  */
209 class OSSIM_DLL ossimSourceInitializeVisitor : public ossimVisitor
210 {
211 public:
212    ossimSourceInitializeVisitor(int visitorType = VISIT_OUTPUTS);
213    ossimSourceInitializeVisitor(const ossimSourceInitializeVisitor& src);
214    virtual ossimRefPtr<ossimVisitor> dup()const;
215 
216    /**
217     * @brief Calls ossimViewInterface::setView if obj cast to
218     * ossimViewInterface*.  On success a property event is sent to
219     * output side so that things like ossimCombiner can reinitialize if
220     * needed.
221     *
222     * @param obj Object to visit.
223     */
224    virtual void visit(ossimObject* obj);
225 
226 
227 };
228 
229 #endif
230