source: trunk/lib/symtab/pbgs_div_symbol_table.h @ 1229

Last change on this file since 1229 was 1229, checked in by vla24, 8 years ago

Reorganized SymbolTable? library

File size: 5.5 KB
Line 
1#ifndef PBGS_DIV_SYMBOL_TABLE_H
2#define PBGS_DIV_SYMBOL_TABLE_H
3
4#define DEBUG_PBGS_DIV 0
5
6// Define either one of grouping functions
7//#define USE_LENGTH_SORT       // f(L) = L
8//#define USE_LOG_SORT          // f(L) = ceil (log(L))
9#define USE_DIV_SORT            // f(L) = floor( (L-1)/2^k )
10
11#define TOTAL_GROUPS 5
12#define LAST_GROUP TOTAL_GROUPS-1
13
14#define USE_FUNCTION_TEMPLATES
15#include "stringpool.h"
16#include "bitstream_hash_table.h"
17#include "ls_symbol_table_compare.h"
18#include "ls_symbol_table_util.h"
19
20#if DEBUG_PBGS_DIV
21#include <iostream>
22using namespace std;
23#endif
24
25class PBGSDivSymbolTable
26{
27public:
28    PBGSDivSymbolTable()
29        :m_globalNameCount(1)
30    {};
31
32    template <int L> inline int Lookup_or_Insert_Name(char* name, int hashvalue);
33
34    inline int Lookup_or_Insert_Name(char* name, int hashvalue, int L);
35
36private:
37    StringPool <4096,100> m_pool;
38    BitStreamHashTable m_hashTable[TOTAL_GROUPS];
39
40    inline int getHashTableIndex(int L);
41    int m_globalNameCount;
42};
43
44template <>
45        inline int PBGSDivSymbolTable::Lookup_or_Insert_Name<3>(char* name, int hashvalue)
46{
47    int GID = 0;
48
49    char delim = name[3];
50    name[3] = '\0';
51    int group = getHashTableIndex(3);
52
53    //Lookup
54    GID = m_hashTable[group].Lookup_Name<3>(name, hashvalue);
55    name[3] = delim;
56
57    //Insert
58    if (!GID) //symbol not found
59    {
60        char* c = m_pool.Insert(name, 3, 1);
61        GID = m_globalNameCount;
62
63        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
64        m_globalNameCount++;
65    }
66#if DEBUG_PBGS_DIV
67    int advance = 1;
68    int L = 3;
69    delim = name[L];
70    name[L] = '\0';
71    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << " | advance: " << advance << endl;
72    name[L] = delim;
73#endif
74
75    return GID;
76}
77
78template <>
79        inline int PBGSDivSymbolTable::Lookup_or_Insert_Name<5>(char* name, int hashvalue)
80{
81    int GID = 0;
82
83    char delim = name[5];
84    name[5] = '\0';
85    int group = getHashTableIndex(5);
86
87    //Lookup
88    GID = m_hashTable[group].Lookup_Name<5>(name, hashvalue);
89    name[5] = delim;
90
91    //Insert
92    if (!GID) //symbol not found
93    {
94        char* c = m_pool.Insert(name, 5, 3);
95        GID = m_globalNameCount;
96
97        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
98        m_globalNameCount++;
99    }
100#if DEBUG_PBGS_DIV
101    int advance = 3;
102    int L = 5;
103    delim = name[L];
104    name[L] = '\0';
105    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << " | advance: " << advance << endl;
106    name[L] = delim;
107#endif
108
109    return GID;
110}
111
112template <>
113        inline int PBGSDivSymbolTable::Lookup_or_Insert_Name<6>(char* name, int hashvalue)
114{
115    int GID = 0;
116
117    char delim = name[6];
118    name[6] = '\0';
119    int group = getHashTableIndex(6);
120
121    //Lookup
122    GID = m_hashTable[group].Lookup_Name<6>(name, hashvalue);
123    name[6] = delim;
124
125    //Insert
126    if (!GID) //symbol not found
127    {
128        char* c = m_pool.Insert(name, 6, 2);
129        GID = m_globalNameCount;
130
131        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
132        m_globalNameCount++;
133    }
134#if DEBUG_PBGS_DIV
135    int advance = 2;
136    int L = 6;
137    delim = name[L];
138    name[L] = '\0';
139    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << " | advance: " << advance << endl;
140    name[L] = delim;
141#endif
142
143    return GID;
144}
145
146template <>
147        inline int PBGSDivSymbolTable::Lookup_or_Insert_Name<7>(char* name, int hashvalue)
148{
149    int GID = 0;
150
151    char delim = name[7];
152    name[7] = '\0';
153    int group = getHashTableIndex(7);
154
155    //Lookup
156    GID = m_hashTable[group].Lookup_Name<7>(name, hashvalue);
157    name[7] = delim;
158
159    //Insert
160    if (!GID) //symbol not found
161    {
162        char* c = m_pool.Insert(name, 7, 1);
163        GID = m_globalNameCount;
164
165        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
166        m_globalNameCount++;
167    }
168#if DEBUG_PBGS_DIV
169    int advance = 1;
170    int L = 7;
171    delim = name[L];
172    name[L] = '\0';
173    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << " | advance: " << advance << endl;
174    name[L] = delim;
175#endif
176
177    return GID;
178}
179
180// Use this function for 1,2, 4, 8 <= L <= 32
181template <int L> inline int PBGSDivSymbolTable::Lookup_or_Insert_Name(char* name, int hashvalue)
182{
183    int GID = 0;
184
185    char delim = name[L];
186    name[L] = '\0';
187    int group = getHashTableIndex(L);
188
189    //Lookup
190    GID = m_hashTable[group].Lookup_Name<L>(name, hashvalue);
191    name[L] = delim;
192
193    //Insert
194    if (!GID) //symbol not found
195    {
196        char* c = m_pool.Insert(name, L);
197        GID = m_globalNameCount;
198
199        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
200        m_globalNameCount++;
201    }
202#if DEBUG_PBGS_DIV
203    delim = name[L];
204    name[L] = '\0';
205    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << endl;
206    name[L] = delim;
207#endif
208
209    return GID;
210}
211
212// Use this function for L > 32
213inline int PBGSDivSymbolTable::Lookup_or_Insert_Name(char* name, int hashvalue, int L)
214{
215    int GID = 0;
216
217    char delim = name[L];
218    name[L] = '\0';
219
220#if DEBUG_PBGS_DIV
221    cout << "Lookup or Insert: " << name << endl;
222#endif
223    int group = getHashTableIndex(L);
224
225    //Lookup
226    GID = m_hashTable[group].Lookup_Name(name, hashvalue,L);
227
228    name[L] = delim;
229
230    //Insert
231    if (!GID) //symbol not found
232    {
233        char* c = m_pool.Insert(name, L);
234        GID = m_globalNameCount;
235
236        m_hashTable[group].Insert_Name(c, hashvalue, m_globalNameCount);
237        m_globalNameCount++;
238    }
239    return GID;
240}
241
242inline int PBGSDivSymbolTable::getHashTableIndex(int L)
243{
244    if (L > 16)
245        return LAST_GROUP;
246    else
247        return L/4;
248}
249#endif // PBGS_DIV_SYMBOL_TABLE_H
250
251
Note: See TracBrowser for help on using the repository browser.