You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.6 KiB
81 lines
2.6 KiB
#include <blobtree.hpp>
|
|
|
|
#include "io_blobtree.h"
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
API blobtree_t* create_blobtree() noexcept
|
|
{
|
|
void* res = mi_malloc(sizeof(blobtree_t));
|
|
::new (res) blobtree_t();
|
|
return (blobtree_t*)res;
|
|
}
|
|
|
|
API void destroy_blobtree(blobtree_t* blobtree) noexcept
|
|
{
|
|
if (blobtree == nullptr) return;
|
|
blobtree->~blobtree_t();
|
|
mi_free(blobtree);
|
|
}
|
|
|
|
API baked_blobtree_t* bake_blobtree(const blobtree_t* blobtree) noexcept
|
|
{
|
|
if (blobtree == nullptr) return nullptr;
|
|
void* res = mi_malloc(sizeof(baked_blobtree_t));
|
|
::new (res) baked_blobtree_t(*blobtree);
|
|
return (baked_blobtree_t*)res;
|
|
}
|
|
|
|
API void destroy_baked_blobtree(baked_blobtree_t* baked_blobtree) noexcept
|
|
{
|
|
if (baked_blobtree == nullptr) return;
|
|
baked_blobtree->~baked_blobtree_t();
|
|
mi_free(baked_blobtree);
|
|
}
|
|
|
|
static inline bool is_node_iterator_valid(node_iterator_t it) noexcept
|
|
{
|
|
return it._ != nullptr && it.__ != nullptr && it.___ != nullptr;
|
|
}
|
|
|
|
API node_iterator_t blobtree_add_primitive_node(blobtree_t* blobtree, primitive* primitive) noexcept
|
|
{
|
|
if (blobtree == nullptr || primitive == nullptr) return node_iterator_t{nullptr, nullptr, nullptr};
|
|
auto iter = blobtree->push_primitive_node(primitive);
|
|
return *(node_iterator_t*)&iter;
|
|
}
|
|
|
|
API node_iterator_t blobtree_add_operation_node(blobtree_t* blobtree,
|
|
node_iterator_t lhs,
|
|
node_iterator_t rhs,
|
|
node_operation op) noexcept
|
|
{
|
|
if (blobtree == nullptr || !is_node_iterator_valid(lhs) || !is_node_iterator_valid(rhs))
|
|
return node_iterator_t{nullptr, nullptr, nullptr};
|
|
|
|
auto cast_lhs = *(blobtree_t::iterator*)&lhs;
|
|
auto cast_rhs = *(blobtree_t::iterator*)&rhs;
|
|
|
|
blobtree_t::iterator iter{};
|
|
switch (op) {
|
|
case UNION_OP: iter = blobtree->push_operation_node(internal::eNodeOperation::unionOp, cast_lhs, cast_rhs); break;
|
|
case INTERSECTION_OP:
|
|
iter = blobtree->push_operation_node(internal::eNodeOperation::intersectionOp, cast_lhs, cast_rhs);
|
|
break;
|
|
case DIFFERENCE_OP:
|
|
iter = blobtree->push_operation_node(internal::eNodeOperation::differenceOp, cast_lhs, cast_rhs);
|
|
break;
|
|
default: return node_iterator_t{nullptr, nullptr, nullptr};
|
|
}
|
|
|
|
return *(node_iterator_t*)&iter;
|
|
}
|
|
|
|
API void blobtree_remove_node(blobtree_t* blobtree, node_iterator_t node) noexcept
|
|
{
|
|
if (blobtree == nullptr || !is_node_iterator_valid(node)) return;
|
|
auto cast_node = *(blobtree_t::iterator*)&node;
|
|
blobtree->pop_node(cast_node);
|
|
}
|
|
|
|
EXTERN_C_END
|