Source code of Windows XP (NT5)
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.
|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999.
//
// File: set.hxx
//
// Contents:
//
// History: 26 Mar 1999 MihaiPS Created
//
//--------------------------------------------------------------------------
#pragma once
template< class CElem > class TSet { public:
TSet( unsigned size = arraySize ) : _array( size ), _iHintEmpty( 0 ), _count( 0 ) {}
unsigned Count() const { return _count; }
void Add( CElem* pElem );
void Remove( CElem const * pElem );
#if 0
BOOL Contains( CElem const * pElem ) const;
CElem* Element(); #endif
protected:
CDynArray< CElem > _array;
// this is the count of elements in the array
unsigned _count;
// this is a hint for an empty location
unsigned _iHintEmpty; };
template< class CElem > void TSet< CElem >::Add( CElem* pElem ) { while( 0 != _array[ _iHintEmpty ] && _iHintEmpty < _array.Size() ) { _iHintEmpty ++; } if( _iHintEmpty < _array.Size() ) { Win4Assert( 0 == _array[ _iHintEmpty ] ); _array[ _iHintEmpty ] = pElem; } else { Win4Assert( _array.Size() == _iHintEmpty ); _array.Add( pElem, _iHintEmpty ); } _iHintEmpty++; _count++; Win4Assert( _count <= _array.Size() ); }
template< class CElem > void TSet< CElem >::Remove( CElem const * pElem ) { unsigned count = 0; Win4Assert( _count <= _array.Size() );
for( unsigned iElem = 0; count < _count && iElem < _array.Size(); iElem++ ) { if( 0 != _array[ iElem ] ) { count++; if( _array[ iElem ] == pElem ) { _array[ iElem ] = 0; _count--; return; } } else if( _iHintEmpty > iElem ) { _iHintEmpty = iElem; } } Win4Assert( !"Element not in set" ); }
#if 0
template< class CElem > BOOL TSet< CElem >::Contains( CElem const * pElem ) const { unsigned count = 0; Win4Assert( _count <= _array.Size() );
for( unsigned iElem = 0; count < _count && iElem < _array.Size(); iElem++ ) { if( 0 != _array[ iElem ] ) { count++; if( _array[ iElem ] == pElem ) { return TRUE; } } } return FALSE; }
template< class CElem > CElem* TSet< CElem >::Element() { for( unsigned iElem = 0; iElem < _array.Size(); iElem++ ) { CElem* pElem = _array[ iElem ]; if( 0 != pElem ) { _array[ iElem ] = 0; _count --; _iHintEmpty = 0; return pElem; } } return 0; } #endif
|