campo-sirio/include/assoc.cpp

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++];
}