164 lines
3.6 KiB
C++
164 lines
3.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
|
//
|
|
// File: alias.hxx
|
|
//
|
|
// Classes: CAliasBlock
|
|
// CAliases
|
|
//
|
|
// History: 26-May-94 DrewB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef __ALIAS_HXX__
|
|
#define __ALIAS_HXX__
|
|
|
|
// Number of alias slots to allocate in a chunk
|
|
#define ALIAS_BLOCK_SIZE 64
|
|
|
|
typedef WORD ALIAS;
|
|
#define INVALID_ALIAS ((ALIAS)0xffff)
|
|
|
|
// Aliases should not be zero because this causes error detection problems
|
|
#define INITIAL_ALIAS ((ALIAS)1)
|
|
|
|
// Values cannot be zero, this allows us to detect free slots in the
|
|
// value array
|
|
#define INVALID_VALUE ((DWORD)0)
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CAliasBlock (ab)
|
|
//
|
|
// Purpose: A block of values indexed by alias
|
|
//
|
|
// History: 26-May-94 DrewB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CAliasBlock
|
|
{
|
|
public:
|
|
CAliasBlock(ALIAS aliasBase,
|
|
CAliasBlock *pabNext);
|
|
|
|
BOOL ContainsAlias(ALIAS alias)
|
|
{
|
|
return alias >= _aliasBase && alias < _aliasBase+ALIAS_BLOCK_SIZE;
|
|
}
|
|
DWORD AliasValue(ALIAS alias)
|
|
{
|
|
thkAssert(!IsFree(alias));
|
|
|
|
return _dwValues[AliasIndex(alias)];
|
|
}
|
|
void RemoveAlias(ALIAS alias)
|
|
{
|
|
thkAssert(!IsFree(alias));
|
|
#if DBG == 1
|
|
CheckFree();
|
|
#endif
|
|
thkAssert(_iFilled > 0);
|
|
|
|
_iFilled--;
|
|
_dwValues[AliasIndex(alias)] = INVALID_VALUE;
|
|
}
|
|
void SetValue(ALIAS alias, DWORD dwValue)
|
|
{
|
|
thkAssert(!IsFree(alias));
|
|
thkAssert(dwValue != INVALID_VALUE);
|
|
|
|
_dwValues[AliasIndex(alias)] = dwValue;
|
|
}
|
|
|
|
ALIAS ValueAlias(DWORD dwValue);
|
|
ALIAS AddValue(DWORD dwValue);
|
|
|
|
CAliasBlock *GetNext(void)
|
|
{
|
|
return _pabNext;
|
|
}
|
|
void SetNext(CAliasBlock *pab)
|
|
{
|
|
_pabNext = pab;
|
|
}
|
|
int AliasesFilled(void)
|
|
{
|
|
return _iFilled;
|
|
}
|
|
|
|
#if DBG == 1
|
|
BOOL IsFree(ALIAS alias)
|
|
{
|
|
return _dwValues[AliasIndex(alias)] == INVALID_VALUE;
|
|
}
|
|
#endif
|
|
|
|
private:
|
|
int AliasIndex(ALIAS alias)
|
|
{
|
|
thkAssert(ContainsAlias(alias));
|
|
|
|
return (int)(alias-_aliasBase);
|
|
}
|
|
ALIAS IndexAlias(int iIndex)
|
|
{
|
|
thkAssert(iIndex >= 0 && iIndex < ALIAS_BLOCK_SIZE);
|
|
|
|
return (ALIAS)(iIndex+_aliasBase);
|
|
}
|
|
|
|
#if DBG == 1
|
|
void CheckFree(void);
|
|
#endif
|
|
|
|
ALIAS _aliasBase;
|
|
int _iFilled;
|
|
DWORD _dwValues[ALIAS_BLOCK_SIZE];
|
|
CAliasBlock *_pabNext;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CAliases (aliases)
|
|
//
|
|
// Purpose: Maintains a set of aliases for values
|
|
//
|
|
// History: 26-May-94 DrewB Created
|
|
//
|
|
// Notes: Values must be unique
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CAliases
|
|
{
|
|
public:
|
|
CAliases(void)
|
|
: _abStatic(INITIAL_ALIAS, NULL)
|
|
{
|
|
// Start alias list with the static block
|
|
_pabAliases = &_abStatic;
|
|
|
|
// The static block takes the first block of aliases
|
|
_aliasBase = INITIAL_ALIAS+ALIAS_BLOCK_SIZE;
|
|
}
|
|
~CAliases(void);
|
|
|
|
DWORD AliasValue(ALIAS alias);
|
|
ALIAS ValueAlias(DWORD dwValue);
|
|
ALIAS AddValue(DWORD dwValue);
|
|
void RemoveAlias(ALIAS alias);
|
|
void SetValue(ALIAS alias, DWORD dwValue);
|
|
|
|
private:
|
|
void DeleteBlock(CAliasBlock *pab, CAliasBlock *pabPrev);
|
|
|
|
CAliasBlock _abStatic;
|
|
CAliasBlock *_pabAliases;
|
|
ALIAS _aliasBase;
|
|
};
|
|
|
|
#endif // #ifndef __ALIAS_HXX__
|