![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2009 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtStateView.h,v $ $Revision: 1.12 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00012 00013 #ifndef DtStateView_H_ 00014 #define DtStateView_H_ 00015 00016 #include <vrvCore/vrvCore.h> 00017 #include <vrvCore/DtSimEntryUpdater.h> 00018 #include <vrvCore/DtSimEntry.h> 00019 #include <boost/signal.hpp> 00020 00021 #include <vlutil/vlExceptions.h> 00022 00023 namespace makVrv 00024 { 00025 00028 class DT_DLL_VRVCORE DtBaseStateView 00029 { 00030 00031 public: 00032 00034 virtual ~DtBaseStateView(); 00035 00039 virtual void emitStateViewUpdated() = 0; 00040 00041 protected : 00042 00044 DtBaseStateView(); 00045 00046 }; 00047 00051 template<class StateType> 00052 class DtStateView : public DtBaseStateView 00053 { 00054 00055 public: 00056 00058 DtStateView(DtSimEntry& entry); 00059 00061 virtual ~DtStateView(); 00062 00065 void forceUpdate(); 00066 00068 void setUpdateRate(DtSimEntryUpdater::UpdateRate rate); 00069 00073 virtual void emitStateViewUpdated(); 00074 00076 const StateType& state(); 00077 00079 const StateType& state() const; 00080 00082 static bool isCompatible(DtSimEntry& entry); 00083 00086 static StateType* findState(DtSimEntry& entry); 00087 00089 boost::signal<void (DtStateView<StateType>*)> signal_stateViewUpdated; 00090 00091 DtUniqueID id() const 00092 { 00093 return mySimEntry.id(); 00094 } 00095 00096 private: 00097 00099 DtStateView(); 00100 DtStateView(const DtStateView&); 00101 DtStateView& operator=(const DtStateView&); 00102 00103 protected: 00104 00105 DtSimEntry& mySimEntry; 00106 StateType* myState; 00107 }; 00108 00109 template<class StateType> 00110 DtStateView<StateType>::DtStateView( DtSimEntry& entry ) 00111 : DtBaseStateView() 00112 , mySimEntry(entry) 00113 , myState(0) 00114 { 00115 myState = DtStateView<StateType>::findState(entry); 00116 if(!myState) 00117 { 00118 DtTHROW_NEW(DtCorruptedState, 00119 "Unable to create DtStateView from DtSimEntry." 00120 "Use isCompatible() before creating DtStateView."); 00121 } 00122 } 00123 00124 template<class StateType> 00125 DtStateView<StateType>::~DtStateView() 00126 { 00128 mySimEntry.setUpdateRate(DtSimEntryUpdater::NoUpdates, this); 00129 } 00130 00131 template<class StateType> 00132 void DtStateView<StateType>::forceUpdate() 00133 { 00134 mySimEntry.forceUpdate(this); 00135 } 00136 00137 template<class StateType> 00138 void DtStateView<StateType>::setUpdateRate(DtSimEntryUpdater::UpdateRate rate) 00139 { 00140 mySimEntry.setUpdateRate(rate, this); 00141 } 00142 00143 template<class StateType> 00144 void DtStateView<StateType>::emitStateViewUpdated() 00145 { 00146 signal_stateViewUpdated(this); 00147 } 00148 00149 template<class StateType> 00150 bool DtStateView<StateType>::isCompatible(DtSimEntry& entry) 00151 { 00152 bool bRet = false; 00153 StateType* type = DtStateView<StateType>::findState(entry); 00154 if(type) 00155 { 00156 bRet = true; 00157 } 00158 return bRet; 00159 } 00160 00161 template <class StateType> 00162 StateType* DtStateView<StateType>::findState(DtSimEntry& entry) 00163 { 00164 DtSimEntry::SimStateVector::const_iterator pos = entry.simStates().begin(); 00165 DtSimEntry::SimStateVector::const_iterator endPos = entry.simStates().end(); 00166 for(; pos != endPos; ++pos) 00167 { 00168 StateType* tState = dynamic_cast<StateType*>(*pos); 00169 if(tState) 00170 { 00171 return tState; 00172 } 00173 } 00174 return 0; 00175 } 00176 00177 template<class StateType> 00178 const StateType& DtStateView<StateType>::state() 00179 { 00180 return *myState; 00181 } 00182 00183 template<class StateType> 00184 const StateType& DtStateView<StateType>::state() const 00185 { 00186 return *myState; 00187 } 00188 00189 00190 } 00191 00192 #endif 00193