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

#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