Skip to main content

orx_parallel/extendable/par_extend_impl/
hash_map.rs

1use crate::extendable::par_extend_core::ParExtendCore;
2use alloc::vec::Vec;
3use core::hash::Hash;
4use std::collections::HashMap;
5
6impl<K: Hash + Eq + Send, V: Send> ParExtendCore<(K, V)> for HashMap<K, V> {
7    type ThreadValues = Self;
8
9    type OrderedThreadValues = Self;
10
11    fn new_thread_values() -> Self::ThreadValues {
12        Default::default()
13    }
14
15    fn new_ordered_thread_values() -> Self::OrderedThreadValues {
16        Default::default()
17    }
18
19    // thread collect
20
21    fn add_thread_value(collected: &mut Self::ThreadValues, (key, value): (K, V)) {
22        _ = collected.insert(key, value);
23    }
24
25    fn add_thread_values(
26        collected: &mut Self::ThreadValues,
27        values: impl IntoIterator<Item = (K, V)>,
28    ) {
29        collected.extend(values)
30    }
31
32    fn add_ordered_thread_value(
33        collected: &mut Self::OrderedThreadValues,
34        _idx: usize,
35        value: (K, V),
36    ) {
37        Self::add_thread_value(collected, value);
38    }
39
40    fn add_ordered_thread_values(
41        collected: &mut Self::OrderedThreadValues,
42        _idx: usize,
43        values: impl IntoIterator<Item = (K, V)>,
44    ) {
45        Self::add_thread_values(collected, values);
46    }
47
48    // opt: thread collect
49
50    fn add_ordered_thread_optionals(
51        collected: &mut Self::OrderedThreadValues,
52        _idx: usize,
53        values: impl IntoIterator<Item = Option<(K, V)>>,
54    ) -> Option<()> {
55        for value in values {
56            let (key, value) = value?;
57            _ = collected.insert(key, value);
58        }
59        Some(())
60    }
61
62    // res: thread collect
63
64    fn add_ordered_thread_fallibles<E>(
65        collected: &mut Self::OrderedThreadValues,
66        _idx: usize,
67        values: impl IntoIterator<Item = Result<(K, V), E>>,
68    ) -> Result<(), E> {
69        for value in values {
70            let (key, value) = value?;
71            collected.insert(key, value);
72        }
73        Ok(())
74    }
75
76    // add
77
78    fn add_one(&mut self, (key, value): (K, V)) {
79        _ = self.insert(key, value);
80    }
81
82    // extend - merge
83
84    fn extend_merge_infallibles(&mut self, results: Vec<Self::ThreadValues>) {
85        for result in results {
86            self.extend(result);
87        }
88    }
89
90    fn extend_merge_ordered_infallibles(&mut self, results: Vec<Self::OrderedThreadValues>) {
91        self.extend_merge_infallibles(results);
92    }
93}