Red-Black Tree Code Cleanups:
[blender.git] / source / blender / blenlib / BLI_dlrbTree.h
index a17cbbd19931f203c02ed70d7163d239df387a43..bced738b4e7873ed9f884cb358a0fe4af34d9f21 100644 (file)
@@ -54,10 +54,10 @@ typedef struct DLRBT_Node {
 } DLRBT_Node;
 
 /* Red/Black defines for tree_col */
-enum eDLRBT_Colors {
+typedef enum eDLRBT_Colors {
        DLRBT_BLACK= 0,
        DLRBT_RED,
-};
+} eDLRBT_Colors;
 
 /* -------- */
 
@@ -70,9 +70,30 @@ typedef struct DLRBT_Tree {
        void *root;                                     /* this should be based on DLRBT_Node-s */
 } DLRBT_Tree;
 
+/* Callback Types --------------------------------- */
+
+/* return -1, 0, 1 for whether the given data is less than, equal to, or greater than the given node 
+ *     - node: <DLRBT_Node> the node to compare to
+ *     - data: pointer to the relevant data or values stored in the bitpattern dependant on the function
+ */
+typedef short (*DLRBT_Comparator_FP)(void *node, void *data);
+
+/* return a new node instance wrapping the given data 
+ *     - data: pointer to the relevant data to create a subclass of node from
+ */
+typedef DLRBT_Node *(*DLRBT_NAlloc_FP)(void *data);
+
+/* update an existing node instance accordingly to be in sync with the given data *    
+ *     - node: <DLRBT_Node> the node to update
+ *     - data: pointer to the relevant data or values stored in the bitpattern dependant on the function
+ */
+typedef void (*DLRBT_NUpdate_FP)(void *node, void *data);
+
 /* ********************************************** */
 /* Public API */
 
+/* ADT Management ------------------------------- */
+
 /* Create a new tree, and initialise as necessary */
 DLRBT_Tree *BLI_dlrbTree_new(void);
 
@@ -86,16 +107,52 @@ void BLI_dlrbTree_free(DLRBT_Tree *tree);
 void BLI_dlrbTree_linkedlist_sync(DLRBT_Tree *tree);
 
 
+/* Searching ------------------------------------ */
 
-/* Balance the tree after the given element has been added to it 
- * (using custom code, in the Binary Tree way).
+/* Find the node which matches or is the closest to the requested node */
+DLRBT_Node *BLI_dlrbTree_search(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data);
+
+/* Find the node which exactly matches the required data */
+DLRBT_Node *BLI_dlrbTree_search_exact(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data);
+
+/* Find the node which occurs immediately before the best matching node */
+DLRBT_Node *BLI_dlrbTree_search_prev(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data);
+
+/* Find the node which occurs immediately after the best matching node */
+DLRBT_Node *BLI_dlrbTree_search_next(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data);
+
+
+/* Check whether there is a node matching the requested node */
+short BLI_dlrbTree_contains(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, void *search_data);
+
+
+/* Node Operations (Managed) --------------------- */
+/* These methods automate the process of adding/removing nodes from the BST, 
+ * using the supplied data and callbacks
  */
-void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node);
+
+/* Add the given data to the tree, and return the node added */
+// NOTE: for duplicates, the update_cb is called (if available), and the existing node is returned
+DLRBT_Node *BLI_dlrbTree_add(DLRBT_Tree *tree, DLRBT_Comparator_FP cmp_cb, 
+                       DLRBT_NAlloc_FP new_cb, DLRBT_NUpdate_FP update_cb, void *data);
+
 
 /* Remove the given element from the tree and balance again */
 // FIXME: this is not implemented yet... 
 void BLI_dlrbTree_remove(DLRBT_Tree *tree, DLRBT_Node *node);
 
+/* Node Operations (Manual) --------------------- */
+/* These methods require custom code for creating BST nodes and adding them to the 
+ * tree in special ways, such that the node can then be balanced.
+ *
+ * It is recommended that these methods are only used where the other method is too cumbersome...
+ */
+
+/* Balance the tree after the given node has been added to it 
+ * (using custom code, in the Binary Tree way).
+ */
+void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node);
+
 /* ********************************************** */
 
 #endif // BLI_DLRB_TREE_H