summaryrefslogtreecommitdiff
path: root/libstd/htab.myr
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2013-10-18 17:17:52 -0400
committerOri Bernstein <ori@eigenstate.org>2013-10-18 17:17:52 -0400
commit6380f0c2b7a4c6e950c5fbced2fd24749850bea5 (patch)
tree70b4dbdb1e4243a8ce2115dfd70d5c6f681afe03 /libstd/htab.myr
parentfb8e2abee34bebf7f8d1d0b2754894b838414bee (diff)
downloadmc-6380f0c2b7a4c6e950c5fbced2fd24749850bea5.tar.gz
Add htkeys() function
Diffstat (limited to 'libstd/htab.myr')
-rw-r--r--libstd/htab.myr25
1 files changed, 23 insertions, 2 deletions
diff --git a/libstd/htab.myr b/libstd/htab.myr
index 6fbd8a1..9c7fe46 100644
--- a/libstd/htab.myr
+++ b/libstd/htab.myr
@@ -18,6 +18,7 @@ pkg std =
generic htfree : (ht : htab(@k, @v)# -> void)
generic htput : (ht : htab(@k, @v)#, k : @k, v : @v -> void)
generic htget : (ht : htab(@k, @v)#, k : @k -> option(@v))
+ generic htkeys : (ht : htab(@k, @v)# -> @k[:])
;;
const Initsz = 32
@@ -138,8 +139,13 @@ generic htput = {ht, k, v
generic htdel = {ht, k
match idx(ht, k)
- `Some i: ht.dead[i] = true;;
- _: /* do nothing */;;
+ `Some i:
+ ht.dead[i] = true
+ ht.nelt--
+ ;;
+ _:
+ /* do nothing */
+ ;;
;;
}
@@ -156,3 +162,18 @@ generic hthas = {ht, k
`None: -> false;;
;;
}
+
+generic htkeys = {ht
+ var keys
+ var i
+ var j
+
+ keys = slalloc(ht.nelt)
+ for i = 0; i < ht.keys.len; i++
+ if ht.hashes[i] != 0 && !ht.dead[i]
+ keys[j++] = ht.keys[i]
+ ;;
+ ;;
+ -> keys
+}
+