#include <iostream>
using namespace std;
struct GenericCb {
void create_resource() {
cout << "Create Resource" << endl;
}
};
struct LagCb : public GenericCb {
void add_member() {
cout << "Add Member" << endl;
}
};
class Orch {
public:
void registerCb(GenericCb *cb) {
this->cb = cb;
}
void notify_create_resource() {
cb->create_resource();
}
GenericCb *cb;
};
class LagOrch : public Orch {
public:
void notify_add_member() {
static_cast<LagCb*>(cb)->add_member();
}
};
int main() {
// Exemplo do orchestrator generico
GenericCb cb;
Orch orch;
orch.registerCb(&cb);
orch.notify_create_resource();
// Exemplo do LAG orchestrator
LagCb lagCb;
LagOrch lagOrch;
lagOrch.registerCb(&lagCb);
lagOrch.notify_create_resource();
lagOrch.notify_add_member();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEdlbmVyaWNDYiB7CiAgICB2b2lkIGNyZWF0ZV9yZXNvdXJjZSgpCXsKICAgIAljb3V0IDw8ICJDcmVhdGUgUmVzb3VyY2UiIDw8IGVuZGw7CiAgICB9Cn07CgpzdHJ1Y3QgTGFnQ2IgOiBwdWJsaWMgR2VuZXJpY0NiIHsKCXZvaWQgYWRkX21lbWJlcigpIHsKCQljb3V0IDw8ICJBZGQgTWVtYmVyIiA8PCBlbmRsOwoJfQp9OwoKY2xhc3MgT3JjaCB7CiAgIHB1YmxpYzoKCXZvaWQgcmVnaXN0ZXJDYihHZW5lcmljQ2IgKmNiKSB7CgkJdGhpcy0+Y2IgPSBjYjsKCX0KCQoJdm9pZCBub3RpZnlfY3JlYXRlX3Jlc291cmNlKCkgewoJCWNiLT5jcmVhdGVfcmVzb3VyY2UoKTsKCX0KCQoJR2VuZXJpY0NiICpjYjsKfTsKCmNsYXNzIExhZ09yY2ggOiBwdWJsaWMgT3JjaCB7CiAgIHB1YmxpYzoKCXZvaWQgbm90aWZ5X2FkZF9tZW1iZXIoKSB7CgkJc3RhdGljX2Nhc3Q8TGFnQ2IqPihjYiktPmFkZF9tZW1iZXIoKTsKCX0KfTsKCmludCBtYWluKCkgewoJLy8gRXhlbXBsbyBkbyBvcmNoZXN0cmF0b3IgZ2VuZXJpY28KCUdlbmVyaWNDYiBjYjsKCU9yY2ggb3JjaDsKCW9yY2gucmVnaXN0ZXJDYigmY2IpOwoJb3JjaC5ub3RpZnlfY3JlYXRlX3Jlc291cmNlKCk7CgkKCS8vIEV4ZW1wbG8gZG8gTEFHIG9yY2hlc3RyYXRvcgoJTGFnQ2IgbGFnQ2I7CglMYWdPcmNoIGxhZ09yY2g7CglsYWdPcmNoLnJlZ2lzdGVyQ2IoJmxhZ0NiKTsKCWxhZ09yY2gubm90aWZ5X2NyZWF0ZV9yZXNvdXJjZSgpOwoJbGFnT3JjaC5ub3RpZnlfYWRkX21lbWJlcigpOwoJCglyZXR1cm4gMDsKfQ==