summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/hashmap.rs40
1 files changed, 16 insertions, 24 deletions
diff --git a/src/hashmap.rs b/src/hashmap.rs
index 60bc88a..407eefe 100644
--- a/src/hashmap.rs
+++ b/src/hashmap.rs
@@ -59,20 +59,8 @@ impl<K, V> FromIterator<(K, V)> for CollectOnceHashMap<K, V, std::collections::h
}
};
- let mut hm = HashMap::with_capacity(iter_size);
-
- for (element_key, element_value) in iter.into_iter() {
- if hm.contains_key(&element_key) {
- return CollectOnceHashMap {
- inner: Err(Error::DuplicatedKey(element_key))
- }
- } else {
- hm.insert(element_key, element_value);
- }
- }
-
CollectOnceHashMap {
- inner: Ok(hm)
+ inner: collect_into_hm(HashMap::with_capacity(iter_size), iter)
}
}
}
@@ -98,21 +86,25 @@ impl<K, V> FromIterator<(K, V)> for CollectOnceHashMapNoPrealloc<K, V, std::coll
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: collect_into_hm(HashMap::new(), iter)
}
+ }
+}
- CollectOnceHashMapNoPrealloc {
- inner: Ok(hm)
+fn collect_into_hm<K, V, T>(mut hm: HashMap<K, V>, iter: T) -> std::result::Result<HashMap<K, V>, Error<K>>
+ where K: Eq + Hash + Debug,
+ T: IntoIterator<Item = (K, V)>
+{
+ for (element_key, element_value) in iter.into_iter() {
+ if hm.contains_key(&element_key) {
+ return Err(Error::DuplicatedKey(element_key))
+ } else {
+ hm.insert(element_key, element_value);
}
}
+
+ Ok(hm)
}