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.
|
|
//
// cuiarray.cpp
// = array object in CUILib =
//
#include "private.h"
#include "cuiarray.h"
/*=============================================================================*/ /* */ /* C U I F O B J E C T A R R A Y */ /* */ /*=============================================================================*/
/* C U I F O B J E C T A R R A Y */ /*------------------------------------------------------------------------------
constructor of CUIFObjectArrayBase
------------------------------------------------------------------------------*/ CUIFObjectArrayBase::CUIFObjectArrayBase( void ) { m_pBuffer = NULL; m_nBuffer = 0; m_nObject = 0; }
/* ~ C U I F O B J E C T A R R A Y */ /*------------------------------------------------------------------------------
destructor of CUIFObjectArrayBase
------------------------------------------------------------------------------*/ CUIFObjectArrayBase::~CUIFObjectArrayBase( void ) { if (m_pBuffer) { MemFree( m_pBuffer ); } }
/* A D D */ /*------------------------------------------------------------------------------
Add object to the list
------------------------------------------------------------------------------*/ BOOL CUIFObjectArrayBase::Add( void *pv ) { // sanity check
if (pv == NULL) { Assert( FALSE ); return FALSE; }
// check if the object is alrady in the list
if (0 <= Find( pv )) { return FALSE; }
// ensure buffer size
if (!EnsureBuffer( m_nObject + 1 )) { return FALSE; }
// add to list
Assert( m_nObject < m_nBuffer ); m_pBuffer[ m_nObject ] = pv;
m_nObject++; return TRUE; }
/* R E M O V E */ /*------------------------------------------------------------------------------
Remove object from the list
------------------------------------------------------------------------------*/ BOOL CUIFObjectArrayBase::Remove( void *pv ) { int i;
// sanity check
if (pv == NULL) { Assert( FALSE ); return FALSE; }
// check if the object is in the list
i = Find( pv ); if (i < 0) { return FALSE; }
// remove from the list
if (i < m_nObject - 1) { MemMove( &m_pBuffer[ i ], &m_pBuffer[ i+1 ], (m_nObject-i-1) * sizeof(void*) ); }
m_nObject--; return TRUE; }
/* G E T C O U N T */ /*------------------------------------------------------------------------------
Get count of objects in the list
------------------------------------------------------------------------------*/ int CUIFObjectArrayBase::GetCount( void ) { return m_nObject; }
/* G E T */ /*------------------------------------------------------------------------------
Get object in the list
------------------------------------------------------------------------------*/ void *CUIFObjectArrayBase::Get( int i ) { if (i < 0 || m_nObject <= i) { return NULL; }
return m_pBuffer[ i ]; }
/* G E T F I R S T */ /*------------------------------------------------------------------------------
Get fist object in the list
------------------------------------------------------------------------------*/ void *CUIFObjectArrayBase::GetFirst( void ) { return Get( 0 ); }
/* G E T L A S T */ /*------------------------------------------------------------------------------
Get last object in the list
------------------------------------------------------------------------------*/ void *CUIFObjectArrayBase::GetLast( void ) { return Get( m_nObject - 1 ); }
/* F I N D */ /*------------------------------------------------------------------------------
Find object Returns index of object in list when found, -1 when not found.
------------------------------------------------------------------------------*/ int CUIFObjectArrayBase::Find( void *pv ) { int i;
for (i = 0; i < m_nObject; i++) { if (m_pBuffer[i] == pv) { return i; } }
return -1; }
/* E N S U R E B U F F E R */ /*------------------------------------------------------------------------------
Ensure buffer size (create/enlarge buffer when no more room) Returns TRUE when buffer size is enough, FALSE when error occured
------------------------------------------------------------------------------*/ BOOL CUIFObjectArrayBase::EnsureBuffer( int iSize ) { void **pBufferNew; int nBufferNew;
Assert( 0 < iSize );
// check if there is room
if (iSize <= m_nBuffer) { Assert( m_pBuffer != NULL ); return TRUE; }
// calc new buffer size
nBufferNew = ((iSize - 1) / 16 + 1) * 16;
// create new buffer
if (m_pBuffer == NULL) { Assert( m_nBuffer == 0 ); pBufferNew = (void**)MemAlloc( nBufferNew * sizeof(void*) ); } else { Assert( 0 < m_nBuffer ); pBufferNew = (void**)MemReAlloc( m_pBuffer, nBufferNew * sizeof(void*) ); }
// check if buffer has been created
if (pBufferNew == NULL) { Assert( FALSE ); return FALSE; }
// update buffer info
m_pBuffer = pBufferNew; m_nBuffer = nBufferNew;
return TRUE; }
|