49 lines
1.2 KiB
C++
49 lines
1.2 KiB
C++
#pragma once
|
|
#ifndef __HASHTABLE_H__
|
|
#define __HASHTABLE_H__
|
|
|
|
#ifndef __ARRAY_H__
|
|
#include <array.h>
|
|
#endif
|
|
|
|
struct THash_bucket;
|
|
struct THash_entry;
|
|
|
|
class THash_table : public TContainer
|
|
{
|
|
TArray* _buckets;
|
|
long _items;
|
|
|
|
// container iterator
|
|
int _curr_bucket, _curr_item;
|
|
|
|
protected:
|
|
THash_bucket& bucket(size_t b);
|
|
void add(TObject* value, const char* key, unsigned int hash);
|
|
THash_entry* lookup_ex(const char* key, unsigned int& hash) const;
|
|
THash_entry* lookup(const char* key) const;
|
|
void expand();
|
|
|
|
public: // Container interface
|
|
virtual TObject* first_item();
|
|
virtual TObject* last_item();
|
|
virtual TObject* succ_item();
|
|
virtual TObject* pred_item();
|
|
virtual long objects() const { return _items; }
|
|
|
|
public:
|
|
bool add(const char* key, TObject* value, bool force = false);
|
|
bool add(const char* key, const TObject& value, bool force = false);
|
|
void steal(THash_entry& e);
|
|
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 _items; }
|
|
|
|
THash_table(size_t sz = 0);
|
|
~THash_table();
|
|
};
|
|
|
|
#endif
|