20 #ifndef OTest2__INCLUDE_OTEST2_TESTMARKBUILDER_H_
21 #define OTest2__INCLUDE_OTEST2_TESTMARKBUILDER_H_
62 virtual ~Container() =
default;
64 const std::string& key_,
70 template<
typename ContainerMark_>
71 class OrderedContainer :
public Container {
73 std::unique_ptr<ContainerMark_> container;
76 explicit OrderedContainer(
77 std::unique_ptr<ContainerMark_>&& container_) :
78 container(std::move(container_)) {
82 const std::string& key_,
84 assert(key_.empty() && mark_ !=
nullptr);
85 container->append(mark_);
88 return container.release();
96 template<
typename ContainerMark_>
97 class UnorderedContainer :
public Container {
99 std::unique_ptr<ContainerMark_> container;
102 explicit UnorderedContainer(
103 std::unique_ptr<ContainerMark_>&& container_) :
104 container(std::move(container_)) {
108 const std::string& key_,
110 assert(!key_.empty() && mark_ !=
nullptr);
111 container->append(key_, mark_);
114 return container.release();
121 template<
typename ContainerMark_>
122 std::unique_ptr<Container> createContainer(
123 std::unique_ptr<ContainerMark_>&& container_,
125 return ::OTest2::make_unique<OrderedContainer<ContainerMark_> >(
126 std::move(container_));
129 template<
typename ContainerMark_>
130 std::unique_ptr<Container> createContainer(
131 std::unique_ptr<ContainerMark_>&& container_,
132 void (ContainerMark_::*)(
const std::string&,
TestMarkPtr)) {
133 return ::OTest2::make_unique<UnorderedContainer<ContainerMark_> >(
134 std::move(container_));
137 void openContainerImpl(
138 std::unique_ptr<Container>&& container_);
147 const std::string& key_);
192 const std::string& value_);
199 template<
typename ContainerMark_>
201 std::unique_ptr<ContainerMark_>&& container_) {
202 assert(container_ !=
nullptr);
204 createContainer(std::move(container_), &ContainerMark_::append));
218 const std::string& prefix_);
231 const std::string& prefix_);