fork download
  1. #include <memory>
  2. #include <iostream>
  3.  
  4. namespace poco {
  5. struct Parser
  6. {
  7. void reset() { std::cout << "Parser::reset !" << std::endl; }
  8. void print() { std::cout << "Parser::print !" << std::endl; }
  9. };
  10. }
  11.  
  12. class MyParserBuilder
  13. {
  14. public:
  15.  
  16. class MyParser
  17. {
  18. public:
  19. MyParser(poco::Parser& parser, MyParserBuilder& builder) :
  20. _parser(parser),
  21. _builder(builder)
  22. {
  23.  
  24. }
  25.  
  26. ~MyParser()
  27. {
  28. _builder.reset();
  29. }
  30.  
  31. // Either expose some functions from the parser or use
  32. // something like:
  33. poco::Parser& operator*() { return _parser; }
  34.  
  35. private:
  36. poco::Parser& _parser;
  37. MyParserBuilder& _builder;
  38. };
  39.  
  40. MyParserBuilder() : _used{false} {}
  41.  
  42. std::unique_ptr<MyParser> build()
  43. {
  44. if (_used) // Or lock ?
  45. {
  46. return std::unique_ptr<MyParser>();
  47. }
  48. _used = true;
  49. return std::unique_ptr<MyParser>(new MyParser(_parser, *this));
  50. }
  51.  
  52. void reset()
  53. {
  54. _parser.reset();
  55. _used = false;
  56. }
  57.  
  58. private:
  59. bool _used;
  60. poco::Parser _parser;
  61. };
  62.  
  63. int main(int, char*[])
  64. {
  65. MyParserBuilder builder;
  66.  
  67. for (unsigned long index = 0; index < 2; ++index)
  68. {
  69. auto parser1 = builder.build();
  70. auto parser2 = builder.build();
  71.  
  72. if (parser1)
  73. {
  74. std::cout << "Parser 1: " << std::endl;
  75. (**parser1).print();
  76. }
  77.  
  78. if (parser2)
  79. {
  80. std::cout << "Parser 2: " << std::endl;
  81. (**parser2).print();
  82. }
  83. }
  84. }
  85.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
Parser 1: 
Parser::print !
Parser::reset !
Parser 1: 
Parser::print !
Parser::reset !