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.
100 lines
2.2 KiB
100 lines
2.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1995 - 2000.
|
|
//
|
|
// File: pendcur.cxx
|
|
//
|
|
// Contents: CPendingCursor
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "pendcur.hxx"
|
|
|
|
CPendingCursor::CPendingCursor( XArray<WORKID> & xWid, unsigned cWid )
|
|
: CCursor( iidInvalid ),
|
|
_iWid( 0 ),
|
|
_cWid( cWid ),
|
|
_aWid( xWid.Acquire() )
|
|
{
|
|
if( _cWid > 1 )
|
|
{
|
|
// loop from through all elements
|
|
for( unsigned j = 1; j < _cWid; j++ )
|
|
{
|
|
WORKID wid = _aWid[j];
|
|
|
|
// go backwards from j-1 shifting up keys greater than 'key'
|
|
for ( int i = j - 1; i >= 0 && _aWid[i] > wid; i-- )
|
|
{
|
|
_aWid[i+1] = _aWid[i];
|
|
}
|
|
// found key less than or equal 'key' or hit the beginning (i == -1)
|
|
// insert key in the hole
|
|
_aWid[i+1] = wid;
|
|
}
|
|
|
|
// Remove duplicates
|
|
unsigned iTarget = 0;
|
|
for ( unsigned iSrc = 1; iSrc < _cWid; iSrc++)
|
|
{
|
|
if ( _aWid[iTarget] == _aWid[iSrc] )
|
|
continue;
|
|
|
|
// wid's are different
|
|
// copy source to target and update target index.
|
|
|
|
iTarget++;
|
|
if ( iTarget != iSrc )
|
|
_aWid[iTarget] = _aWid[iSrc];
|
|
}
|
|
|
|
_cWid = iTarget + 1; // possibly shrink array
|
|
}
|
|
}
|
|
|
|
|
|
CPendingCursor::~CPendingCursor()
|
|
{
|
|
delete [] _aWid;
|
|
}
|
|
|
|
ULONG CPendingCursor::WorkIdCount()
|
|
{
|
|
return( _cWid );
|
|
}
|
|
|
|
|
|
WORKID CPendingCursor::WorkId()
|
|
{
|
|
if ( _iWid >= _cWid )
|
|
return( widInvalid );
|
|
else
|
|
return( _aWid[_iWid] );
|
|
}
|
|
|
|
WORKID CPendingCursor::NextWorkId()
|
|
{
|
|
_iWid++;
|
|
|
|
return( WorkId() );
|
|
}
|
|
|
|
ULONG CPendingCursor::HitCount()
|
|
{
|
|
return( 1 );
|
|
}
|
|
|
|
LONG CPendingCursor::Rank()
|
|
{
|
|
return( MAX_QUERY_RANK );
|
|
}
|
|
|
|
void CPendingCursor::RatioFinished (ULONG& denom, ULONG& num)
|
|
{
|
|
denom = _cWid;
|
|
num = min (_iWid, _cWid);
|
|
}
|