Leaked source code of windows server 2003
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.
 
 
 
 
 
 

101 lines
2.8 KiB

/******************************************************************************
* SentItemMemory.h *
*------------------*
* This file defines and implements the CSentItemMemory class. This class was
* written to simplify memory management in the sentence enumerator. The
* const SPVSTATE member of the SPVSENTITEM struct needs to be modified in the
* sentence enumerator, both during normalization and during lexicon lookup.
* It was thus desireable to be able to free all of the memory which was
* dynamically created in the sentence enumerator at once, without having to,
* for example, figure out which pronunciations were const (specified in the
* XML state) and which were dynamically created.
*------------------------------------------------------------------------------
* Copyright (C) 1999 Microsoft Corporation Date: 12/6/99
* All Rights Reserved
*
*********************************************************************** AKH ***/
struct MemoryChunk
{
BYTE* pMemory;
MemoryChunk* pNext;
};
class CSentItemMemory
{
public:
CSentItemMemory( )
{
m_pHead = NULL;
m_pCurr = NULL;
}
~CSentItemMemory()
{
MemoryChunk *pIterator = m_pHead, *pTemp = 0;
while (pIterator)
{
pTemp = pIterator->pNext;
delete [] pIterator->pMemory;
delete pIterator;
pIterator = pTemp;
}
}
void* GetMemory( ULONG ulBytes, HRESULT *hr )
{
void *Memory = 0;
if (!m_pHead)
{
m_pHead = new MemoryChunk;
if (m_pHead)
{
m_pHead->pNext = NULL;
m_pHead->pMemory = new BYTE[ulBytes];
if (m_pHead->pMemory)
{
m_pCurr = m_pHead;
Memory = (void*) m_pHead->pMemory;
}
else
{
*hr = E_OUTOFMEMORY;
}
}
else
{
*hr = E_OUTOFMEMORY;
}
}
else
{
m_pCurr->pNext = new MemoryChunk;
if (m_pCurr->pNext)
{
m_pCurr = m_pCurr->pNext;
m_pCurr->pNext = NULL;
m_pCurr->pMemory = new BYTE[ulBytes];
if (m_pCurr->pMemory)
{
Memory = (void*) m_pCurr->pMemory;
}
else
{
*hr = E_OUTOFMEMORY;
}
}
else
{
*hr = E_OUTOFMEMORY;
}
}
return Memory;
}
private:
MemoryChunk* m_pHead;
MemoryChunk* m_pCurr;
};