1#![warn(missing_docs)]
22#![warn(clippy::all)]
23
24pub mod thread_pool;
25pub mod parallel;
26pub mod scope;
27pub mod executor;
28pub mod parallel_vec;
29pub mod advanced;
30pub mod work_stealing;
31pub mod simd;
32pub mod config;
33
34pub use thread_pool::ThreadPool;
35pub use parallel::{ParallelIterator, IntoParallelIterator};
36pub use parallel_vec::{ParallelVec, IntoParallelVec};
37pub use advanced::{parallel_sort, parallel_sort_by, parallel_zip, parallel_chunks, parallel_partition_advanced};
38pub use work_stealing::{WorkStealingPool, work_stealing_map};
39pub use config::{ThreadPoolConfig, set_global_config, get_global_config};
40
41pub mod prelude {
43 pub use crate::parallel::{ParallelIterator, IntoParallelIterator, ParallelSlice, ParallelSliceMut};
44 pub use crate::parallel_vec::{ParallelVec, IntoParallelVec};
45 pub use std::thread::scope;
47}
48
49pub const VERSION: &str = env!("CARGO_PKG_VERSION");
51
52pub use std::thread::scope;
54
55#[cfg(test)]
56mod tests {
57 use super::prelude::*;
58 use super::ThreadPool;
59
60 #[test]
61 fn test_parallel_sum() {
62 let numbers: Vec<i32> = (0..100).collect();
63 let sum: i32 = numbers.par_iter().sum();
64 assert_eq!(sum, 4950);
65 }
66
67 #[test]
68 fn test_parallel_map() {
69 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
70 let doubled: Vec<i32> = numbers
71 .par_iter()
72 .map(|&x| x * 2)
73 .collect();
74 assert_eq!(doubled, vec![2, 4, 6, 8, 10]);
75 }
76
77 #[test]
78 fn test_thread_pool() {
79 let pool = ThreadPool::new(2);
80
81 for i in 0..10 {
82 pool.execute(move || {
83 let _result = i * i;
84 });
86 }
87
88 pool.wait();
89 }
90
91 #[test]
92 fn test_parallel_filter() {
93 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
94 let evens: Vec<i32> = numbers
95 .par_iter()
96 .filter(|&x| x % 2 == 0)
97 .cloned()
98 .collect();
99 assert_eq!(evens, vec![2, 4, 6, 8, 10]);
100 }
101
102 #[test]
103 fn test_parallel_fold() {
104 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
105 let result: Vec<i32> = numbers
106 .par_iter()
107 .fold(|| 0, |acc, &x| acc + x)
108 .collect();
109 assert_eq!(result.len(), 1);
110 assert_eq!(result[0], 15);
111 }
112
113 #[test]
114 fn test_parallel_reduce() {
115 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
116 let result = numbers
117 .par_iter()
118 .cloned()
119 .reduce(|a, b| a + b);
120 assert_eq!(result, Some(15));
121 }
122
123 #[test]
124 fn test_parallel_find_any() {
125 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
126 let found = numbers
127 .par_iter()
128 .find_any(|&&x| x > 3);
129 assert!(found.is_some());
130 assert!(*found.unwrap() > 3);
131 }
132
133 #[test]
134 fn test_parallel_all() {
135 let numbers: Vec<i32> = vec![2, 4, 6, 8, 10];
136 let all_even = numbers
137 .par_iter()
138 .all(|&x| x % 2 == 0);
139 assert!(all_even);
140 }
141
142 #[test]
143 fn test_parallel_any() {
144 let numbers: Vec<i32> = vec![1, 3, 5, 7, 8];
145 let has_even = numbers
146 .par_iter()
147 .any(|&x| x % 2 == 0);
148 assert!(has_even);
149 }
150
151 #[test]
152 fn test_parallel_cloned() {
153 let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
154 let doubled: Vec<i32> = numbers
155 .par_iter()
156 .cloned()
157 .map(|x| x * 2)
158 .collect();
159 assert_eq!(doubled, vec![2, 4, 6, 8, 10]);
160 }
161
162 #[test]
163 fn test_parallel_iter_mut() {
164 let mut numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
165 numbers
166 .par_iter_mut()
167 .for_each(|x| *x *= 2);
168 assert_eq!(numbers, vec![2, 4, 6, 8, 10]);
169 }
170}