lair 0.6.0

Linear algebra in Rust
Documentation
use std::ptr;

#[allow(clippy::cast_possible_wrap)]
pub unsafe fn laswp<T>(
    ncols: usize,
    a: *mut T,
    row_stride: isize,
    col_stride: isize,
    begin: usize,
    piv: &[usize],
) where
    T: Copy,
{
    for (i, &p) in piv.iter().enumerate().skip(begin) {
        if i == p {
            continue;
        }
        let mut n = ncols;
        let mut row1 = a.offset(i as isize * row_stride);
        let mut row2 = a.offset(p as isize * row_stride);
        loop {
            let mut tmp = ptr::read(row1);
            tmp = ptr::replace(row2, tmp);
            ptr::write(row1, tmp);
            if n == 1 {
                break;
            }
            row1 = row1.offset(col_stride);
            row2 = row2.offset(col_stride);
            n -= 1;
        }
    }
}