Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00019 namespace kNet
00020 {
00021
00022 template<typename T, typename HashFunc>
00023 class OrderedHashTable
00024 {
00025 public:
00026 struct Node
00027 {
00028 Node()
00029 :next(0), prev(0), hashChain(0), used(false)
00030 {
00031 }
00032
00033 T value;
00034 bool used;
00035 Node *next;
00036 Node *prev;
00037 Node *hashChain;
00038 };
00039
00040 explicit OrderedHashTable(size_t numElems)
00041 :root(0), numElemsMask(numElems-1), size(0)
00042 {
00043 data = new Node[numElems];
00044 root = 0;
00045 }
00046 ~OrderedHashTable()
00047 {
00048 delete[] data;
00049 }
00050
00051 size_t Size() const { return size; }
00052
00053 void Insert(const T &value)
00054 {
00055 int idx = HashFunc::Hash(value, numElemsMask);
00056 data[idx].value = value;
00057 if (root)
00058 {
00059 root->prev = &data[idx];
00060 data[idx].next = root;
00061 }
00062 else
00063 data[idx].next = 0;
00064 data[idx].prev = 0;
00065 data[idx].used = true;
00066 data[idx].hashChain = 0;
00067 root = &data[idx];
00068 ++size;
00069 }
00070
00071 void Clear()
00072 {
00073 while(size > 0)
00074 Remove(First());
00075 }
00076
00077 void PopFront()
00078 {
00079 Remove(First());
00080 }
00081
00082 template<typename KeyType>
00083 Node *Find(const KeyType &key)
00084 {
00085 int idx = HashFunc::Hash(key, numElemsMask);
00086 if (data[idx].used)
00087 return &data[idx];
00088 else
00089 return 0;
00090 }
00091
00092 template<typename KeyType>
00093 void Remove(const KeyType &key)
00094 {
00095 int idx = HashFunc::Hash(key, numElemsMask);
00096 assert(data[idx].used);
00097 Remove(&data[idx]);
00098 }
00099
00100 void Remove(Node *node)
00101 {
00102 assert(node);
00103 assert(node->used);
00104
00105 if (node == root)
00106 root = node->next;
00107
00108 node->used = false;
00109 if (node->prev)
00110 node->prev->next = node->next;
00111 if (node->next)
00112 node->next->prev = node->prev;
00113 --size;
00114 }
00115
00116 T *Front() { return root ? &root->value : 0; }
00117
00118 Node *First()
00119 {
00120 return root;
00121 }
00122
00123 Node *Next(Node *node)
00124 {
00125 return node->next;
00126 }
00127
00128 private:
00129 Node *root;
00130
00131 Node *data;
00132 size_t numElemsMask;
00133 size_t size;
00134
00135 };
00136
00137 }