adding CExpr
This commit is contained in:
parent
c973feece9
commit
7947f37851
30 changed files with 10941 additions and 0 deletions
350
CExpr/WX_HASH.CPP
Normal file
350
CExpr/WX_HASH.CPP
Normal file
|
|
@ -0,0 +1,350 @@
|
|||
/*
|
||||
* 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 ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in a new issue