windows-nt/Source/XPSP1/NT/com/rpc/midl/common/idict.cxx
2020-09-26 16:20:57 +08:00

205 lines
4.9 KiB
C++

/*****************************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1987-1999 **/
/*****************************************************************************/
/*****************************************************************************
File : idict.hxx
Title : index based dictionary simulation
History :
04-Aug-1991 VibhasC Created
*****************************************************************************/
#pragma warning ( disable : 4514 4710 )
/****************************************************************************
local defines and includes
****************************************************************************/
#include "nulldefs.h"
extern "C" {
#include <stdio.h>
}
#include "idict.hxx"
/****************************************************************************/
/****************************************************************************
idict class implementation
****************************************************************************/
IDICT::IDICT(
short InitialSize,
short Increment )
{
IDICTELEMENT * pNewArray = new
IDICTELEMENT [ InitialSize ];
iNextIndex = 0;
CurrentSize = InitialSize;
IDictIncrement = Increment;
SetArray( pNewArray );
}
/****************************************************************************
SetElement:
Set the element in the array to the value that is passed in
****************************************************************************/
void
IDICT::SetElement(
IDICTKEY Key,
IDICTELEMENT Element )
{
if( Key < iNextIndex )
{
pArray[ Key ] = Element;
}
}
/****************************************************************************
SetNewElement:
Set the new element in the array to the value that is passed in
****************************************************************************/
IDICTKEY
IDICT::SetNewElement(
IDICTELEMENT Element )
{
pArray[ iNextIndex ] = Element;
return iNextIndex++;
}
/****************************************************************************
ExpandArray:
Expand the array to accomodate more elements coming in.
****************************************************************************/
void
IDICT::ExpandArray()
{
IDICTELEMENT * pOldArray = GetArray();
IDICTELEMENT * pNewArray = new
IDICTELEMENT [(CurrentSize+IDictIncrement)];
int iIndex = 0;
//.. pOldArray moves, so we need pTemp to mark the beginning
IDICTELEMENT * pTemp = pOldArray;
SetArray( pNewArray );
CurrentSize = short( CurrentSize + IDictIncrement );
if( pOldArray )
{
while( iIndex++ < iNextIndex )
{
*pNewArray++ = *pOldArray++;
}
}
delete pTemp;
}
/***************************************************************************
GetElement:
return the element pointed to by the KEY (index)
***************************************************************************/
IDICTELEMENT
IDICT::GetElement(
IDICTKEY Key )
{
IDICTELEMENT * pArray = GetArray();
if( pArray && ( Key < iNextIndex ) )
return pArray[ Key ];
return (IDICTELEMENT) 0;
}
/***************************************************************************
IsElementPresent:
return the element pointed to by the KEY (index)
***************************************************************************/
BOOL
IDICT::IsElementPresent(
IDICTELEMENT Element )
{
IDICTELEMENT * pArray = GetArray();
short iIndex;
if( pArray )
{
for( iIndex = 0; iIndex < iNextIndex; ++iIndex )
{
if( pArray[ iIndex ] == Element )
return TRUE;
}
}
return FALSE;
}
/***************************************************************************
AddElement:
Basically SetNewElement, with checks for needed expansion. Notice how the
array pointer is never accessed in this routine directly. This is becuase
ExpandArray can potentially change the array underneath. So after evry
expand call, must make sure that any local pointers to the array are
updated.
***************************************************************************/
IDICTKEY
IDICT::AddElement(
IDICTELEMENT pNew )
{
if( iNextIndex >= CurrentSize )
{
ExpandArray();
}
return SetNewElement( pNew );
}
/*****************************************************************************/
ISTACK::ISTACK(
short MaxDepth )
{
InitNew( MaxDepth );
CurrentElement = 0;
}
void
ISTACK::InitNew(
short MaxDepth )
{
MaxElements = MaxDepth;
pStack = new IDICTELEMENT[ MaxElements ];
}
IDICTELEMENT
ISTACK::Push(
IDICTELEMENT Element )
{
if( CurrentElement == MaxElements )
{
int i;
IDICTELEMENT (*pStackOld);
pStackOld = pStack;
InitNew( short( MaxElements + 10 ) );
for( i = 0;
i < CurrentElement;
++i )
{
pStack[ i ] = pStackOld[ i ];
}
delete pStackOld;
}
pStack[ CurrentElement++ ] = Element;
return Element;
}
IDICTELEMENT
ISTACK::Pop()
{
MIDL_ASSERT( CurrentElement != 0 );
return pStack[ --CurrentElement ];
}