#include <iostream>
#include <string>
class Event
{
protected:
Event(std::string const& name)
: name(name)
{}
public:
virtual
~Event() = default;
public:
std::string name;
};
class Actor;
class ActorEvent
: public Event
{
protected:
ActorEvent(std::string const& name,
Actor* actor)
: Event(name)
, actor(actor)
{}
public:
virtual
~ActorEvent() = default;
public:
Actor* actor;
};
class ActorCreated
: public ActorEvent
{
public:
ActorCreated(Actor* actor)
: ActorEvent("ActorCreated", actor)
{}
virtual
~ActorCreated() = default;
};
class ActorDeleted
: public ActorEvent
{
public:
ActorDeleted(Actor* actor)
: ActorEvent("ActorDeleted", actor)
{}
virtual
~ActorDeleted() = default;
};
class EventManager
{
public:
void
process(ActorCreated const& event)
{
std::cerr << "actor created (" << std::hex << event.actor << ")" << std::endl;
}
void
process(ActorDeleted const& event)
{
std::cerr << "actor deleted (" << std::hex << event.actor << ")" << std::endl;
}
};
EventManager e;
class Actor
{
public:
Actor()
{
e.process(ActorCreated(this));
}
~Actor()
{
e.process(ActorDeleted(this));
}
};
int main()
{
std::cerr << "hello" << std::endl;
{
Actor a;
}
std::cerr << "good bye" << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgRXZlbnQKewpwcm90ZWN0ZWQ6CiAgRXZlbnQoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpCiAgICA6IG5hbWUobmFtZSkKICB7fQpwdWJsaWM6CiAgdmlydHVhbAogIH5FdmVudCgpID0gZGVmYXVsdDsKCnB1YmxpYzoKICBzdGQ6OnN0cmluZyBuYW1lOwp9OwoKY2xhc3MgQWN0b3I7CgpjbGFzcyBBY3RvckV2ZW50CiAgOiBwdWJsaWMgRXZlbnQKewpwcm90ZWN0ZWQ6CiAgQWN0b3JFdmVudChzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwKICAgICAgICAgICAgIEFjdG9yKiBhY3RvcikKICAgIDogRXZlbnQobmFtZSkKICAgICwgYWN0b3IoYWN0b3IpCiAge30KCnB1YmxpYzoKICB2aXJ0dWFsCiAgfkFjdG9yRXZlbnQoKSA9IGRlZmF1bHQ7CgpwdWJsaWM6CiAgQWN0b3IqIGFjdG9yOwp9OwoKY2xhc3MgQWN0b3JDcmVhdGVkCiAgOiBwdWJsaWMgQWN0b3JFdmVudAp7CnB1YmxpYzoKICBBY3RvckNyZWF0ZWQoQWN0b3IqIGFjdG9yKQogICAgOiBBY3RvckV2ZW50KCJBY3RvckNyZWF0ZWQiLCBhY3RvcikKICB7fQogIHZpcnR1YWwKICB+QWN0b3JDcmVhdGVkKCkgPSBkZWZhdWx0Owp9OwoKY2xhc3MgQWN0b3JEZWxldGVkCiAgOiBwdWJsaWMgQWN0b3JFdmVudAp7CnB1YmxpYzoKICBBY3RvckRlbGV0ZWQoQWN0b3IqIGFjdG9yKQogICAgOiBBY3RvckV2ZW50KCJBY3RvckRlbGV0ZWQiLCBhY3RvcikKICB7fQogIHZpcnR1YWwKICB+QWN0b3JEZWxldGVkKCkgPSBkZWZhdWx0Owp9OwoKY2xhc3MgRXZlbnRNYW5hZ2VyCnsKcHVibGljOgogIHZvaWQKICBwcm9jZXNzKEFjdG9yQ3JlYXRlZCBjb25zdCYgZXZlbnQpCiAgewogICAgc3RkOjpjZXJyIDw8ICJhY3RvciBjcmVhdGVkICgiIDw8IHN0ZDo6aGV4IDw8IGV2ZW50LmFjdG9yIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgfQoKICB2b2lkCiAgcHJvY2VzcyhBY3RvckRlbGV0ZWQgY29uc3QmIGV2ZW50KQogIHsKICAgIHN0ZDo6Y2VyciA8PCAiYWN0b3IgZGVsZXRlZCAoIiA8PCBzdGQ6OmhleCA8PCBldmVudC5hY3RvciA8PCAiKSIgPDwgc3RkOjplbmRsOwogIH0KfTsKCkV2ZW50TWFuYWdlciBlOwoKY2xhc3MgQWN0b3IKewpwdWJsaWM6CiAgQWN0b3IoKQogIHsKICAgIGUucHJvY2VzcyhBY3RvckNyZWF0ZWQodGhpcykpOwogIH0KCiAgfkFjdG9yKCkKICB7CiAgICBlLnByb2Nlc3MoQWN0b3JEZWxldGVkKHRoaXMpKTsKICB9Cn07CgppbnQgbWFpbigpCnsKICBzdGQ6OmNlcnIgPDwgImhlbGxvIiA8PCBzdGQ6OmVuZGw7CiAgewogICAgQWN0b3IgYTsKICB9CiAgc3RkOjpjZXJyIDw8ICJnb29kIGJ5ZSIgPDwgc3RkOjplbmRsOwp9Cg==