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