#include #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