00001 /* 00007 * LEGAL: COPYRIGHT (C) 2006 JIM E. BROOKS 00008 * THIS SOURCE CODE IS RELEASED UNDER THE TERMS 00009 * OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2). 00010 *****************************************************************************/ 00011 00012 #ifndef BASE_TIMER_HH 00013 #define BASE_TIMER_HH 1 00014 00015 #define GET_TIMER() (base::Timer::GetInstance()) 00016 00017 #include "base/time.hh" // Milliseconds etc 00018 00019 namespace base { 00020 00021 const bool TIMER_ENABLED = true; 00022 const bool TIMER_DISABLED = false; 00023 00024 // Macro to define nested class. 00025 // Functor must not hold a ref-ptr to its owner 00026 // (would create a cycle of reference-counted pointers). 00027 #define CLASS_TICK_FUNCTOR( CLASS, MEMBER ) \ 00028 class TickFunctor : public base::Timer::Functor \ 00029 { \ 00030 public: \ 00031 TickFunctor( CLASS& obj ) : MEMBER(obj) { } \ 00032 void operator()( const Milliseconds millisecElapsed ); \ 00033 private: \ 00034 CLASS& MEMBER; \ 00035 }; \ 00036 friend class TickFunctor; 00037 00038 // Macro. 00039 #define CLASS_TICK_FUNCTOR_BASIC \ 00040 class TickFunctor : public base::Timer::Functor \ 00041 { \ 00042 public: \ 00043 void operator()( const Milliseconds millisecElapsed ); \ 00044 }; \ 00045 friend class TickFunctor; 00046 00068 class Timer 00069 { 00070 00071 private: 00072 enum eRegistered { CALLBACK_UNREGISTERED = 0, // "REGISTERED" predefined on Windows 00073 CALLBACK_REGISTERED = 1 }; 00074 00075 public: 00076 enum eDisablement { CAN_DISABLE, CANNOT_DISABLE }; 00077 00084 class Functor : public Shared 00085 { 00086 00087 public: 00088 Functor( void ) { } 00089 virtual ~Functor() { } 00091 virtual void operator()( const Milliseconds millisecElapsed ) = 0; 00092 }; 00093 00094 private: 00102 class Callback : public Shared 00103 { 00104 00105 friend class Timer; 00106 public: 00107 Callback( const bool registered, 00108 const SharedPtr<Functor> functor, 00109 const Milliseconds millisecFreq, 00110 const Timer::eDisablement canDisable = CAN_DISABLE ); 00111 Callback( const Callback& src ); 00112 ~Callback(); 00113 void CallIfTimeHasCome( const Milliseconds millisecElapsed ); 00114 bool IfRegistered( void ) const { return mRegistered; } 00115 bool IfCanDisable( void ) const { return mCanDisable; } 00116 00117 private: 00118 enum { NEVER_CALLED = -1 }; 00119 bool mRegistered; 00120 shptr<Functor> mFunctor; 00121 Milliseconds mMillisecFreq; 00122 Milliseconds mMillisecCalled; 00123 bool mCanDisable; 00124 public: 00125 00126 }; 00127 00128 private: 00129 Timer( void ); // singleton 00130 ~Timer(); 00131 00132 public: 00133 // Client interface: 00134 CLASS_METHOD Timer& GetInstance( void ) 00135 { 00136 if ( UX( msInstance == NULL ) ) 00137 msInstance = new Timer; 00138 return *msInstance; 00139 } 00140 void Enable( bool enable ); 00141 Milliseconds GetElapsedTime( void ) { return mElapsedTime; } // time since start of program 00142 void Register( SharedPtr<Functor> functor, const Milliseconds millisecFreq, eDisablement canDisable = CAN_DISABLE ); 00143 void Unregister( SharedPtr<Functor> functor ); 00144 00145 // For integration: 00146 void Tick( const Milliseconds millisecElapsed ); 00147 00148 private: 00149 typedef map<SafePtr<Functor>,Callback> Callbacks; 00150 00151 Callbacks::iterator Find( SafePtr<Functor> functor ); 00152 00153 private: 00154 CLASS_CONST uint MIN_MILLISEC = 1; 00155 CLASS_CONST uint MAX_MILLISEC = THOUSAND * 60 * 60; // 1 hour 00156 CLASS_VAR Timer* msInstance; 00157 bool mEnabled; 00158 bool mBusy; 00159 Milliseconds mElapsedTime; 00160 Callbacks mCallbacks; 00161 }; 00162 00163 } // namespace base 00164 00165 #endif // BASE_TIMER_HH
Palomino Flight Simulator documents generated by doxygen 1.5.6 on Mon Dec 29 17:26:59 2008