138 lines
2.7 KiB
C++
Executable File
138 lines
2.7 KiB
C++
Executable File
#include <assoc.h>
|
|
|
|
THash_object* TAssoc_array::_lookup(const char* k, bool& isnew, bool insert)
|
|
{
|
|
TString key(k);
|
|
word hv = key.hash() % HASH_SIZE;
|
|
TArray& arr = _data[hv];
|
|
THash_object* o = NULL;
|
|
isnew = FALSE;
|
|
|
|
for (int i = 0; i < arr.items(); i++)
|
|
{
|
|
THash_object* ob = (THash_object*)&arr[i];
|
|
if (ob->_key == key)
|
|
{ o = ob; break; }
|
|
if (ob->_key > key)
|
|
break;
|
|
}
|
|
|
|
if (o == NULL && insert)
|
|
{
|
|
o = new THash_object(key);
|
|
arr.insert(o,i);
|
|
isnew = TRUE;
|
|
_cnt++;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
void TAssoc_array::destroy()
|
|
{
|
|
for (int i = 0; i < HASH_SIZE; i++)
|
|
_data[i].destroy();
|
|
_cnt = _row = _col = 0;
|
|
}
|
|
|
|
bool TAssoc_array::add(const char* key, TObject* obj,
|
|
bool force)
|
|
{
|
|
bool isnew = FALSE;
|
|
|
|
THash_object* o = _lookup(key,isnew,TRUE);
|
|
|
|
if (!isnew)
|
|
{
|
|
if (force) { o->_obj = obj; }
|
|
return TRUE;
|
|
}
|
|
o->_obj = obj;
|
|
return FALSE;
|
|
}
|
|
|
|
bool TAssoc_array::add(const char* key, const TObject& obj, bool force)
|
|
{
|
|
return add(key,obj.dup(),force);
|
|
}
|
|
|
|
bool TAssoc_array::remove(const char* k)
|
|
{
|
|
TString key(k);
|
|
word hv = key.hash() % HASH_SIZE;
|
|
TArray& arr = _data[hv];
|
|
THash_object* o = NULL;
|
|
|
|
for (int i = 0; i < arr.items(); i++)
|
|
{
|
|
THash_object* ob = (THash_object*)&arr[i];
|
|
if (ob->_key == key)
|
|
{ o = ob; break; }
|
|
if (ob->_key > key)
|
|
break;
|
|
}
|
|
if (o != NULL) { arr.destroy(i,TRUE); _cnt--; return TRUE; }
|
|
return FALSE;
|
|
}
|
|
|
|
TObject& TAssoc_array::find(const char* key)
|
|
{
|
|
bool isnew = FALSE;
|
|
THash_object* o = _lookup(key, isnew);
|
|
if (o == NULL) error_box("INTERNAL (HASH): Unref key");
|
|
if (o->_obj == NULL) return error;
|
|
else return *(o->_obj);
|
|
}
|
|
|
|
TObject* TAssoc_array::objptr(const char* key)
|
|
{
|
|
bool isnew;
|
|
THash_object* o = NULL;
|
|
if ((o = _lookup(key,isnew)) != NULL)
|
|
return &(o->obj());
|
|
return NULL;
|
|
}
|
|
|
|
bool TAssoc_array::is_key(const char* key)
|
|
{
|
|
bool isnew = FALSE;
|
|
THash_object* o = _lookup(key, isnew);
|
|
if (o == NULL) return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
TObject* TAssoc_array::get()
|
|
{
|
|
TArray& arr = _data[_row];
|
|
|
|
for(;_row < HASH_SIZE;)
|
|
{
|
|
if ((int)_col < arr.items())
|
|
break;
|
|
arr = _data[++_row];
|
|
_col = 0;
|
|
}
|
|
if (_row == HASH_SIZE)
|
|
{ _row = 0; return NULL; }
|
|
|
|
THash_object* o = (THash_object*)&arr[_col++];
|
|
return o->_obj == NULL ? &error : o->_obj;
|
|
}
|
|
|
|
THash_object* TAssoc_array::get_hashobj()
|
|
{
|
|
TArray& arr = _data[_row];
|
|
|
|
for(;_row < HASH_SIZE;)
|
|
{
|
|
if ((int)_col < arr.items())
|
|
break;
|
|
arr = _data[++_row];
|
|
_col = 0;
|
|
}
|
|
if (_row == HASH_SIZE)
|
|
{ _row = 0; return NULL; }
|
|
|
|
return (THash_object*)&arr[_col++];
|
|
}
|
|
|