#include <iostream>
#include <memory>
using namespace std;
class Configurable {
public:
virtual void SetParameter(int i) { _prop = i; }
virtual int GetParameter() { return _prop; }
private:
int _prop;
};
class Algorithm: public Configurable {
public:
virtual ~Algorithm() = default;
virtual void Process() = 0;
};
class AlgorithmDecorator: public Algorithm{
public:
AlgorithmDecorator(std::unique_ptr<Algorithm> &&algo): _algo{std::move(algo)} {}
void Process() { _algo->Process(); /* decoration code here */}
void SetParameter(int i) override { _algo->SetParameter(i); }
int GetParameter() override { return _algo->GetParameter(); }
protected:
std::unique_ptr<Algorithm> _algo;
};
class ConcreteAlgorithm: public Algorithm {
public:
void Process() { std::cout << GetParameter() << std::endl; }
};
int main() {
std::unique_ptr<Algorithm> algo = std::make_unique<ConcreteAlgorithm>();
algo = std::make_unique<AlgorithmDecorator>(std::move(algo));
algo->SetParameter(5);
algo->Process();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ29uZmlndXJhYmxlIHsKcHVibGljOgogIHZpcnR1YWwgdm9pZCBTZXRQYXJhbWV0ZXIoaW50IGkpIHsgX3Byb3AgPSBpOyB9CiAgdmlydHVhbCBpbnQgR2V0UGFyYW1ldGVyKCkgeyByZXR1cm4gX3Byb3A7IH0KcHJpdmF0ZToKICBpbnQgX3Byb3A7Cn07CgpjbGFzcyBBbGdvcml0aG06IHB1YmxpYyBDb25maWd1cmFibGUgIHsKcHVibGljOgogIHZpcnR1YWwgfkFsZ29yaXRobSgpID0gZGVmYXVsdDsKICB2aXJ0dWFsIHZvaWQgUHJvY2VzcygpID0gMDsKfTsKCmNsYXNzIEFsZ29yaXRobURlY29yYXRvcjogcHVibGljIEFsZ29yaXRobXsKcHVibGljOgogIEFsZ29yaXRobURlY29yYXRvcihzdGQ6OnVuaXF1ZV9wdHI8QWxnb3JpdGhtPiAmJmFsZ28pOiBfYWxnb3tzdGQ6Om1vdmUoYWxnbyl9IHt9CiAgdm9pZCBQcm9jZXNzKCkgeyBfYWxnby0+UHJvY2VzcygpOyAvKiBkZWNvcmF0aW9uIGNvZGUgaGVyZSAqL30KICB2b2lkIFNldFBhcmFtZXRlcihpbnQgaSkgb3ZlcnJpZGUgeyBfYWxnby0+U2V0UGFyYW1ldGVyKGkpOyB9CiAgaW50IEdldFBhcmFtZXRlcigpIG92ZXJyaWRlIHsgcmV0dXJuIF9hbGdvLT5HZXRQYXJhbWV0ZXIoKTsgfQpwcm90ZWN0ZWQ6CiAgc3RkOjp1bmlxdWVfcHRyPEFsZ29yaXRobT4gX2FsZ287Cn07CgpjbGFzcyBDb25jcmV0ZUFsZ29yaXRobTogcHVibGljIEFsZ29yaXRobSB7CnB1YmxpYzoKICB2b2lkIFByb2Nlc3MoKSB7IHN0ZDo6Y291dCA8PCBHZXRQYXJhbWV0ZXIoKSA8PCBzdGQ6OmVuZGw7IH0KfTsKCmludCBtYWluKCkgewogIHN0ZDo6dW5pcXVlX3B0cjxBbGdvcml0aG0+IGFsZ28gPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmNyZXRlQWxnb3JpdGhtPigpOwogIGFsZ28gPSBzdGQ6Om1ha2VfdW5pcXVlPEFsZ29yaXRobURlY29yYXRvcj4oc3RkOjptb3ZlKGFsZ28pKTsKICBhbGdvLT5TZXRQYXJhbWV0ZXIoNSk7CiAgYWxnby0+UHJvY2VzcygpOwogIHJldHVybiAwOwp9