void HashTable<T>::Grow() { AppReleaseAssert(m_size < 65536, "Hashtable grew too large"); unsigned int oldSize = m_size; m_size *= 2; m_mask = m_size - 1; char **oldKeys = m_keys; m_keys = new char *[m_size]; T *oldData = m_data; m_data = new T [m_size]; m_numCollisions = 0; // Set all m_keys' pointers to NULL memset(m_keys, 0, sizeof(char *) * m_size); memset(m_data, 0, sizeof(T) * m_size); for (unsigned int i = 0; i < oldSize; ++i) { if (oldKeys[i]) { unsigned int newIndex = GetInsertPos(oldKeys[i]); m_keys[newIndex] = oldKeys[i]; m_data[newIndex] = oldData[i]; } } m_slotsFree += m_size - oldSize; delete [] oldKeys; delete [] oldData; }
void HashTable<T>::Rebuild() { char **oldKeys = m_keys; m_keys = new char *[m_size]; T *oldData = m_data; m_data = new T [m_size]; m_numCollisions = 0; // Set all m_keys' pointers to NULL memset(m_keys, 0, sizeof(char *) * m_size); memset(m_data, 0, sizeof(T) * m_size); for (unsigned int i = 0; i < m_size; ++i) { if (oldKeys[i]) { unsigned int newIndex = GetInsertPos(oldKeys[i]); m_keys[newIndex] = oldKeys[i]; m_data[newIndex] = oldData[i]; } } delete [] oldKeys; delete [] oldData; }
void CSharedFilesCtrl::DoShowFile(CKnownFile* file, bool batch) { wxUIntPtr ptr = reinterpret_cast<wxUIntPtr>(file); if ((!batch) && (FindItem(-1, ptr) > -1)) { return; } const long insertPos = (batch ? GetItemCount() : GetInsertPos(ptr)); long newitem = InsertItem(insertPos, wxEmptyString); SetItemPtrData( newitem, ptr ); if (!batch) { ShowFilesCount(); } }
int HashTable<T>::PutData(char const *_key, T const &_data) { // // Make sure the table is big enough if (m_slotsFree * 2 <= m_size) { Grow(); } // // Do the main insert unsigned int index = GetInsertPos(_key); AppAssert(m_keys[index] == NULL); m_keys[index] = newStr ( _key ); m_data[index] = _data; m_slotsFree--; return index; }