From 46e540b1b18da2f0034106a67fc8c4fad37b40ee Mon Sep 17 00:00:00 2001 From: Stu Black Date: Mon, 27 Oct 2025 23:28:43 -0400 Subject: [PATCH] Prune the WMBag API in preparation for rewriting it in Rust. --- WINGs/WINGs/WUtil.h | 47 +--------- WINGs/bagtree.c | 214 -------------------------------------------- 2 files changed, 1 insertion(+), 260 deletions(-) diff --git a/WINGs/WINGs/WUtil.h b/WINGs/WINGs/WUtil.h index 2797429c..27e60723 100644 --- a/WINGs/WINGs/WUtil.h +++ b/WINGs/WINGs/WUtil.h @@ -494,58 +494,18 @@ void* WMArrayPrevious(WMArray *array, WMArrayIterator *iter); * Slow for storing small numbers of elements */ -#define WMCreateBag(size) WMCreateTreeBag() - -#define WMCreateBagWithDestructor(size, d) WMCreateTreeBagWithDestructor(d) - WMBag* WMCreateTreeBag(void); -WMBag* WMCreateTreeBagWithDestructor(WMFreeDataProc *destructor); - -int WMGetBagItemCount(WMBag *bag); - -void WMAppendBag(WMBag *bag, WMBag *other); - -void WMPutInBag(WMBag *bag, void *item); - -/* insert will increment the index of elements after it by 1 */ -void WMInsertInBag(WMBag *bag, int index, void *item); - -/* erase will remove the element from the bag, - * but will keep the index of the other elements unchanged */ -int WMEraseFromBag(WMBag *bag, int index); - -/* delete and remove will remove the elements and cause the elements - * after them to decrement their indexes by 1 */ -int WMDeleteFromBag(WMBag *bag, int index); - -int WMRemoveFromBag(WMBag *bag, void *item); - void* WMGetFromBag(WMBag *bag, int index); void* WMReplaceInBag(WMBag *bag, int index, void *item); #define WMSetInBag(bag, index, item) WMReplaceInBag(bag, index, item) -/* comparer must return: - * < 0 if a < b - * > 0 if a > b - * = 0 if a = b - */ -void WMSortBag(WMBag *bag, WMCompareDataProc *comparer); - void WMEmptyBag(WMBag *bag); void WMFreeBag(WMBag *bag); -void WMMapBag(WMBag *bag, void (*function)(void*, void*), void *data); - -int WMGetFirstInBag(WMBag *bag, void *item); - -int WMCountInBag(WMBag *bag, void *item); - -int WMFindInBag(WMBag *bag, WMMatchDataProc *match, void *cdata); - void* WMBagFirst(WMBag *bag, WMBagIterator *ptr); void* WMBagLast(WMBag *bag, WMBagIterator *ptr); @@ -557,13 +517,8 @@ void* WMBagPrevious(WMBag *bag, WMBagIterator *ptr); void* WMBagIteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr); -int WMBagIndexForIterator(WMBag *bag, WMBagIterator ptr); - -/* The following 2 macros assume that the bag doesn't change in the for loop */ -#define WM_ITERATE_BAG(bag, var, i) \ - for (var = WMBagFirst(bag, &(i)); (i) != NULL; \ - var = WMBagNext(bag, &(i))) +/* The following macro assumes that the bag doesn't change in the for loop */ #define WM_ETARETI_BAG(bag, var, i) \ for (var = WMBagLast(bag, &(i)); (i) != NULL; \ diff --git a/WINGs/bagtree.c b/WINGs/bagtree.c index 4b3062ca..52f7c6ed 100644 --- a/WINGs/bagtree.c +++ b/WINGs/bagtree.c @@ -21,7 +21,6 @@ typedef struct W_Bag { int count; - void (*destructor) (void *item); } W_Bag; #define IS_LEFT(node) (node == node->parent->left) @@ -349,11 +348,6 @@ void PrintTree(WMBag * bag) #endif WMBag *WMCreateTreeBag(void) -{ - return WMCreateTreeBagWithDestructor(NULL); -} - -WMBag *WMCreateTreeBagWithDestructor(WMFreeDataProc * destructor) { WMBag *bag; @@ -362,64 +356,10 @@ WMBag *WMCreateTreeBagWithDestructor(WMFreeDataProc * destructor) bag->nil->left = bag->nil->right = bag->nil->parent = bag->nil; bag->nil->index = WBNotFound; bag->root = bag->nil; - bag->destructor = destructor; return bag; } -int WMGetBagItemCount(WMBag * self) -{ - return self->count; -} - -void WMAppendBag(WMBag * self, WMBag * bag) -{ - WMBagIterator ptr; - void *data; - - for (data = WMBagFirst(bag, &ptr); data != NULL; data = WMBagNext(bag, &ptr)) { - WMPutInBag(self, data); - } -} - -void WMPutInBag(WMBag * self, void *item) -{ - W_Node *ptr; - - ptr = wmalloc(sizeof(W_Node)); - - ptr->data = item; - ptr->index = self->count; - ptr->left = self->nil; - ptr->right = self->nil; - ptr->parent = self->nil; - - rbTreeInsert(self, ptr); - - self->count++; -} - -void WMInsertInBag(WMBag * self, int index, void *item) -{ - W_Node *ptr; - - ptr = wmalloc(sizeof(W_Node)); - - ptr->data = item; - ptr->index = index; - ptr->left = self->nil; - ptr->right = self->nil; - ptr->parent = self->nil; - - rbTreeInsert(self, ptr); - - while ((ptr = treeSuccessor(ptr, self->nil)) != self->nil) { - ptr->index++; - } - - self->count++; -} - static int treeDeleteNode(WMBag * self, W_Node *ptr) { if (ptr != self->nil) { @@ -434,47 +374,12 @@ static int treeDeleteNode(WMBag * self, W_Node *ptr) } ptr = rbTreeDelete(self, ptr); - if (self->destructor) - self->destructor(ptr->data); wfree(ptr); return 1; } return 0; } -int WMRemoveFromBag(WMBag * self, void *item) -{ - W_Node *ptr = treeFind(self->root, self->nil, item); - return treeDeleteNode(self, ptr); -} - -int WMEraseFromBag(WMBag * self, int index) -{ - W_Node *ptr = treeSearch(self->root, self->nil, index); - - if (ptr != self->nil) { - - self->count--; - - ptr = rbTreeDelete(self, ptr); - if (self->destructor) - self->destructor(ptr->data); - wfree(ptr); - - wassertrv(self->count == 0 || self->root->index >= 0, 1); - - return 1; - } else { - return 0; - } -} - -int WMDeleteFromBag(WMBag * self, int index) -{ - W_Node *ptr = treeSearch(self->root, self->nil, index); - return treeDeleteNode(self, ptr); -} - void *WMGetFromBag(WMBag * self, int index) { W_Node *node; @@ -486,41 +391,6 @@ void *WMGetFromBag(WMBag * self, int index) return NULL; } -int WMGetFirstInBag(WMBag * self, void *item) -{ - W_Node *node; - - node = treeFind(self->root, self->nil, item); - if (node != self->nil) - return node->index; - else - return WBNotFound; -} - -static int treeCount(W_Node * root, W_Node * nil, void *item) -{ - int count = 0; - - if (root == nil) - return 0; - - if (root->data == item) - count++; - - if (root->left != nil) - count += treeCount(root->left, nil, item); - - if (root->right != nil) - count += treeCount(root->right, nil, item); - - return count; -} - -int WMCountInBag(WMBag * self, void *item) -{ - return treeCount(self->root, self->nil, item); -} - void *WMReplaceInBag(WMBag * self, int index, void *item) { W_Node *ptr = treeSearch(self->root, self->nil, index); @@ -529,8 +399,6 @@ void *WMReplaceInBag(WMBag * self, int index, void *item) if (item == NULL) { self->count--; ptr = rbTreeDelete(self, ptr); - if (self->destructor) - self->destructor(ptr->data); wfree(ptr); } else if (ptr != self->nil) { old = ptr->data; @@ -554,37 +422,6 @@ void *WMReplaceInBag(WMBag * self, int index, void *item) return old; } -void WMSortBag(WMBag * self, WMCompareDataProc * comparer) -{ - void **items; - W_Node *tmp; - int i; - - if (self->count == 0) - return; - - items = wmalloc(sizeof(void *) * self->count); - i = 0; - - tmp = treeMinimum(self->root, self->nil); - while (tmp != self->nil) { - items[i++] = tmp->data; - tmp = treeSuccessor(tmp, self->nil); - } - - qsort(&items[0], self->count, sizeof(void *), comparer); - - i = 0; - tmp = treeMinimum(self->root, self->nil); - while (tmp != self->nil) { - tmp->index = i; - tmp->data = items[i++]; - tmp = treeSuccessor(tmp, self->nil); - } - - wfree(items); -} - static void deleteTree(WMBag * self, W_Node * node) { if (node == self->nil) @@ -592,9 +429,6 @@ static void deleteTree(WMBag * self, W_Node * node) deleteTree(self, node->left); - if (self->destructor) - self->destructor(node->data); - deleteTree(self, node->right); wfree(node); @@ -614,46 +448,6 @@ void WMFreeBag(WMBag * self) wfree(self); } -static void mapTree(W_Bag * tree, W_Node * node, void (*function) (void *, void *), void *data) -{ - if (node == tree->nil) - return; - - mapTree(tree, node->left, function, data); - - (*function) (node->data, data); - - mapTree(tree, node->right, function, data); -} - -void WMMapBag(WMBag * self, void (*function) (void *, void *), void *data) -{ - mapTree(self, self->root, function, data); -} - -static int findInTree(W_Bag * tree, W_Node * node, WMMatchDataProc * function, void *cdata) -{ - int index; - - if (node == tree->nil) - return WBNotFound; - - index = findInTree(tree, node->left, function, cdata); - if (index != WBNotFound) - return index; - - if ((*function) (node->data, cdata)) { - return node->index; - } - - return findInTree(tree, node->right, function, cdata); -} - -int WMFindInBag(WMBag * self, WMMatchDataProc * match, void *cdata) -{ - return findInTree(self, self->root, match, cdata); -} - void *WMBagFirst(WMBag * self, WMBagIterator * ptr) { W_Node *node; @@ -735,11 +529,3 @@ void *WMBagIteratorAtIndex(WMBag * self, int index, WMBagIterator * ptr) return node->data; } } - -int WMBagIndexForIterator(WMBag * bag, WMBagIterator ptr) -{ - /* Parameter not used, but tell the compiler that it is ok */ - (void) bag; - - return ((W_Node *) ptr)->index; -}