main
Brett 2024-03-04 12:26:22 -05:00
parent 41e0791a53
commit 77a01e9b22
3 changed files with 113 additions and 13 deletions

@ -1 +1 @@
Subproject commit b7d69bdcbb4e9bb61650c7d85e7ae444cb21ed74 Subproject commit fe9cd9a6efcb4636172bea5940da5071c7ecf1e7

View File

@ -28,6 +28,7 @@ namespace fb
inline void execute_tests() inline void execute_tests()
{ {
execute(); execute();
funny();
} }
} }

View File

@ -86,17 +86,54 @@ namespace fb
std::array<blt::i32, 4> arg_c = {2, 2, 2, 0}; std::array<blt::i32, 4> arg_c = {2, 2, 2, 0};
struct construct_info
{
type_t type;
bool choice;
};
std::vector<construct_info> create_info(blt::size_t size)
{
std::vector<construct_info> info;
construct_info root = {random_type(), false};
std::stack<std::pair<construct_info, blt::size_t>> stack;
stack.emplace(root, 0);
while (!stack.empty())
{
auto top = stack.top();
auto node = top.first;
auto depth = top.second;
info.push_back(node);
stack.pop();
for (blt::i32 i = 0; i < arg_c[static_cast<int>(info.back().type)]; i++)
{
if (depth >= size)
break;
if (choice())
stack.emplace(construct_info{random_type(), true}, depth + 1);
else
stack.emplace(construct_info{random_type_sub(), false}, depth + 1);
}
}
return info;
}
class tree1 class tree1
{ {
public:
blt::bump_allocator<true> alloc{sizeof(node_t) * 8192};
private: private:
struct node_t struct node_t
{ {
blt::bump_allocator<true>& alloc;
std::array<node_t*, 2> children{}; std::array<node_t*, 2> children{};
double value = 0; double value = 0;
blt::i32 argc; blt::i32 argc;
type_t type; type_t type;
explicit node_t(type_t type): argc(arg_c[static_cast<int>(type)]), type(type) explicit node_t(type_t type, blt::bump_allocator<true>& alloc): alloc(alloc), argc(arg_c[static_cast<int>(type)]), type(type)
{ {
if (type == type_t::VALUE) if (type == type_t::VALUE)
value = random_value(); value = random_value();
@ -113,7 +150,7 @@ namespace fb
value = children[0]->value - children[1]->value; value = children[0]->value - children[1]->value;
return; return;
case type_t::MUL: case type_t::MUL:
value = children[0]->value * children[1]->value; value = children[0]->value * children[1]->value;
return; return;
case type_t::VALUE: case type_t::VALUE:
return; return;
@ -143,15 +180,44 @@ namespace fb
} }
return value; return value;
} }
~node_t()
{
for (int i = 0; i < argc; i++)
{
alloc.destroy(children[i]);
alloc.deallocate(children[i]);
}
}
}; };
node_t* root = nullptr; node_t* root = nullptr;
public: public:
blt::bump_allocator<true> alloc{sizeof(node_t) * 8192};
void create(blt::size_t size) void create(const std::vector<construct_info>& info)
{ {
root = alloc.emplace<node_t>(random_type()); // root = alloc.emplace<node_t>(random_type(), alloc);
// std::stack<std::pair<node_t*, blt::size_t>> stack;
// stack.emplace(root, 0);
// while (!stack.empty())
// {
// auto top = stack.top();
// auto* node = top.first;
// auto depth = top.second;
// stack.pop();
// for (blt::i32 i = 0; i < node->argc; i++)
// {
// auto& assignment = node->children[i];
// if (choice())
// assignment = alloc.emplace<node_t>(random_type(), alloc);
// else
// assignment = alloc.emplace<node_t>(random_type_sub(), alloc);
// if (depth < size)
// stack.emplace(assignment, depth + 1);
// }
// }
root = alloc.emplace<node_t>(info[0].type, alloc);
blt::size_t index = 1;
std::stack<std::pair<node_t*, blt::size_t>> stack; std::stack<std::pair<node_t*, blt::size_t>> stack;
stack.emplace(root, 0); stack.emplace(root, 0);
while (!stack.empty()) while (!stack.empty())
@ -163,12 +229,8 @@ namespace fb
for (blt::i32 i = 0; i < node->argc; i++) for (blt::i32 i = 0; i < node->argc; i++)
{ {
auto& assignment = node->children[i]; auto& assignment = node->children[i];
if (choice()) assignment = alloc.emplace<node_t>(info[index++].type, alloc);
assignment = alloc.emplace<node_t>(random_type()); stack.emplace(assignment, depth + 1);
else
assignment = alloc.emplace<node_t>(random_type_sub());
if (depth < size)
stack.emplace(assignment, depth + 1);
} }
} }
} }
@ -177,12 +239,49 @@ namespace fb
{ {
return root->evaluate_tree(); return root->evaluate_tree();
} }
~tree1()
{
alloc.destroy(root);
alloc.deallocate(root);
}
};
struct tree2
{
private:
struct node_t
{
double value;
blt::i32 argc;
type_t type;
};
node_t* nodes = nullptr;
blt::size_t size = 0;
public:
tree2() = default;
void create(const std::vector<construct_info>& info)
{
size = static_cast<blt::size_t>(std::pow(2, std::log2(info.size()) + 1));
nodes = new node_t[size];
for (blt::size_t i = 0; i < info; i++)
{
}
}
~tree2()
{
delete[] nodes;
}
}; };
void funny() void funny()
{ {
auto info = create_info(25);
tree1 love; tree1 love;
love.create(10); love.create(info);
BLT_TRACE(love.evaluate()); BLT_TRACE(love.evaluate());
} }
} }