DICT0.H

/*************************************************************/ 
/** **/
/** Microsoft RPC Examples **/
/** Dictionary Application **/
/** Copyright 1992 - 1998 Microsoft Corporation **/
/** **/
/*************************************************************/

/**************************************************************/
/* user interface header file for top down splay package */
/* based on Sleator & Tarjan's Self Adjusting Trees */
/**************************************************************/

typedef int (*cmp_rec_func)(void *, void *);
/* type of a comparison function */

typedef struct tnode {
struct tnode *left; /* left child pointer */
struct tnode *right; /* right child pointer */
void *item; /* pointer to some structure */
} TreeNode;

typedef struct dictnode {
TreeNode *root; /* pointer to the root of a SAT */
long size; /* number of records in dictionary */
void * state; /* reserved for state info */
cmp_rec_func cmp_rec; /* pointer to a comparison function */
TreeNode* (*splay)(TreeNode *, void *, cmp_rec_func);
/* pointer to a splay function */
void (*print_rec)(void *); /* one line print function */
} Dictionary;

/*************************************************************************/
/***** Core functions (internal) *****/
/*************************************************************************/

TreeNode * /* returns the new root */
tdSplay( /* general top down splay */
TreeNode *root, /* the current root of the tree */
void *keyItem, /* pointer to a "key item" searched for */
int (*cmp)(void *, void *) );
/* pointer to a comparison function */

TreeNode*
tdSplayLeft(TreeNode* root);

TreeNode*
tdSplayRight(TreeNode* root);

void
print_tree_sat( /* prints the binary tree (indented right subtree,
followed by the root, followed by the indented
right dubtree) */
Dictionary * dp,
int indent); /* number of blanks to indent subtrees */

/*************************************************************************/
/*** Minimal Dictionary Operations: ***/
/*** ***/
/*** Dictionary *Dict_New(Cmp_rec*, Splay*, print_rec*) ***/
/*** ***/
/*** Dict_Status Dict_Find(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Next(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Prev(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Insert(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Delete(Dictionary*, Item**) ***/
/*** ***/
/*** Item* DICT_CURR_ITEM(Dict*) ***/
/*************************************************************************/

typedef enum {
SUCCESS,
ITEM_ALREADY_PRESENT,
ITEM_NOT_FOUND,
FIRST_ITEM,
LAST_ITEM,
EMPTY_DICTIONARY,
NULL_ITEM
} Dict_Status;

#define DICT_CURR_ITEM(pDict) ( (pDict)->root->item )

#define DICT_EMPTY(pDict) ( (pDict)->root == NULL )

Dictionary*
Dict_New( /* returns a new dictionary node */
int (*cmp_rec) /* pointer to item comparison function */
(void *, void *),
TreeNode* (*splay) /* pointer to a splay function */
(TreeNode *, void *, cmp_rec_func),

void (*print_rec) /* pointer to one line item print routine */
(void *) );

Dict_Status
Dict_Find(
Dictionary* dp, /* Dictionary to be searched. */
void* item); /* Item searched for. */

Dict_Status
Dict_Next(
Dictionary* dp, /* Dictionary to be searched. */
void* item); /* A Key item. Advance to successor of item in dp. */

Dict_Status
Dict_Prev(
Dictionary* dp, /* Dictionary to be searched. */
void* item); /* A Key item. Retreat to predecessor of item in dp. */

Dict_Status
Dict_Insert( /* insert the given item into the tree */
Dictionary* dp, /* the modified dictionary */
void* item); /* the item to be inserted */

Dict_Status
Dict_Delete( /* delete the given item into from the tree */
Dictionary* dp, /* the modified dictionary */
void** pItem); /* IN: points to the (key) item to be deleted */
/* OUT: points to the item just deleted */