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.
 
 
 
 
 
 

112 lines
3.3 KiB

#ifndef __VARMAPINDEX_H__
#define __VARMAPINDEX_H__
/*---------------------------------------------------------------------------
File: VarMapIndex.h
Comments: Helper class for CMapStringToVar.
CIndexTree implements a sorted, balanced binary tree. This is used by CMapStringToVar
to provide enumeration in sorted order by key.
(c) Copyright 1995-1998, Mission Critical Software, Inc., All Rights Reserved
Proprietary and confidential to Mission Critical Software, Inc.
REVISION LOG ENTRY
Revision By: Christy Boles
Revised on 11/19/98 18:01:34
---------------------------------------------------------------------------
*/
#include "VarData.h"
class CHashItem;
class CIndexTree;
class CIndexItem
{
friend class CIndexTree;
CHashItem * pData;
CIndexItem * pLeft;
CIndexItem * pRight;
CIndexItem * pParent;
BOOL red;
public:
CVarData* GetValue();
CString GetKey();
protected:
CIndexItem(CHashItem*pd) { pData = pd; pLeft = NULL; pRight = NULL; pParent = NULL; red = FALSE;}
CHashItem* Data() { return pData; }
CIndexItem* Left() { return pLeft; }
CIndexItem* Right() { return pRight; }
CIndexItem* Parent() { return pParent; }
BOOL IsRed() { return red; }
void Left(CIndexItem* l) { pLeft = l; }
void Right(CIndexItem* r) { pRight = r; }
void Parent(CIndexItem* par) { pParent = par; }
void Data(CHashItem* p) { pData=p; }
void Red(BOOL rd = TRUE) { red = rd; }
void Black(BOOL blk = TRUE) { red = !blk; }
void McLogInternalDiagnostics(CString keyName,int depth);
};
typedef int CompareFunction(CIndexItem* i1,CIndexItem* i2);
typedef int CompareKeyFunction(CString s, CIndexItem* i);
extern CompareFunction CompareItems;
extern CompareKeyFunction CompareStringToItem;
extern CompareFunction CompareItemsNoCase;
extern CompareKeyFunction CompareStringToItemNoCase;
class CIndexTree
{
friend class CMapStringToVar;
CIndexItem* m_root;
CompareFunction* m_Compare;
CompareKeyFunction* m_CompareKey;
BOOL m_CaseSensitive;
protected:
CIndexTree(CompareFunction * comp = &CompareItems, CompareKeyFunction * kc = &CompareStringToItem)
{
m_root = NULL;
m_Compare = comp;
m_CompareKey = kc;
m_CaseSensitive = TRUE;
}
~CIndexTree() { RemoveAll(); }
public:
CIndexItem* GetFirstItem() const { CIndexItem * curr = m_root; while ( curr && curr->Left() ) curr = curr->Left(); return curr; }
CIndexItem* GetPrevItem(CIndexItem*curr) const;
CIndexItem* GetNextItem(CIndexItem*curr) const;
CIndexItem* GetFirstAfter(CString value) const;
void McLogInternalDiagnostics(CString keyName);
#ifdef _DEBUG
BOOL AssertValid(int nItems) const;
#endif
protected:
// functions called by CMapStringToVar to add/remove items from the tree
void RemoveAll();
CIndexItem * Insert(CHashItem* data);
void SetCompareFunctions(CompareFunction * f, CompareKeyFunction * kc) { m_Compare = f; m_CompareKey = kc; }
// Helper functions to maintain tree structure
void LeftRotate(CIndexItem* item);
void RightRotate(CIndexItem* item);
void RemoveHelper(CIndexItem* item);
};
#endif //__VARMAPINDEX_H__