version 1.1, 2001/04/27 00:01:00
|
version 1.2, 2001/04/27 01:05:03
|
|
|
| |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
// | // |
// HashTableBase::BucketBase |
// _HashTableBase::_BucketBase |
// | // |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
| |
BucketBase::~BucketBase() |
_BucketBase::~_BucketBase() |
{ | { |
| |
} | } |
| |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
// | // |
// HashTableIteratorBase |
// _HashTableIteratorBase |
// | // |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
| |
HashTableIteratorBase HashTableIteratorBase::operator++(int) |
_HashTableIteratorBase _HashTableIteratorBase::operator++(int) |
{ | { |
HashTableIteratorBase tmp = *this; |
_HashTableIteratorBase tmp = *this; |
operator++(); | operator++(); |
return tmp; | return tmp; |
} | } |
| |
HashTableIteratorBase& HashTableIteratorBase::operator++() |
_HashTableIteratorBase& _HashTableIteratorBase::operator++() |
{ | { |
// At the end? | // At the end? |
| |
|
|
return *this; | return *this; |
} | } |
| |
HashTableIteratorBase::HashTableIteratorBase( |
_HashTableIteratorBase::_HashTableIteratorBase( |
BucketBase** first, |
_BucketBase** first, |
BucketBase** last) : _first(first), _last(last) |
_BucketBase** last) : _first(first), _last(last) |
{ | { |
while (_first != last) | while (_first != last) |
{ | { |
|
|
| |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
// | // |
// HashTableBase |
// _HashTableBase |
// | // |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
| |
HashTableBase::HashTableBase(Uint32 numChains) : _size(0), _numChains(numChains) |
_HashTableBase::_HashTableBase(Uint32 numChains) : _size(0), _numChains(numChains) |
{ | { |
if (numChains < 8) | if (numChains < 8) |
numChains = 8; | numChains = 8; |
| |
_chains = new BucketBase*[_numChains]; |
_chains = new _BucketBase*[_numChains]; |
memset(_chains, 0, sizeof(BucketBase*) * _numChains); |
memset(_chains, 0, sizeof(_BucketBase*) * _numChains); |
} | } |
| |
HashTableBase::~HashTableBase() |
_HashTableBase::_HashTableBase(const _HashTableBase& x) |
{ | { |
|
_size = 0; |
|
_numChains = 0; |
|
_chains = 0; |
|
operator=(x); |
|
} |
|
|
|
_HashTableBase::~_HashTableBase() |
|
{ |
|
clear(); |
|
delete [] _chains; |
|
} |
|
|
|
_HashTableBase& _HashTableBase::operator=(const _HashTableBase& x) |
|
{ |
|
if (this == &x) |
|
return *this; |
|
|
|
// Destroy the old representation: |
|
|
clear(); | clear(); |
|
|
|
if (_chains) |
|
delete [] _chains; |
|
|
|
// Create chain array: |
|
|
|
_chains = new _BucketBase*[_numChains = x._numChains]; |
|
memset(_chains, 0, sizeof(_BucketBase*) * _numChains); |
|
_size = x._size; |
|
|
|
// Copy over the buckets: |
|
|
|
for (Uint32 i = 0; i < _numChains; i++) |
|
{ |
|
if (x._chains[i]) |
|
{ |
|
_chains[i] = x._chains[i]->clone(); |
|
|
|
_BucketBase* curr = _chains[i]; |
|
_BucketBase* next = x._chains[i]->next; |
|
|
|
for (; next; next = next->next) |
|
{ |
|
curr->next = next->clone(); |
|
curr = curr->next; |
|
} |
|
} |
} | } |
| |
void HashTableBase::clear() |
return *this; |
|
} |
|
|
|
void _HashTableBase::clear() |
{ | { |
for (Uint32 i = 0; i < _numChains; i++) | for (Uint32 i = 0; i < _numChains; i++) |
{ | { |
for (BucketBase* bucket = _chains[i]; bucket; ) |
for (_BucketBase* bucket = _chains[i]; bucket; ) |
{ | { |
BucketBase* next = bucket->next; |
_BucketBase* next = bucket->next; |
delete bucket; | delete bucket; |
bucket = next; | bucket = next; |
} | } |
} | } |
| |
_size = 0; | _size = 0; |
memset(_chains, 0, sizeof(BucketBase*) * _numChains); |
|
|
if (_numChains) |
|
memset(_chains, 0, sizeof(_BucketBase*) * _numChains); |
} | } |
| |
Boolean HashTableBase::insert( |
Boolean _HashTableBase::insert( |
Uint32 hashCode, | Uint32 hashCode, |
BucketBase* bucket, |
_BucketBase* bucket, |
const void* key) | const void* key) |
{ | { |
// Check for duplicate entry with same key: | // Check for duplicate entry with same key: |
| |
Uint32 i = hashCode % _numChains; | Uint32 i = hashCode % _numChains; |
BucketBase* last = 0; |
_BucketBase* last = 0; |
| |
for (BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
for (_BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
{ | { |
if (bucket->equal(key)) | if (bucket->equal(key)) |
{ | { |
|
|
return true; | return true; |
} | } |
| |
const BucketBase* HashTableBase::lookup( |
const _BucketBase* _HashTableBase::lookup( |
Uint32 hashCode, | Uint32 hashCode, |
const void* key) | const void* key) |
{ | { |
Uint32 i = hashCode % _numChains; | Uint32 i = hashCode % _numChains; |
| |
for (BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
for (_BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
{ | { |
if (bucket->equal(key)) | if (bucket->equal(key)) |
return bucket; | return bucket; |
|
|
return 0; | return 0; |
} | } |
| |
Boolean HashTableBase::remove(Uint32 hashCode, const void* key) |
Boolean _HashTableBase::remove(Uint32 hashCode, const void* key) |
{ | { |
for (Uint32 i = 0; i < _numChains; i++) | for (Uint32 i = 0; i < _numChains; i++) |
{ | { |
BucketBase* prev = 0; |
_BucketBase* prev = 0; |
| |
for (BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
for (_BucketBase* bucket = _chains[i]; bucket; bucket = bucket->next) |
{ | { |
if (bucket->equal(key)) | if (bucket->equal(key)) |
{ | { |