#include "unittest.h"
#include <libpmemobj++/allocator.hpp>
#include <libpmemobj++/make_persistent.hpp>
#include <libpmemobj++/p.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <libpmemobj++/transaction.hpp>
#include "obj_cpp_containers/cont_test_common.hpp"
#include <deque>
#define LAYOUT "cpp"
namespace
{
struct containers {
explicit containers(nvobj::pool_base &pop)
{
try {
nvobj::transaction::exec_tx(pop, [&] {
foodeq.emplace_front();
foodeq.push_front(foo());
foodeq.push_back(foo());
foodeq.emplace_back(Last_val);
});
} catch (...) {
UT_ASSERT(0);
}
}
std::deque<foo, nvobj::allocator<foo>> foodeq;
};
struct root {
nvobj::persistent_ptr<containers> cons;
};
void
test_deque(nvobj::pool<root> &pop, bool open)
{
auto conp = pop.get_root()->cons;
UT_ASSERT(conp != nullptr);
test_container_val(conp->foodeq);
if (open)
loop_insert(pop, conp->foodeq, foo(rand()), 20);
}
}
int
main(int argc, char *argv[])
{
START(argc, argv, "obj_cpp_deque");
if (argc != 3 || strchr("co", argv[1][0]) == nullptr)
UT_FATAL("usage: %s <c,o> file-name", argv[0]);
const char *path = argv[2];
nvobj::pool<root> pop;
bool open = (argv[1][0] == 'o');
try {
if (open) {
pop = nvobj::pool<root>::open(path, LAYOUT);
} else {
pop = nvobj::pool<root>::create(path, LAYOUT,
PMEMOBJ_MIN_POOL * 2,
S_IWUSR | S_IRUSR);
nvobj::transaction::manual tx(pop);
pop.get_root()->cons =
nvobj::make_persistent<containers>(pop);
nvobj::transaction::commit();
}
} catch (pmem::pool_error &pe) {
UT_FATAL("!pool::create: %s %s", pe.what(), path);
}
test_deque(pop, open);
pop.close();
DONE(nullptr);
}