#ifndef CONT_TEST_COMMON_HPP
#define CONT_TEST_COMMON_HPP
#include <unittest.h>
#include "libpmemobj++/p.hpp"
namespace nvobj = pmem::obj;
namespace {
const int Test_arr_size = 10;
const int Last_val = 0xFF;
struct foo {
explicit foo(int tobar = 1) : bar(tobar)
{
for (int i = 0; i < Test_arr_size; ++i)
arr[i] = i;
}
foo(const foo &rhs) = default;
foo &operator=(const foo &rhs) = default;
bool
operator<(const foo &rhs) const noexcept
{
return this->bar < rhs.bar;
}
void
test_foo(int tobar = 1) const
{
UT_ASSERTeq(bar, tobar);
for (int i = 0; i < Test_arr_size; ++i)
UT_ASSERTeq(arr[i], i);
}
nvobj::p<int> bar;
nvobj::p<char> arr[Test_arr_size];
};
struct hash : public std::unary_function<nvobj::p<size_t>, const foo &> {
nvobj::p<size_t>
operator()(const foo &key) const
{
return (nvobj::p<size_t>)key.bar;
}
};
struct equal_to : public std::binary_function<bool, const foo &, const foo &> {
bool
operator()(const foo &lhs, const foo &rhs) const
{
return lhs.bar == rhs.bar;
}
};
template <typename T>
void
test_container_val(T &cont)
{
auto iter = cont.rbegin();
(iter++)->test_foo(Last_val);
while (iter != cont.rend()) {
(iter++)->test_foo();
}
}
template <typename T, typename Y, typename pool>
void
loop_insert(pool &pop, T &cont, const Y &val, int count)
{
for (int i = 0; i < count; ++i) {
try {
nvobj::transaction::exec_tx(pop, [&] {
cont.insert(cont.cbegin(), Y(val));
});
} catch (...) {
UT_ASSERT(0);
}
}
}
}
#endif