pub fn apply_reordering(ordering: &mut Option<Vec<usize>>, from: usize, to: usize) {
if from == to {
return;
}
if ordering.is_none() {
*ordering = Some(Vec::new());
}
let ordering = ordering.as_mut().unwrap();
let max_index = from.max(to);
while ordering.len() <= max_index {
ordering.push(ordering.len());
}
let from_pos = ordering.iter().position(|&x| x == from).unwrap();
let to_pos = ordering.iter().position(|&x| x == to).unwrap();
ordering.remove(from_pos);
ordering.insert(to_pos, from);
}
#[cfg(test)]
mod reordering_tests {
use crate::ordering::apply_reordering;
use rstest::rstest;
#[rstest]
#[case(0,1,vec![1,0], vec![0,1])]
#[case(4,0,vec![0,1,2,3,4,5,6], vec![4,0,1,2,3,5,6])]
#[case(10,0,vec![], vec![10,0,1,2,3,4,5,6,7,8,9])]
#[case(0,1,vec![], vec![1,0])]
#[case(1,0,vec![1,0], vec![0,1])]
#[case(1,0,vec![1,0,2,3,4], vec![0,1,2,3,4])]
#[case(4,0,vec![], vec![4,0,1,2,3])]
#[case(4,3,vec![4,0,1,2,3,5,6], vec![0,1,2,3,4,5,6])]
#[case(10,9,vec![10,0,1,2,3,4,5,6,7,8,9], vec![0,1,2,3,4,5,6,7,8,9,10])]
#[case(0,0,vec![], vec![])]
#[case(4,4,vec![0,1], vec![0,1])]
fn test_apply_reordering(
#[case] from: usize,
#[case] to: usize,
#[case] ordering: Vec<usize>,
#[case] expected: Vec<usize>,
) {
let mut ordering = Some(ordering);
apply_reordering(&mut ordering, from, to);
assert_eq!(ordering, Some(expected));
}
}