summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-10-16 11:26:44 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-10-16 11:27:12 +0200
commit9c1aa9dd8ea6bd7e9f7ded3c4b7218877d942f93 (patch)
treeb82f6075c4402ff098042ae1c43b167954775eaf
parentb9f1c356f417f628b17dbb75ec3c98786ec31e81 (diff)
Add adapter that does not preallocate
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/hashmap.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/hashmap.rs b/src/hashmap.rs
index dd95b34..60bc88a 100644
--- a/src/hashmap.rs
+++ b/src/hashmap.rs
@@ -77,6 +77,44 @@ impl<K, V> FromIterator<(K, V)> for CollectOnceHashMap<K, V, std::collections::h
}
}
+/// See `CollectOnceHashMap`
+pub struct CollectOnceHashMapNoPrealloc<K, V, S = std::collections::hash_map::RandomState>
+ where K: Eq + Hash + Debug
+{
+ inner: std::result::Result<HashMap<K, V, S>, Error<K>>
+}
+
+impl<K, V, S> From<CollectOnceHashMapNoPrealloc<K, V, S>> for CollectOnceHashMap<K, V, S>
+ where K: Eq + Hash + Debug
+{
+ fn from(cohm: CollectOnceHashMapNoPrealloc<K, V, S>) -> Self {
+ CollectOnceHashMap { inner: cohm.inner }
+ }
+}
+
+impl<K, V> FromIterator<(K, V)> for CollectOnceHashMapNoPrealloc<K, V, std::collections::hash_map::RandomState>
+ where K: Eq + Hash + Debug
+{
+ fn from_iter<T>(iter: T) -> Self
+ where T: IntoIterator<Item = (K, V)>
+ {
+ let mut hm = HashMap::new();
+ for (element_key, element_value) in iter.into_iter() {
+ if hm.contains_key(&element_key) {
+ return CollectOnceHashMapNoPrealloc {
+ inner: Err(Error::DuplicatedKey(element_key))
+ }
+ } else {
+ hm.insert(element_key, element_value);
+ }
+ }
+
+ CollectOnceHashMapNoPrealloc {
+ inner: Ok(hm)
+ }
+ }
+}
+
#[cfg(test)]
mod tests {