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.4 KiB
128 lines
3.4 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 1998.
|
|
//
|
|
// File: keycur.hxx
|
|
//
|
|
// Contents: Key cursor classes
|
|
//
|
|
// Classes: CKeyCursor - 'The mother of all key cursors'
|
|
//
|
|
// History: 15-Apr-91 KyleP Created.
|
|
// 26-Sep-91 BartoszM Made it a subclass
|
|
// 18-Feb-92 AmyA Changed from CIndexCursor to
|
|
// CKeyCursor.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <misc.hxx>
|
|
#include <ocursor.hxx>
|
|
|
|
class CKeyBuf;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CKeyCursor
|
|
//
|
|
// Purpose: The root class for all key cursors
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 15-Apr-91 KyleP Created.
|
|
// 22-Jul-92 BartoszM added weight, rank, and max wid
|
|
// 23-Jun-94 SitaramR removed _widMax.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CKeyCursor : public COccCursor
|
|
{
|
|
public:
|
|
|
|
CKeyCursor ( INDEXID iid, WORKID widMax )
|
|
: COccCursor(iid, widMax),
|
|
_lStatWeight( 0xffffffff ) {}
|
|
|
|
CKeyCursor () {}
|
|
|
|
virtual const CKeyBuf * GetKey() = 0;
|
|
|
|
// GetNextKey should always update _pid!
|
|
// and _lStatWeight
|
|
|
|
virtual const CKeyBuf * GetNextKey() = 0;
|
|
|
|
virtual ULONG OccurrenceCount() { return(0); }
|
|
|
|
virtual WORKID MaxWorkId() { return(_widMax); }
|
|
|
|
virtual LONG Rank()
|
|
{
|
|
LONG rank;
|
|
|
|
//
|
|
// Only string keys really have a rank with any meaning.
|
|
//
|
|
|
|
if ( GetKey()->IsValue() )
|
|
{
|
|
rank = MAX_QUERY_RANK;
|
|
}
|
|
else
|
|
{
|
|
OCCURRENCE maxOcc = MaxOccurrence();
|
|
|
|
Win4Assert( maxOcc > 0 );
|
|
Win4Assert( 0xffffffff != _lStatWeight );
|
|
|
|
rank = RANK_MULTIPLIER * HitCount() * _lStatWeight / maxOcc;
|
|
|
|
ciDebugOut(( DEB_TRACE, "wid %d, rank %d, maxOcc %d, _lStatWeight %d, HitCount %d\n",
|
|
WorkId(), rank, maxOcc, _lStatWeight, HitCount() ));
|
|
|
|
#if CIDBG == 1
|
|
if ( rank < 0 )
|
|
ciDebugOut(( DEB_WARN,
|
|
"keycur rank 0x%x, maxOcc 0x%x, _lStatWeight 0x%x, HitCount 0x%x\n",
|
|
rank, maxOcc, _lStatWeight, HitCount() ));
|
|
#endif
|
|
|
|
if (rank > MAX_QUERY_RANK)
|
|
rank = MAX_QUERY_RANK;
|
|
}
|
|
|
|
return rank;
|
|
}
|
|
|
|
virtual void FreeStream() {}
|
|
|
|
virtual void RefillStream() {}
|
|
|
|
void RatioFinished ( ULONG& denom, ULONG& num )
|
|
{
|
|
Win4Assert ( !"RatioFinished called for random CKeyCursor" );
|
|
}
|
|
|
|
#ifdef CIEXTMODE
|
|
void CiExtDump(void *ciExtSelf);
|
|
#endif
|
|
|
|
protected:
|
|
|
|
void UpdateWeight()
|
|
{
|
|
ULONG widCount = WorkIdCount();
|
|
if ( widCount == 0 )
|
|
_lStatWeight = 0;
|
|
else
|
|
_lStatWeight = Log2(_widMax / widCount);
|
|
|
|
ciDebugOut(( DEB_TRACE, "updateweight wid %d, _widMax %d, widCount %d, _lStatWeight %d\n",
|
|
WorkId(), _widMax, widCount, _lStatWeight ));
|
|
}
|
|
|
|
LONG _lStatWeight; // statistical weight for current key
|
|
};
|
|
|