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