#include <string.h>
#include <stdarg.h>
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxHashTable, wxObject)
-#endif
-wxHashTable::wxHashTable (const int the_key_type, const int size)
+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 = NULL;
+ 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] = NULL;
+ hash_table[i] = (wxList *) NULL;
+*/
}
wxHashTable::~wxHashTable (void)
{
+ Destroy();
+}
+
+void wxHashTable::Destroy(void)
+{
+ 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(const int the_key_type, const int size)
+bool wxHashTable::Create(int the_key_type, int size)
{
+ Destroy();
+
n = size;
current_position = -1;
- current_node = NULL;
+ current_node = (wxNode *) NULL;
key_type = the_key_type;
- if (hash_table)
- delete[] hash_table;
hash_table = new wxList *[size];
int i;
for (i = 0; i < size; i++)
- hash_table[i] = NULL;
+ hash_table[i] = (wxList *) NULL;
return TRUE;
}
-void wxHashTable::Put (const long key, const long value, wxObject * object)
+
+void wxHashTable::DoCopy(const wxHashTable& table)
+{
+ n = table.n;
+ 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;
- if (k < 0)
- k = -k;
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 (const long key, const char *value, wxObject * object)
+void wxHashTable::Put (long key, const wxChar *value, wxObject * object)
{
// Should NEVER be
- long k = (long) key;
- if (k < 0)
- k = -k;
+ 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 (const long key, wxObject * object)
+void wxHashTable::Put (long key, wxObject * object)
{
// Should NEVER be
long k = (long) key;
- if (k < 0)
- k = -k;
-
+
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 char *key, wxObject * object)
+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 (const long key, const long value) const
+wxObject *wxHashTable::Get (long key, long value) const
{
// Should NEVER be
long k = (long) key;
- if (k < 0)
- k = -k;
int position = (int) (k % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
return node->Data ();
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-wxObject *wxHashTable::Get (const long key, const char *value) const
+wxObject *wxHashTable::Get (long key, const wxChar *value) const
{
// Should NEVER be
long k = (long) key;
- if (k < 0)
- k = -k;
-
+
int position = (int) (k % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
return node->Data ();
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-wxObject *wxHashTable::Get (const long key) const
+wxObject *wxHashTable::Get (long key) const
{
// Should NEVER be
long k = (long) key;
- if (k < 0)
- k = -k;
int position = (int) (k % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (k);
}
}
-wxObject *wxHashTable::Get (const char *key) const
+wxObject *wxHashTable::Get (const wxChar *key) const
{
int position = (int) (MakeKey (key) % n);
+ if (position < 0) position = -position;
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
}
}
-wxObject *wxHashTable::Delete (const long key)
+wxObject *wxHashTable::Delete (long key)
{
// Should NEVER be
long k = (long) key;
- if (k < 0)
- k = -k;
int position = (int) (k % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (k);
{
wxObject *data = node->Data ();
delete node;
+ m_count--;
return data;
}
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-wxObject *wxHashTable::Delete (const char *key)
+wxObject *wxHashTable::Delete (const wxChar *key)
{
int position = (int) (MakeKey (key) % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
{
wxObject *data = node->Data ();
delete node;
+ m_count--;
return data;
}
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-wxObject *wxHashTable::Delete (const long key, const int value)
+wxObject *wxHashTable::Delete (long key, int value)
{
// Should NEVER be
- long k = (long) key;
- if (k < 0)
- k = -k;
+ long k = (long) key;
int position = (int) (k % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
{
wxObject *data = node->Data ();
delete node;
+ m_count--;
return data;
}
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-wxObject *wxHashTable::Delete (const long key, const char *value)
+wxObject *wxHashTable::Delete (long key, const wxChar *value)
{
int position = (int) (key % n);
+ if (position < 0) position = -position;
+
if (!hash_table[position])
- return NULL;
+ return (wxObject *) NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
{
wxObject *data = node->Data ();
delete node;
+ m_count--;
return data;
}
else
- return NULL;
+ return (wxObject *) NULL;
}
}
-long wxHashTable::MakeKey (const char *string) const
+long wxHashTable::MakeKey (const wxChar *string) const
{
long int_key = 0;
while (*string)
- int_key += (unsigned char) *string++;
+ int_key += (wxUChar) *string++;
return int_key;
}
void wxHashTable::BeginFind (void)
{
current_position = -1;
- current_node = NULL;
+ current_node = (wxNode *) NULL;
}
wxNode *wxHashTable::Next (void)
{
- wxNode *found = NULL;
+ wxNode *found = (wxNode *) NULL;
bool end = FALSE;
while (!end && !found)
{
if (current_position >= n)
{
current_position = -1;
- current_node = NULL;
+ current_node = (wxNode *) NULL;
end = TRUE;
}
else
return found;
}
-void wxHashTable::DeleteContents (const bool flag)
+void wxHashTable::DeleteContents (bool flag)
{
int i;
+ m_deleteContents = flag;
for (i = 0; i < n; i++)
{
if (hash_table[i])
if (hash_table[i])
hash_table[i]->Clear ();
}
+ m_count = 0;
}