diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-10-16 11:26:44 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-10-16 11:27:12 +0200 |
commit | 9c1aa9dd8ea6bd7e9f7ded3c4b7218877d942f93 (patch) | |
tree | b82f6075c4402ff098042ae1c43b167954775eaf | |
parent | b9f1c356f417f628b17dbb75ec3c98786ec31e81 (diff) |
Add adapter that does not preallocate
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/hashmap.rs | 38 |
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 { |