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.
125 lines
3.3 KiB
125 lines
3.3 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994.
|
|
//
|
|
// File: KVec.hxx
|
|
//
|
|
// Contents: CKeyVector
|
|
//
|
|
// Classes: CEntryBuffer, CEntryBufferHandler
|
|
//
|
|
// History: 18-Mar-93 AmyA Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <entry.hxx>
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CKeyVector
|
|
//
|
|
// Purpose: A vector of pointers to entries stored in the entry buffer
|
|
// The vector grows backwards from the end of the buffer
|
|
//
|
|
// Notes: Instead of storing pointers we store byte offsets
|
|
// from the beginning of buffer. FixPointers converts
|
|
// them to actual pointers by adding the address
|
|
// of the base pointer.
|
|
//
|
|
// History: 12-Jun-91 BartoszM Created
|
|
// 18-Mar-93 AmyA Moved from sort.hxx
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CKeyVector
|
|
{
|
|
public:
|
|
|
|
inline void Init ( BYTE * buf, unsigned cb );
|
|
|
|
inline void Add ( CEntry* pEntry );
|
|
|
|
inline void Sentinel( CEntry* sentinel );
|
|
|
|
inline BYTE* GetCurPos() const;
|
|
|
|
inline CEntry** GetVector() const;
|
|
|
|
inline void CalculateOffsets( unsigned count );
|
|
|
|
private:
|
|
CEntry** _ppEntry;
|
|
BYTE * _pbFirstEntry;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CKeyVector::Init, public
|
|
//
|
|
// Synopsis: Initialize cursor to point to the end of buffer
|
|
//
|
|
// Arguments: [buf] -- buffer
|
|
// [cb] -- size of buffer
|
|
//
|
|
// History: 07-Jun-91 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void CKeyVector::Init ( BYTE * buf, unsigned cb )
|
|
{
|
|
//
|
|
// point it at the end of buffer.
|
|
// it will grow up
|
|
//
|
|
|
|
_ppEntry = (CEntry **) & buf[cb];
|
|
_pbFirstEntry = buf;
|
|
}
|
|
|
|
inline void CKeyVector::Add ( CEntry* pEntry )
|
|
{
|
|
--_ppEntry;
|
|
// store pointer to entry
|
|
*_ppEntry = pEntry;
|
|
}
|
|
|
|
inline void CKeyVector::Sentinel( CEntry* sentinel )
|
|
{
|
|
Add ( sentinel );
|
|
}
|
|
|
|
inline BYTE * CKeyVector::GetCurPos() const
|
|
{
|
|
return (BYTE*)_ppEntry;
|
|
}
|
|
|
|
inline CEntry** CKeyVector::GetVector() const
|
|
{
|
|
return _ppEntry;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CKeyVector::CalculateOffsets, public
|
|
//
|
|
// Synopsis: Calculate relative pointers by subtracting the base pointer
|
|
//
|
|
// Arguments: [count] -- number of offsets to calculate
|
|
//
|
|
// History: 30-Jun-93 AmyA Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void CKeyVector::CalculateOffsets ( unsigned count )
|
|
{
|
|
// _ppEntry stores an array of pointers to entries. We subtract the base
|
|
// pointer from all of them in order to create an array of relative
|
|
// pointers to entries.
|
|
|
|
for ( unsigned i = 0; i < count; i++ )
|
|
*((INT_PTR *)(_ppEntry+i)) = (BYTE *)(_ppEntry[i]) - _pbFirstEntry;
|
|
}
|
|
|