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:
@@ -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 \
|
||||||
|
|||||||
@@ -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);
|
||||||
|
*/
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
160
WINGs/tree.c
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user