Skip to main content

orx_parallel/extendable/par_extend_impl/
hash_set.rs

1use crate::extendable::par_extend_core::ParExtendCore;
2use alloc::vec::Vec;
3use core::hash::Hash;
4use std::collections::HashSet;
5
6impl<T: Hash + Eq + Send> ParExtendCore<T> for HashSet<T> {
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, value: T) {
22        _ = collected.insert(value);
23    }
24
25    fn add_thread_values(collected: &mut Self::ThreadValues, values: impl IntoIterator<Item = T>) {
26        collected.extend(values)
27    }
28
29    fn add_ordered_thread_value(collected: &mut Self::OrderedThreadValues, _idx: usize, value: T) {
30        Self::add_thread_value(collected, value);
31    }
32
33    fn add_ordered_thread_values(
34        collected: &mut Self::OrderedThreadValues,
35        _idx: usize,
36        values: impl IntoIterator<Item = T>,
37    ) {
38        Self::add_thread_values(collected, values);
39    }
40
41    // opt: thread collect
42
43    fn add_ordered_thread_optionals(
44        collected: &mut Self::OrderedThreadValues,
45        _idx: usize,
46        values: impl IntoIterator<Item = Option<T>>,
47    ) -> Option<()> {
48        for value in values {
49            _ = collected.insert(value?);
50        }
51        Some(())
52    }
53
54    // res: thread collect
55
56    fn add_ordered_thread_fallibles<E>(
57        collected: &mut Self::OrderedThreadValues,
58        _idx: usize,
59        values: impl IntoIterator<Item = Result<T, E>>,
60    ) -> Result<(), E> {
61        for value in values {
62            _ = collected.insert(value?);
63        }
64        Ok(())
65    }
66
67    // add
68
69    fn add_one(&mut self, value: T) {
70        _ = self.insert(value);
71    }
72
73    // extend - merge
74
75    fn extend_merge_infallibles(&mut self, results: Vec<Self::ThreadValues>) {
76        for result in results {
77            self.extend(result);
78        }
79    }
80
81    fn extend_merge_ordered_infallibles(&mut self, results: Vec<Self::OrderedThreadValues>) {
82        self.extend_merge_infallibles(results);
83    }
84}