source: cpp/frams/util/hashtable.h @ 1040

Last change on this file since 1040 was 793, checked in by Maciej Komosinski, 6 years ago

Code formatting

  • Property svn:eol-style set to native
File size: 1.8 KB
RevLine 
[286]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
[109]4
5#ifndef _HASHTABLE_H_
6#define _HASHTABLE_H_
7
8#include "sstring.h"
9
10class HashEntry
11{
12public:
[793]13        int hash;
14        SString key;
15        void *value;
16        HashEntry *next;
[109]17
[793]18        HashEntry(int h, const SString& k, void *v) :hash(h), key(k), value(v), next(0){}
[109]19};
20
21class HashEntryIterator;
22
23class HashTable
24{
[793]25        friend class HashEntryIterator;
26        HashEntry **tab;
27        int size;
28        int count;
29        int threshold;
30        float load;
31        int sync;
[109]32
[793]33        int hash(const SString &s);
34        void rehash(int newsize);
[109]35public:
36
[793]37        HashTable(int initsize, float lo) { init(initsize, lo); }
38        HashTable(int initsize) { init(initsize, 0.75); }
39        HashTable() { init(); }
40        ~HashTable();
[109]41
[793]42        /** always use init() after clear() ! */
43        void clear();
44        void init(int initsize = 11, float lo = 0.75);
[109]45
[793]46        int getSize() { return count; }
47        void* put(const SString& key, void *value);
48        void* get(const SString& key, int *reallygot = 0);
49        void* remove(const SString& key);
50        /** can be used inside iteration loop:
51                for(HashEntryIterator it(hashtable);it;) hashtable.remove(it);
52                \note iterator is "iterated" to the next entry when the current one is removed (no "it++"!)
53                */
54        void* remove(HashEntryIterator& it);
[109]55
[793]56        void debugprint();
57        void getstats(float *);
[109]58};
59
60/** for(HashEntryIterator it(hashtable);it;it++)
[793]61          {
62          ... it->value
63          ... it->key
64          }
65          */
[109]66class HashEntryIterator
67{
[793]68        void findNext();
69public:
70        const HashTable *ht;
71        int hashindex;
72        HashEntry *entry;
73        int sync;
74        HashEntryIterator(const HashTable&t) :ht(&t), hashindex(0), entry(t.tab[0]), sync(ht->sync)
75        {
76                if (!entry) findNext();
77        }
78        HashEntryIterator() {}
79        void operator++();
80        void operator++(int) { operator++(); }
81        HashEntry* operator->() { return entry; }
82        bool isValid() { return (entry && (sync == ht->sync)) ? 1 : 0; }
[109]83};
84
85
86#endif
Note: See TracBrowser for help on using the repository browser.