#include <string>
#include <iostream>
#include <stdexcept>
class XML{};
class XMLParser1 {
public:
virtual XML Parse(const std::string&) = 0;
};
class XMLParser11 : public XMLParser1 {
public:
XML Parse(const std::string& xml) {
XML xmlTree; // or std::auto_ptr<XML> xmlTree(new XML); if it must be a pointer
// ...
std::cout << "XMLParserll is processing " << xml << '\n';
// ...
return xmlTree;
}
};
class XMLParser2 {
public:
virtual XML Parse(std::istream&) = 0;
};
class XMLParser11Adapter : public XMLParser2 {
public:
XML Parse(std::istream& xmlStream) {
if ( !xmlStream ) {
throw std::runtime_error("XMLParserlldapter::Parse() cannot read from xmlStream");
}
std::string xml;
std::string line;
while ( getline( xmlStream, line ) ) {
xml += line + '\n';
}
return xmlParser11.Parse(xml);
}
private:
XMLParser11 xmlParser11;
};
int main()
{
XMLParser11Adapter xmlp;
xmlp.Parse(std::cin);
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKY2xhc3MgWE1Me307CgpjbGFzcyBYTUxQYXJzZXIxIHsKcHVibGljOgogICAgdmlydHVhbCBYTUwgUGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmKSA9IDA7Cn07CgpjbGFzcyBYTUxQYXJzZXIxMSA6IHB1YmxpYyBYTUxQYXJzZXIxIHsKcHVibGljOgogICAgWE1MIFBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB4bWwpIHsKICAgICAgICBYTUwgeG1sVHJlZTsgLy8gb3Igc3RkOjphdXRvX3B0cjxYTUw+IHhtbFRyZWUobmV3IFhNTCk7IGlmIGl0IG11c3QgYmUgYSBwb2ludGVyCiAgICAgICAgLy8gLi4uCiAgICAgICAgc3RkOjpjb3V0IDw8ICJYTUxQYXJzZXJsbCBpcyBwcm9jZXNzaW5nICIgPDwgeG1sIDw8ICdcbic7CiAgICAgICAgLy8gLi4uCiAgICAgICAgcmV0dXJuIHhtbFRyZWU7CiAgICB9Cn07CgpjbGFzcyBYTUxQYXJzZXIyIHsKcHVibGljOgogICAgdmlydHVhbCBYTUwgUGFyc2Uoc3RkOjppc3RyZWFtJikgPSAwOwp9OwoKY2xhc3MgWE1MUGFyc2VyMTFBZGFwdGVyIDogcHVibGljIFhNTFBhcnNlcjIgewogcHVibGljOgogICAgWE1MIFBhcnNlKHN0ZDo6aXN0cmVhbSYgeG1sU3RyZWFtKSB7CiAgICAgICAgaWYgKCAheG1sU3RyZWFtICkgewogICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlhNTFBhcnNlcmxsZGFwdGVyOjpQYXJzZSgpIGNhbm5vdCByZWFkIGZyb20geG1sU3RyZWFtIik7CiAgICAgICAgfQogICAgICAgIHN0ZDo6c3RyaW5nIHhtbDsKICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOwogICAgICAgIHdoaWxlICggZ2V0bGluZSggeG1sU3RyZWFtLCBsaW5lICkgKSB7CiAgICAgICAgICAgIHhtbCArPSBsaW5lICsgJ1xuJzsKICAgICAgICB9CiAgICByZXR1cm4geG1sUGFyc2VyMTEuUGFyc2UoeG1sKTsKICB9CiBwcml2YXRlOgogICAgWE1MUGFyc2VyMTEgeG1sUGFyc2VyMTE7ICAKfTsKCmludCBtYWluKCkKewogICAgWE1MUGFyc2VyMTFBZGFwdGVyIHhtbHA7CiAgICB4bWxwLlBhcnNlKHN0ZDo6Y2luKTsKfQ==