48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#pragma once
|
|
#ifndef __HASHTABLE_H__
|
|
#define __HASHTABLE_H__
|
|
|
|
#ifndef __ARRAY_H__
|
|
#include <array.h>
|
|
#endif
|
|
|
|
class THash_table : public TContainer
|
|
{
|
|
struct THashEntry;
|
|
THashEntry** _buckets;
|
|
size_t _bucketCount, _size;
|
|
volatile unsigned int _lock;
|
|
|
|
// container iterator
|
|
size_t _curr_bucket;
|
|
THashEntry* _curr_entry;
|
|
|
|
protected:
|
|
THashEntry* lookup_ex(const char* key, unsigned int& hash, size_t& index) const;
|
|
THashEntry* lookup(const char* key) const;
|
|
void expand_if_needed();
|
|
void Lock();
|
|
void Unlock();
|
|
|
|
public: // Container interface
|
|
virtual TObject* first_item();
|
|
virtual TObject* last_item();
|
|
virtual TObject* succ_item();
|
|
virtual TObject* pred_item();
|
|
virtual long objects() const { return _size; }
|
|
|
|
public:
|
|
bool add(const char* key, TObject* value, bool force = false);
|
|
bool add(const char* key, const TObject& value, bool force = false);
|
|
bool is_key(const char* key) const { return lookup(key) != NULL; }
|
|
TObject* get(const char* key);
|
|
TObject* remove(const char* key);
|
|
bool destroy(const char* key);
|
|
size_t items() const { return _size; }
|
|
|
|
THash_table(size_t sz = 0);
|
|
~THash_table();
|
|
};
|
|
|
|
#endif
|