#include <memory>
#include <iostream>
namespace poco {
struct Parser
{
void reset() { std::cout << "Parser::reset !" << std::endl; }
void print() { std::cout << "Parser::print !" << std::endl; }
};
}
class MyParserBuilder
{
public:
class MyParser
{
public:
MyParser(poco::Parser& parser, MyParserBuilder& builder) :
_parser(parser),
_builder(builder)
{
}
~MyParser()
{
_builder.reset();
}
// Either expose some functions from the parser or use
// something like:
poco::Parser& operator*() { return _parser; }
private:
poco::Parser& _parser;
MyParserBuilder& _builder;
};
MyParserBuilder() : _used{false} {}
std::unique_ptr<MyParser> build()
{
if (_used) // Or lock ?
{
return std::unique_ptr<MyParser>();
}
_used = true;
return std::unique_ptr<MyParser>(new MyParser(_parser, *this));
}
void reset()
{
_parser.reset();
_used = false;
}
private:
bool _used;
poco::Parser _parser;
};
int main(int, char*[])
{
MyParserBuilder builder;
for (unsigned long index = 0; index < 2; ++index)
{
auto parser1 = builder.build();
auto parser2 = builder.build();
if (parser1)
{
std::cout << "Parser 1: " << std::endl;
(**parser1).print();
}
if (parser2)
{
std::cout << "Parser 2: " << std::endl;
(**parser2).print();
}
}
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIHBvY28geyAKICBzdHJ1Y3QgUGFyc2VyIAogIHsgCiAgICB2b2lkIHJlc2V0KCkgeyBzdGQ6OmNvdXQgPDwgIlBhcnNlcjo6cmVzZXQgISIgPDwgc3RkOjplbmRsOyB9IAogICAgdm9pZCBwcmludCgpIHsgc3RkOjpjb3V0IDw8ICJQYXJzZXI6OnByaW50ICEiIDw8IHN0ZDo6ZW5kbDsgfQogIH07IAp9CgpjbGFzcyBNeVBhcnNlckJ1aWxkZXIKewpwdWJsaWM6CgogIGNsYXNzIE15UGFyc2VyCiAgewogIHB1YmxpYzoKICAgIE15UGFyc2VyKHBvY286OlBhcnNlciYgcGFyc2VyLCBNeVBhcnNlckJ1aWxkZXImIGJ1aWxkZXIpIDogCiAgICBfcGFyc2VyKHBhcnNlciksIAogICAgX2J1aWxkZXIoYnVpbGRlcikKICAgIHsKCiAgICB9CgogICAgfk15UGFyc2VyKCkgCiAgICB7IAogICAgICBfYnVpbGRlci5yZXNldCgpOyAKICAgIH0KCiAgIC8vIEVpdGhlciBleHBvc2Ugc29tZSBmdW5jdGlvbnMgZnJvbSB0aGUgcGFyc2VyIG9yIHVzZSAKICAgLy8gc29tZXRoaW5nIGxpa2U6CiAgICBwb2NvOjpQYXJzZXImIG9wZXJhdG9yKigpIHsgcmV0dXJuIF9wYXJzZXI7IH0KCiAgcHJpdmF0ZToKICAgIHBvY286OlBhcnNlciYgX3BhcnNlcjsKICAgIE15UGFyc2VyQnVpbGRlciYgX2J1aWxkZXI7CiAgfTsKCiAgTXlQYXJzZXJCdWlsZGVyKCkgOiBfdXNlZHtmYWxzZX0ge30KCiAgc3RkOjp1bmlxdWVfcHRyPE15UGFyc2VyPiBidWlsZCgpIAogIHsgCiAgICAgIGlmIChfdXNlZCkgLy8gT3IgbG9jayA/CiAgICAgIHsKICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE15UGFyc2VyPigpOwogICAgICB9CiAgICAgIF91c2VkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNeVBhcnNlcj4obmV3IE15UGFyc2VyKF9wYXJzZXIsICp0aGlzKSk7IAogICAgfQoKICAgIHZvaWQgcmVzZXQoKQogICAgewogICAgICBfcGFyc2VyLnJlc2V0KCk7CiAgICAgIF91c2VkID0gZmFsc2U7CiAgICB9CgogIHByaXZhdGU6CiAgICBib29sIF91c2VkOyAKICAgIHBvY286OlBhcnNlciBfcGFyc2VyOwp9OwoKaW50IG1haW4oaW50LCBjaGFyKltdKQp7CiAgTXlQYXJzZXJCdWlsZGVyIGJ1aWxkZXI7CgogIGZvciAodW5zaWduZWQgbG9uZyBpbmRleCA9IDA7IGluZGV4IDwgMjsgKytpbmRleCkKICB7CiAgICBhdXRvIHBhcnNlcjEgPSBidWlsZGVyLmJ1aWxkKCk7CiAgICBhdXRvIHBhcnNlcjIgPSBidWlsZGVyLmJ1aWxkKCk7CgogICAgaWYgKHBhcnNlcjEpCiAgICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiUGFyc2VyIDE6ICIgPDwgc3RkOjplbmRsOwogICAgICAoKipwYXJzZXIxKS5wcmludCgpOwogICAgfQoKICAgIGlmIChwYXJzZXIyKQogICAgewogICAgICBzdGQ6OmNvdXQgPDwgIlBhcnNlciAyOiAiIDw8IHN0ZDo6ZW5kbDsKICAgICAgKCoqcGFyc2VyMikucHJpbnQoKTsKICAgIH0KICB9Cn0K