struct card_timer { ev::dynamic_loop&m_loop; std::vector<ct_timer*> m_timers; std::vector<int> m_timers_free; card_timer(ev::dynamic_loop&loop) :m_loop(loop) { grow(); } ~card_timer() { for(auto&i:m_timers) delete i; } void grow() { int on=m_timers.size(); int n=on<<1; if(n==0) n=4; m_timers.resize(n); for(int i=on;i<n;i++) { m_timers[i]=new ct_timer(); m_timers[i]->m_id=i; m_timers_free.push_back(i); } } void alloc_timer(int delay_ms,int ct,int type) { if(m_timers_free.empty()) grow(); int id=m_timers_free.back(); m_timers_free.pop_back(); m_timers[id]->start<card_timer,&card_timer::on_timer>(m_loop,this,delay_ms,ct,type); } void free_timer(int ct,int type) { for(int i=0,len=m_timers.size();i<len;i++) { if(m_timers[i]->m_ct==ct && m_timers[i]->m_type==type) { m_timers[i]->stop(); m_timers_free.push_back(i); break; } } } virtual void on_ct_timer(int ct,int type)=0; void on_timer(ev::timer&t,int) { ct_timer&tmp=*(ct_timer*)&t; on_ct_timer(tmp.m_ct,tmp.m_type); } };