#include <iostream>
#include <sstream>
 
std::stringstream::pos_type size_of_stream(const std::stringstream& ss)
{
    std::streambuf* buf = ss.rdbuf();
 
    // Get the current position so we can restore it later
    std::stringstream::pos_type original = buf->pubseekoff(0, ss.cur, ss.out);
 
    // Seek to end and get the position
    std::stringstream::pos_type end = buf->pubseekoff(0, ss.end, ss.out);
 
    // Restore the position
    buf->pubseekpos(original, ss.out);
 
    return end;
}
 
int main()
{
    std::stringstream ss;
 
    ss << "Hello";
    ss << ' ';
    ss << "World";
    ss << 42;
 
    std::cout << size_of_stream(ss) << std::endl;
 
    // Make sure the output string is still the same
    ss << "\nnew line";
    std::cout << ss.str() << std::endl;
 
    std::string str;
    ss >> str;
    std::cout << str << std::endl;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KCnN0ZDo6c3RyaW5nc3RyZWFtOjpwb3NfdHlwZSBzaXplX29mX3N0cmVhbShjb25zdCBzdGQ6OnN0cmluZ3N0cmVhbSYgc3MpCnsKICAgIHN0ZDo6c3RyZWFtYnVmKiBidWYgPSBzcy5yZGJ1ZigpOwoKICAgIC8vIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBsYXRlcgogICAgc3RkOjpzdHJpbmdzdHJlYW06OnBvc190eXBlIG9yaWdpbmFsID0gYnVmLT5wdWJzZWVrb2ZmKDAsIHNzLmN1ciwgc3Mub3V0KTsKCiAgICAvLyBTZWVrIHRvIGVuZCBhbmQgZ2V0IHRoZSBwb3NpdGlvbgogICAgc3RkOjpzdHJpbmdzdHJlYW06OnBvc190eXBlIGVuZCA9IGJ1Zi0+cHVic2Vla29mZigwLCBzcy5lbmQsIHNzLm91dCk7CgogICAgLy8gUmVzdG9yZSB0aGUgcG9zaXRpb24KICAgIGJ1Zi0+cHVic2Vla3BvcyhvcmlnaW5hbCwgc3Mub3V0KTsKCiAgICByZXR1cm4gZW5kOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwoKICAgIHNzIDw8ICJIZWxsbyI7CiAgICBzcyA8PCAnICc7CiAgICBzcyA8PCAiV29ybGQiOwogICAgc3MgPDwgNDI7CgogICAgc3RkOjpjb3V0IDw8IHNpemVfb2Zfc3RyZWFtKHNzKSA8PCBzdGQ6OmVuZGw7CgogICAgLy8gTWFrZSBzdXJlIHRoZSBvdXRwdXQgc3RyaW5nIGlzIHN0aWxsIHRoZSBzYW1lCiAgICBzcyA8PCAiXG5uZXcgbGluZSI7CiAgICBzdGQ6OmNvdXQgPDwgc3Muc3RyKCkgPDwgc3RkOjplbmRsOwoKICAgIHN0ZDo6c3RyaW5nIHN0cjsKICAgIHNzID4+IHN0cjsKICAgIHN0ZDo6Y291dCA8PCBzdHIgPDwgc3RkOjplbmRsOwp9