1
1
import "memory.csp";
2
2
import "algorithm.csp";
3
+ import "vec.csp";
3
4
4
5
macro hashmap(key_type, val_type) {
5
6
(struct {
@@ -61,10 +62,22 @@ macro hashmap_get(map, _key) {
61
62
)
62
63
}
63
64
65
+ macro hashmap_keys(map) {
66
+ (::std::hashmap::keys((map)): &typeof (map).pairs.key)
67
+ }
68
+
69
+ macro hashmap_values(map) {
70
+ (::std::hashmap::values((map)): &typeof (map).pairs.val)
71
+ }
72
+
64
73
macro hashmap_size_mod(map, val) {
65
74
((val) & ((map).data.alloc / ((map).data.ksize + (map).data.vsize) - 1))
66
75
}
67
76
77
+ macro hashmap_num_allocated(map) {
78
+ ((map).data.alloc / ((map).data.ksize + (map).data.vsize))
79
+ }
80
+
68
81
namespace std {
69
82
namespace hashmap {
70
83
type Data: struct {
@@ -146,7 +159,7 @@ namespace std {
146
159
let index = calc_index(map, key);
147
160
148
161
# linear probing
149
- for 0..(map.data.alloc / map.data.ksize + (map).data.vsize ) {
162
+ for 0..hashmap_num_allocated! (map) {
150
163
let pair = &map.pairs[index * (map.data.ksize + map.data.vsize)];
151
164
152
165
if memory::eq(key, pair, map.data.ksize) || (map.data.use_str_hashing && string::equal(*(key: &&const char), *(pair: &&const char)))
@@ -177,5 +190,27 @@ namespace std {
177
190
fn get(map: &Template, key: &u8): &u8 {
178
191
<- find_pair(map, key, false) |> if $ == nil => $ else $ + (map.data.ksize: u64);
179
192
}
193
+
194
+ fn keys(map: &Template): &u8 {
195
+ let v = vec!{u8};
196
+
197
+ for let i: u64 = 0; i < map.data.alloc; i += (map.data.ksize + map.data.vsize); {
198
+ if !memory::is_zero(&map.pairs[i], map.data.ksize)
199
+ memory::copy(vec::__internal_add(&v, map.data.ksize), &map.pairs[i], map.data.ksize);
200
+ }
201
+
202
+ <- v;
203
+ }
204
+
205
+ fn values(map: &Template): &u8 {
206
+ let v = vec!{u8};
207
+
208
+ for let i: u64 = 0; i < map.data.alloc; i += (map.data.ksize + map.data.vsize); {
209
+ if !memory::is_zero(&map.pairs[i], map.data.ksize)
210
+ memory::copy(vec::__internal_add(&v, map.data.vsize), &map.pairs[i] + map.data.ksize, map.data.vsize);
211
+ }
212
+
213
+ <- v;
214
+ }
180
215
}
181
216
}
0 commit comments