eng_timer.hh

Go to the documentation of this file.
00001 /*
00008  * LEGAL:   COPYRIGHT (C) 2006 JIM E. BROOKS
00009  *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
00010  *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
00011  *****************************************************************************/
00012 
00013 #ifndef ENG_TIMER_HH
00014 #define ENG_TIMER_HH 1
00015 
00016 // Timer class should stay independent of Engine class because of #include ordering.
00017 
00018 namespace eng {
00019 
00044 class Timer
00045 {
00046 
00047 public:
00048     enum eDisablement { CAN_DISABLE, CANNOT_DISABLE };
00049 
00056     class Functor : public Shared
00057     {
00058     
00059     public:
00060                         Functor( void ) { }
00061         virtual         ~Functor() { }
00063         virtual void    operator()( const Milliseconds millisecElapsed ) = 0;
00064     };
00065 
00066 private:
00074     class Callback : public Shared
00075     {
00076     
00077     friend class Timer;
00078     public:
00079                     Callback( SharedPtr<Functor> functor, const Milliseconds millisecFreq, Timer::eDisablement canDisable = CAN_DISABLE );
00080                     Callback( const Callback& src );
00081                     ~Callback();
00082         void        CallIfTimeHasCome( const Milliseconds millisecElapsed );
00083         bool        IfCanDisable( void ) const { return mCanDisable; }
00084 
00085     private:
00086         enum                { NEVER_CALLED = -1 };
00087         shptr<Functor>      mFunctor;         // the callback
00088         Milliseconds        mMillisecFreq;    // how often to invoke callback
00089         Milliseconds        mMillisecCalled;  // last time it was called
00090         bool                mCanDisable;      // false if callback must be called even if Timer is disabled
00091     };
00092 
00093 private:
00094     Timer( void );  // singleton
00095     ~Timer();
00096 
00097 public:
00098 // Client interface:
00099     CLASS_METHOD Timer& GetInstance( void );
00100     void                Register( SharedPtr<Functor> functor, const Milliseconds millisecFreq, eDisablement canDisable = CAN_DISABLE );
00101     void                Unregister( SharedPtr<Functor> functor );
00102     void                Enable( bool enable );
00103 
00104 // For integration:
00105     void                Tick( const Milliseconds millisecElapsed );
00106 
00107 private:
00108     typedef map<SafePtr<Functor>,Callback> Callbacks;
00109     typedef deque<Callbacks::iterator> Zombies;  // iterators into mCallbacks
00110 
00111     Callbacks::iterator Find( SharedPtr<Functor> functor );
00112 
00113 private:
00114     CLASS_CONST uint    MIN_MILLISEC = 1;
00115     CLASS_CONST uint    MAX_MILLISEC = THOUSAND * 60 * 60;  // 1 hour
00116     CLASS_VAR Timer*    msInstance;
00117     bool                mEnabled;
00118     Callbacks           mCallbacks;   
00119     Zombies             mZombies;     
00120 };
00121 
00122 } // namespace eng
00123 
00124 #endif // ENG_TIMER_HH
Palomino 3D Engine documents generated by doxygen 1.5.3 on Fri Nov 23 11:26:09 2007