00001 // Copyright (C) 2004 Nitin Jyoti, Arun Pratap, Suresh Golconda ;-) 00002 00003 #ifndef CAJUN_TIMER_H 00004 #define CAJUN_TIMER_H 00005 00006 #include <cassert> 00007 #include <list> 00008 #include "sim_util.H" 00009 00010 namespace cajun 00011 { 00012 class timer_t 00013 { 00014 public: 00015 class observer_t 00016 { 00017 public: 00018 virtual ~observer_t () {} 00019 00020 double m_interval; 00021 double m_ticks; 00022 virtual bool timeout (double currTime) = 0; 00023 }; 00024 00025 timer_t () : m_prev_time (0) {} 00026 00027 ~timer_t (); 00028 00029 list<observer_t *>::iterator register_observer (observer_t *ptrObserver) 00030 { 00031 ptrObserver->m_ticks = ptrObserver->m_interval; 00032 return m_observers.insert (m_observers.end (), ptrObserver); 00033 } 00034 void unregister_observer (list<observer_t *>::iterator index) 00035 { 00036 m_observers.erase (index); 00037 } 00038 00039 void step_time (float curr_time) 00040 { 00041 float delta_time = curr_time - m_prev_time; 00042 00043 for (curr = m_observers.begin (); 00044 curr != m_observers.end ();) 00045 { 00046 (*curr)->m_ticks -= delta_time; 00047 00048 if ((*curr)->m_ticks <= 0) 00049 { 00050 (*curr)->m_ticks = (*curr)->m_interval; 00051 if (! (*curr)->timeout (curr_time)) 00052 { 00053 //sanity check 00054 assert (! m_observers.empty ()); 00055 assert (curr != m_observers.end ()); 00056 printf ("end of observer\n"); 00057 curr = m_observers.erase (curr); 00058 } 00059 else 00060 ++curr; 00061 } 00062 } 00063 m_prev_time = curr_time; 00064 } 00065 private: 00066 list<timer_t::observer_t *>::iterator curr; 00067 std::list<observer_t *> m_observers; 00068 double m_prev_time; 00069 }; 00070 }; 00071 #endif