Skip to content

Commit 871beb5

Browse files
committed
add keys() and values() function to hashmap; add \` to surroundingPairs in language-configuration.json
1 parent cae7205 commit 871beb5

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

editors/vscode/language-configuration.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
["[", "]"],
2222
["(", ")"],
2323
["\"", "\""],
24-
["'", "'"]
24+
["'", "'"],
25+
["`", "`"],
2526
]
2627
}

examples/std/map.csp

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ fn main(): i32 {
1010
hashmap_put!(map, 2, 12); # put value 12 for key 2
1111
io::printf("%i\n", hashmap_get!(map, 1)); # get value with key 1
1212

13+
let keys = hashmap_keys!(map);
14+
for let i = 0; i < vec::size(keys); i++; {
15+
io::printf("%i ", keys[i]);
16+
}
17+
io::newline();
18+
1319
hashmap_free!(map); # free memory
1420
}
1521

src/std/hashmap.csp

+36-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import "memory.csp";
22
import "algorithm.csp";
3+
import "vec.csp";
34

45
macro hashmap(key_type, val_type) {
56
(struct {
@@ -61,10 +62,22 @@ macro hashmap_get(map, _key) {
6162
)
6263
}
6364

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+
6473
macro hashmap_size_mod(map, val) {
6574
((val) & ((map).data.alloc / ((map).data.ksize + (map).data.vsize) - 1))
6675
}
6776

77+
macro hashmap_num_allocated(map) {
78+
((map).data.alloc / ((map).data.ksize + (map).data.vsize))
79+
}
80+
6881
namespace std {
6982
namespace hashmap {
7083
type Data: struct {
@@ -146,7 +159,7 @@ namespace std {
146159
let index = calc_index(map, key);
147160

148161
# linear probing
149-
for 0..(map.data.alloc / map.data.ksize + (map).data.vsize) {
162+
for 0..hashmap_num_allocated!(map) {
150163
let pair = &map.pairs[index * (map.data.ksize + map.data.vsize)];
151164

152165
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 {
177190
fn get(map: &Template, key: &u8): &u8 {
178191
<- find_pair(map, key, false) |> if $ == nil => $ else $ + (map.data.ksize: u64);
179192
}
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+
}
180215
}
181216
}

src/std/io.csp

+3
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ namespace std {
188188
<- c;
189189
}
190190

191+
fn newline()
192+
syscall::write(stdout, "\n", 1);
193+
191194
fn close(fd: i32)
192195
{
193196
syscall::close(fd); # error handling

0 commit comments

Comments
 (0)