3
3
#include < map>
4
4
#include < vector>
5
5
6
+ enum
7
+ {
8
+ NHASH = 4098 ,
9
+ };
10
+
11
+ std::hash<std::string> hasher;
12
+
6
13
class Suffixes
7
14
{
8
15
private:
@@ -40,35 +47,74 @@ class Suffixes
40
47
}
41
48
};
42
49
43
- typedef std::deque<std::string> Prefix;
44
- std::hash<std::string> hasher;
45
-
46
- // todo: make instance methods of Prefix
47
- int hash_prefix (Prefix p)
50
+ class Prefix
48
51
{
49
- unsigned int h = 0 ;
52
+ public:
53
+ std::string values[2 ];
54
+ int _size;
50
55
51
- for ( int i = 0 ; i < p. size (); i++ )
56
+ int size ()
52
57
{
53
- h += hasher (p.at (i));
58
+ return _size;
59
+ }
60
+ std::string at (int index)
61
+ {
62
+ return values[index];
63
+ }
64
+ void push_back (std::string val)
65
+ {
66
+ values[_size++] = val;
67
+ }
68
+ void pop_front ()
69
+ {
70
+ if (_size == 2 )
71
+ {
72
+ values[0 ] = values[1 ];
73
+ values[1 ] = std::string ();
74
+ }
75
+ else if (_size == 1 )
76
+ {
77
+ values[0 ] = std::string ();
78
+ }
79
+ else if (_size == 0 )
80
+ {
81
+ return ;
82
+ }
83
+ _size--;
54
84
}
55
85
56
- return h % 4098 ;
57
- }
86
+ int hash ()
87
+ {
88
+ unsigned int h = 0 ;
58
89
59
- bool prefix_equals (Prefix first, Prefix second )
60
- {
61
- if (first. size () != second. size ())
62
- return false ;
90
+ for ( int i = 0 ; i < size (); i++ )
91
+ {
92
+ h += hasher ( at (i));
93
+ }
63
94
64
- for (int i = 0 ; i < first.size (); i++)
95
+ return h % NHASH;
96
+ }
97
+
98
+ bool operator ==(Prefix other)
65
99
{
66
- if (first. at (i). compare (second. at (i)) != 0 )
100
+ if (size () != other. size () )
67
101
return false ;
102
+
103
+ for (int i = 0 ; i < size (); i++)
104
+ if (at (i).compare (other.at (i)) != 0 )
105
+ return false ;
106
+
107
+ return true ;
68
108
}
69
109
70
- return true ;
71
- }
110
+ Prefix ()
111
+ {
112
+ _size = 0 ;
113
+ values[0 ] = std::string ();
114
+ values[1 ] = std::string ();
115
+ }
116
+ };
117
+
72
118
class StateMap
73
119
{
74
120
private:
@@ -81,15 +127,14 @@ class StateMap
81
127
};
82
128
83
129
public:
84
- std::map<Prefix, Suffixes> _map;
85
- StateMapEntry *entries[4098 ];
130
+ StateMapEntry *entries[NHASH];
86
131
87
132
Suffixes *operator [](Prefix p)
88
133
{
89
- int hash = hash_prefix (p );
134
+ int hash = p. hash ( );
90
135
for (StateMapEntry *e = entries[hash]; e != NULL ; e = e->next )
91
136
{
92
- if (prefix_equals (p, *e->prefix ) )
137
+ if (p == *e->prefix )
93
138
{
94
139
return e->suffixes ;
95
140
}
0 commit comments