void DynamicHashArray::StoreElement(AccountNumber p_Key, ModifiableElement p_Element) { ArrayIndex SlotNumber; DynamicHashString DHString; DynamicHashString BuddyString; DynamicHashString NewSlotString; ArrayIndex i; ArrayIndex BuddySlotNumber; ArrayIndex NewSlotNumber; AccountNumber AcctNumber; ModifiableElement Data; DynamicHashString TempString; bool Status = false; if (m_ElementsBeforeExpansion == 0) { if (m_CurrentSlotCount == UINT_MAX) exit(1); // should be an exception, but not yet if (m_CurrentSlotCount == m_CurrentMaxSlotCount) m_CurrentMaxSlotCount *= 2; BuddySlotNumber = (ArrayIndex)(m_CurrentSlotCount - m_CurrentMaxSlotCount/2); NewSlotNumber = m_CurrentSlotCount; m_CurrentSlotCount ++; TempString = DynamicHashString(GetString(BuddySlotNumber)); for (i = 0; i < TempString.m_Count; i ++) { AcctNumber = TempString.m_Key[i]; SlotNumber = CalculateHash(AcctNumber); if (SlotNumber == BuddySlotNumber) BuddyString. AddElement(AcctNumber, TempString.GetSubString(i)); else if (SlotNumber == NewSlotNumber) NewSlotString. AddElement(AcctNumber, TempString.GetSubString(i)); else qfassert(0); // should never happen } if (TempString.GetChain()) { NewSlotString.SetChain(); BuddyString.SetChain(); BuddyString.BumpChainCount(); } PutString(NewSlotNumber,NewSlotString); PutString(BuddySlotNumber,BuddyString); m_ElementsBeforeExpansion = ElementsPerSlot; } m_ElementsBeforeExpansion --; ArrayIndex Size; AccountNumber p_Temp = p_Key; char buf[10]; Status = DeleteElement(p_Key); // get rid of old element if (p_Element == "") // if new element null, we are done return; for (i = 0; ; i ++) { SlotNumber = CalculateHash(p_Temp); DHString = DynamicHashString(GetString(SlotNumber)); Size = ModifiableElement(DHString).GetSize(); if (Size + p_Element.GetSize() < MaxItemSize) { DHString.AddElement(p_Temp, p_Element); PutString(SlotNumber,DHString); break; } else { DHString.SetChain(); DHString.BumpChainCount(); PutString(SlotNumber,DHString); sprintf(buf,"\f%d",i); p_Temp = p_Key + buf; p_Temp = p_Temp.Mid(0,p_Temp.GetSize()-1); } } }