| 1 | /// Test that one can emulate join with `scope`: |
| 2 | fn pseudo_join<F, G>(f: F, g: G) |
| 3 | where |
| 4 | F: FnOnce() + Send, |
| 5 | G: FnOnce() + Send, |
| 6 | { |
| 7 | rayon_core::scope(|s| { |
| 8 | s.spawn(|_| g()); |
| 9 | f(); |
| 10 | }); |
| 11 | } |
| 12 | |
| 13 | fn quick_sort<T: PartialOrd + Send>(v: &mut [T]) { |
| 14 | if v.len() <= 1 { |
| 15 | return; |
| 16 | } |
| 17 | |
| 18 | let mid = partition(v); |
| 19 | let (lo, hi) = v.split_at_mut(mid); |
| 20 | pseudo_join(|| quick_sort(lo), || quick_sort(hi)); |
| 21 | } |
| 22 | |
| 23 | fn partition<T: PartialOrd + Send>(v: &mut [T]) -> usize { |
| 24 | let pivot = v.len() - 1; |
| 25 | let mut i = 0; |
| 26 | for j in 0..pivot { |
| 27 | if v[j] <= v[pivot] { |
| 28 | v.swap(i, j); |
| 29 | i += 1; |
| 30 | } |
| 31 | } |
| 32 | v.swap(i, pivot); |
| 33 | i |
| 34 | } |
| 35 | |
| 36 | fn is_sorted<T: Send + Ord>(v: &[T]) -> bool { |
| 37 | (1..v.len()).all(|i| v[i - 1] <= v[i]) |
| 38 | } |
| 39 | |
| 40 | #[test] |
| 41 | fn scope_join() { |
| 42 | let mut v: Vec<i32> = (0..256).rev().collect(); |
| 43 | quick_sort(&mut v); |
| 44 | assert!(is_sorted(&v)); |
| 45 | } |
| 46 | |