#pragma once #ifndef __HASHTABLE_H__ #define __HASHTABLE_H__ #ifndef __ARRAY_H__ #include #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