strided_view/
auxiliary.rs1pub fn index_order(strides: &[isize]) -> Vec<usize> {
25 let n = strides.len();
26 let mut result = vec![1usize; n];
27
28 for i in 0..n {
29 let si = strides[i].unsigned_abs();
30 if si == 0 {
31 result[i] = 1;
32 continue;
33 }
34 let mut k = 1usize;
35 for &s in strides {
36 if s != 0 && s.unsigned_abs() < si {
37 k += 1;
38 }
39 }
40 result[i] = k;
41 }
42
43 result
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test_index_order() {
52 let order = index_order(&[4, 1, 2]);
54 assert_eq!(order, vec![3, 1, 2]);
55 }
56
57 #[test]
58 fn test_index_order_with_zero() {
59 let order = index_order(&[4, 0, 2]);
61 assert_eq!(order, vec![2, 1, 1]);
62 }
63
64 #[test]
65 fn test_index_order_negative_strides() {
66 let order = index_order(&[-4, 1, -2]);
67 assert_eq!(order, vec![3, 1, 2]);
68 }
69
70 #[test]
71 fn test_index_order_tied_strides() {
72 let order = index_order(&[2, 2, 1]);
73 assert_eq!(order, vec![2, 2, 1]);
74 }
75
76 #[test]
77 fn test_index_order_all_same() {
78 let order = index_order(&[3, 3, 3]);
79 assert_eq!(order, vec![1, 1, 1]);
80 }
81}