VR-Forces 4.0.4 Class Documentation
include/vrvCore/DtStateView.h
Go to the documentation of this file.
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 

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)