140 lines
3.3 KiB
C++
140 lines
3.3 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
|
//
|
|
// File: entry.hxx
|
|
//
|
|
// Contents: Class for an entry in the entry buffer
|
|
//
|
|
// Classes: CEntry
|
|
//
|
|
// History: 12-Jun-91 BartoszM Created
|
|
// 18-Mar-93 AmyA Moved from sort.hxx
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CEntry
|
|
//
|
|
// Purpose: An encapsulation of variable size structure
|
|
// to be stored in the entry buffer
|
|
//
|
|
// History: 12-Jun-91 BartoszM Created
|
|
// 18-Mar-93 AmyA Moved from sort.hxx
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
inline int CompareULONG( ULONG a, ULONG b )
|
|
{
|
|
// Empirical evidence shows that checking in this order is most optimal
|
|
|
|
if ( a == b )
|
|
return 0;
|
|
|
|
if ( a > b )
|
|
return 1;
|
|
|
|
return -1;
|
|
}
|
|
|
|
class CEntry
|
|
{
|
|
public:
|
|
CEntry() {}
|
|
|
|
int Compare( const CEntry * pe2 ) const
|
|
{
|
|
//
|
|
// note: pe2's pid, occ, and wid can all be 0xffffffff in
|
|
// the daemon, and wid for "this" can be 0xffffffff in cisvc.
|
|
// This means we have to use ::Compare instead of subtraction.
|
|
//
|
|
|
|
Win4Assert ( 0 != this );
|
|
Win4Assert ( 0 != pe2 );
|
|
|
|
int cb2 = pe2->_cb;
|
|
int cbMin = ( _cb <= cb2 ) ? _cb : cb2;
|
|
|
|
int c = memcmp( GetKeyBuf(), pe2->GetKeyBuf(), cbMin );
|
|
|
|
if ( 0 == c )
|
|
{
|
|
c = _cb - cb2;
|
|
|
|
if ( 0 == c )
|
|
{
|
|
// strings are equal length and compare ok
|
|
// pids are almost always contents, so check == first
|
|
|
|
if ( _pid == pe2->_pid )
|
|
{
|
|
c = CompareULONG( _wid, pe2->_wid );
|
|
|
|
if ( 0 == c )
|
|
c = CompareULONG( _occ, pe2->_occ );
|
|
}
|
|
else
|
|
return _pid > pe2->_pid ? 1 : -1;
|
|
|
|
}
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
// increment taking into account variable size
|
|
inline CEntry * Next () const;
|
|
|
|
// Compression and decompression
|
|
|
|
void SetWid ( WORKID wid )
|
|
{
|
|
Win4Assert( wid <= CI_MAX_DOCS_IN_WORDLIST ||
|
|
wid == widInvalid );
|
|
|
|
if ( widInvalid == wid )
|
|
_wid = 0xff;
|
|
else
|
|
_wid = (BYTE) wid;
|
|
}
|
|
void SetPid ( PROPID pid ) { _pid = pid; }
|
|
void SetOcc ( OCCURRENCE occ ) { _occ = occ; }
|
|
void SetCount ( unsigned cb )
|
|
{
|
|
Win4Assert( cb <= 0xff );
|
|
_cb = (BYTE)cb;
|
|
}
|
|
|
|
OCCURRENCE Occ() const { return _occ; }
|
|
PROPID Pid() const { return _pid; }
|
|
WORKID Wid() const
|
|
{
|
|
if ( 0xff == _wid )
|
|
return widInvalid;
|
|
|
|
return _wid;
|
|
}
|
|
unsigned Count() const { return _cb; }
|
|
BYTE * GetKeyBuf() const { return (BYTE *)_key; }
|
|
|
|
BOOL IsValue() const { return ( _key[0] != STRING_KEY ); }
|
|
|
|
private:
|
|
|
|
|
|
// We could compress _pid better.
|
|
|
|
PROPID _pid;
|
|
OCCURRENCE _occ;
|
|
|
|
BYTE _wid; // fake wid <= 0x10
|
|
BYTE _cb; // # of bytes in _key
|
|
BYTE _key[1]; // variable size key
|
|
};
|
|
|