112 lines
3.3 KiB
C
112 lines
3.3 KiB
C
|
#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__
|