Forked from
Bariatti Francesco / pingouins
116 commits behind the upstream repository.
-
Bariatti Francesco authoredBariatti Francesco authored
allocator.cpp 1.98 KiB
#include "allocator.hpp"
#include <iostream>
#include <cstring>
namespace mcts
{
allocator::allocator(unsigned int size)
{
std::cout << "allocator initialization..." << std::endl;
node_arena = new node[size];
std::cout << "allocator initialization done" << std::endl;
limit = node_arena + size;
free_pointer = node_arena;
}
allocator::~allocator()
{
delete[] node_arena;
}
node* allocator::allocate(unsigned int size)
{
node* n;
#pragma GCC diagnostic ignored "-Wunused-value"
#pragma omp atomic capture
{
n = free_pointer;
free_pointer += size;
}
memset(n, 0, sizeof(node) * size);
if (n + size >= limit) throw "allocate_children: not enough memory";
return n;
}
unsigned int allocator::size() const
{
return limit - node_arena;
}
unsigned int allocator::free_space() const
{
return limit - free_pointer;
}
void allocator::clear()
{
free_pointer = node_arena;
}
node* allocator::allocate_unsafe(unsigned int size)
{
node* n = free_pointer;
free_pointer += size;
memset(n, 0, sizeof(node) * size);
if (n + size > limit) throw "allocate_children: not enough memory";
return n;
}
void allocator::copy(node* n1, node* n2, unsigned int prunning)
{
if (n1->get_statistics().count < prunning) return;
n2->set_statistics(n1->get_statistics());
unsigned int nb_children = n1->get_number_of_children();
n2->set_number_of_children(nb_children);
if (nb_children == 0) return;
n2->set_children(allocate_unsafe(nb_children));
node* children1 = n1->get_children();
node* children2 = n2->get_children();
for (unsigned int i = 0; i < nb_children; ++i)
{
copy(children1 + i, children2 + i, prunning);
}
}
node* allocator::move(node* root, unsigned int prunning)
{
node* r = allocate_unsafe(1);
copy(root, r, prunning);
free_pointer = node_arena;
node* res = allocate_unsafe(1);
copy(r, res);
return res;
}
}