Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* --------------------------------------------------------------------
Microsoft OS/2 LAN Manager Copyright(c) Microsoft Corp., 1990
RPC - Written by Dov Harel
This file contains the definition for splay tree self adjusting binary trees -------------------------------------------------------------------- */
#ifndef __DICT_HXX__
#define __DICT_HXX__
#if 0
#include "objidl.h"
#include "common.h"
#endif // 0
extern "C" { #include "string.h"
}
#ifndef Nil
#define Nil 0
#endif
#ifndef DICT_MYSPLAY
#define VIRT_SPLAY
#else
#define VIRT_SPLAY virtual
#endif
typedef void * pUserType;
class TreeNode {
public: TreeNode *left; /* left child pointer */ TreeNode *right; /* right child pointer */ pUserType item; /* pointer to some structure */
TreeNode(pUserType itemI) { left = right = Nil; item = itemI; } };
typedef int (* CompareFN)(pUserType, pUserType); typedef void (* PrintFN)(pUserType);
typedef enum { SUCCESS, ITEM_ALREADY_PRESENT, ITEM_NOT_FOUND, FIRST_ITEM, LAST_ITEM, EMPTY_DICTIONARY, NULL_ITEM } Dict_Status;
class Dictionary { TreeNode * root; // pointer to the root of a SAT
long fCompare; // value of last compare
pUserType itemCur; // the current item
long size; // number of records in dictionary/
public:
Dictionary() { root = Nil; size = 0; }
long SplayUserType(pUserType);
// default comparison is (signed) comparison of pointers to entries
virtual int Compare (pUserType p1, pUserType p2) { long l1 = (long)p1; long l2 = (long)p2;
return l1 - l2; }
virtual void Print(pUserType pItem) { }
pUserType Dict_Curr_Item () { // return the top of the tree
return ((root)? root->item: Nil); }
pUserType Dict_Item () { // return item from Find/Next/Prev methods
return (itemCur); }
long Dict_Empty () { // Is the tree empty
return (root == Nil); }
// internal print routine
void PrinTree( int lmargin, TreeNode *np );
// printout the tree, requires print function
void Dict_Print(long indent = 1);
Dict_Status Dict_Find(pUserType); // Item searched for
Dict_Status Dict_Init() // First item of a Type
{ return Dict_Next( (pUserType) 0 ); }
Dict_Status Dict_Next(pUserType = Nil); // Next item of a Type
Dict_Status Dict_Prev(pUserType = Nil); // Previous item of a Type
Dict_Status Dict_Insert(pUserType); // Add a new item to the tree
Dict_Status Dict_Delete(pUserType *); // Delete an item form the tree
// returns the item just deleted
pUserType Dict_Delete_One(); // Delete any convenient node from the tree
// and return the deleted node
Dict_Status Dict_Discard() // Delete the dictionary ( but not the user items )
{ while ( Dict_Delete_One() ) ; return EMPTY_DICTIONARY; }
};
// dictionary of strings ( compare function compares strings )
class STRING_DICT : public Dictionary { public: virtual int Compare (pUserType p1, pUserType p2) { return strcmp( (char *)p1, (char *)p2 ); }
};
#endif // __DICT_HXX__
|