#include <iostream>
#include <string>
using namespace std;
class Ausgabedingens;
class Sinnlos
{
Ausgabedingens *out;
public:
Sinnlos();
void tu_was_sinnloses();
Ausgabedingens* imbue(Ausgabedingens *neuer_wert)
{
Ausgabedingens *alter_wert = out;
out = neuer_wert;
return alter_wert;
}
};
class Ausgabedingens
{
string wert;
Ausgabedingens *altes_dingens;
Sinnlos &sinn;
public:
Ausgabedingens(string wert, Sinnlos &sinn): wert(wert), altes_dingens(sinn.imbue(this)), sinn(sinn) { }
void write(string was) { cout << wert << was; }
~Ausgabedingens() {sinn.imbue(altes_dingens); }
Ausgabedingens(Ausgabedingens&) = delete;
void operator=(Ausgabedingens&) = delete;
};
void Sinnlos::tu_was_sinnloses() {if (out) out->write("Huhu.\n"); }
Sinnlos::Sinnlos(): out(nullptr) {}
Sinnlos GlobalGraphicsContext;
int main()
{
Ausgabedingens BackBuffer1("Ding 1: ", GlobalGraphicsContext);
GlobalGraphicsContext.tu_was_sinnloses();
{
Ausgabedingens BackBuffer2("Ding 2: ", GlobalGraphicsContext);
GlobalGraphicsContext.tu_was_sinnloses();
}
GlobalGraphicsContext.tu_was_sinnloses();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEF1c2dhYmVkaW5nZW5zOwoKY2xhc3MgU2lubmxvcwp7CiAgQXVzZ2FiZWRpbmdlbnMgKm91dDsKcHVibGljOgogIFNpbm5sb3MoKTsKICB2b2lkIHR1X3dhc19zaW5ubG9zZXMoKTsKICBBdXNnYWJlZGluZ2VucyogaW1idWUoQXVzZ2FiZWRpbmdlbnMgKm5ldWVyX3dlcnQpCiAgewogICAgQXVzZ2FiZWRpbmdlbnMgKmFsdGVyX3dlcnQgID0gb3V0OwogICAgb3V0ID0gbmV1ZXJfd2VydDsKICAgIHJldHVybiBhbHRlcl93ZXJ0OwogIH0KfTsKCmNsYXNzIEF1c2dhYmVkaW5nZW5zCnsKICBzdHJpbmcgd2VydDsKICBBdXNnYWJlZGluZ2VucyAqYWx0ZXNfZGluZ2VuczsKICBTaW5ubG9zICZzaW5uOwpwdWJsaWM6CiAgQXVzZ2FiZWRpbmdlbnMoc3RyaW5nIHdlcnQsIFNpbm5sb3MgJnNpbm4pOiB3ZXJ0KHdlcnQpLCBhbHRlc19kaW5nZW5zKHNpbm4uaW1idWUodGhpcykpLCBzaW5uKHNpbm4pIHsgfQogIHZvaWQgd3JpdGUoc3RyaW5nIHdhcykgeyBjb3V0IDw8IHdlcnQgPDwgd2FzOyB9CiAgfkF1c2dhYmVkaW5nZW5zKCkge3Npbm4uaW1idWUoYWx0ZXNfZGluZ2Vucyk7IH0KCiAgQXVzZ2FiZWRpbmdlbnMoQXVzZ2FiZWRpbmdlbnMmKSA9IGRlbGV0ZTsKICB2b2lkIG9wZXJhdG9yPShBdXNnYWJlZGluZ2VucyYpID0gZGVsZXRlOwp9OwoKdm9pZCBTaW5ubG9zOjp0dV93YXNfc2lubmxvc2VzKCkge2lmIChvdXQpIG91dC0+d3JpdGUoIkh1aHUuXG4iKTsgfQpTaW5ubG9zOjpTaW5ubG9zKCk6IG91dChudWxscHRyKSB7fSAKCgpTaW5ubG9zIEdsb2JhbEdyYXBoaWNzQ29udGV4dDsKCmludCBtYWluKCkKewogIEF1c2dhYmVkaW5nZW5zIEJhY2tCdWZmZXIxKCJEaW5nIDE6ICIsIEdsb2JhbEdyYXBoaWNzQ29udGV4dCk7CiAgR2xvYmFsR3JhcGhpY3NDb250ZXh0LnR1X3dhc19zaW5ubG9zZXMoKTsKICB7CiAgICBBdXNnYWJlZGluZ2VucyBCYWNrQnVmZmVyMigiRGluZyAyOiAiLCBHbG9iYWxHcmFwaGljc0NvbnRleHQpOwogICAgR2xvYmFsR3JhcGhpY3NDb250ZXh0LnR1X3dhc19zaW5ubG9zZXMoKTsKICB9CiAgR2xvYmFsR3JhcGhpY3NDb250ZXh0LnR1X3dhc19zaW5ubG9zZXMoKTsKfQo=