Skip to main content

sift/
utils.rs

1#[cfg(not(target_arch = "wasm32"))]
2pub use rayon::prelude::*;
3
4#[cfg(target_arch = "wasm32")]
5pub use wasm_compat::*;
6
7#[cfg(target_arch = "wasm32")]
8pub mod wasm_compat {
9    pub trait IntoParallelIterator {
10        type Item;
11        type Iter: Iterator<Item = Self::Item>;
12        fn into_par_iter(self) -> Self::Iter;
13    }
14
15    impl<I: IntoIterator> IntoParallelIterator for I {
16        type Item = I::Item;
17        type Iter = I::IntoIter;
18        fn into_par_iter(self) -> Self::Iter {
19            self.into_iter()
20        }
21    }
22
23    pub trait IntoParallelRefIterator<'data> {
24        type Item: 'data;
25        type Iter: Iterator<Item = Self::Item>;
26        fn par_iter(&'data self) -> Self::Iter;
27    }
28
29    impl<'data, I: 'data + ?Sized> IntoParallelRefIterator<'data> for I
30    where
31        &'data I: IntoIterator,
32    {
33        type Item = <&'data I as IntoIterator>::Item;
34        type Iter = <&'data I as IntoIterator>::IntoIter;
35        fn par_iter(&'data self) -> Self::Iter {
36            self.into_iter()
37        }
38    }
39
40    pub trait IntoParallelRefMutIterator<'data> {
41        type Item: 'data;
42        type Iter: Iterator<Item = Self::Item>;
43        fn par_iter_mut(&'data mut self) -> Self::Iter;
44    }
45
46    impl<'data, I: 'data + ?Sized> IntoParallelRefMutIterator<'data> for I
47    where
48        &'data mut I: IntoIterator,
49    {
50        type Item = <&'data mut I as IntoIterator>::Item;
51        type Iter = <&'data mut I as IntoIterator>::IntoIter;
52        fn par_iter_mut(&'data mut self) -> Self::Iter {
53            self.into_iter()
54        }
55    }
56
57    // Abstract parallel slice traits (simulating rayon)
58    pub trait ParallelSlice<T> {
59        fn par_chunks<'a>(&'a self, chunk_size: usize) -> std::slice::Chunks<'a, T>;
60    }
61
62    impl<T> ParallelSlice<T> for [T] {
63        fn par_chunks<'a>(&'a self, chunk_size: usize) -> std::slice::Chunks<'a, T> {
64            self.chunks(chunk_size)
65        }
66    }
67
68    pub trait ParallelSliceMut<T> {
69        fn par_chunks_mut<'a>(&'a mut self, chunk_size: usize) -> std::slice::ChunksMut<'a, T>;
70    }
71
72    impl<T> ParallelSliceMut<T> for [T] {
73        fn par_chunks_mut<'a>(&'a mut self, chunk_size: usize) -> std::slice::ChunksMut<'a, T> {
74            self.chunks_mut(chunk_size)
75        }
76    }
77}