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.
 
 
 
 
 
 

235 lines
5.1 KiB

//+-------------------------------------------------------------------------
//
// 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;
};