summaryrefslogtreecommitdiff
path: root/cli/util/collections.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/util/collections.rs')
-rw-r--r--cli/util/collections.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/cli/util/collections.rs b/cli/util/collections.rs
new file mode 100644
index 000000000..21f73024b
--- /dev/null
+++ b/cli/util/collections.rs
@@ -0,0 +1,38 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+use std::marker::PhantomData;
+
+pub struct CheckedSet<T: std::hash::Hash + ?Sized> {
+ _kind: PhantomData<T>,
+ checked: std::collections::HashSet<u64>,
+}
+
+impl<T: std::hash::Hash + ?Sized> Default for CheckedSet<T> {
+ fn default() -> Self {
+ Self {
+ _kind: Default::default(),
+ checked: Default::default(),
+ }
+ }
+}
+
+impl<T: std::hash::Hash + ?Sized> CheckedSet<T> {
+ pub fn with_capacity(capacity: usize) -> Self {
+ Self {
+ _kind: PhantomData,
+ checked: std::collections::HashSet::with_capacity(capacity),
+ }
+ }
+
+ pub fn insert(&mut self, value: &T) -> bool {
+ self.checked.insert(self.get_hash(value))
+ }
+
+ fn get_hash(&self, value: &T) -> u64 {
+ use std::collections::hash_map::DefaultHasher;
+ use std::hash::Hasher;
+ let mut hasher = DefaultHasher::new();
+ value.hash(&mut hasher);
+ hasher.finish()
+ }
+}