|
74 | 74 | } |
75 | 75 | } |
76 | 76 |
|
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> |
78 | 82 | where |
79 | 83 | F: FnMut(&T, &T) -> Ordering, |
80 | 84 | { |
@@ -109,136 +113,3 @@ where |
109 | 113 | }, |
110 | 114 | } |
111 | 115 | } |
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 | | -} |
0 commit comments