#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);
}
};