#include <iostream>
#include <vector>
using namespace std;
class P {
private:
string nom;
public:
P(string n) : nom(n) {}
virtual string toString() const {
return "P_" + nom +"\n" ;
}
virtual P * adapter(double nbFois) {
return this;
}
};
class I {
public:
I(const P & p_, int a) : p(p_), amount(a) {
}
string desc() const {
string s;
s += " " + to_string(amount) + " * ";
s += " I_";
// call P::toString or PC::toString() ?
s += p.toString();
return s;
}
private:
const P & p;
int amount;
};
class R {
private:
vector<I> is;
string nom;
public:
R(string n) : nom(n) {
}
void add(const P & p, int amount) {
I i(p, amount);
is.push_back(i);
}
string toString() const {
string s;
for (auto i : is) {
s += " ";
s += i.desc() + "\n";
}
return s;
}
};
class PC : public P {
private:
R r;
public:
PC(string n) : P(n), r(n) {
}
string toString() const {
string s;
s += "PC ";
s += P::toString();
s += r.toString();
return s;
}
void addToR(const P & p, int amount) {
r.add(p, amount);
}
PC * adapter(double nbFois) {
cout << "PC_adapt" << endl;
return this;
}
};
int main() {
P p1("abc");
P p2("def");
PC pc("abc_def");
pc.addToR(p1, 1);
pc.addToR(p2, 1);
cout << pc.toString() << endl;
P p3("hij");
PC pc2("hij_abc_def");
pc2.addToR(p3, 1);
pc2.addToR(pc, 2);
cout << pc2.toString() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBQIHsKICBwcml2YXRlOgogICAgc3RyaW5nIG5vbTsKICAgIAogIHB1YmxpYzoKICAgIFAoc3RyaW5nIG4pIDogbm9tKG4pIHt9CiAgICAKICAgIHZpcnR1YWwgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXJldHVybiAiUF8iICsgbm9tICsiXG4iIDsKCX0KCQoJdmlydHVhbCBQICogYWRhcHRlcihkb3VibGUgbmJGb2lzKSB7CgkJcmV0dXJuIHRoaXM7Cgl9CgkKfTsKCgoKY2xhc3MgSSB7CiAgcHVibGljOgogICAgSShjb25zdCBQICYgcF8sIGludCBhKSA6IHAocF8pLCBhbW91bnQoYSkgewoJfQoJCglzdHJpbmcgZGVzYygpIGNvbnN0IHsKCSAgIHN0cmluZyBzOwoJICAgcyArPSAiICIgKyB0b19zdHJpbmcoYW1vdW50KSArICIgKiAiOwoJICAgcyArPSAiIElfIjsKCSAgIC8vIGNhbGwgUDo6dG9TdHJpbmcgb3IgUEM6OnRvU3RyaW5nKCkgPwoJICAgcyArPSBwLnRvU3RyaW5nKCk7CgkgICAKCSAgIHJldHVybiBzOwoJfQogIAogIHByaXZhdGU6CiAgICBjb25zdCBQICYgcDsgIAogICAgaW50IGFtb3VudDsKICAKfTsKCgpjbGFzcyBSIHsKCQoJcHJpdmF0ZToKCSAgdmVjdG9yPEk+IGlzOwoJICBzdHJpbmcgbm9tOwoJICAKCXB1YmxpYzoKCSAgIFIoc3RyaW5nIG4pIDogbm9tKG4pIHsKCSAgIH0KCSAgIAoJICAgdm9pZCBhZGQoY29uc3QgUCAmIHAsIGludCBhbW91bnQpIHsKCQkgICBJIGkocCwgYW1vdW50KTsKCQkgICBpcy5wdXNoX2JhY2soaSk7CgkgICB9CgkgICAKCSAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQkgICBzdHJpbmcgczsKCQkgICBmb3IgKGF1dG8gaSA6IGlzKSB7CgkJCSAgIHMgKz0gIiAgIjsKCQkJICAgcyArPSBpLmRlc2MoKSArICJcbiI7CgkJICAgfQoJCSAgIHJldHVybiBzOwoJICAgfQoJICAgCgp9OwoKCmNsYXNzIFBDIDogcHVibGljIFAgewoJCglwcml2YXRlOgoJICBSIHI7CgkKCQoJcHVibGljOgoJCglQQyhzdHJpbmcgbikgOiBQKG4pLCByKG4pIHsKCX0KCQoJc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCXN0cmluZyBzOwoJCXMgKz0gIlBDICI7CgkJcyArPSBQOjp0b1N0cmluZygpOwoJCXMgKz0gci50b1N0cmluZygpOwoJCQoJCXJldHVybiBzOwoJfQoJCgl2b2lkIGFkZFRvUihjb25zdCBQICYgcCwgaW50IGFtb3VudCkgewoJCXIuYWRkKHAsIGFtb3VudCk7Cgl9CgoJUEMgKiBhZGFwdGVyKGRvdWJsZSBuYkZvaXMpIHsKCQljb3V0IDw8ICJQQ19hZGFwdCIgPDwgZW5kbDsKCQlyZXR1cm4gdGhpczsKCX0KCQoKfTsKCmludCBtYWluKCkgewoKICBQIHAxKCJhYmMiKTsKICBQIHAyKCJkZWYiKTsKICAKICBQQyBwYygiYWJjX2RlZiIpOwogIHBjLmFkZFRvUihwMSwgMSk7CiAgcGMuYWRkVG9SKHAyLCAxKTsKICAKICBjb3V0IDw8IHBjLnRvU3RyaW5nKCkgPDwgZW5kbDsKICAKICBQIHAzKCJoaWoiKTsKICBQQyBwYzIoImhpal9hYmNfZGVmIik7CiAgcGMyLmFkZFRvUihwMywgMSk7CiAgcGMyLmFkZFRvUihwYywgMik7CiAgCiAgY291dCA8PCBwYzIudG9TdHJpbmcoKSA8PCBlbmRsOwogIAoKICByZXR1cm4gMDsKICAKfQo=