Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit 5501dfc

Browse files
committed
stdlib: add HashSet#get, add tests
1 parent a66295f commit 5501dfc

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

dora/stdlib/collections.dora

+32
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,38 @@ impl[K: Hash + Identity + Equals] HashSet[K] {
910910
false
911911
}
912912

913+
@pub fun get(key: K): Option[K] {
914+
assert(self.entries <= self.cap);
915+
916+
if self.entries == 0 {
917+
return Option[K]::None;
918+
}
919+
920+
var hash = key.hash();
921+
var idx = hash.toInt64() & (self.cap - 1);
922+
923+
while true {
924+
if self
925+
... .isLive(idx) {
926+
let currentKey = self.keys.get(idx);
927+
928+
if currentKey.hash() == hash && (currentKey.identicalTo(key) || currentKey.equals(key)) {
929+
return Option[K]::Some(currentKey);
930+
}
931+
idx = (idx + 1) & (self.cap - 1);
932+
}
933+
... .isDeleted(idx) {
934+
// There might be live entries after a deleted one.
935+
idx = (idx + 1) & (self.cap - 1);
936+
}
937+
else {
938+
return Option[K]::None;
939+
}
940+
}
941+
942+
Option[K]::None
943+
}
944+
913945
@pub fun remove(key: K): Option[K] {
914946
self.shrink();
915947

tests/stdlib/hashset-get.dora

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
fun main(): Unit {
2+
let set = std::HashSet[Float64]::new(0.0, Float64::notANumber(), Float64::infinityPositive());
3+
4+
assert(set.size() == 3);
5+
assert(set.get(0.0).getOrPanic() === 0.0);
6+
assert(set.get(-0.0).getOrPanic() === 0.0);
7+
8+
set.insert(-0.0);
9+
10+
assert(set.size() == 3);
11+
assert(set.get(0.0).getOrPanic() === -0.0);
12+
assert(set.get(-0.0).getOrPanic() === -0.0);
13+
14+
assert(set.get(Float64::notANumber()).getOrPanic() === Float64::notANumber());
15+
assert(set.get(Float64::infinityPositive()).getOrPanic() === Float64::infinityPositive());
16+
}

0 commit comments

Comments
 (0)