From 87ab15aaa51ad51f0a69e96c08d45ff23400b4dc Mon Sep 17 00:00:00 2001
From: Christian C <cc@localhost>
Date: Wed, 5 Mar 2025 14:59:22 -0800
Subject: Better Allocation Management

---
 src/main.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 68 insertions(+), 15 deletions(-)

(limited to 'src')

diff --git a/src/main.c b/src/main.c
index a710ecb..f3e455b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -109,20 +109,31 @@ struct AVLNode* left_rotate(struct AVLNode* parent)
   return child1;
 }
 
-struct AVLNode* insert_mask(struct AVLNode* node, struct MaskData* data)
+struct Result insert_mask(struct AVLNode* node, struct MaskData* data)
 {
+  struct Result result;
   // 1. Standard BST insertion
   if (node == NULL) {
-    return create_avl_mask_node(data);
+    return (struct Result) {create_avl_mask_node(data), TRUE};
   }
 
   struct MaskData *node_data = (struct MaskData*)node->data;
   if (node->compare(data, node_data)) {
-    node->left = insert_mask(node->left, data);
+    result = insert_mask(node->left, data);
+    if (!result.success) {
+      fprintf(stderr, "Failed to insert!");
+      return result;
+    }
+    node->left = (struct AVLNode*)result.data;
   } else if (node->compare(node->data, data)) {
-    node->right = insert_mask(node->right, data);
+    result = insert_mask(node->right, data);
+    if (!result.success) {
+      fprintf(stderr, "Failed to insert!");
+      return result;
+    }
+    node->right = (struct AVLNode*)result.data;
   } else {
-    return node;
+    return (struct Result) {node, FALSE};
   }
 
   // 2. Update height of the ancestor node
@@ -134,21 +145,31 @@ struct AVLNode* insert_mask(struct AVLNode* node, struct MaskData* data)
 
   // LeftLeft
   if ((balance > 1) && node->compare(data, node->left->data)) {
-    return right_rotate(node);
+    return (struct Result) {right_rotate(node), TRUE};
   }
   // RightRight
   if ((balance < -1) && node->compare(node->right->data, data)) {
-    return left_rotate(node);
+    return (struct Result) {left_rotate(node), TRUE};
   }
   // LeftRight
   if ((balance > 1) && node->compare(node->left->data, data)) {
-    return right_rotate(node);
+    return (struct Result) {right_rotate(node), TRUE};
   }
   // RightLeft
   if ((balance < -1) && node->compare(data,node->right->data)) {
-    return left_rotate(node);
+    return (struct Result) {left_rotate(node), TRUE};
   }
-  return node;
+  return (struct Result) {node, TRUE};
+}
+
+struct AVLNode* insert_mask_alloc(struct AVLNode* node, uint16_t label)
+{
+  struct MaskData* data = create_mask_data(label);
+  struct Result result = insert_mask(node, data);
+  if (!result.success) {
+    free(data);
+  }
+  return (struct AVLNode*)result.data;
 }
 
 void print_label(struct AVLNode* root) {
@@ -179,14 +200,46 @@ void free_avl_tree_nodes(struct AVLNode* root) {
   }
 }
 
+void increase_label_area(struct AVLNode* root, uint16_t label) {
+  if (root == NULL) {
+    return;
+  }
+  struct MaskData* data = (struct MaskData*)root->data;
+  if (data->label == label) {
+    data->area++;
+  }
+  else if (data->label > label) {
+    increase_label_area(root->left, label);
+  }
+  else if (data->label < label) {
+    increase_label_area(root->right, label);
+  }
+}
+
+void increase_label_perimeter(struct AVLNode* root, uint16_t label) {
+  if (root == NULL) {
+    return;
+  }
+  struct MaskData* data = (struct MaskData*)root->data;
+  if (data->label == label) {
+    data->perimeter++;
+  }
+  else if (data->label > label) {
+    increase_label_perimeter(root->left, label);
+  }
+  else if (data->label < label) {
+    increase_label_perimeter(root->right, label);
+  }
+}
+
 int main(int argc, char** argv)
 {
   struct AVLNode* root = NULL;
-  root = insert_mask(root, create_mask_data(2));
-  root = insert_mask(root, create_mask_data(5));
-  root = insert_mask(root, create_mask_data(1));
-  root = insert_mask(root, create_mask_data(3));
-  root = insert_mask(root, create_mask_data(4));
+  root = insert_mask_alloc(root, 2);
+  root = insert_mask_alloc(root, 5);
+  root = insert_mask_alloc(root, 1);
+  root = insert_mask_alloc(root, 3);
+  root = insert_mask_alloc(root, 4);
   printf("Inorder traversal of AVL tree: ");
   print_label(root);
   printf("\n");
-- 
cgit v1.2.1