#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 <iterator>
#include <set>
#define LAYOUT "cpp"
namespace
{
struct containers {
explicit containers(nvobj::pool_base &pop)
{
try {
nvobj::transaction::exec_tx(pop, [&] {
fooset.emplace();
fooset.emplace(Last_val);
});
} catch (...) {
UT_ASSERT(0);
}
}
std::multiset<foo, std::less<foo>, nvobj::allocator<foo>> fooset;
};
struct root {
nvobj::persistent_ptr<containers> cons;
};
void
test_set(nvobj::pool<root> &pop, bool open)
{
auto conp = pop.get_root()->cons;
UT_ASSERT(conp != nullptr);
test_container_val(conp->fooset);
if (open) {
loop_insert(pop, conp->fooset, foo(rand()), 20);
nvobj::transaction::manual tx(pop);
auto it = conp->fooset.begin();
std::advance(it, conp->fooset.size() / 2);
conp->fooset.erase(it);
nvobj::transaction::commit();
}
}
}
int
main(int argc, char *argv[])
{
START(argc, argv, "obj_cpp_multiset");
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_set(pop, open);
pop.close();
DONE(nullptr);
}