]> git.saurik.com Git - wxWidgets.git/commitdiff
leave only wxString overloads for of the functions working with string keys; remove...
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 25 Apr 2007 19:21:46 +0000 (19:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 25 Apr 2007 19:21:46 +0000 (19:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45644 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/hash.h
src/common/hash.cpp

index 5cf258f5d20dc00fa0b1df744190ed4f78ee2fd3..32789cdd787c850de1c7dd4578788171ad5d922a 100644 (file)
 #include "wx/defs.h"
 #include "wx/string.h"
 
-#define wxUSE_OLD_HASH_TABLE 0
-
 #if !wxUSE_STL
     #include "wx/object.h"
 #else
     class WXDLLIMPEXP_BASE wxObject;
 #endif
-#if wxUSE_OLD_HASH_TABLE
-    #include "wx/list.h"
-#endif
 
 // the default size of the hash
 #define wxHASH_SIZE_DEFAULT     (1000)
  * the list to find the desired item.
 */
 
-// ----------------------------------------------------------------------------
-// this is the base class for object hashes: hash tables which contain
-// pointers to objects
-// ----------------------------------------------------------------------------
-
-#if wxUSE_OLD_HASH_TABLE
-
-class WXDLLIMPEXP_BASE wxHashTableBase : public wxObject
-{
-public:
-    wxHashTableBase();
-
-    void Create(wxKeyType keyType = wxKEY_INTEGER,
-                size_t size = wxHASH_SIZE_DEFAULT);
-    void Destroy();
-
-    size_t GetSize() const { return m_hashSize; }
-    size_t GetCount() const { return m_count; }
-
-    void DeleteContents(bool flag);
-
-protected:
-    // find the node for (key, value)
-    wxNodeBase *GetNode(long key, long value) const;
-
-    // the array of lists in which we store the values for given key hash
-    wxListBase **m_hashTable;
-
-    // the size of m_lists array
-    size_t m_hashSize;
-
-    // the type of indexing we use
-    wxKeyType m_keyType;
-
-    // the total number of elements in the hash
-    size_t m_count;
-
-    // should we delete our data?
-    bool m_deleteContents;
-
-private:
-    // no copy ctor/assignment operator (yet)
-    DECLARE_NO_COPY_CLASS(wxHashTableBase)
-};
-
-#else // if !wxUSE_OLD_HASH_TABLE
-
-#if !defined(wxENUM_KEY_TYPE_DEFINED)
-#define wxENUM_KEY_TYPE_DEFINED
-
-enum wxKeyType
-{
-    wxKEY_NONE,
-    wxKEY_INTEGER,
-    wxKEY_STRING
-};
-
-#endif
-
 union wxHashKeyValue
 {
     long integer;
-    wxChar *string;
+    wxString *string;
 };
 
 // for some compilers (AIX xlC), defining it as friend inside the class is not
@@ -112,12 +48,12 @@ class WXDLLIMPEXP_BASE wxHashTableBase_Node
 public:
     wxHashTableBase_Node( long key, void* value,
                           wxHashTableBase* table );
-    wxHashTableBase_Node( const wxChar* key, void* value,
+    wxHashTableBase_Node( const wxString&  key, void* value,
                           wxHashTableBase* table );
     ~wxHashTableBase_Node();
 
     long GetKeyInteger() const { return m_key.integer; }
-    const wxChar* GetKeyString() const { return m_key.string; }
+    const wxString& GetKeyString() const { return *m_key.string; }
 
     void* GetData() const { return m_value; }
     void SetData( void* data ) { m_value = data; }
@@ -165,15 +101,15 @@ public:
 
     void DeleteContents( bool flag ) { m_deleteContents = flag; }
 
-    static long MakeKey(const wxChar *string);
+    static long MakeKey(const wxString& string);
 
 protected:
     void DoPut( long key, long hash, void* data );
-    void DoPut( const wxChar* key, long hash, void* data );
+    void DoPut( const wxString&  key, long hash, void* data );
     void* DoGet( long key, long hash ) const;
-    void* DoGet( const wxChar* key, long hash ) const;
+    void* DoGet( const wxString&  key, long hash ) const;
     void* DoDelete( long key, long hash );
-    void* DoDelete( const wxChar* key, long hash );
+    void* DoDelete( const wxString&  key, long hash );
 
 private:
     // Remove the node from the hash, *only called from
@@ -217,14 +153,10 @@ private:
     DECLARE_NO_COPY_CLASS(wxHashTableBase)
 };
 
-#endif // wxUSE_OLD_HASH_TABLE
-
 // ----------------------------------------------------------------------------
 // for compatibility only
 // ----------------------------------------------------------------------------
 
-#if !wxUSE_OLD_HASH_TABLE
-
 class WXDLLIMPEXP_BASE wxHashTable_Node : public wxHashTableBase_Node
 {
     friend class WXDLLIMPEXP_BASE wxHashTable;
@@ -232,7 +164,7 @@ public:
     wxHashTable_Node( long key, void* value,
                       wxHashTableBase* table )
         : wxHashTableBase_Node( key, value, table ) { }
-    wxHashTable_Node( const wxChar* key, void* value,
+    wxHashTable_Node( const wxString&  key, void* value,
                       wxHashTableBase* table )
         : wxHashTableBase_Node( key, value, table ) { }
 
@@ -268,12 +200,9 @@ public:
         { DoPut( value, value, object ); }
     void Put(long lhash, long value, wxObject *object)
         { DoPut( value, lhash, object ); }
-    void Put(const wxChar *value, wxObject *object)
-        { DoPut( value, MakeKey( value ), object ); }
-    // FIXME-UTF8: have only wxString forms here
     void Put(const wxString& value, wxObject *object)
         { DoPut( value, MakeKey( value ), object ); }
-    void Put(long lhash, const wxChar *value, wxObject *object)
+    void Put(long lhash, const wxString& value, wxObject *object)
         { DoPut( value, lhash, object ); }
 
     // key and value are the same
@@ -281,12 +210,9 @@ public:
         { return (wxObject*)DoGet( value, value ); }
     wxObject *Get(long lhash, long value) const
         { return (wxObject*)DoGet( value, lhash ); }
-    wxObject *Get(const wxChar *value) const
-        { return (wxObject*)DoGet( value, MakeKey( value ) ); }
-    // FIXME-UTF8: have only wxString forms here
     wxObject *Get(const wxString& value) const
         { return (wxObject*)DoGet( value, MakeKey( value ) ); }
-    wxObject *Get(long lhash, const wxChar *value) const
+    wxObject *Get(long lhash, const wxString& value) const
         { return (wxObject*)DoGet( value, lhash ); }
 
     // Deletes entry and returns data if found
@@ -294,19 +220,11 @@ public:
         { return (wxObject*)DoDelete( key, key ); }
     wxObject *Delete(long lhash, long key)
         { return (wxObject*)DoDelete( key, lhash ); }
-    wxObject *Delete(const wxChar *key)
-        { return (wxObject*)DoDelete( key, MakeKey( key ) ); }
-    // FIXME-UTF8: have only wxString forms here
     wxObject *Delete(const wxString& key)
         { return (wxObject*)DoDelete( key, MakeKey( key ) ); }
-    wxObject *Delete(long lhash, const wxChar *key)
+    wxObject *Delete(long lhash, const wxString& key)
         { return (wxObject*)DoDelete( key, lhash ); }
 
-    // Construct your own integer key from a string, e.g. in case
-    // you need to combine it with something
-    long MakeKey(const wxChar *string) const
-        { return wxHashTableBase::MakeKey(string); }
-
     // Way of iterating through whole hash table (e.g. to delete everything)
     // Not necessary, of course, if you're only storing pointers to
     // objects maintained separately
@@ -333,103 +251,6 @@ private:
     size_t m_currBucket;
 };
 
-#else // if wxUSE_OLD_HASH_TABLE
-
-typedef wxNode wxHashTable_Node;
-
-class WXDLLIMPEXP_BASE wxHashTable : public wxObject
-{
-public:
-    typedef wxNode Node;
-    typedef wxNode* compatibility_iterator;
-
-    int n;
-    int current_position;
-    wxNode *current_node;
-
-    unsigned int key_type;
-    wxList **hash_table;
-
-    wxHashTable(int the_key_type = wxKEY_INTEGER,
-                int size = wxHASH_SIZE_DEFAULT);
-    virtual ~wxHashTable();
-
-    // copy ctor and assignment operator
-    wxHashTable(const wxHashTable& table) : wxObject()
-        { DoCopy(table); }
-    wxHashTable& operator=(const wxHashTable& table)
-        { Clear(); DoCopy(table); return *this; }
-
-    void DoCopy(const wxHashTable& table);
-
-    void Destroy();
-
-    bool Create(int the_key_type = wxKEY_INTEGER,
-                int size = wxHASH_SIZE_DEFAULT);
-
-    // Note that there are 2 forms of Put, Get.
-    // With a key and a value, the *value* will be checked
-    // when a collision is detected. Otherwise, if there are
-    // 2 items with a different value but the same key,
-    // we'll retrieve the WRONG ONE. So where possible,
-    // supply the required value along with the key.
-    // In fact, the value-only versions make a key, and still store
-    // the value. The use of an explicit key might be required
-    // e.g. when combining several values into one key.
-    // When doing that, it's highly likely we'll get a collision,
-    // e.g. 1 + 2 = 3, 2 + 1 = 3.
-
-    // key and value are NOT necessarily the same
-    void Put(long key, long value, wxObject *object);
-    void Put(long key, const wxChar *value, wxObject *object);
-
-    // key and value are the same
-    void Put(long value, wxObject *object);
-    void Put(const wxChar *value, wxObject *object);
-
-    // key and value not the same
-    wxObject *Get(long key, long value) const;
-    wxObject *Get(long key, const wxChar *value) const;
-
-    // key and value are the same
-    wxObject *Get(long value) const;
-    wxObject *Get(const wxChar *value) const;
-
-    // Deletes entry and returns data if found
-    wxObject *Delete(long key);
-    wxObject *Delete(const wxChar *key);
-
-    wxObject *Delete(long key, int value);
-    wxObject *Delete(long key, const wxChar *value);
-
-    // Construct your own integer key from a string, e.g. in case
-    // you need to combine it with something
-    long MakeKey(const wxChar *string) const;
-
-    // Way of iterating through whole hash table (e.g. to delete everything)
-    // Not necessary, of course, if you're only storing pointers to
-    // objects maintained separately
-
-    void BeginFind();
-    Node* Next();
-
-    void DeleteContents(bool flag);
-    void Clear();
-
-    // Returns number of nodes
-    size_t GetCount() const { return m_count; }
-
-private:
-    size_t m_count;             // number of elements in the hashtable
-    bool m_deleteContents;
-
-    DECLARE_DYNAMIC_CLASS(wxHashTable)
-};
-
-#endif // wxUSE_OLD_HASH_TABLE
-
-#if !wxUSE_OLD_HASH_TABLE
-
 // defines a new type safe hash table which stores the elements of type eltype
 // in lists of class listclass
 #define _WX_DECLARE_HASH(eltype, dummy, hashclass, classexp)                  \
@@ -458,69 +279,6 @@ private:
         DECLARE_NO_COPY_CLASS(hashclass)                                      \
     }
 
-#else // if wxUSE_OLD_HASH_TABLE
-
-#define _WX_DECLARE_HASH(eltype, listclass, hashclass, classexp)               \
-    classexp hashclass : public wxHashTableBase                                \
-    {                                                                          \
-    public:                                                                    \
-        hashclass(wxKeyType keyType = wxKEY_INTEGER,                           \
-                  size_t size = wxHASH_SIZE_DEFAULT)                           \
-            { Create(keyType, size); }                                         \
-                                                                               \
-        virtual ~hashclass() { Destroy(); }                                            \
-                                                                               \
-        void Put(long key, long val, eltype *data) { DoPut(key, val, data); }  \
-        void Put(long key, eltype *data) { DoPut(key, key, data); }            \
-                                                                               \
-        eltype *Get(long key, long value) const                                \
-        {                                                                      \
-            wxNodeBase *node = GetNode(key, value);                            \
-            return node ? ((listclass::Node *)node)->GetData() : (eltype *)0;  \
-        }                                                                      \
-        eltype *Get(long key) const { return Get(key, key); }                  \
-                                                                               \
-        eltype *Delete(long key, long value)                                   \
-        {                                                                      \
-            eltype *data;                                                      \
-                                                                               \
-            wxNodeBase *node = GetNode(key, value);                            \
-            if ( node )                                                        \
-            {                                                                  \
-                data = ((listclass::Node *)node)->GetData();                   \
-                                                                               \
-                delete node;                                                   \
-                m_count--;                                                     \
-            }                                                                  \
-            else                                                               \
-            {                                                                  \
-                data = (eltype *)0;                                            \
-            }                                                                  \
-                                                                               \
-            return data;                                                       \
-        }                                                                      \
-        eltype *Delete(long key) { return Delete(key, key); }                  \
-                                                                               \
-    protected:                                                                 \
-        void DoPut(long key, long value, eltype *data)                         \
-        {                                                                      \
-            size_t slot = (size_t)abs((int)(key % (long)m_hashSize));          \
-                                                                               \
-            if ( !m_hashTable[slot] )                                          \
-            {                                                                  \
-                m_hashTable[slot] = new listclass(m_keyType);                  \
-                if ( m_deleteContents )                                        \
-                    m_hashTable[slot]->DeleteContents(true);                   \
-            }                                                                  \
-                                                                               \
-            ((listclass *)m_hashTable[slot])->Append(value, data);             \
-            m_count++;                                                         \
-        }                                                                      \
-                                                                               \
-        DECLARE_NO_COPY_CLASS(hashclass)                                       \
-    }
-
-#endif // wxUSE_OLD_HASH_TABLE
 
 // this macro is to be used in the user code
 #define WX_DECLARE_HASH(el, list, hash) \
@@ -552,5 +310,4 @@ private:
         (hash).Clear();                                                      \
     }
 
-#endif
-    // _WX_HASH_H__
+#endif // _WX_HASH_H__
index a782166d021f90644e5a06d6968d2290294e7ffa..8333e1cdea03fa8f43f41a5281ecb25365153ad9 100644 (file)
 #endif
 
 #ifndef WX_PRECOMP
-    #include "wx/list.h"
     #include "wx/hash.h"
 #endif
 
-#if wxUSE_OLD_HASH_TABLE
-
-#include <string.h>
-#include <stdarg.h>
-
-// ----------------------------------------------------------------------------
-// wxWin macros
-// ----------------------------------------------------------------------------
-
-IMPLEMENT_DYNAMIC_CLASS(wxHashTable, wxObject)
-
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// wxHashTablleBase for working with "void *" data
-// ----------------------------------------------------------------------------
-
-wxHashTableBase::wxHashTableBase()
-{
-    m_deleteContents = false;
-    m_hashTable = (wxListBase **)NULL;
-    m_hashSize = 0;
-    m_count = 0;
-    m_keyType = wxKEY_NONE;
-}
-
-void wxHashTableBase::Create(wxKeyType keyType, size_t size)
-{
-    Destroy();
-
-    m_hashSize = size;
-    m_keyType = keyType;
-    m_hashTable = new wxListBase *[size];
-    for ( size_t n = 0; n < m_hashSize; n++ )
-    {
-        m_hashTable[n] = (wxListBase *) NULL;
-    }
-}
-
-void wxHashTableBase::Destroy()
-{
-    if ( m_hashTable )
-    {
-        for ( size_t n = 0; n < m_hashSize; n++ )
-        {
-            delete m_hashTable[n];
-        }
-
-        delete [] m_hashTable;
-
-        m_hashTable = (wxListBase **)NULL;
-
-        m_count = 0;
-    }
-}
-
-void wxHashTableBase::DeleteContents(bool flag)
-{
-    m_deleteContents = flag;
-    for ( size_t n = 0; n < m_hashSize; n++ )
-    {
-        if ( m_hashTable[n] )
-        {
-            m_hashTable[n]->DeleteContents(flag);
-        }
-    }
-}
-
-wxNodeBase *wxHashTableBase::GetNode(long key, long value) const
-{
-    size_t slot = (size_t)abs((int)(key % (long)m_hashSize));
-
-    wxNodeBase *node;
-    if ( m_hashTable[slot] )
-    {
-        node = m_hashTable[slot]->Find(wxListKey(value));
-    }
-    else
-    {
-        node = (wxNodeBase *)NULL;
-    }
-
-    return node;
-}
-
-// ----------------------------------------------------------------------------
-// old not type safe wxHashTable
-// ----------------------------------------------------------------------------
-
-wxHashTable::wxHashTable (int the_key_type, int size)
-{
-  n = 0;
-  hash_table = (wxList**) NULL;
-  Create(the_key_type, size);
-  m_count = 0;
-  m_deleteContents = false;
-/*
-  n = size;
-  current_position = -1;
-  current_node = (wxNode *) NULL;
-
-  key_type = the_key_type;
-  hash_table = new wxList *[size];
-  int i;
-  for (i = 0; i < size; i++)
-    hash_table[i] = (wxList *) NULL;
-*/
-}
-
-wxHashTable::~wxHashTable ()
-{
-  Destroy();
-}
-
-void wxHashTable::Destroy()
-{
-  if (!hash_table) return;
-  int i;
-  for (i = 0; i < n; i++)
-    if (hash_table[i])
-      delete hash_table[i];
-  delete[] hash_table;
-  hash_table = NULL;
-}
-
-bool wxHashTable::Create(int the_key_type, int size)
-{
-  Destroy();
-
-  n = size;
-  current_position = -1;
-  current_node = (wxNode *) NULL;
-
-  key_type = the_key_type;
-  hash_table = new wxList *[size];
-  int i;
-  for (i = 0; i < size; i++)
-    hash_table[i] = (wxList *) NULL;
-  return true;
-}
-
-
-void wxHashTable::DoCopy(const wxHashTable& table)
-{
-  n = table.n;
-  m_count = table.m_count;
-  current_position = table.current_position;
-  current_node = NULL; // doesn't matter - Next() will reconstruct it
-  key_type = table.key_type;
-
-  hash_table = new wxList *[n];
-  for (int i = 0; i < n; i++) {
-    if (table.hash_table[i] == NULL)
-      hash_table[i] = NULL;
-    else {
-      hash_table[i] = new wxList(key_type);
-      *(hash_table[i]) = *(table.hash_table[i]);
-    }
-  }
-}
-
-void wxHashTable::Put (long key, long value, wxObject * object)
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-  {
-    hash_table[position] = new wxList (wxKEY_INTEGER);
-    if (m_deleteContents) hash_table[position]->DeleteContents(true);
-  }
-
-  hash_table[position]->Append (value, object);
-  m_count++;
-}
-
-void wxHashTable::Put (long key, const wxChar *value, wxObject * object)
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-  {
-    hash_table[position] = new wxList (wxKEY_STRING);
-    if (m_deleteContents) hash_table[position]->DeleteContents(true);
-  }
-
-  hash_table[position]->Append (value, object);
-  m_count++;
-}
-
-void wxHashTable::Put (long key, wxObject * object)
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-  {
-    hash_table[position] = new wxList (wxKEY_INTEGER);
-    if (m_deleteContents) hash_table[position]->DeleteContents(true);
-  }
-
-  hash_table[position]->Append (k, object);
-  m_count++;
-}
-
-void wxHashTable::Put (const wxChar *key, wxObject * object)
-{
-  int position = (int) (MakeKey (key) % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-  {
-    hash_table[position] = new wxList (wxKEY_STRING);
-    if (m_deleteContents) hash_table[position]->DeleteContents(true);
-  }
-
-  hash_table[position]->Append (key, object);
-  m_count++;
-}
-
-wxObject *wxHashTable::Get (long key, long value) const
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (value);
-      if (node)
-        return node->GetData ();
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-wxObject *wxHashTable::Get (long key, const wxChar *value) const
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (value);
-      if (node)
-        return node->GetData ();
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-wxObject *wxHashTable::Get (long key) const
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (k);
-      return node ? node->GetData () : (wxObject*)NULL;
-    }
-}
-
-wxObject *wxHashTable::Get (const wxChar *key) const
-{
-  int position = (int) (MakeKey (key) % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (key);
-      return node ? node->GetData () : (wxObject*)NULL;
-    }
-}
-
-wxObject *wxHashTable::Delete (long key)
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (k);
-      if (node)
-        {
-          wxObject *data = node->GetData ();
-          delete node;
-          m_count--;
-          return data;
-        }
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-wxObject *wxHashTable::Delete (const wxChar *key)
-{
-  int position = (int) (MakeKey (key) % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (key);
-      if (node)
-        {
-          wxObject *data = node->GetData ();
-          delete node;
-          m_count--;
-          return data;
-        }
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-wxObject *wxHashTable::Delete (long key, int value)
-{
-  // Should NEVER be
-  long k = (long) key;
-
-  int position = (int) (k % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (value);
-      if (node)
-        {
-          wxObject *data = node->GetData ();
-          delete node;
-          m_count--;
-          return data;
-        }
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-wxObject *wxHashTable::Delete (long key, const wxChar *value)
-{
-  int position = (int) (key % n);
-  if (position < 0) position = -position;
-
-  if (!hash_table[position])
-    return (wxObject *) NULL;
-  else
-    {
-      wxNode *node = hash_table[position]->Find (value);
-      if (node)
-        {
-          wxObject *data = node->GetData ();
-          delete node;
-          m_count--;
-          return data;
-        }
-      else
-        return (wxObject *) NULL;
-    }
-}
-
-long wxHashTable::MakeKey (const wxChar *string) const
-{
-  long int_key = 0;
-
-  while (*string)
-    int_key += (wxUChar) *string++;
-
-  return int_key;
-}
-
-void wxHashTable::BeginFind ()
-{
-  current_position = -1;
-  current_node = (wxNode *) NULL;
-}
-
-wxHashTable::Node* wxHashTable::Next ()
-{
-  wxNode *found = (wxNode *) NULL;
-  bool end = false;
-  while (!end && !found)
-    {
-      if (!current_node)
-        {
-          current_position++;
-          if (current_position >= n)
-            {
-              current_position = -1;
-              current_node = (wxNode *) NULL;
-              end = true;
-            }
-          else
-            {
-              if (hash_table[current_position])
-                {
-                  current_node = hash_table[current_position]->GetFirst ();
-                  found = current_node;
-                }
-            }
-        }
-      else
-        {
-          current_node = current_node->GetNext ();
-          found = current_node;
-        }
-    }
-  return found;
-}
-
-void wxHashTable::DeleteContents (bool flag)
-{
-  int i;
-  m_deleteContents = flag;
-  for (i = 0; i < n; i++)
-    {
-      if (hash_table[i])
-        hash_table[i]->DeleteContents (flag);
-    }
-}
-
-void wxHashTable::Clear ()
-{
-    int i;
-    if (hash_table)
-    {
-        for (i = 0; i < n; i++)
-        {
-            if (hash_table[i])
-                hash_table[i]->Clear ();
-        }
-    }
-  m_count = 0;
-}
-
-#else // if !wxUSE_OLD_HASH_TABLE
-
 wxHashTableBase_Node::wxHashTableBase_Node( long key, void* value,
                                             wxHashTableBase* table )
     : m_value( value ), m_hashPtr( table )
@@ -509,11 +35,11 @@ wxHashTableBase_Node::wxHashTableBase_Node( long key, void* value,
     m_key.integer = key;
 }
 
-wxHashTableBase_Node::wxHashTableBase_Node( const wxChar* key, void* value,
+wxHashTableBase_Node::wxHashTableBase_Node( const wxString& key, void* value,
                                             wxHashTableBase* table )
     : m_value( value ), m_hashPtr( table )
 {
-    m_key.string = wxStrcpy( new wxChar[wxStrlen( key ) + 1], key );
+    m_key.string = new wxString(key);
 }
 
 wxHashTableBase_Node::~wxHashTableBase_Node()
@@ -571,7 +97,7 @@ void wxHashTableBase::DoRemoveNode( wxHashTableBase_Node* node )
 {
     size_t bucket = ( m_keyType == wxKEY_INTEGER ?
                       node->m_key.integer        :
-                      MakeKey( node->m_key.string ) ) % m_size;
+                      MakeKey( *node->m_key.string ) ) % m_size;
 
     if( node->GetNext() == node )
     {
@@ -599,7 +125,7 @@ void wxHashTableBase::DoDestroyNode( wxHashTableBase_Node* node )
     node->m_hashPtr = NULL;
 
     if( m_keyType == wxKEY_STRING )
-        delete[] node->m_key.string;
+        delete node->m_key.string;
     if( m_deleteContents )
         DoDeleteContents( node );
 }
@@ -643,7 +169,7 @@ void wxHashTableBase::DoPut( long key, long hash, void* data )
     DoInsertNode( bucket, node );
 }
 
-void wxHashTableBase::DoPut( const wxChar* key, long hash, void* data )
+void wxHashTableBase::DoPut( const wxString& key, long hash, void* data )
 {
     wxASSERT( m_keyType == wxKEY_STRING );
 
@@ -677,7 +203,7 @@ void* wxHashTableBase::DoGet( long key, long hash ) const
     return NULL;
 }
 
-void* wxHashTableBase::DoGet( const wxChar* key, long hash ) const
+void* wxHashTableBase::DoGet( const wxString& key, long hash ) const
 {
     wxASSERT( m_keyType == wxKEY_STRING );
 
@@ -691,7 +217,7 @@ void* wxHashTableBase::DoGet( const wxChar* key, long hash ) const
 
     do
     {
-        if( wxStrcmp( curr->m_key.string, key ) == 0 )
+        if( *curr->m_key.string == key )
             return curr->m_value;
 
         curr = curr->GetNext();
@@ -750,7 +276,7 @@ void* wxHashTableBase::DoDelete( long key, long hash )
     return NULL;
 }
 
-void* wxHashTableBase::DoDelete( const wxChar* key, long hash )
+void* wxHashTableBase::DoDelete( const wxString& key, long hash )
 {
     wxASSERT( m_keyType == wxKEY_STRING );
 
@@ -765,7 +291,7 @@ void* wxHashTableBase::DoDelete( const wxChar* key, long hash )
 
     do
     {
-        if( wxStrcmp( curr->m_key.string, key ) == 0 )
+        if( *curr->m_key.string == key )
         {
             void* retval = curr->m_value;
             curr->m_value = NULL;
@@ -784,12 +310,13 @@ void* wxHashTableBase::DoDelete( const wxChar* key, long hash )
     return NULL;
 }
 
-long wxHashTableBase::MakeKey( const wxChar *str )
+long wxHashTableBase::MakeKey( const wxString& str )
 {
     long int_key = 0;
 
-    while( *str )
-        int_key += (wxUChar)*str++;
+    const wxStringCharType *p = str.wx_str();
+    while( *p )
+        int_key += *p++;
 
     return int_key;
 }
@@ -855,4 +382,3 @@ wxHashTable::Node* wxHashTable::Next()
     return m_curr;
 }
 
-#endif // !wxUSE_OLD_HASH_TABLE