numrst 0.5.0

Fundamental package for scientific computing
Documentation
use std::io::Read;
use crate::{NdArray, Result, Shape, Storage, WithDType};

pub fn read_ndarray<W: WithDType + bytemuck::Pod, R: Read>(mut reader: R, shape: Shape) -> Result<NdArray<W>> {
    let element_size = shape.element_count();
    let data = read_as_vec::<W, _>(&mut reader, element_size)?;

    let storage = Storage::new(data);
    Ok(NdArray::from_storage(storage, shape))
}

pub fn read_bool_ndarray<R: Read>(mut reader: R, shape: Shape) -> Result<NdArray<bool>> {
    let element_size = shape.element_count();
    let data = read_bools(&mut reader, element_size)?;

    let storage = Storage::new(data);
    Ok(NdArray::from_storage(storage, shape))
}

pub fn read_bools<R: Read>(reader: &mut R, len: usize) -> Result<Vec<bool>> {
    let mut buf = vec![0u8; len];
    reader.read_exact(&mut buf)?;
    let vec = buf.into_iter().map(|b| b != 0).collect();
    Ok(vec)
}

pub fn read_as_vec<T: bytemuck::Pod, R: Read>(reader: &mut R, len: usize) -> Result<Vec<T>> {
    let mut buf = vec![0u8; len * std::mem::size_of::<T>()];
    reader.read_exact(&mut buf)?;
    let slice: &[T] = bytemuck::cast_slice(&buf);
    Ok(slice.to_vec())
}