source: trunk/lib/symtab/pbgs_log_symbol_table.h @ 1278

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

refactored some code

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