This repository was archived by the owner on Feb 18, 2025. It is now read-only.
File tree 2 files changed +48
-0
lines changed
2 files changed +48
-0
lines changed Original file line number Diff line number Diff line change @@ -910,6 +910,38 @@ impl[K: Hash + Identity + Equals] HashSet[K] {
910
910
false
911
911
}
912
912
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
+
913
945
@pub fun remove(key: K): Option[K] {
914
946
self.shrink();
915
947
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments