From a7ec9dab95795ae1dbb64f4d916a7b13efdc9a8a Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 11 Jan 2001 02:35:21 +0000 Subject: [PATCH] - Preliminary tree code - added a key enumerator to hashtables (similar to value enumerator, just that it enumerates all keys in the hash) --- WINGs/Makefile.am | 2 + WINGs/WUtil.h | 38 ++++++++++- WINGs/hashtable.c | 27 ++++++++ WINGs/tree.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 WINGs/tree.c diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 3e16dd66..61688639 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -43,6 +43,7 @@ libWINGs_a_SOURCES = \ notification.c \ selection.c \ string.c \ + tree.c \ userdefaults.c \ usleep.c \ wapplication.c \ @@ -95,6 +96,7 @@ libWUtil_a_SOURCES = \ memory.c \ notification.c \ string.c \ + tree.c \ userdefaults.c \ usleep.c \ wapplication.c \ diff --git a/WINGs/WUtil.h b/WINGs/WUtil.h index b3217bc3..60db95ea 100644 --- a/WINGs/WUtil.h +++ b/WINGs/WUtil.h @@ -120,6 +120,9 @@ enum { typedef struct W_Array WMArray; typedef struct W_Bag WMBag; typedef struct W_Data WMData; +typedef struct W_TreeNode WMTreeNode; +typedef struct W_TreeNode WMTree; +typedef struct W_HashTable WMDictionary; typedef struct W_HashTable WMHashTable; typedef struct W_UserDefaults WMUserDefaults; typedef struct W_Notification WMNotification; @@ -128,7 +131,6 @@ typedef struct W_Host WMHost; typedef struct W_Connection WMConnection; - typedef int WMCompareDataProc(const void *item1, const void *item2); typedef void WMFreeDataProc(void *data); @@ -307,6 +309,8 @@ WMHashEnumerator WMEnumerateHashTable(WMHashTable *table); void* WMNextHashEnumeratorItem(WMHashEnumerator *enumerator); +void* WMNextHashEnumeratorKey(WMHashEnumerator *enumerator); + unsigned WMCountHashTable(WMHashTable *table); @@ -568,6 +572,38 @@ unsigned WMGetDataFormat(WMData *aData); /* Storing data */ +/*--------------------------------------------------------------------------*/ + +/* Generic Tree and TreeNode */ + +WMTreeNode* WMCreateTreeNode(void *data); + +WMTreeNode* WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor); + +WMTreeNode* WMInsertItemInTree(WMTreeNode *parent, int index, void *item); + +WMTreeNode* WMAddItemToTree(WMTreeNode *parent, void *item); + +WMTreeNode* WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *node); + +WMTreeNode* WMAddNodeToTree(WMTreeNode *parent, WMTreeNode *node); + +int WMGetTreeNodeDepth(WMTreeNode *node); + +void WMDestroyTreeNode(WMTreeNode *node); + + +/*--------------------------------------------------------------------------*/ + +/* Dictionaries */ +/* +WMDictionary* WMCreateDictionaryFromElements(void *key, void *value, ...); + +#define WMGetDictionaryEntryForKey(dict, key) WMHashGet(dict, key) + +WMArray* WMGetAllDictionaryKeys(WMDictionary *dPtr); +*/ + /*--------------------------------------------------------------------------*/ diff --git a/WINGs/hashtable.c b/WINGs/hashtable.c index 5ea12be3..fc5f0f8a 100644 --- a/WINGs/hashtable.c +++ b/WINGs/hashtable.c @@ -361,6 +361,33 @@ WMNextHashEnumeratorItem(WMHashEnumerator *enumerator) } +void* +WMNextHashEnumeratorKey(WMHashEnumerator *enumerator) +{ + const void *key = NULL; + + /* this assumes the table doesn't change between + * WMEnumerateHashTable() and WMNextHashEnumeratorKey() calls */ + + if (enumerator->nextItem==NULL) { + HashTable *table = enumerator->table; + while (++enumerator->index < table->size) { + if (table->table[enumerator->index]!=NULL) { + enumerator->nextItem = table->table[enumerator->index]; + break; + } + } + } + + if (enumerator->nextItem) { + key = ((HashItem*)enumerator->nextItem)->key; + enumerator->nextItem = ((HashItem*)enumerator->nextItem)->next; + } + + return (void*)key; +} + + unsigned WMCountHashTable(WMHashTable *table) { diff --git a/WINGs/tree.c b/WINGs/tree.c new file mode 100644 index 00000000..0bee563f --- /dev/null +++ b/WINGs/tree.c @@ -0,0 +1,160 @@ + + + +//#include +#include + +#include "WUtil.h" + + +typedef struct W_TreeNode { + void *data; + + //unsigned int uflags:16; + + WMArray *leaves; + + int depth; + + struct W_TreeNode *parent; + + WMFreeDataProc *destructor; +} W_TreeNode; + + + +void +destroyNode(void *data) +{ + WMTreeNode *node = (WMTreeNode*) data; + + if (node->destructor) { + (*node->destructor)(node->data); + } + if (node->leaves) { + WMFreeArray(node->leaves); + } + wfree(node); +} + + +WMTreeNode* +WMCreateTreeNode(void *data) +{ + return WMCreateTreeNodeWithDestructor(data, NULL); +} + + +WMTreeNode* +WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor) +{ + WMTreeNode *node; + + node = (WMTreeNode*) wmalloc(sizeof(W_TreeNode)); + memset(node, 0, sizeof(W_TreeNode)); + + node->destructor = destructor; + + node->data = data; + node->parent = NULL; + node->depth = 0; + node->leaves = WMCreateArrayWithDestructor(1, destroyNode); + + return node; +} + + +WMTreeNode* +WMInsertItemInTree(WMTreeNode *parent, int index, void *item) +{ + WMTreeNode *node; + + wassertrv(parent!=NULL, NULL); + + node = WMCreateTreeNodeWithDestructor(item, parent->destructor); + node->parent = parent; + node->depth = parent->depth+1; + if (index < 0 || index > WMGetArrayItemCount(parent->leaves)) { + WMAddToArray(parent->leaves, node); + } else { + WMInsertInArray(parent->leaves, index, node); + } + + return node; +} + + +WMTreeNode* +WMAddItemToTree(WMTreeNode *parent, void *item) +{ + WMTreeNode *node; + + wassertrv(parent!=NULL, NULL); + + node = WMCreateTreeNodeWithDestructor(item, parent->destructor); + node->parent = parent; + node->depth = parent->depth+1; + WMAddToArray(parent->leaves, node); + + return node; +} + + +static void +updateNodeDepth(WMTreeNode *node, int depth) +{ + int i; + + node->depth = depth; + for (i=0; ileaves); i++) { + updateNodeDepth(WMGetFromArray(node->leaves, i), depth+1); + } +} + + +WMTreeNode* +WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *node) +{ + wassertrv(parent!=NULL, NULL); + wassertrv(node!=NULL, NULL); + + node->parent = parent; + updateNodeDepth(node, parent->depth+1); + if (index < 0 || index > WMGetArrayItemCount(parent->leaves)) { + WMAddToArray(parent->leaves, node); + } else { + WMInsertInArray(parent->leaves, index, node); + } + + return node; +} + + +WMTreeNode* +WMAddNodeToTree(WMTreeNode *parent, WMTreeNode *node) +{ + wassertrv(parent!=NULL, NULL); + wassertrv(node!=NULL, NULL); + + node->parent = parent; + updateNodeDepth(node, parent->depth+1); + WMAddToArray(parent->leaves, node); + + return node; +} + + +int +WMGetTreeNodeDepth(WMTreeNode *node) +{ + return node->depth; +} + + +void +WMDestroyTreeNode(WMTreeNode *node) +{ + destroyNode(node); +} + +