Skip to main content

orx_parallel/extendable/par_extend_impl/
binary_heap.rs

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