@@ -53,10 +53,9 @@ fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
53
53
* will fail.
54
54
*/
55
55
56
- fn insert_common [ @K ,
57
- @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
58
- bkts : & [ mutable bucket[ K , V ] ] , nbkts : uint ,
59
- key : & K , val : & V ) -> bool {
56
+ fn insert_common [ @K , @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
57
+ bkts : & [ mutable bucket[ K , V ] ] , nbkts : uint ,
58
+ key : & K , val : & V ) -> bool {
60
59
let i: uint = 0 u;
61
60
let h: uint = hasher ( key) ;
62
61
while i < nbkts {
@@ -67,93 +66,88 @@ fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
67
66
68
67
let k_ = k;
69
68
if eqer ( key, k_) {
70
- bkts. ( j) = some[ K , V ] ( k_, val) ;
69
+ bkts. ( j) = some ( k_, val) ;
71
70
ret false;
72
71
}
73
72
i += 1 u;
74
73
}
75
- _ { bkts. ( j) = some[ K , V ] ( key, val) ; ret true; }
74
+ _ { bkts. ( j) = some ( key, val) ; ret true; }
76
75
}
77
76
}
78
77
fail; // full table
79
-
80
78
}
81
- fn find_common [ @K ,
82
- @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
83
- bkts : & [ mutable bucket[ K , V ] ] , nbkts : uint , key : & K )
84
- -> option:: t [ V ] {
79
+ fn find_common [ @K , @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
80
+ bkts : & [ mutable bucket[ K , V ] ] , nbkts : uint ,
81
+ key : & K ) -> option:: t [ V ] {
85
82
let i: uint = 0 u;
86
83
let h: uint = hasher ( key) ;
87
84
while i < nbkts {
88
85
let j: uint = hash ( h, nbkts, i) ;
89
86
alt bkts. ( j) {
90
87
some ( k, v) {
91
88
// Copy to please alias analysis.
92
-
93
89
let k_ = k;
94
90
let v_ = v;
95
- if eqer ( key, k_) { ret option:: some[ V ] ( v_) ; }
91
+ if eqer ( key, k_) { ret option:: some ( v_) ; }
96
92
}
97
- nil. { ret option :: none[ V ] ; }
98
- deleted[ K , V ] . { }
93
+ nil. { ret option :: none; }
94
+ deleted. { }
99
95
}
100
96
i += 1 u;
101
97
}
102
- ret option:: none[ V ] ;
98
+ ret option:: none;
103
99
}
104
- fn rehash [ @K ,
105
- @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
106
- oldbkts : & [ mutable bucket[ K , V ] ] , noldbkts : uint ,
107
- newbkts : & [ mutable bucket[ K , V ] ] , nnewbkts : uint ) {
100
+ fn rehash [ @K , @V ] ( hasher : & hashfn[ K ] , eqer : & eqfn[ K ] ,
101
+ oldbkts : & [ mutable bucket[ K , V ] ] , noldbkts : uint ,
102
+ newbkts : & [ mutable bucket[ K , V ] ] , nnewbkts : uint ) {
108
103
for b: bucket[ K , V ] in oldbkts {
109
104
alt b {
110
105
some( k_, v_) {
111
106
let k = k_;
112
107
let v = v_;
113
- insert_common[ K , V ] ( hasher, eqer, newbkts, nnewbkts, k, v) ;
108
+ insert_common ( hasher, eqer, newbkts, nnewbkts, k, v) ;
114
109
}
115
110
_ { }
116
111
}
117
112
}
118
113
}
119
- obj hashmap[ @K ,
120
- @V ] ( hasher: hashfn[ K ] ,
121
- eqer: eqfn[ K ] ,
122
- mutable bkts: [ mutable bucket[ K , V ] ] ,
123
- mutable nbkts: uint,
124
- mutable nelts: uint,
125
- lf: util:: rational) {
114
+ obj hashmap[ @K , @V ] ( hasher: hashfn[ K ] ,
115
+ eqer: eqfn[ K ] ,
116
+ mutable bkts: [ mutable bucket[ K , V ] ] ,
117
+ mutable nbkts: uint,
118
+ mutable nelts: uint,
119
+ lf: util:: rational) {
126
120
fn size ( ) -> uint { ret nelts; }
127
121
fn insert ( key : & K , val : & V ) -> bool {
128
122
let load: util:: rational =
129
123
{ num: nelts + 1 u as int , den: nbkts as int } ;
130
124
if !util:: rational_leq ( load, lf) {
131
125
let nnewbkts: uint = uint:: next_power_of_two ( nbkts + 1 u) ;
132
- let newbkts = make_buckets[ K , V ] ( nnewbkts) ;
133
- rehash[ K , V ] ( hasher, eqer, bkts, nbkts, newbkts, nnewbkts) ;
126
+ let newbkts = make_buckets ( nnewbkts) ;
127
+ rehash ( hasher, eqer, bkts, nbkts, newbkts, nnewbkts) ;
134
128
bkts = newbkts;
135
129
nbkts = nnewbkts;
136
130
}
137
- if insert_common[ K , V ] ( hasher, eqer, bkts, nbkts, key, val) {
131
+ if insert_common ( hasher, eqer, bkts, nbkts, key, val) {
138
132
nelts += 1 u;
139
133
ret true;
140
134
}
141
135
ret false;
142
136
}
143
137
fn contains_key ( key : & K ) -> bool {
144
- ret alt find_common[ K , V ] ( hasher, eqer, bkts, nbkts, key) {
138
+ ret alt find_common ( hasher, eqer, bkts, nbkts, key) {
145
139
option:: some ( _) { true }
146
140
_ { false }
147
141
} ;
148
142
}
149
143
fn get ( key : & K ) -> V {
150
- ret alt find_common[ K , V ] ( hasher, eqer, bkts, nbkts, key) {
144
+ ret alt find_common ( hasher, eqer, bkts, nbkts, key) {
151
145
option:: some ( val) { val }
152
146
_ { fail }
153
147
} ;
154
148
}
155
149
fn find ( key : & K ) -> option:: t [ V ] {
156
- be find_common[ K , V ] ( hasher, eqer, bkts, nbkts, key) ;
150
+ be find_common ( hasher, eqer, bkts, nbkts, key) ;
157
151
}
158
152
fn remove ( key : & K ) -> option:: t [ V ] {
159
153
let i: uint = 0 u;
@@ -165,21 +159,21 @@ fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
165
159
let k_ = k;
166
160
let vo = option:: some ( v) ;
167
161
if eqer ( key, k_) {
168
- bkts. ( j) = deleted[ K , V ] ;
162
+ bkts. ( j) = deleted;
169
163
nelts -= 1 u;
170
164
ret vo;
171
165
}
172
166
}
173
167
deleted. { }
174
- nil . { ret option :: none[ V ] ; }
168
+ nil . { ret option :: none; }
175
169
}
176
170
i += 1 u;
177
171
}
178
- ret option:: none[ V ] ;
172
+ ret option:: none;
179
173
}
180
174
fn rehash ( ) {
181
- let newbkts = make_buckets[ K , V ] ( nbkts) ;
182
- rehash[ K , V ] ( hasher, eqer, bkts, nbkts, newbkts, nbkts) ;
175
+ let newbkts = make_buckets ( nbkts) ;
176
+ rehash ( hasher, eqer, bkts, nbkts, newbkts, nbkts) ;
183
177
bkts = newbkts;
184
178
}
185
179
iter items( ) -> @{ key: K , val: V } {
@@ -193,8 +187,8 @@ fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
193
187
}
194
188
}
195
189
}
196
- let bkts = make_buckets[ K , V ] ( initial_capacity) ;
197
- ret hashmap[ K , V ] ( hasher, eqer, bkts, initial_capacity, 0 u, load_factor) ;
190
+ let bkts = make_buckets ( initial_capacity) ;
191
+ ret hashmap( hasher, eqer, bkts, initial_capacity, 0 u, load_factor) ;
198
192
}
199
193
200
194
// Hash map constructors for basic types
@@ -206,13 +200,13 @@ fn new_str_hash[@V]() -> hashmap[str, V] {
206
200
fn new_int_hash [ @V ] ( ) -> hashmap [ int, V ] {
207
201
fn hash_int ( x : & int ) -> uint { ret x as uint ; }
208
202
fn eq_int ( a : & int , b : & int ) -> bool { ret a == b; }
209
- ret mk_hashmap[ int , V ] ( hash_int, eq_int) ;
203
+ ret mk_hashmap( hash_int, eq_int) ;
210
204
}
211
205
212
206
fn new_uint_hash [ @V ] ( ) -> hashmap [ uint, V ] {
213
207
fn hash_uint ( x : & uint ) -> uint { ret x; }
214
208
fn eq_uint ( a : & uint , b : & uint ) -> bool { ret a == b; }
215
- ret mk_hashmap[ uint , V ] ( hash_uint, eq_uint) ;
209
+ ret mk_hashmap( hash_uint, eq_uint) ;
216
210
}
217
211
218
212
// Local Variables:
0 commit comments