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.
|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: FRETABLE.HXX
//
// Contents: Fresh table
//
// Classes: CFreshItem, CFreshTable, CIdxSubstitution, CFreshTableIter
//
// History: 15-Oct-91 BartoszM created
// 5-Dec-97 dlee rewrote as simple sorted array
//
//
//--------------------------------------------------------------------------
#pragma once
#include <tsort.hxx>
//+-------------------------------------------------------------------------
//
// Class: CIdxSubstitution
//
// Purpose: Holds info about substituting index ids after a merge
//
// History: ?
//
//--------------------------------------------------------------------------
class CIdxSubstitution { public: CIdxSubstitution (BOOL isMaster, INDEXID iid, int cInd, INDEXID const * aIidOld) :_isMaster(isMaster), _iid (iid), _cInd (cInd), _aIidOld (aIidOld) {}
BOOL IsMaster() const { return _isMaster; }
INDEXID IidOldDeleted () const { Win4Assert (_isMaster); return _iid; }
INDEXID IidNew () const { Win4Assert (!_isMaster); return _iid; }
BOOL Find (INDEXID iid) const { for ( int j = 0; j < _cInd; j++ ) { if ( iid == _aIidOld[j] ) { return TRUE; } } return FALSE; }
private:
const BOOL _isMaster; const INDEXID _iid; // if is master, old iid deleted, otherwise iid merge target
const int _cInd; INDEXID const * const _aIidOld; };
//+-------------------------------------------------------------------------
//
// Class: CFreshItem
//
// Purpose: A single fresh item
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
class CFreshItem { public: INDEXID IndexId() const { return _iid; } WORKID WorkId() const { return _wid; }
void SetIndexId ( INDEXID iid ) { _iid = iid; }
int Compare( CFreshItem const * p2 ) const { if ( _wid < p2->_wid ) return -1;
return ( _wid != p2->_wid ); }
int Compare( const WORKID wid ) const { if ( _wid < wid ) return -1;
return ( _wid != wid ); }
BOOL IsEQ( const WORKID wid ) const { return ( _wid == wid ); }
BOOL IsLT( const WORKID wid ) const { return ( _wid < wid ); }
BOOL IsGT( const WORKID wid ) const { return ( _wid > wid ); }
BOOL IsGE( const WORKID wid ) const { return ( _wid >= wid ); }
BOOL IsEQ( CFreshItem const * p2 ) const { return ( _wid == p2->_wid ); }
BOOL IsLT( CFreshItem const * p2 ) const { return ( _wid < p2->_wid ); }
BOOL IsGT( CFreshItem const * p2 ) const { return ( _wid > p2->_wid ); }
BOOL IsGE( CFreshItem const * p2 ) const { return ( _wid >= p2->_wid ); }
WORKID _wid; INDEXID _iid; };
//+-------------------------------------------------------------------------
//
// Class: CFreshTable
//
// Purpose: Table of fresh items
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
class CFreshTable { friend class CFreshTableIter;
public: CFreshTable( unsigned size ) : _aItems( size ) {}
CFreshTable( CFreshTable & freshTable );
CFreshTable( CFreshTable const & freshTable, CIdxSubstitution const & subst);
unsigned Count() const { return _aItems.Count(); }
void Add( WORKID wid, INDEXID iid );
INDEXID AddReplace( WORKID wid, INDEXID iid );
CFreshItem * Find( WORKID wid ) { CSortable<CFreshItem,WORKID> sort( _aItems ); return sort.Search( wid ); }
void ModificationsComplete();
private:
CDynArrayInPlace<CFreshItem> _aItems; };
//+-------------------------------------------------------------------------
//
// Class: CFreshTableIter
//
// Synopsis: Iterates over a CFreshTable
//
// History: 93-Nov-15 DwightKr Created
//
//--------------------------------------------------------------------------
class CFreshTableIter { public: CFreshTableIter( CFreshTable const & table ) : _table ( table ), _iRow( 0 ) { Advance(); // Move to the first entry
}
BOOL AtEnd() { return ( 0 == _pItem ); }
void Advance() { if ( _iRow < _table.Count() ) _pItem = & ( _table._aItems[ _iRow++ ] ); else _pItem = 0; }
CFreshItem * operator->() { return _pItem; }
private: CFreshItem * _pItem; unsigned _iRow; CFreshTable const & _table; };
|