#pragma once #include "io_primitive.h" EXTERN_C_BEGIN // forward declartions struct blobtree_t; struct baked_blobtree_t; enum node_operation { UNION_OP, INTERSECTION_OP, DIFFERENCE_OP }; // just used for guards the data range of the iterator // DO NOT TRY TO MODIFY THIS STRUCTURE MANUALLY struct node_iterator_t { void *_, *__, *___; }; /** * @brief Creates a new blobtree. * @return A pointer to the newly created blobtree. * @note The blobtree just holds some information pointing to each primitive given, but not has the own of the primitives. */ API blobtree_t* create_blobtree() noexcept; API void destroy_blobtree(blobtree_t* blobtree) noexcept; /** * @brief Bakes the blobtree into a more efficient structure for solvers. * @param[in] blobtree The blobtree to bake, which should only hold one tree but a forest of trees. * @return A pointer to the baked blobtree. * @note This operation can be time consuming since it involves twice time of depth-first travelsal. */ API baked_blobtree_t* bake_blobtree(const blobtree_t* blobtree) noexcept; API void destroy_baked_blobtree(baked_blobtree_t* baked_blobtree) noexcept; /** * @brief Add a primitive node to the blobtree. * @param[in] blobtree The blobtree to add the node to. * @param[in] primitive The primitive to add to the blobtree. * @return The iterator of the newly created node. */ API node_iterator_t blobtree_add_primitive_node(blobtree_t* blobtree, primitive* primitive) noexcept; /** * @brief Add an operation node to the blobtree. * @param[in] blobtree The blobtree to add the node to. * @param[in] lhs The left-hand side node iterator. * @param[in] rhs The right-hand side node iterator. * @param[in] op The operation to perform on the two nodes. * @return The iterator of the newly created node. * @note This function does not check whether the input nodes are on that blobtree or not. * It is the user's responsibility to check that. */ API node_iterator_t blobtree_add_operation_node(blobtree_t* blobtree, node_iterator_t lhs, node_iterator_t rhs, node_operation op) noexcept; /** * @brief remove a node from the blobtree. * @param[in] blobtree The blobtree to remove the node from. * @param[in] node The iterator of the node to remove. * @note This function does not check whether the node is on that blobtree or not. * It is the user's responsibility to check that. */ API void blobtree_remove_node(blobtree_t* blobtree, node_iterator_t node) noexcept; EXTERN_C_END