1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-19 12:28:22 +01:00

- Preliminary tree code

- added a key enumerator to hashtables (similar to value enumerator,
  just that it enumerates all keys in the hash)
This commit is contained in:
dan
2001-01-11 02:35:21 +00:00
parent 9a43af3d83
commit a7ec9dab95
4 changed files with 226 additions and 1 deletions

View File

@@ -43,6 +43,7 @@ libWINGs_a_SOURCES = \
notification.c \ notification.c \
selection.c \ selection.c \
string.c \ string.c \
tree.c \
userdefaults.c \ userdefaults.c \
usleep.c \ usleep.c \
wapplication.c \ wapplication.c \
@@ -95,6 +96,7 @@ libWUtil_a_SOURCES = \
memory.c \ memory.c \
notification.c \ notification.c \
string.c \ string.c \
tree.c \
userdefaults.c \ userdefaults.c \
usleep.c \ usleep.c \
wapplication.c \ wapplication.c \

View File

@@ -120,6 +120,9 @@ enum {
typedef struct W_Array WMArray; typedef struct W_Array WMArray;
typedef struct W_Bag WMBag; typedef struct W_Bag WMBag;
typedef struct W_Data WMData; 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_HashTable WMHashTable;
typedef struct W_UserDefaults WMUserDefaults; typedef struct W_UserDefaults WMUserDefaults;
typedef struct W_Notification WMNotification; typedef struct W_Notification WMNotification;
@@ -128,7 +131,6 @@ typedef struct W_Host WMHost;
typedef struct W_Connection WMConnection; typedef struct W_Connection WMConnection;
typedef int WMCompareDataProc(const void *item1, const void *item2); typedef int WMCompareDataProc(const void *item1, const void *item2);
typedef void WMFreeDataProc(void *data); typedef void WMFreeDataProc(void *data);
@@ -307,6 +309,8 @@ WMHashEnumerator WMEnumerateHashTable(WMHashTable *table);
void* WMNextHashEnumeratorItem(WMHashEnumerator *enumerator); void* WMNextHashEnumeratorItem(WMHashEnumerator *enumerator);
void* WMNextHashEnumeratorKey(WMHashEnumerator *enumerator);
unsigned WMCountHashTable(WMHashTable *table); unsigned WMCountHashTable(WMHashTable *table);
@@ -568,6 +572,38 @@ unsigned WMGetDataFormat(WMData *aData);
/* Storing data */ /* 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);
*/
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/

View File

@@ -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 unsigned
WMCountHashTable(WMHashTable *table) WMCountHashTable(WMHashTable *table)
{ {

160
WINGs/tree.c Normal file
View File

@@ -0,0 +1,160 @@
//#include <stdlib.h>
#include <string.h>
#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; i<WMGetArrayItemCount(node->leaves); 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);
}