Windows2003-3790/inetsrv/query/h/entry.hxx
2020-09-30 16:53:55 +02:00

140 lines
3.5 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
};