35 struct TestMarkBuilder::Impl {
37 class RootContainer :
public Container {
40 explicit RootContainer(
43 const std::string& key_,
45 virtual TestMark* getMark();
50 std::unique_ptr<Container> container;
54 std::unique_ptr<Container>&& container_);
56 typedef std::vector<Record> Stack;
65 TestMarkBuilder::Impl::RootContainer::RootContainer(
68 assert(root !=
nullptr);
71 void TestMarkBuilder::Impl::RootContainer::append(
72 const std::string& key_,
74 assert(key_.empty() && mark_ !=
nullptr && *root ==
nullptr);
78 TestMark* TestMarkBuilder::Impl::RootContainer::getMark() {
87 TestMarkBuilder::Impl::Record::Record(
89 std::unique_ptr<Container>&& container_) :
91 container(std::move(container_)) {
95 void TestMarkBuilder::Impl::appendItem(
97 assert(item_ !=
nullptr);
99 Record& record_(stack.back());
100 record_.container->append(record_.key, item_);
104 void TestMarkBuilder::Impl::appendItem(
106 assert(item_ !=
nullptr);
114 pimpl->stack.emplace_back(
116 ::OTest2::make_unique<Impl::RootContainer>(&pimpl->root));
124 const std::string& key_) {
125 assert(pimpl->stack.back().key.empty() && !key_.empty());
126 pimpl->stack.back().key = key_;
131 pimpl->appendItem(mark_);
149 long double value_) {
154 const std::string& value_) {
158 void TestMarkBuilder::openContainerImpl(
159 std::unique_ptr<typename TestMarkBuilder::Container>&& container_) {
160 pimpl->stack.emplace_back(
"", std::move(container_));
168 const std::string& prefix_) {
177 const std::string& prefix_) {
182 std::unique_ptr<TestMark> container_(pimpl->stack.back().container->getMark());
183 pimpl->stack.pop_back();
184 pimpl->appendItem(container_.release());
188 assert(pimpl->stack.size() == 1);
189 assert(pimpl->root !=
nullptr);