#include <map> #include <list> struct pulse_value { int pulse; void *value; }; template<class T, int HASH> class pulse_timer { public: int pulse; std::list<struct pulse_value> content[HASH]; int cur_hash; std::list<struct pulse_value> *cur_list; pulse_timer(void) { pulse = -1; cur_hash = 0; cur_list = NULL; advance(); } ~pulse_timer(void) { } inline void advance(void) { pulse++; cur_hash = (pulse%HASH); cur_list = &content[cur_hash]; } T *pop(void) { struct pulse_value cur; // Empty if (cur_list->size() < 1) return NULL; // First Value cur = cur_list->front(); // Return if valid if (cur.pulse <= pulse) { cur_list->pop_front(); return (T*)cur.value; } // Nothing return NULL; } void push(T *value, int delay) { std::list<struct pulse_value>::iterator it, end; std::list<struct pulse_value> *list; struct pulse_value cur; int delay_pulse; int hash; // Init delay_pulse = (pulse+delay); // Calculate Pulse hash = (delay_pulse%HASH); // Calculate Hash list = &content[hash]; // Localize // Insertion Sort it = list->begin(); end = list->end(); for (; it != end; it++) { cur = *it; if (cur.pulse > delay_pulse) { cur.pulse = delay_pulse; cur.value = value; list->insert(it, cur); return; } } // Add to end cur.pulse = delay_pulse; cur.value = value; list->push_back(cur); } };