- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
struct HashArrayMap {
struct Node
{
Key k;
Value v;
Node(const Key &key, const Value &value) :
k(key), v(value){}
Node(const Key &key) :
k(key), v(){}
};
constexpr static size_t TblSize = 1U << TblPower;
GrowArray<Node> table[TblSize];
HashArrayMap() {
}
~HashArrayMap() {
}
size_t HashFunc(const Key &key) const
{
/// TODO: string hash?
// handle hash: handle pointers usually aligned
return (((size_t) key) >> 8) & (TblSize - 1);
}
// just in case: check existance or constant access
Value *GetPtr(const Key &key) const
{
size_t hashValue = HashFunc(key);
const GrowArray<Node> &entry = table[hashValue];
for(int i = 0; i < entry.count; i++)
{
if(entry[i].k == key)
return &entry[i].v;
}
return nullptr;
}
Value &operator [] (const Key &key)
{
return GetOrAllocate(key);
}
#define HASHFIND(key) \
GrowArray<Node> &entry = table[HashFunc(key)]; \
int i; \
for(i = 0; i < entry.count; i++) \
if( entry[i].k == key ) \
break;
Value& GetOrAllocate(const Key &key)
{
HASHFIND(key);
if(i == entry.count )
entry.Add(Node(key));
return entry[i].v;
}
bool Remove(const Key &key)
{
HASHFIND(key);
if(i != entry.count)
{
entry.RemoveAt(i);
return true;
}
return false;
}
#undef HASHFIND
};
Комментарии (0) RSS
Добавить комментарий