@@ -183,24 +183,22 @@ where
183
183
/// assert(sorted_descending == [32, 42]); // does not verify
184
184
/// }
185
185
/// ```
186
- pub fn sort_via < Env > (self , ordering : fn [ Env ] (T , T ) -> bool ) -> Self {
186
+ pub fn sort_via (self , ordering : fn (T , T ) -> bool ) -> Self {
187
187
// Safety: `sorted` array is checked to be:
188
188
// a. a permutation of `input`'s elements
189
189
// b. satisfying the predicate `ordering`
190
- unsafe {
191
- let sorted = quicksort:: quicksort (self , ordering );
192
-
193
- if !is_unconstrained () {
194
- for i in 0 ..N - 1 {
195
- assert (
196
- ordering (sorted [i ], sorted [i + 1 ]),
197
- "Array has not been sorted correctly according to `ordering`." ,
198
- );
199
- }
200
- check_shuffle:: check_shuffle (self , sorted );
190
+ let sorted = unsafe { quicksort:: quicksort (self , ordering ) };
191
+
192
+ if !is_unconstrained () {
193
+ for i in 0 ..N - 1 {
194
+ assert (
195
+ ordering (sorted [i ], sorted [i + 1 ]),
196
+ "Array has not been sorted correctly according to `ordering`." ,
197
+ );
201
198
}
202
- sorted
199
+ check_shuffle:: check_shuffle ( self , sorted );
203
200
}
201
+ sorted
204
202
}
205
203
}
206
204
@@ -232,4 +230,92 @@ mod test {
232
230
fn map_empty () {
233
231
assert_eq ([].map (|x | x + 1 ), []);
234
232
}
233
+
234
+ global arr_with_100_values : [u32 ; 100 ] = [
235
+ 42 , 123 , 87 , 93 , 48 , 80 , 50 , 5 , 104 , 84 , 70 , 47 , 119 , 66 , 71 , 121 , 3 , 29 , 42 , 118 , 2 , 54 ,
236
+ 89 , 44 , 81 , 0 , 26 , 106 , 68 , 96 , 84 , 48 , 95 , 54 , 45 , 32 , 89 , 100 , 109 , 19 , 37 , 41 , 19 , 98 ,
237
+ 53 , 114 , 107 , 66 , 6 , 74 , 13 , 19 , 105 , 64 , 123 , 28 , 44 , 50 , 89 , 58 , 123 , 126 , 21 , 43 , 86 , 35 ,
238
+ 21 , 62 , 82 , 0 , 108 , 120 , 72 , 72 , 62 , 80 , 12 , 71 , 70 , 86 , 116 , 73 , 38 , 15 , 127 , 81 , 30 , 8 ,
239
+ 125 , 28 , 26 , 69 , 114 , 63 , 27 , 28 , 61 , 42 , 13 , 32 ,
240
+ ];
241
+ global expected_with_100_values : [u32 ; 100 ] = [
242
+ 0 , 0 , 2 , 3 , 5 , 6 , 8 , 12 , 13 , 13 , 15 , 19 , 19 , 19 , 21 , 21 , 26 , 26 , 27 , 28 , 28 , 28 , 29 , 30 , 32 ,
243
+ 32 , 35 , 37 , 38 , 41 , 42 , 42 , 42 , 43 , 44 , 44 , 45 , 47 , 48 , 48 , 50 , 50 , 53 , 54 , 54 , 58 , 61 , 62 ,
244
+ 62 , 63 , 64 , 66 , 66 , 68 , 69 , 70 , 70 , 71 , 71 , 72 , 72 , 73 , 74 , 80 , 80 , 81 , 81 , 82 , 84 , 84 , 86 ,
245
+ 86 , 87 , 89 , 89 , 89 , 93 , 95 , 96 , 98 , 100 , 104 , 105 , 106 , 107 , 108 , 109 , 114 , 114 , 116 , 118 ,
246
+ 119 , 120 , 121 , 123 , 123 , 123 , 125 , 126 , 127 ,
247
+ ];
248
+ fn sort_u32 (a : u32 , b : u32 ) -> bool {
249
+ a <= b
250
+ }
251
+
252
+ #[test]
253
+ fn test_sort () {
254
+ let mut arr : [u32 ; 7 ] = [3 , 6 , 8 , 10 , 1 , 2 , 1 ];
255
+
256
+ let sorted = arr .sort ();
257
+
258
+ let expected : [u32 ; 7 ] = [1 , 1 , 2 , 3 , 6 , 8 , 10 ];
259
+ assert (sorted == expected );
260
+ }
261
+
262
+ #[test]
263
+ fn test_sort_100_values () {
264
+ let mut arr : [u32 ; 100 ] = [
265
+ 42 , 123 , 87 , 93 , 48 , 80 , 50 , 5 , 104 , 84 , 70 , 47 , 119 , 66 , 71 , 121 , 3 , 29 , 42 , 118 , 2 ,
266
+ 54 , 89 , 44 , 81 , 0 , 26 , 106 , 68 , 96 , 84 , 48 , 95 , 54 , 45 , 32 , 89 , 100 , 109 , 19 , 37 , 41 ,
267
+ 19 , 98 , 53 , 114 , 107 , 66 , 6 , 74 , 13 , 19 , 105 , 64 , 123 , 28 , 44 , 50 , 89 , 58 , 123 , 126 , 21 ,
268
+ 43 , 86 , 35 , 21 , 62 , 82 , 0 , 108 , 120 , 72 , 72 , 62 , 80 , 12 , 71 , 70 , 86 , 116 , 73 , 38 , 15 ,
269
+ 127 , 81 , 30 , 8 , 125 , 28 , 26 , 69 , 114 , 63 , 27 , 28 , 61 , 42 , 13 , 32 ,
270
+ ];
271
+
272
+ let sorted = arr .sort ();
273
+
274
+ let expected : [u32 ; 100 ] = [
275
+ 0 , 0 , 2 , 3 , 5 , 6 , 8 , 12 , 13 , 13 , 15 , 19 , 19 , 19 , 21 , 21 , 26 , 26 , 27 , 28 , 28 , 28 , 29 , 30 ,
276
+ 32 , 32 , 35 , 37 , 38 , 41 , 42 , 42 , 42 , 43 , 44 , 44 , 45 , 47 , 48 , 48 , 50 , 50 , 53 , 54 , 54 , 58 ,
277
+ 61 , 62 , 62 , 63 , 64 , 66 , 66 , 68 , 69 , 70 , 70 , 71 , 71 , 72 , 72 , 73 , 74 , 80 , 80 , 81 , 81 , 82 ,
278
+ 84 , 84 , 86 , 86 , 87 , 89 , 89 , 89 , 93 , 95 , 96 , 98 , 100 , 104 , 105 , 106 , 107 , 108 , 109 , 114 ,
279
+ 114 , 116 , 118 , 119 , 120 , 121 , 123 , 123 , 123 , 125 , 126 , 127 ,
280
+ ];
281
+ assert (sorted == expected );
282
+ }
283
+
284
+ #[test]
285
+ fn test_sort_100_values_comptime () {
286
+ let sorted = arr_with_100_values .sort ();
287
+ assert (sorted == expected_with_100_values );
288
+ }
289
+
290
+ #[test]
291
+ fn test_sort_via () {
292
+ let mut arr : [u32 ; 7 ] = [3 , 6 , 8 , 10 , 1 , 2 , 1 ];
293
+
294
+ let sorted = arr .sort_via (sort_u32 );
295
+
296
+ let expected : [u32 ; 7 ] = [1 , 1 , 2 , 3 , 6 , 8 , 10 ];
297
+ assert (sorted == expected );
298
+ }
299
+
300
+ #[test]
301
+ fn test_sort_via_100_values () {
302
+ let mut arr : [u32 ; 100 ] = [
303
+ 42 , 123 , 87 , 93 , 48 , 80 , 50 , 5 , 104 , 84 , 70 , 47 , 119 , 66 , 71 , 121 , 3 , 29 , 42 , 118 , 2 ,
304
+ 54 , 89 , 44 , 81 , 0 , 26 , 106 , 68 , 96 , 84 , 48 , 95 , 54 , 45 , 32 , 89 , 100 , 109 , 19 , 37 , 41 ,
305
+ 19 , 98 , 53 , 114 , 107 , 66 , 6 , 74 , 13 , 19 , 105 , 64 , 123 , 28 , 44 , 50 , 89 , 58 , 123 , 126 , 21 ,
306
+ 43 , 86 , 35 , 21 , 62 , 82 , 0 , 108 , 120 , 72 , 72 , 62 , 80 , 12 , 71 , 70 , 86 , 116 , 73 , 38 , 15 ,
307
+ 127 , 81 , 30 , 8 , 125 , 28 , 26 , 69 , 114 , 63 , 27 , 28 , 61 , 42 , 13 , 32 ,
308
+ ];
309
+
310
+ let sorted = arr .sort_via (sort_u32 );
311
+
312
+ let expected : [u32 ; 100 ] = [
313
+ 0 , 0 , 2 , 3 , 5 , 6 , 8 , 12 , 13 , 13 , 15 , 19 , 19 , 19 , 21 , 21 , 26 , 26 , 27 , 28 , 28 , 28 , 29 , 30 ,
314
+ 32 , 32 , 35 , 37 , 38 , 41 , 42 , 42 , 42 , 43 , 44 , 44 , 45 , 47 , 48 , 48 , 50 , 50 , 53 , 54 , 54 , 58 ,
315
+ 61 , 62 , 62 , 63 , 64 , 66 , 66 , 68 , 69 , 70 , 70 , 71 , 71 , 72 , 72 , 73 , 74 , 80 , 80 , 81 , 81 , 82 ,
316
+ 84 , 84 , 86 , 86 , 87 , 89 , 89 , 89 , 93 , 95 , 96 , 98 , 100 , 104 , 105 , 106 , 107 , 108 , 109 , 114 ,
317
+ 114 , 116 , 118 , 119 , 120 , 121 , 123 , 123 , 123 , 125 , 126 , 127 ,
318
+ ];
319
+ assert (sorted == expected );
320
+ }
235
321
}
0 commit comments