Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenlib/intern/DLRB_tree.c
| Show All 39 Lines | void BLI_dlrbTree_init(DLRBT_Tree *tree) | ||||
| if (tree == NULL) { | if (tree == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| tree->first = tree->last = tree->root = NULL; | tree->first = tree->last = tree->root = NULL; | ||||
| } | } | ||||
| /* Helper for traversing tree and freeing sub-nodes */ | /* Helper for traversing tree and freeing sub-nodes */ | ||||
| static void recursive_tree_free_nodes(DLRBT_Node *node) | static void recursive_tree_free_nodes(DLRBT_Node *node, DLRBT_NFree_FP free_cb) | ||||
| { | { | ||||
| /* sanity check */ | /* sanity check */ | ||||
| if (node == NULL) { | if (node == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* free child nodes + subtrees */ | /* free child nodes + subtrees */ | ||||
| recursive_tree_free_nodes(node->left); | recursive_tree_free_nodes(node->left, free_cb); | ||||
| recursive_tree_free_nodes(node->right); | recursive_tree_free_nodes(node->right, free_cb); | ||||
| /* free self */ | /* free self */ | ||||
| MEM_freeN(node); | if (free_cb) { | ||||
| free_cb(node); | |||||
| } | |||||
| } | } | ||||
| void BLI_dlrbTree_free(DLRBT_Tree *tree) | void BLI_dlrbTree_free(DLRBT_Tree *tree, DLRBT_NFree_FP free_cb) | ||||
| { | { | ||||
| if (tree == NULL) { | if (tree == NULL) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* if the list-base stuff is set, just use that (and assume its set), | /* if the list-base stuff is set, just use that (and assume its set), | ||||
| * otherwise, we'll need to traverse the tree... | * otherwise, we'll need to traverse the tree... | ||||
| */ | */ | ||||
| if (tree->first) { | if (tree->first) { | ||||
| /* free list */ | /* free list */ | ||||
| if (free_cb) { | |||||
| LISTBASE_FOREACH_MUTABLE(DLRBT_Node *, node, tree) { | |||||
| free_cb(node); | |||||
| } | |||||
| BLI_listbase_clear((ListBase *)tree); | |||||
| } | |||||
| else { | |||||
| BLI_freelistN((ListBase *)tree); | BLI_freelistN((ListBase *)tree); | ||||
| } | } | ||||
| } | |||||
| else { | else { | ||||
| /* traverse tree, freeing sub-nodes */ | /* traverse tree, freeing sub-nodes */ | ||||
| recursive_tree_free_nodes(tree->root); | recursive_tree_free_nodes(tree->root, free_cb); | ||||
| } | } | ||||
| /* clear pointers */ | /* clear pointers */ | ||||
| tree->first = tree->last = tree->root = NULL; | tree->first = tree->last = tree->root = NULL; | ||||
| } | } | ||||
| /* ------- */ | /* ------- */ | ||||
| ▲ Show 20 Lines • Show All 492 Lines • ▼ Show 20 Lines | switch (cmp_cb(parNode, data)) { | ||||
| new_node = 1; | new_node = 1; | ||||
| parNode->right = node; | parNode->right = node; | ||||
| node->parent = parNode; | node->parent = parNode; | ||||
| break; | break; | ||||
| } | } | ||||
| default: /* update the duplicate node as appropriate */ | default: /* update the duplicate node as appropriate */ | ||||
| { | { | ||||
| /* Return the updated node after calling the callback. */ | |||||
| node = parNode; | |||||
| if (update_cb) { | if (update_cb) { | ||||
| update_cb(parNode, data); | update_cb(node, data); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* no nodes in the tree yet... add a new node as the root */ | /* no nodes in the tree yet... add a new node as the root */ | ||||
| node = new_cb(data); | node = new_cb(data); | ||||
| Show All 26 Lines | |||||