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