#include <ios>
struct A {};
int getFormatIPIndex()
{
static int const i = std::ios_base::xalloc();
return i;
}
enum flag_t { Hello, World };
struct setflag
{
flag_t flag;
setflag( flag_t f ) :
flag{f} {}
};
#include <ostream>
std::ostream& operator<<( std::ostream& os, setflag a )
{
os.iword(getFormatIPIndex()) = a.flag;
return os;
}
std::ostream& operator<<( std::ostream& os, A )
{
auto index = os.iword(getFormatIPIndex());
if( index == Hello )
os << "Hello ";
else if( index == World )
os << "World";
return os;
}
#include <iostream>
int main()
{
std::cout << setflag(Hello) << A{} << setflag(World) << A{};
}
I2luY2x1ZGUgPGlvcz4KCnN0cnVjdCBBIHt9OwoKaW50IGdldEZvcm1hdElQSW5kZXgoKQp7CglzdGF0aWMgaW50IGNvbnN0IGkgPSBzdGQ6Omlvc19iYXNlOjp4YWxsb2MoKTsKCXJldHVybiBpOwp9CgplbnVtIGZsYWdfdCB7IEhlbGxvLCBXb3JsZCB9OwoKc3RydWN0IHNldGZsYWcKewoJZmxhZ190IGZsYWc7CgoJc2V0ZmxhZyggZmxhZ190IGYgKSA6CgkJZmxhZ3tmfSB7fQp9OwoKI2luY2x1ZGUgPG9zdHJlYW0+CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoIHN0ZDo6b3N0cmVhbSYgb3MsIHNldGZsYWcgYSApCnsKICAgIG9zLml3b3JkKGdldEZvcm1hdElQSW5kZXgoKSkgPSBhLmZsYWc7CiAgICByZXR1cm4gb3M7Cn0KCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtJiBvcywgQSApCnsKCWF1dG8gaW5kZXggPSBvcy5pd29yZChnZXRGb3JtYXRJUEluZGV4KCkpOwoKCWlmKCBpbmRleCA9PSBIZWxsbyApCgkJb3MgPDwgIkhlbGxvICI7CgllbHNlIGlmKCBpbmRleCA9PSBXb3JsZCApCgkJb3MgPDwgIldvcmxkIjsKCglyZXR1cm4gb3M7Cn0KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkKewoJc3RkOjpjb3V0IDw8IHNldGZsYWcoSGVsbG8pIDw8IEF7fSA8PCBzZXRmbGFnKFdvcmxkKSA8PCBBe307Cn0K