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.
|
|
//+---------------------------------------------------------------------------
//
// 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
};
|