X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c2bb85e9e38ee35758e0076485bb6665f2c229f5..28be2e8a170979d476a5ea4f585505b8a2f5af27:/src/common/hash.cpp diff --git a/src/common/hash.cpp b/src/common/hash.cpp index 1aa13adf84..09e9b42d13 100644 --- a/src/common/hash.cpp +++ b/src/common/hash.cpp @@ -104,7 +104,7 @@ void wxHashTableBase::DeleteContents(bool flag) wxNodeBase *wxHashTableBase::GetNode(long key, long value) const { - size_t slot = (size_t)abs(key % m_hashSize); + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); wxNodeBase *node; if ( m_hashTable[slot] ) @@ -123,6 +123,11 @@ wxNodeBase *wxHashTableBase::GetNode(long key, long value) const // wxHashTableLong // ---------------------------------------------------------------------------- +wxHashTableLong::~wxHashTableLong() +{ + Destroy(); +} + void wxHashTableLong::Init(size_t size) { m_hashSize = size; @@ -156,7 +161,7 @@ void wxHashTableLong::Put(long key, long value) { wxCHECK_RET( m_hashSize, _T("must call Create() first") ); - size_t slot = (size_t)abs(key % m_hashSize); + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); if ( !m_keys[slot] ) { @@ -174,7 +179,7 @@ long wxHashTableLong::Get(long key) const { wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); - size_t slot = (size_t)abs(key % m_hashSize); + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); wxArrayLong *keys = m_keys[slot]; if ( keys ) @@ -196,7 +201,7 @@ long wxHashTableLong::Delete(long key) { wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") ); - size_t slot = (size_t)abs(key % m_hashSize); + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); wxArrayLong *keys = m_keys[slot]; if ( keys ) @@ -221,6 +226,85 @@ long wxHashTableLong::Delete(long key) return wxNOT_FOUND; } +// ---------------------------------------------------------------------------- +// wxStringHashTable: more efficient than storing strings in a list +// ---------------------------------------------------------------------------- + +wxStringHashTable::wxStringHashTable(size_t sizeTable) +{ + m_keys = new wxArrayLong *[sizeTable]; + m_values = new wxArrayString *[sizeTable]; + + m_hashSize = sizeTable; + for ( size_t n = 0; n < m_hashSize; n++ ) + { + m_values[n] = (wxArrayString *)NULL; + m_keys[n] = (wxArrayLong *)NULL; + } +} + +wxStringHashTable::~wxStringHashTable() +{ + Destroy(); +} + +void wxStringHashTable::Destroy() +{ + for ( size_t n = 0; n < m_hashSize; n++ ) + { + delete m_values[n]; + delete m_keys[n]; + } + + delete [] m_values; + delete [] m_keys; + m_hashSize = 0; +} + +void wxStringHashTable::Put(long key, const wxString& value) +{ + wxCHECK_RET( m_hashSize, _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + if ( !m_keys[slot] ) + { + m_keys[slot] = new wxArrayLong; + m_values[slot] = new wxArrayString; + } + + m_keys[slot]->Add(key); + m_values[slot]->Add(value); +} + +wxString wxStringHashTable::Get(long key, bool *wasFound) const +{ + wxCHECK_MSG( m_hashSize, _T(""), _T("must call Create() first") ); + + size_t slot = (size_t)abs((int)(key % (long)m_hashSize)); + + wxArrayLong *keys = m_keys[slot]; + if ( keys ) + { + size_t count = keys->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( keys->Item(n) == key ) + { + if ( wasFound ) + *wasFound = TRUE; + + return m_values[slot]->Item(n); + } + } + } + + if ( wasFound ) + *wasFound = FALSE; + + return _T(""); +} + // ---------------------------------------------------------------------------- // old not type safe wxHashTable // ----------------------------------------------------------------------------