Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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();
	}
}
Ejemplo n.º 4
0
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;
}