#include <iostream>
#include <vector>
#include <functional>
namespace TGE
{
class EventListener
{
public:
typedef struct
{
std::function<void()> run;
bool triggered;
std::string name;
} Event;
template <typename F>
void newEvent(F onRun, std::string eventName)
{
Event newEvent;
newEvent.name = eventName;
newEvent.triggered = false;
newEvent.run = onRun;
eventStack.push_back(newEvent);
}
void trigger(std::string eventName)
{
std::vector<Event>::iterator itr;
for(itr = eventStack.begin(); itr != eventStack.end(); itr++)
{
if(itr->name == eventName) itr->triggered = true;
}
}
protected:
std::vector<Event> eventStack;
};
}
class MenuState : protected TGE::EventListener
{
public:
void enter()
{
newEvent([=](){Event1();}, "Event1");
trigger("Event1");
std::vector<Event>::iterator itr;
for(itr = eventStack.begin(); itr != eventStack.end(); itr++)
{
if(itr->triggered)
{
itr->run();
itr->triggered = false;
}
}
}
void Event1()
{
std::cout << "Event1";
}
};
int main()
{
MenuState* menuState = 0;
menuState = new MenuState();
menuState->enter();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCm5hbWVzcGFjZSBUR0UKewogICAgY2xhc3MgRXZlbnRMaXN0ZW5lcgogICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHJ1bjsKICAgICAgICAgICAgICAgIGJvb2wgdHJpZ2dlcmVkOwogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgICAgfSBFdmVudDsKCiAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgoJCQl2b2lkIG5ld0V2ZW50KEYgb25SdW4sIHN0ZDo6c3RyaW5nIGV2ZW50TmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRXZlbnQgbmV3RXZlbnQ7CiAgICAgICAgICAgICAgICBuZXdFdmVudC5uYW1lID0gZXZlbnROYW1lOwogICAgICAgICAgICAgICAgbmV3RXZlbnQudHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuZXdFdmVudC5ydW4gPSBvblJ1bjsKICAgICAgICAgICAgICAgIGV2ZW50U3RhY2sucHVzaF9iYWNrKG5ld0V2ZW50KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdm9pZCB0cmlnZ2VyKHN0ZDo6c3RyaW5nIGV2ZW50TmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RXZlbnQ+OjppdGVyYXRvciBpdHI7CgogICAgICAgICAgICAgICAgZm9yKGl0ciA9IGV2ZW50U3RhY2suYmVnaW4oKTsgaXRyICE9IGV2ZW50U3RhY2suZW5kKCk7IGl0cisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKGl0ci0+bmFtZSA9PSBldmVudE5hbWUpIGl0ci0+dHJpZ2dlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEV2ZW50PiBldmVudFN0YWNrOwogICAgfTsKfQoKY2xhc3MgTWVudVN0YXRlIDogcHJvdGVjdGVkIFRHRTo6RXZlbnRMaXN0ZW5lcgp7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBlbnRlcigpCiAgICAgICAgewogICAgICAgICAgICBuZXdFdmVudChbPV0oKXtFdmVudDEoKTt9LCAiRXZlbnQxIik7CiAgICAgICAgICAgIHRyaWdnZXIoIkV2ZW50MSIpOwoKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RXZlbnQ+OjppdGVyYXRvciBpdHI7CiAgICAgICAgICAgIGZvcihpdHIgPSBldmVudFN0YWNrLmJlZ2luKCk7IGl0ciAhPSBldmVudFN0YWNrLmVuZCgpOyBpdHIrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaXRyLT50cmlnZ2VyZWQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaXRyLT5ydW4oKTsKICAgICAgICAgICAgICAgICAgICBpdHItPnRyaWdnZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2b2lkIEV2ZW50MSgpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkV2ZW50MSI7CiAgICAgICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBNZW51U3RhdGUqIG1lbnVTdGF0ZSA9IDA7CiAgICBtZW51U3RhdGUgPSBuZXcgTWVudVN0YXRlKCk7CiAgICBtZW51U3RhdGUtPmVudGVyKCk7CgogICAgcmV0dXJuIDA7Cn0=