#include <iostream>
class space_delimited_output_buffer : public std::streambuf
{
public:
space_delimited_output_buffer(std::streambuf* sbuf)
: m_sbuf(sbuf)
{ }
virtual int_type overflow(int_type c)
{
return m_sbuf->sputc(c);
}
virtual int sync()
{
if (ok_to_write)
this->sputc(' ');
else
ok_to_write = true;
return internal_sync();
}
private:
std::streambuf* m_sbuf;
bool ok_to_write = false;
int internal_sync()
{
return m_sbuf->pubsync();
}
};
class space_delimited_output_stream
: public std::ostream
, private virtual space_delimited_output_buffer
{
public:
space_delimited_output_stream(std::ostream& os)
: std::ostream(this)
, space_delimited_output_buffer(os.rdbuf())
{
this->tie(this);
}
};
int main() {
space_delimited_output_stream os(std::cout);
os << "abc" << 123 << "xyz";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3Mgc3BhY2VfZGVsaW1pdGVkX291dHB1dF9idWZmZXIgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYKewpwdWJsaWM6CiAgICBzcGFjZV9kZWxpbWl0ZWRfb3V0cHV0X2J1ZmZlcihzdGQ6OnN0cmVhbWJ1Ziogc2J1ZikKICAgICAgICA6IG1fc2J1ZihzYnVmKQogICAgeyB9CiAKICAgIHZpcnR1YWwgaW50X3R5cGUgb3ZlcmZsb3coaW50X3R5cGUgYykKICAgIHsKICAgICAgICByZXR1cm4gbV9zYnVmLT5zcHV0YyhjKTsKICAgIH0KIAogICAgdmlydHVhbCBpbnQgc3luYygpCiAgICB7CiAgICAgICAgaWYgKG9rX3RvX3dyaXRlKQogICAgICAgICAgICB0aGlzLT5zcHV0YygnICcpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgb2tfdG9fd3JpdGUgPSB0cnVlOwogCiAgICAgICAgcmV0dXJuIGludGVybmFsX3N5bmMoKTsKICAgIH0KcHJpdmF0ZToKICAgIHN0ZDo6c3RyZWFtYnVmKiBtX3NidWY7CiAgICBib29sIG9rX3RvX3dyaXRlID0gZmFsc2U7CiAKICAgIGludCBpbnRlcm5hbF9zeW5jKCkKICAgIHsKICAgICAgICByZXR1cm4gbV9zYnVmLT5wdWJzeW5jKCk7CiAgICB9Cn07CiAKY2xhc3Mgc3BhY2VfZGVsaW1pdGVkX291dHB1dF9zdHJlYW0KICAgIDogcHVibGljIHN0ZDo6b3N0cmVhbQogICAgLCBwcml2YXRlIHZpcnR1YWwgc3BhY2VfZGVsaW1pdGVkX291dHB1dF9idWZmZXIKewpwdWJsaWM6CiAgICBzcGFjZV9kZWxpbWl0ZWRfb3V0cHV0X3N0cmVhbShzdGQ6Om9zdHJlYW0mIG9zKQogICAgICAgIDogc3RkOjpvc3RyZWFtKHRoaXMpCiAgICAgICAgLCBzcGFjZV9kZWxpbWl0ZWRfb3V0cHV0X2J1ZmZlcihvcy5yZGJ1ZigpKQogICAgewogICAgICAgIHRoaXMtPnRpZSh0aGlzKTsgCiAgICB9Cn07CiAKaW50IG1haW4oKSB7CiAgICBzcGFjZV9kZWxpbWl0ZWRfb3V0cHV0X3N0cmVhbSBvcyhzdGQ6OmNvdXQpOwogICAgb3MgPDwgImFiYyIgPDwgMTIzIDw8ICJ4eXoiOwp9