#include <stddef.h>
#include "../Include/tesselator.h"
#include "bucketalloc.h"
#include "dict.h"
Dict *dictNewDict( TESSalloc* alloc, void *frame, int (*leq)(void *frame, DictKey key1, DictKey key2) )
{
Dict *dict = (Dict *)alloc->memalloc( alloc->userData, sizeof( Dict ));
DictNode *head;
if (dict == NULL) return NULL;
head = &dict->head;
head->key = NULL;
head->next = head;
head->prev = head;
dict->frame = frame;
dict->leq = leq;
if (alloc->dictNodeBucketSize < 16)
alloc->dictNodeBucketSize = 16;
if (alloc->dictNodeBucketSize > 4096)
alloc->dictNodeBucketSize = 4096;
dict->nodePool = createBucketAlloc( alloc, "Dict", sizeof(DictNode), alloc->dictNodeBucketSize );
return dict;
}
void dictDeleteDict( TESSalloc* alloc, Dict *dict )
{
deleteBucketAlloc( dict->nodePool );
alloc->memfree( alloc->userData, dict );
}
DictNode *dictInsertBefore( Dict *dict, DictNode *node, DictKey key )
{
DictNode *newNode;
do {
node = node->prev;
} while( node->key != NULL && ! (*dict->leq)(dict->frame, node->key, key));
newNode = (DictNode *)bucketAlloc( dict->nodePool );
if (newNode == NULL) return NULL;
newNode->key = key;
newNode->next = node->next;
node->next->prev = newNode;
newNode->prev = node;
node->next = newNode;
return newNode;
}
void dictDelete( Dict *dict, DictNode *node )
{
node->next->prev = node->prev;
node->prev->next = node->next;
bucketFree( dict->nodePool, node );
}
DictNode *dictSearch( Dict *dict, DictKey key )
{
DictNode *node = &dict->head;
do {
node = node->next;
} while( node->key != NULL && ! (*dict->leq)(dict->frame, key, node->key));
return node;
}