#include <iostream>
#include <functional>
#include <map>
#include <string>
using namespace std;
// IntervalManager
class TaskManager {
private:
int time = 0;
// Event Struct
class MyEvent {
public:
int timeout;
int interval;
function<void()> func;
};
map<string, MyEvent> taskMap;
public:
void setInterval(string name, int interval, function<void()> func){
MyEvent ev;
ev.timeout = interval + this->time;
ev.interval = interval;
ev.func = func;
this->taskMap[name] = ev;
}
void setTimeout(string name, int timeout, function<void()> func){
MyEvent ev;
ev.timeout = timeout + this->time;
ev.interval = -1; //mark
ev.func = func;
this->taskMap[name] = ev;
}
void execute(){
for(auto ite = this->taskMap.begin();
ite != this->taskMap.end();){
auto &name = ite->first;
auto &ev = ite->second;
if(ev.timeout == this->time){
// Execute!
ev.func();
if( ev.interval != -1){
// than interval
// reset timeout;
ev.timeout = ev.interval + this->time;
}
else{
// than timeout
// erase
this->taskMap.erase(ite++);
continue;
}
}
ite++;
}
//Time count up
this->time++;
} // end of execute()
void clearInterval(string name){
auto ite = this->taskMap.find(name);
this->taskMap.erase(ite);
}
};
int main() {
// your code goes here
// create interval manager
TaskManager tasks;
// setTimeout
tasks.setTimeout("helloTask", 3,
[&](){cout << "timeout" << endl;}
);
// setInterval
tasks.setInterval("interval", 2,
[&](){cout<<"interval"<<endl;}
);
for(int i = 0; i < 10; i++){
cout<<"▼ : "+to_string(i)+" loop"<<endl;
tasks.execute();
cout<<"▲"<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEludGVydmFsTWFuYWdlcgpjbGFzcyBUYXNrTWFuYWdlciB7CnByaXZhdGU6CglpbnQgdGltZSA9IDA7CgkvLyBFdmVudCBTdHJ1Y3QKCWNsYXNzIE15RXZlbnQgewoJcHVibGljOgoJCWludCB0aW1lb3V0OwoJCWludCBpbnRlcnZhbDsKCQlmdW5jdGlvbjx2b2lkKCk+IGZ1bmM7Cgl9OwoJbWFwPHN0cmluZywgTXlFdmVudD4gdGFza01hcDsKCQpwdWJsaWM6Cgl2b2lkIHNldEludGVydmFsKHN0cmluZyBuYW1lLCBpbnQgaW50ZXJ2YWwsIGZ1bmN0aW9uPHZvaWQoKT4gZnVuYyl7CgkJTXlFdmVudCBldjsKCQlldi50aW1lb3V0ID0gaW50ZXJ2YWwgKyB0aGlzLT50aW1lOwoJCWV2LmludGVydmFsID0gaW50ZXJ2YWw7CgkJZXYuZnVuYyA9IGZ1bmM7CgkJdGhpcy0+dGFza01hcFtuYW1lXSA9IGV2OwoJfQoJdm9pZCBzZXRUaW1lb3V0KHN0cmluZyBuYW1lLCBpbnQgdGltZW91dCwgZnVuY3Rpb248dm9pZCgpPiBmdW5jKXsKCQlNeUV2ZW50IGV2OwoJCWV2LnRpbWVvdXQgPSB0aW1lb3V0ICsgdGhpcy0+dGltZTsKCQlldi5pbnRlcnZhbCA9IC0xOyAvL21hcmsKCQlldi5mdW5jID0gZnVuYzsKCQl0aGlzLT50YXNrTWFwW25hbWVdID0gZXY7Cgl9CgkKCXZvaWQgZXhlY3V0ZSgpewoKCQlmb3IoYXV0byBpdGUgPSB0aGlzLT50YXNrTWFwLmJlZ2luKCk7CgkJCQlpdGUgIT0gdGhpcy0+dGFza01hcC5lbmQoKTspewoJCQlhdXRvICZuYW1lID0gaXRlLT5maXJzdDsKCQkJYXV0byAmZXYgPSBpdGUtPnNlY29uZDsKCgkJCWlmKGV2LnRpbWVvdXQgPT0gdGhpcy0+dGltZSl7CgkJCQkvLyBFeGVjdXRlIQoJCQkJZXYuZnVuYygpOwoJCQkJCgkJCQlpZiggZXYuaW50ZXJ2YWwgIT0gLTEpewoJCQkJCS8vIHRoYW4gaW50ZXJ2YWwKCQkJCQkvLyByZXNldCB0aW1lb3V0OwoJCQkJCWV2LnRpbWVvdXQgPSBldi5pbnRlcnZhbCArIHRoaXMtPnRpbWU7CgkJCQl9CgkJCQllbHNlewoJCQkJCS8vIHRoYW4gdGltZW91dAoJCQkJCS8vIGVyYXNlCgkJCQkJdGhpcy0+dGFza01hcC5lcmFzZShpdGUrKyk7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCQkJaXRlKys7CgkJfQoJCS8vVGltZSBjb3VudCB1cAoJCXRoaXMtPnRpbWUrKzsKCX0gLy8gZW5kIG9mIGV4ZWN1dGUoKQoJCgl2b2lkIGNsZWFySW50ZXJ2YWwoc3RyaW5nIG5hbWUpewoJCWF1dG8gaXRlID0gdGhpcy0+dGFza01hcC5maW5kKG5hbWUpOwoJCXRoaXMtPnRhc2tNYXAuZXJhc2UoaXRlKTsKCX0KfTsKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJCgkvLyBjcmVhdGUgaW50ZXJ2YWwgbWFuYWdlcgoJVGFza01hbmFnZXIgdGFza3M7CgkKCS8vIHNldFRpbWVvdXQKCXRhc2tzLnNldFRpbWVvdXQoImhlbGxvVGFzayIsIDMsCgkJWyZdKCl7Y291dCA8PCAidGltZW91dCIgPDwgZW5kbDt9CgkpOwoJCgkvLyBzZXRJbnRlcnZhbAoJdGFza3Muc2V0SW50ZXJ2YWwoImludGVydmFsIiwgMiwKCQlbJl0oKXtjb3V0PDwiaW50ZXJ2YWwiPDxlbmRsO30KCSk7CgkKCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKXsKCQljb3V0PDwi4pa8IDogIit0b19zdHJpbmcoaSkrIiBsb29wIjw8ZW5kbDsKCQl0YXNrcy5leGVjdXRlKCk7CgkJY291dDw8IuKWsiI8PGVuZGw7Cgl9CgkKCXJldHVybiAwOwp9