fn transpose_2d<T: Copy>(rows: usize, cols: usize, row_major: &[T]) -> Vec<T> {
debug_assert_eq!(row_major.len(), rows * cols);
let n = rows * cols;
let mut out: Vec<T> = Vec::with_capacity(n);
if n == 0 {
return out;
}
const BLK: usize = 32;
let dst = out.as_mut_ptr();
for cb in (0..cols).step_by(BLK) {
let c_end = (cb + BLK).min(cols);
for rb in (0..rows).step_by(BLK) {
let r_end = (rb + BLK).min(rows);
for r in rb..r_end {
let src_row_base = r * cols;
for c in cb..c_end {
let value = row_major[src_row_base + c];
unsafe {
dst.add(c * rows + r).write(value);
}
}
}
}
}
unsafe {
out.set_len(n);
}
out
}
#[inline]
pub(super) fn transpose_scalars<T: Copy>(rows: usize, cols: usize, row_major: &[T]) -> Vec<T> {
transpose_2d(rows, cols, row_major)
}
#[inline]
pub(super) fn transpose_pairs<T: Copy>(
rows: usize,
cols: usize,
row_major: &[(T, T)],
) -> Vec<(T, T)> {
transpose_2d(rows, cols, row_major)
}