/*TITLE declarations for block classes*/

/****keyword-flag*** "%v %f %n" */
/* "16 14-Apr-98,22:48:30 BLOCK.H" */

class QuantumFile
{
public:
QuantumFile();
void Open(String p_FileName="", ArrayIndex p_BufferCount=DefaultBufferCount);
void Flush();
void Close();
long GetReadCount() {return m_ReadCount;}
long GetWriteCount() { return m_WriteCount;}
~QuantumFile();

public:
//used by implementation classes only
 ObjectNumber GetMainObjectCount() {return m_MainObjectCount;}
 ArrayIndex GetMainObjectBlockCount();
 ArrayIndex QGetFreeSpaceListCount() {return m_FreeSpaceListCount;}
 ArrayIndex QGetFreeSpaceListBlockCount();
 void SetFreeSpace(ArrayIndex p_QuantumNumber, 
    QFreeSpaceEntry p_FreeSpaceEntry);
 QFreeSpaceEntry QGetFreeSpace(ArrayIndex p_QuantumNumber);
 QuantumNumber FindEmptyBlock();
 QuantumNumber FindSpaceForItem(ObjectNumber p_ObjectNumber, 
    ArrayIndex p_ItemSize);
 ArrayIndex GetQuantumNumberAdjustment() {return m_QuantumStartingBlock-1;}
 FreeSpaceBlockPtr MakeFreeSpaceBlockPtr(ArrayIndex p_Index);
 MainObjectBlockPtr MakeMainObjectBlockPtr(ArrayIndex p_Index);
 BigPointerBlockPtr MakeBigPointerBlockPtr(ArrayIndex p_Index);
 LittlePointerBlockPtr MakeLittlePointerBlockPtr(ArrayIndex p_Index);
 LeafBlockPtr MakeLeafBlockPtr(ArrayIndex p_Index);
 Block *MakeBlockResident(ArrayIndex p_BlockNumber);
 void SetModified(ArrayIndex p_BlockNumber);

private:
SVector<Block *> m_Block;
SVector<ArrayIndex> m_BlockNumber;
SVector<char> m_BufferModified;
SVector<ArrayIndex> m_TimeStamp;
String m_FileName;
FILE * m_DosFilePtr;
BlockNumber m_CurrentLowestFreeBlock;
BlockNumber m_MainObjectStartingBlock;
BlockNumber m_FreeSpaceListStartingBlock;
BlockNumber m_QuantumStartingBlock;
ObjectNumber m_MainObjectCount;
ArrayIndex m_FreeSpaceListCount;
ArrayIndex m_Counter;
FreeSpaceArrayPtr *m_FreeSpaceArray;
MainObjectArrayPtr *m_MainObjectArray;
long m_ReadCount;
long m_WriteCount;

void Position(ArrayIndex p_BlockNumber);
void Write(ArrayIndex p_BlockNumber);
void Read(ArrayIndex p_BlockNumber);
QuantumFile(const QuantumFile&);
QuantumFile& operator=(const QuantumFile&);
};


