/*TITLE dynamic hashing class declarations */

/****keyword-flag*** "%v %f %n" */
/* "13 2-May-98,19:15:32 DYNHASH.H" */

/* The following const determines the average loading of a hash string */
/* The value 1 provides the highest capability to handle large objects */
/*   without chain overflows */
static const ArrayIndex ElementsPerSlot = 6;

class DynamicHashArray;

class DynamicHashString
{
friend DynamicHashArray;
protected:
	ArrayIndex m_Count;
	SVector<AccountNumber> m_Key;
	SVector<ArrayIndex> m_KeyLength;
	SVector<ArrayIndex> m_DataOffset;
	ModifiableElement m_Data;
	char m_Chain;
static int s_ChainCount;

public:
	DynamicHashString();
	DynamicHashString(ModifiableElement p_Element);
	void AddElement(AccountNumber p_Key, ModifiableElement p_Element);
	bool DeleteElement(AccountNumber p_Key);
	ModifiableElement FindElement(AccountNumber p_Key);
	operator ModifiableElement();
	ModifiableElement GetSubString(ArrayIndex p_Index);
	ArrayIndex GetCount();
	void SetChain();
	char GetChain();
static int GetChainCount();
static void BumpChainCount();
static void DumpModifiableElement(ModifiableElement p_Element);
};

class DynamicHashArrayRef
{
private:
	DynamicHashArray &m_DHA;
	AccountNumber m_DHAIndex;

private: //prevent compiler warnings
	DynamicHashArrayRef& operator=(const DynamicHashArrayRef&);

public:
	DynamicHashArrayRef(DynamicHashArray &p_DHA, AccountNumber p_DHAIndex);
	DynamicHashArrayRef& operator=(ModifiableElement p_ME);
	operator ModifiableElement();
};

static const ArrayIndex InitCurrentSlotCount = 8;
static const Ulong InitCurrentMaxSlotCount = 8;

class DynamicHashArray
{
private: //prevent meaningless operations
	DynamicHashArray(const DynamicHashArray&);
	DynamicHashArray& operator =(const DynamicHashArray&);

protected:
	ModifiableElement m_ArrayName;
	QuantumFile *m_QF;
	MainObjectArrayPtr m_MOA;
	ObjectNumber m_ObjectNumber;
	ArrayIndex m_CurrentSlotCount;
	Ulong m_CurrentMaxSlotCount;
	ArrayIndex m_ElementsBeforeExpansion;

public:
	DynamicHashArray();
	~DynamicHashArray();
	DynamicHashArray(QuantumFile *p_QF, ModifiableElement p_ArrayName);
	void Open(QuantumFile *p_QF, ModifiableElement p_ArrayName);
	void StoreElement(AccountNumber p_Key, ModifiableElement p_Element);
	ModifiableElement FindElement(AccountNumber p_Key);
	bool DeleteElement(AccountNumber p_Key);
	ArrayIndex CalculateHash(AccountNumber p_Key);
	void PutString(ArrayIndex p_Index, ModifiableElement p_Element);
	ModifiableElement GetString(ArrayIndex p_Index);
	DynamicHashArrayRef operator[](AccountNumber p_AccountNumber);
};

