source: trunk/lib/symtab/pbgs_log_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: 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#ifdef USE_MASK_COMPARE
141        char* c = m_pool.Insert(name, length, 4-length);
142        m_hashTable[2].Insert_Name(c, hashvalue, m_globalNameCount);
143#else
144        char* c = m_pool.Insert(name, length);
145        m_hashTable[2].Insert_Name(c, hashvalue, m_globalNameCount, length);
146#endif
147        m_globalNameCount++;
148    }
149#if DEBUG_PBGS_LOG
150    int group = 2;
151    int L = length;
152    delim = name[L];
153    name[L] = '\0';
154    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << endl;
155    name[L] = delim;
156#endif
157
158    return GID;
159}
160
161inline int PBGSLogSymbolTable::Lookup_or_Insert_Name_8(char* name, int hashvalue, int length)
162{
163    int GID = 0;
164
165    //Lookup
166    GID = m_hashTable[3].Lookup_Name_8(name, hashvalue, length);
167
168    //Insert
169    if (!GID) //symbol not found
170    {
171        GID = m_globalNameCount;
172        char* c = m_pool.Insert(name, length);
173        m_hashTable[3].Insert_Name(c, hashvalue, m_globalNameCount, length);
174        m_globalNameCount++;
175    }
176#if DEBUG_PBGS_LOG
177    int group = 3;
178    int L = length;
179    delim = name[L];
180    name[L] = '\0';
181    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << endl;
182    name[L] = delim;
183#endif
184
185    return GID;
186}
187
188inline int PBGSLogSymbolTable::Lookup_or_Insert_Name_16(char* name, int hashvalue, int length)
189{
190    int GID = 0;
191
192    //Lookup
193    GID = m_hashTable[4].Lookup_Name_16(name, hashvalue, length);
194
195    //Insert
196    if (!GID) //symbol not found
197    {
198        char* c = m_pool.Insert(name, length);
199        GID = m_globalNameCount;
200
201        m_hashTable[4].Insert_Name(c, hashvalue, m_globalNameCount, length);
202        m_globalNameCount++;
203    }
204#if DEBUG_PBGS_LOG
205    int group = 4;
206    int L = length;
207    delim = name[L];
208    name[L] = '\0';
209    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | group: " << group << endl;
210    name[L] = delim;
211#endif
212
213    return GID;
214}
215
216// Use this function for 17 <= L <= 32
217inline int PBGSLogSymbolTable::Lookup_or_Insert_Name_32(char* name, int hashvalue, int L)
218{
219    int GID = 0;
220
221    //Lookup
222    GID = m_hashTable[LAST_GROUP].Lookup_Name_32(name, hashvalue, L);
223
224    //Insert
225    if (!GID) //symbol not found
226    {
227        char* c = m_pool.Insert(name, L);
228        GID = m_globalNameCount;
229
230        m_hashTable[LAST_GROUP].Insert_Name(c, hashvalue, m_globalNameCount, L);
231        m_globalNameCount++;
232    }
233#if DEBUG_PBGS
234    delim = name[L];
235    name[L] = '\0';
236    cout << "Lookup or Insert: " << name << " | lgth: " << L << " | bucket: " << LAST_BUCKET << endl;
237    name[L] = delim;
238#endif
239
240    return GID;
241}
242
243// Use this function for L > 32
244inline int PBGSLogSymbolTable::Lookup_or_Insert_Name(char* name, int hashvalue, int L)
245{
246    int GID = 0;
247
248#if DEBUG_PBGS_LOG
249    cout << "Lookup or Insert: " << name << endl;
250#endif
251
252    //Lookup
253    GID = m_hashTable[LAST_GROUP].Lookup_Name(name, hashvalue,L);
254
255    //Insert
256    if (!GID) //symbol not found
257    {
258        char* c = m_pool.Insert(name, L);
259        GID = m_globalNameCount;
260
261        m_hashTable[LAST_GROUP].Insert_Name(c, hashvalue, m_globalNameCount);
262        m_globalNameCount++;
263    }
264    return GID;
265}
266
267void PBGSLogSymbolTable::Print_Symbol_Table_Distribution()
268{
269    for (int i = 0; i < TOTAL_GROUPS; i++)
270    {
271        fprintf (stderr, "Group #%i\n", i );
272        m_hashTable[i].Print_Symbol_Table_Distribution();
273    }
274}
275#endif // PBLS_SYMBOL_TABLE_H
Note: See TracBrowser for help on using the repository browser.