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.
 
 
 
 
 
 

126 lines
3.0 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1992.
//
// File: WIDARR.CXX
//
// Contents: Work ID array
//
// Classes: CWidArray
//
// History: 28-Oct-91 BartoszM Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <doclist.hxx>
#include "widarr.hxx"
//+---------------------------------------------------------------------------
//
// Member: CWidArray::CWidArray, public
//
// Synopsis: Allocates empty array of cnt elements
//
// Arguments: [cnt] -- size of array
//
// History: 20-Oct-91 BartoszM Created.
//
//----------------------------------------------------------------------------
CWidArray::CWidArray ( unsigned cnt )
: _count(cnt)
{
_table = new WORKID[_count];
}
//+---------------------------------------------------------------------------
//
// Member: CWidArray::CWidArray, public
//
// Synopsis: Copies these wids from DocList that correspond
// to pidAll and whose status is SUCCESS or PENDING
// and sorts them
//
// Arguments: [DocList] -- list of documents
//
// History: 20-Oct-91 BartoszM Created.
//
// Notes: Elements are sorted for the binary search to work
//
//----------------------------------------------------------------------------
CWidArray::CWidArray ( CDocList& DocList )
: _table (0), _count(0)
{
unsigned max = DocList.Count();
for ( unsigned i = 0; i < max; i++ )
{
STATUS status = DocList.Status(i);
if ( status == SUCCESS || status == PENDING )
_count++;
}
// create a table of wid's
unsigned j = 0;
if ( _count > 0 )
{
_table = new WORKID [ _count ];
for ( i = 0; i < max; i++ )
{
STATUS status = DocList.Status(i);
if ( status == SUCCESS || status == PENDING )
_table[j++] = DocList.Wid(i);
}
}
#if CIDBG==1
// check to make sure it's sorted.
if ( _count > 0 )
for ( i = 0; i < _count - 1; i++ )
{
ciAssert( _table[i+1]==widInvalid || _table[i] < _table[i+1] );
}
#endif // CIDBG
}
//+---------------------------------------------------------------------------
//
// Member: CWidArray::Find, public
//
// Synopsis: Finds given work id
//
// Arguments: [wid] -- work id to search for
//
// History: 20-Oct-91 BartoszM Created.
//
// Notes: Uses binary search
//
//----------------------------------------------------------------------------
BOOL CWidArray::Find ( WORKID wid ) const
{
int low = 0;
int high = _count-1;
while ( high >= low )
{
int mid = (low + high)/2;
WORKID widMid = _table[mid];
if ( widMid == wid )
return TRUE;
else if ( wid < widMid )
high = mid-1;
else // wid > widMid
low = mid+1;
}
return FALSE;
}