#include <iostream>
using namespace std;
static int formatId = ios_base::xalloc();
ostream & toFoo(ostream & stream) {
stream.iword(formatId) = 1;
return stream;
}
ostream & toBar(ostream & stream) {
stream.iword(formatId) = 2;
return stream;
}
struct FooBar {};
ostream & operator<<(ostream & stream, FooBar const &) {
switch (stream.iword(formatId)) {
case 1: stream << "foo"; break;
case 2: stream << "bar"; break;
default: stream << "wild foobar";
}
return stream;
}
int main() {
FooBar f;
cout << f << toFoo << " " << f << endl;
cout << f << toBar << " " << f << endl;
cout << f << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RhdGljIGludCBmb3JtYXRJZCA9IGlvc19iYXNlOjp4YWxsb2MoKTsKCm9zdHJlYW0gJiB0b0Zvbyhvc3RyZWFtICYgc3RyZWFtKSB7CiAgc3RyZWFtLml3b3JkKGZvcm1hdElkKSA9IDE7CiAgcmV0dXJuIHN0cmVhbTsKfQpvc3RyZWFtICYgdG9CYXIob3N0cmVhbSAmIHN0cmVhbSkgewogIHN0cmVhbS5pd29yZChmb3JtYXRJZCkgPSAyOwogIHJldHVybiBzdHJlYW07Cn0KCnN0cnVjdCBGb29CYXIge307Cgpvc3RyZWFtICYgb3BlcmF0b3I8PChvc3RyZWFtICYgc3RyZWFtLCBGb29CYXIgY29uc3QgJikgewogIHN3aXRjaCAoc3RyZWFtLml3b3JkKGZvcm1hdElkKSkgewogICAgY2FzZSAxOiBzdHJlYW0gPDwgImZvbyI7IGJyZWFrOwogICAgY2FzZSAyOiBzdHJlYW0gPDwgImJhciI7IGJyZWFrOwogICAgZGVmYXVsdDogc3RyZWFtIDw8ICJ3aWxkIGZvb2JhciI7CiAgfQogIHJldHVybiBzdHJlYW07Cn0KCmludCBtYWluKCkgewogIEZvb0JhciBmOwogIGNvdXQgPDwgZiA8PCB0b0ZvbyA8PCAiICIgPDwgZiA8PCBlbmRsOwogIGNvdXQgPDwgZiA8PCB0b0JhciA8PCAiICIgPDwgZiA8PCBlbmRsOwogIGNvdXQgPDwgZiA8PCBlbmRsOwogIHJldHVybiAwOwp9