windows-nt/Source/XPSP1/NT/inetsrv/query/bigtable/tblrowal.hxx
2020-09-26 16:20:57 +08:00

92 lines
2.6 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1994.
//
// File: tblrowal.hxx
//
// Contents: Declaration of the CTableRowAlloc class, used in allocation
// of table row data and checking of column bindings.
//
// Classes: CTableRowAlloc
//
// History: 27 Jun 1994 Alanw Created
//
//--------------------------------------------------------------------------
#pragma once
#ifdef DISPLAY_INCLUDES
#pragma message( "#include <" __FILE__ ">..." )
#endif
//+-------------------------------------------------------------------------
//
// Class: CTableRowAlloc
//
// Purpose: Track assignment of fields within a table row. Used to
// check column bindings and to allocate appropriately
// aligned memory to a table window.
//
// Interface:
//
//--------------------------------------------------------------------------
class CTableRowAlloc : INHERIT_UNWIND
{
DECLARE_UNWIND
enum { CB_INIT = 256 };
public:
CTableRowAlloc( unsigned cbRow = 0 );
~CTableRowAlloc()
{
if ( _pRowMap != _aRowMap )
{
delete [] _pRowMap;
}
}
// Allocate a column in a row, return offset in row
USHORT AllocOffset( unsigned cbData, unsigned cbAlign, BOOL fGrow );
// Reserve a run of data; return TRUE if successful
BOOL ReserveRowSpace( unsigned iOffset, unsigned cbData );
// Retrieve required row width
USHORT GetRowWidth( void ) {
return _maxRow;
}
// Set required row width, if greater than the current maximum.
USHORT SetRowWidth( unsigned width ) {
Win4Assert(width > 0 && width < USHRT_MAX);
if (width > _maxRow)
_maxRow = (WORD)width;
return _maxRow;
}
private:
BOOL _IsLikelyFree( unsigned iOffset, unsigned cbData );
BOOL _IsInUse( unsigned i )
{
Win4Assert( i < _cbRow );
return _pRowMap[i];
}
USHORT _maxRow; // required width of row
USHORT _cbRow; // size of _pRowMap
BYTE* _pRowMap; // Row map data
// OPTIMIZATION to avoid doing memory allocations if possible.
BYTE _aRowMap[CB_INIT];
unsigned _iFirstFree; // Index of the first free entry in the map
// OPTIMIZATION
};