#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 <map>
#define LAYOUT "cpp"
namespace
{
struct containers {
explicit containers(nvobj::pool_base &pop)
{
try {
nvobj::transaction::exec_tx(pop, [&] {
foomap.insert(std::make_pair(1, foo()));
foomap[12] = foo();
foomap[2] = foo();
foomap[14] = foo();
foomap.erase(2);
foomap[23] = foo(Last_val);
});
} catch (...) {
UT_ASSERT(0);
}
}
std::map<int, foo, std::less<int>,
nvobj::allocator<std::pair<const int, foo>>>
foomap;
};
struct root {
nvobj::persistent_ptr<containers> cons;
};
void
test_map(nvobj::pool<root> &pop, bool open)
{
auto conp = pop.get_root()->cons;
UT_ASSERT(conp != nullptr);
auto iter = conp->foomap.rbegin();
(iter++)->second.test_foo(Last_val);
while (iter != conp->foomap.rend()) {
(iter++)->second.test_foo();
}
if (open) {
loop_insert(pop, conp->foomap, std::make_pair(rand(), foo()),
20);
nvobj::transaction::manual tx(pop);
conp->foomap.begin()->second = foo(234);
nvobj::transaction::commit();
}
}
}
int
main(int argc, char *argv[])
{
START(argc, argv, "obj_cpp_map");
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_map(pop, open);
pop.close();
DONE(nullptr);
}