pub fn index_order(strides: &[isize]) -> Vec<usize> {
let n = strides.len();
let mut result = vec![1usize; n];
for i in 0..n {
let si = strides[i].unsigned_abs();
if si == 0 {
result[i] = 1;
continue;
}
let mut k = 1usize;
for &s in strides {
if s != 0 && s.unsigned_abs() < si {
k += 1;
}
}
result[i] = k;
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_index_order() {
let order = index_order(&[4, 1, 2]);
assert_eq!(order, vec![3, 1, 2]);
}
#[test]
fn test_index_order_with_zero() {
let order = index_order(&[4, 0, 2]);
assert_eq!(order, vec![2, 1, 1]);
}
#[test]
fn test_index_order_negative_strides() {
let order = index_order(&[-4, 1, -2]);
assert_eq!(order, vec![3, 1, 2]);
}
#[test]
fn test_index_order_tied_strides() {
let order = index_order(&[2, 2, 1]);
assert_eq!(order, vec![2, 2, 1]);
}
#[test]
fn test_index_order_all_same() {
let order = index_order(&[3, 3, 3]);
assert_eq!(order, vec![1, 1, 1]);
}
}