This repository has been archived on 2024-03-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
ContactBook/CExpr/WX_HASH.CPP
2024-03-20 09:28:18 -05:00

350 lines
6.5 KiB
C++

/*
* File: wb_hash.cc
* Purpose: Hash table implementation
* Author: Julian Smart
* Created: 1993
* Updated: August 1994
* RCS_ID: $Id: wb_hash.cc,v 1.3 1994/08/14 21:34:01 edz Exp $
* Copyright: (c) 1993, AIAI, University of Edinburgh
*/
/* static const char sccsid[] = "@(#)wb_hash.cc 1.2 5/9/94"; */
#ifdef __GNUG__
#pragma implementation "wx_hash.h"
#endif
#include "stdafx.h"
#include "wx_list.h"
#include "wx_hash.h"
#include <string.h>
#include <stdarg.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(wxHashTable, CObject)
wxHashTable::wxHashTable (int the_key_type, int size)
{
n = size;
current_position = -1;
current_node = NULL;
key_type = the_key_type;
hash_table = new wxList *[size];
int i;
for (i = 0; i < size; i++)
hash_table[i] = NULL;
}
wxHashTable::~wxHashTable (void)
{
int i;
for (i = 0; i < n; i++)
if (hash_table[i])
delete hash_table[i];
delete[] hash_table;
}
BOOL wxHashTable::Create(int the_key_type, int size)
{
n = size;
current_position = -1;
current_node = 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;
return TRUE;
}
void wxHashTable::Put (long key, long value, CObject * object)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
hash_table[position] = new wxList (wxKEY_INTEGER);
hash_table[position]->Append (value, object);
}
void wxHashTable::Put (long key, char *value, CObject * object)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
hash_table[position] = new wxList (wxKEY_INTEGER);
hash_table[position]->Append (value, object);
}
void wxHashTable::Put (long key, CObject * object)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
hash_table[position] = new wxList (wxKEY_INTEGER);
hash_table[position]->Append (key, object);
}
void wxHashTable::Put (const char *key, CObject * object)
{
int position = (int) (MakeKey (key) % n);
if (!hash_table[position])
hash_table[position] = new wxList (wxKEY_STRING);
hash_table[position]->Append (key, object);
}
CObject *wxHashTable::Get (long key, long value)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
return node->Data ();
else
return NULL;
}
}
CObject *wxHashTable::Get (long key, char *value)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
return node->Data ();
else
return NULL;
}
}
CObject *wxHashTable::Get (long key)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
return node ? node->Data () : NULL;
}
}
CObject *wxHashTable::Get (const char *key)
{
int position = (int) (MakeKey (key) % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
return node ? node->Data () : NULL;
}
}
CObject *wxHashTable::Delete (long key)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
if (node)
{
CObject *data = node->Data ();
delete node;
return data;
}
else
return NULL;
}
}
CObject *wxHashTable::Delete (const char *key)
{
int position = (int) (MakeKey (key) % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (key);
if (node)
{
CObject *data = node->Data ();
delete node;
return data;
}
else
return NULL;
}
}
CObject *wxHashTable::Delete (long key, int value)
{
// Should NEVER be
if (key < 0)
key = -key;
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
{
CObject *data = node->Data ();
delete node;
return data;
}
else
return NULL;
}
}
CObject *wxHashTable::Delete (long key, char *value)
{
/*
// Should NEVER be
if (key < 0)
key = -key;
*/
int position = (int) (key % n);
if (!hash_table[position])
return NULL;
else
{
wxNode *node = hash_table[position]->Find (value);
if (node)
{
CObject *data = node->Data ();
delete node;
return data;
}
else
return NULL;
}
}
long wxHashTable::MakeKey (const char *string)
{
long int_key = 0;
while (*string)
int_key += (unsigned char) *string++;
/* // Don't need this since int_key >= 0)
if (int_key < 0)
int_key = -int_key;
*/
return int_key;
}
void wxHashTable::BeginFind (void)
{
current_position = -1;
current_node = NULL;
}
wxNode *wxHashTable::Next (void)
{
wxNode *found = NULL;
BOOL end = FALSE;
while (!end && !found)
{
if (!current_node)
{
current_position++;
if (current_position >= n)
{
current_position = -1;
current_node = NULL;
end = TRUE;
}
else
{
if (hash_table[current_position])
{
current_node = hash_table[current_position]->First ();
found = current_node;
}
}
}
else
{
current_node = current_node->Next ();
found = current_node;
}
}
return found;
}
void wxHashTable::DeleteContents (BOOL flag)
{
int i;
for (i = 0; i < n; i++)
{
if (hash_table[i])
hash_table[i]->DeleteContents (flag);
}
}
void wxHashTable::Clear (void)
{
int i;
for (i = 0; i < n; i++)
{
if (hash_table[i])
hash_table[i]->Clear ();
}
}