source: trunk/lib/symtab/pbgs_identity_symbol_table.h @ 1391

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

Symbol Table: Refactored code. Split HashTable? implementation into 3 classes according to grouping strategies.

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