]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/hash.cpp
fixed serious bug in wxFont::operator== (ignored weight)
[wxWidgets.git] / src / common / hash.cpp
index 1aa13adf84982444d41e93c54c2f27b6c5ba4c4a..2909e481837ec5223adf08894e59b5404082ad23 100644 (file)
@@ -104,7 +104,7 @@ void wxHashTableBase::DeleteContents(bool flag)
 
 wxNodeBase *wxHashTableBase::GetNode(long key, long value) const
 {
 
 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] )
 
     wxNodeBase *node;
     if ( m_hashTable[slot] )
@@ -123,6 +123,11 @@ wxNodeBase *wxHashTableBase::GetNode(long key, long value) const
 // wxHashTableLong
 // ----------------------------------------------------------------------------
 
 // wxHashTableLong
 // ----------------------------------------------------------------------------
 
+wxHashTableLong::~wxHashTableLong()
+{
+    Destroy();
+}
+
 void wxHashTableLong::Init(size_t size)
 {
     m_hashSize = size;
 void wxHashTableLong::Init(size_t size)
 {
     m_hashSize = size;
@@ -138,6 +143,11 @@ void wxHashTableLong::Init(size_t size)
     m_count = 0;
 }
 
     m_count = 0;
 }
 
+void wxHashTableLong::Create(size_t size)
+{
+    Init(size);
+}
+
 void wxHashTableLong::Destroy()
 {
     for ( size_t n = 0; n < m_hashSize; n++ )
 void wxHashTableLong::Destroy()
 {
     for ( size_t n = 0; n < m_hashSize; n++ )
@@ -156,7 +166,7 @@ void wxHashTableLong::Put(long key, long value)
 {
     wxCHECK_RET( m_hashSize, _T("must call Create() first") );
 
 {
     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] )
     {
 
     if ( !m_keys[slot] )
     {
@@ -174,7 +184,7 @@ long wxHashTableLong::Get(long key) const
 {
     wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") );
 
 {
     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 )
 
     wxArrayLong *keys = m_keys[slot];
     if ( keys )
@@ -196,7 +206,7 @@ long wxHashTableLong::Delete(long key)
 {
     wxCHECK_MSG( m_hashSize, wxNOT_FOUND, _T("must call Create() first") );
 
 {
     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 )
 
     wxArrayLong *keys = m_keys[slot];
     if ( keys )
@@ -221,6 +231,85 @@ long wxHashTableLong::Delete(long key)
     return wxNOT_FOUND;
 }
 
     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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // old not type safe wxHashTable
 // ----------------------------------------------------------------------------
@@ -306,7 +395,7 @@ void wxHashTable::Put (long key, long value, wxObject * object)
 
   if (!hash_table[position])
   {
 
   if (!hash_table[position])
   {
-    hash_table[position] = new wxList (wxKEY_INTEGER);
+    hash_table[position] = new wxList (wxKEY_STRING);
     if (m_deleteContents) hash_table[position]->DeleteContents(TRUE);
   }
 
     if (m_deleteContents) hash_table[position]->DeleteContents(TRUE);
   }
 
@@ -592,11 +681,14 @@ void wxHashTable::DeleteContents (bool flag)
 
 void wxHashTable::Clear ()
 {
 
 void wxHashTable::Clear ()
 {
-  int i;
-  for (i = 0; i < n; i++)
+    int i;
+    if (hash_table)
     {
     {
-      if (hash_table[i])
-        hash_table[i]->Clear ();
+        for (i = 0; i < n; i++)
+        {
+            if (hash_table[i])
+                hash_table[i]->Clear ();
+        }
     }
   m_count = 0;
 }
     }
   m_count = 0;
 }