Skip to content

Commit 4a56e5a

Browse files
authored
Merge pull request #73 from orxfun/rand-clippy-fixes
clippy rand fixes
2 parents face2ca + 01fc879 commit 4a56e5a

6 files changed

Lines changed: 247 additions & 242 deletions

File tree

src/algorithms/binary_search.rs

Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -31,111 +31,3 @@ where
3131

3232
Err(fragment_begin_idx)
3333
}
34-
35-
#[cfg(test)]
36-
mod tests {
37-
use super::*;
38-
use crate::{test_all_growth_types, Growth, SplitVec};
39-
use orx_pinned_vec::PinnedVec;
40-
41-
fn get_compare(value: usize) -> impl FnMut(&usize) -> Ordering {
42-
move |x: &usize| x.cmp(&value)
43-
}
44-
45-
#[test]
46-
fn bin_search_empty() {
47-
let cmp = get_compare(42);
48-
49-
let fragments = alloc::vec![];
50-
let result = binary_search_by(&fragments, cmp);
51-
assert_eq!(result, Err(0));
52-
}
53-
54-
#[test]
55-
fn bin_search_empty_first_fragment() {
56-
let cmp = get_compare(42);
57-
58-
let fragments = alloc::vec![alloc::vec![].into()];
59-
let result = binary_search_by(&fragments, cmp);
60-
assert_eq!(result, Err(0));
61-
}
62-
63-
#[test]
64-
fn bin_search_empty_second_fragment() {
65-
let fragments = alloc::vec![alloc::vec![1, 4, 5].into(), alloc::vec![].into()];
66-
67-
let result = binary_search_by(&fragments, get_compare(0));
68-
assert_eq!(result, Err(0));
69-
70-
let result = binary_search_by(&fragments, get_compare(2));
71-
assert_eq!(result, Err(1));
72-
73-
let result = binary_search_by(&fragments, get_compare(42));
74-
assert_eq!(result, Err(3));
75-
76-
let result = binary_search_by(&fragments, get_compare(1));
77-
assert_eq!(result, Ok(0));
78-
79-
let result = binary_search_by(&fragments, get_compare(4));
80-
assert_eq!(result, Ok(1));
81-
82-
let result = binary_search_by(&fragments, get_compare(5));
83-
assert_eq!(result, Ok(2));
84-
}
85-
86-
#[test]
87-
fn bin_search_three_fragments() {
88-
let fragments = alloc::vec![
89-
alloc::vec![1, 4, 5].into(),
90-
alloc::vec![7].into(),
91-
alloc::vec![9, 10].into()
92-
];
93-
94-
let search = |x| binary_search_by(&fragments, get_compare(x));
95-
96-
assert_eq!(search(0), Err(0));
97-
assert_eq!(search(1), Ok(0));
98-
assert_eq!(search(2), Err(1));
99-
assert_eq!(search(3), Err(1));
100-
assert_eq!(search(4), Ok(1));
101-
assert_eq!(search(5), Ok(2));
102-
assert_eq!(search(6), Err(3));
103-
assert_eq!(search(7), Ok(3));
104-
assert_eq!(search(8), Err(4));
105-
assert_eq!(search(9), Ok(4));
106-
assert_eq!(search(10), Ok(5));
107-
assert_eq!(search(11), Err(6));
108-
}
109-
110-
#[test]
111-
fn bin_search_randomized() {
112-
use rand::prelude::*;
113-
use rand_chacha::ChaCha8Rng;
114-
115-
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
116-
let mut rng = ChaCha8Rng::seed_from_u64(8654);
117-
let mut ref_vec = alloc::vec![];
118-
let mut idx = 0;
119-
while ref_vec.len() < 1033 {
120-
if rng.gen::<f32>() < 0.85 {
121-
ref_vec.push(idx);
122-
vec.push(idx);
123-
}
124-
idx += 1;
125-
}
126-
127-
for i in 0..(idx + 10) {
128-
assert_eq!(
129-
vec.binary_search_by(|x| x.cmp(&i)),
130-
ref_vec.binary_search_by(|x| x.cmp(&i)),
131-
);
132-
assert_eq!(vec.binary_search(&i), ref_vec.binary_search(&i));
133-
assert_eq!(
134-
vec.binary_search_by_key(&(2 * i), |x| 2 * x),
135-
ref_vec.binary_search_by_key(&(2 * i), |x| 2 * x),
136-
);
137-
}
138-
}
139-
test_all_growth_types!(test);
140-
}
141-
}

src/algorithms/in_place_sort.rs

Lines changed: 5 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ where
7474
}
7575
}
7676

77-
fn find_position_to_insert<T, F>(fragment: &[T], compare: &mut F, value: &T) -> Option<usize>
77+
pub(super) fn find_position_to_insert<T, F>(
78+
fragment: &[T],
79+
compare: &mut F,
80+
value: &T,
81+
) -> Option<usize>
7882
where
7983
F: FnMut(&T, &T) -> Ordering,
8084
{
@@ -109,136 +113,3 @@ where
109113
},
110114
}
111115
}
112-
113-
#[cfg(test)]
114-
mod tests {
115-
use super::*;
116-
use crate::{Doubling, Growth, Linear, Recursive};
117-
use alloc::vec::Vec;
118-
use test_case::test_case;
119-
120-
#[test]
121-
fn insertion_position() {
122-
let fragment: Fragment<u32> = alloc::vec![4, 7, 9, 13, 16, 17, 23].into();
123-
124-
let mut c = |a: &u32, b: &u32| a.cmp(b);
125-
let mut pos = |val: &u32| find_position_to_insert(&fragment, &mut c, val);
126-
127-
assert_eq!(pos(&0), None);
128-
assert_eq!(pos(&3), None);
129-
assert_eq!(pos(&4), None);
130-
131-
assert_eq!(pos(&5), Some(1));
132-
assert_eq!(pos(&6), Some(1));
133-
assert_eq!(pos(&7), Some(1));
134-
135-
assert_eq!(pos(&8), Some(2));
136-
assert_eq!(pos(&9), Some(2));
137-
138-
assert_eq!(pos(&10), Some(3));
139-
assert_eq!(pos(&11), Some(3));
140-
assert_eq!(pos(&12), Some(3));
141-
assert_eq!(pos(&13), Some(3));
142-
143-
assert_eq!(pos(&14), Some(4));
144-
assert_eq!(pos(&15), Some(4));
145-
assert_eq!(pos(&16), Some(4));
146-
147-
assert_eq!(pos(&17), Some(5));
148-
149-
assert_eq!(pos(&18), Some(6));
150-
assert_eq!(pos(&19), Some(6));
151-
assert_eq!(pos(&20), Some(6));
152-
assert_eq!(pos(&21), Some(6));
153-
assert_eq!(pos(&22), Some(6));
154-
assert_eq!(pos(&23), Some(6));
155-
156-
assert_eq!(pos(&24), Some(7));
157-
assert_eq!(pos(&25), Some(7));
158-
assert_eq!(pos(&26), Some(7));
159-
assert_eq!(pos(&100), Some(7));
160-
}
161-
162-
#[test]
163-
fn insertion_position_with_ties() {
164-
let mut c = |a: &u32, b: &u32| a.cmp(b);
165-
166-
let fragment: Fragment<u32> = alloc::vec![4, 7, 13, 13, 13, 17, 23].into();
167-
let mut pos = |val: &u32| find_position_to_insert(&fragment, &mut c, val);
168-
assert_eq!(pos(&13), Some(2));
169-
170-
let fragment: Fragment<u32> = alloc::vec![4, 7, 13, 13, 23, 23, 23].into();
171-
let mut pos = |val: &u32| find_position_to_insert(&fragment, &mut c, val);
172-
assert_eq!(pos(&23), Some(4));
173-
174-
let fragment: Fragment<u32> = alloc::vec![4, 4, 13, 13, 23, 23, 23].into();
175-
let mut pos = |val: &u32| find_position_to_insert(&fragment, &mut c, val);
176-
assert_eq!(pos(&4), None);
177-
}
178-
179-
#[test]
180-
fn sort_simple() {
181-
let mut c = |a: &u32, b: &u32| a.cmp(b);
182-
183-
let mut fragments: Vec<Fragment<u32>> = alloc::vec![
184-
alloc::vec![2, 4].into(),
185-
alloc::vec![0, 5, 6].into(),
186-
alloc::vec![1, 3].into()
187-
];
188-
189-
in_place_sort_by(&mut fragments, &mut c);
190-
191-
assert_is_sorted(fragments);
192-
}
193-
194-
#[test_case(Doubling)]
195-
#[test_case(Recursive)]
196-
#[test_case(Linear::new(10))]
197-
fn sort_growth(growth: impl Growth) {
198-
let mut c = |a: &i32, b: &i32| a.cmp(b);
199-
200-
let num_fragments = 10;
201-
let mut fragments: Vec<Fragment<_>> = alloc::vec![];
202-
203-
let mut len = 0;
204-
for _ in 0..num_fragments {
205-
let fragment_capacities: Vec<_> = fragments.iter().map(|x| x.capacity()).collect();
206-
let mut fragment =
207-
Fragment::new(growth.new_fragment_capacity_from(fragment_capacities.into_iter()));
208-
for i in 0..fragment.capacity() {
209-
let i = len + i;
210-
let value = match i % 3 {
211-
0 => i as i32,
212-
1 => 42,
213-
_ => -(i as i32),
214-
};
215-
fragment.push(value);
216-
}
217-
218-
assert_eq!(fragment.len(), fragment.capacity());
219-
len += fragment.len();
220-
fragments.push(fragment);
221-
}
222-
223-
assert_eq!(fragments.len(), num_fragments);
224-
225-
in_place_sort_by(&mut fragments, &mut c);
226-
227-
assert_is_sorted(fragments);
228-
}
229-
230-
fn assert_is_sorted<T: Ord>(fragments: Vec<Fragment<T>>) {
231-
let flattened: Vec<T> = fragments.into_iter().flat_map(|x| Vec::from(x)).collect();
232-
233-
if flattened.is_empty() {
234-
return;
235-
}
236-
237-
let mut curr = &flattened[0];
238-
for i in 1..flattened.len() {
239-
let cmp = curr.cmp(&flattened[i]);
240-
assert!(cmp != Greater);
241-
curr = &flattened[i];
242-
}
243-
}
244-
}

src/algorithms/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
#[cfg(test)]
2+
mod tests;
3+
14
pub mod binary_search;
25
pub mod in_place_sort;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
use crate::algorithms::binary_search::binary_search_by;
2+
use crate::{test_all_growth_types, Growth, SplitVec};
3+
use core::cmp::Ordering;
4+
use orx_pinned_vec::PinnedVec;
5+
6+
fn get_compare(value: usize) -> impl FnMut(&usize) -> Ordering {
7+
move |x: &usize| x.cmp(&value)
8+
}
9+
10+
#[test]
11+
fn bin_search_empty() {
12+
let cmp = get_compare(42);
13+
14+
let fragments = alloc::vec![];
15+
let result = binary_search_by(&fragments, cmp);
16+
assert_eq!(result, Err(0));
17+
}
18+
19+
#[test]
20+
fn bin_search_empty_first_fragment() {
21+
let cmp = get_compare(42);
22+
23+
let fragments = alloc::vec![alloc::vec![].into()];
24+
let result = binary_search_by(&fragments, cmp);
25+
assert_eq!(result, Err(0));
26+
}
27+
28+
#[test]
29+
fn bin_search_empty_second_fragment() {
30+
let fragments = alloc::vec![alloc::vec![1, 4, 5].into(), alloc::vec![].into()];
31+
32+
let result = binary_search_by(&fragments, get_compare(0));
33+
assert_eq!(result, Err(0));
34+
35+
let result = binary_search_by(&fragments, get_compare(2));
36+
assert_eq!(result, Err(1));
37+
38+
let result = binary_search_by(&fragments, get_compare(42));
39+
assert_eq!(result, Err(3));
40+
41+
let result = binary_search_by(&fragments, get_compare(1));
42+
assert_eq!(result, Ok(0));
43+
44+
let result = binary_search_by(&fragments, get_compare(4));
45+
assert_eq!(result, Ok(1));
46+
47+
let result = binary_search_by(&fragments, get_compare(5));
48+
assert_eq!(result, Ok(2));
49+
}
50+
51+
#[test]
52+
fn bin_search_three_fragments() {
53+
let fragments = alloc::vec![
54+
alloc::vec![1, 4, 5].into(),
55+
alloc::vec![7].into(),
56+
alloc::vec![9, 10].into()
57+
];
58+
59+
let search = |x| binary_search_by(&fragments, get_compare(x));
60+
61+
assert_eq!(search(0), Err(0));
62+
assert_eq!(search(1), Ok(0));
63+
assert_eq!(search(2), Err(1));
64+
assert_eq!(search(3), Err(1));
65+
assert_eq!(search(4), Ok(1));
66+
assert_eq!(search(5), Ok(2));
67+
assert_eq!(search(6), Err(3));
68+
assert_eq!(search(7), Ok(3));
69+
assert_eq!(search(8), Err(4));
70+
assert_eq!(search(9), Ok(4));
71+
assert_eq!(search(10), Ok(5));
72+
assert_eq!(search(11), Err(6));
73+
}
74+
75+
#[test]
76+
fn bin_search_randomized() {
77+
use rand::prelude::*;
78+
use rand_chacha::ChaCha8Rng;
79+
80+
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
81+
let mut rng = ChaCha8Rng::seed_from_u64(8654);
82+
let mut ref_vec = alloc::vec![];
83+
let mut idx = 0;
84+
while ref_vec.len() < 1033 {
85+
if rng.random::<f32>() < 0.85 {
86+
ref_vec.push(idx);
87+
vec.push(idx);
88+
}
89+
idx += 1;
90+
}
91+
92+
for i in 0..(idx + 10) {
93+
assert_eq!(
94+
vec.binary_search_by(|x| x.cmp(&i)),
95+
ref_vec.binary_search_by(|x| x.cmp(&i)),
96+
);
97+
assert_eq!(vec.binary_search(&i), ref_vec.binary_search(&i));
98+
assert_eq!(
99+
vec.binary_search_by_key(&(2 * i), |x| 2 * x),
100+
ref_vec.binary_search_by_key(&(2 * i), |x| 2 * x),
101+
);
102+
}
103+
}
104+
test_all_growth_types!(test);
105+
}

0 commit comments

Comments
 (0)