mirror of https://github.com/tongzx/nt5src
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.
128 lines
3.1 KiB
128 lines
3.1 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1991 - 1997
|
|
//
|
|
// File: occarray.cxx
|
|
//
|
|
// Contents: Occurrence array
|
|
//
|
|
// Classes: CSparseOccArray
|
|
//
|
|
// History: 20-Jun-96 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "occarray.hxx"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSparseOccArray::CSparseOccArray, public
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// Arguments: [size] -- the size of the initial array. If no parameter is
|
|
// passed in, this defaults to OCCARRAY_SIZE.
|
|
//
|
|
// History: 1-Dec-97 dlee created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CSparseOccArray::CSparseOccArray(ULONG size)
|
|
: _aPidOcc( size )
|
|
{
|
|
} //CSparseOccArray
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSparseOccArray::Get, public
|
|
//
|
|
// Synopsis: Returns a reference to the occurrence count for a propid
|
|
//
|
|
// Arguments: [pid] -- Property id
|
|
//
|
|
// History: 1-Dec-97 dlee created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
OCCURRENCE & CSparseOccArray::Get( ULONG pid )
|
|
{
|
|
//
|
|
// Look it up in the array. Grab the pointer so we don't use the
|
|
// non-const version of operator []
|
|
//
|
|
|
|
SPidOcc * pItems = (SPidOcc *) _aPidOcc.GetPointer();
|
|
unsigned cItems = _aPidOcc.Count();
|
|
|
|
for ( ULONG i = 0; i < cItems; i++ )
|
|
if ( pid == pItems[i].pid )
|
|
return pItems[i].occ;
|
|
|
|
// not found; assume the occurrence count is 1 and add it to the array
|
|
|
|
SPidOcc & item = _aPidOcc[ i ];
|
|
|
|
item.pid = pid;
|
|
item.occ = 1;
|
|
|
|
return item.occ;
|
|
} //Get
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSparseOccArray::Set
|
|
//
|
|
// Synopsis: Sets the occurrence for the pid
|
|
//
|
|
// Arguments: [pid] -- Property id
|
|
// [occ] -- Occurrence to set
|
|
//
|
|
// History: 1-Dec-97 dlee created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CSparseOccArray::Set( ULONG pid, OCCURRENCE occ )
|
|
{
|
|
Win4Assert( occ > 0 );
|
|
|
|
if ( occ > 1 )
|
|
{
|
|
//
|
|
// First try to update an existing entry for the pid
|
|
//
|
|
|
|
SPidOcc * pItems = (SPidOcc *) _aPidOcc.GetPointer();
|
|
unsigned cItems = _aPidOcc.Count();
|
|
|
|
for ( ULONG i = 0; i < cItems; i++ )
|
|
{
|
|
if ( pid == pItems[i].pid )
|
|
{
|
|
Win4Assert( occ > pItems[i].occ );
|
|
pItems[i].occ = occ;
|
|
return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// This is a linear algorithm -- if we hit this assert for normal
|
|
// files rethink the design.
|
|
//
|
|
|
|
Win4Assert( i < 500 );
|
|
|
|
//
|
|
// Add the new pid
|
|
//
|
|
|
|
SPidOcc & item = _aPidOcc[ i ];
|
|
item.pid = pid;
|
|
item.occ = occ;
|
|
}
|
|
} //Set
|
|
|
|
|