1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use { crate::{ Context, Readable, Reader, Writable, Writer, }, ndarray::ArrayBase, }; use ndarray::{OwnedRepr, Dimension}; use std::convert::TryInto; impl<C, D, P> Writable<C> for ArrayBase<OwnedRepr<P>, D> where C: Context, D: Dimension, P: Writable<C>, { #[inline] fn write_to<T: ?Sized + Writer<C>>(&self, writer: &mut T) -> Result<(), C::Error> { self.shape().write_to(writer)?; let data_slice = self.as_slice().unwrap(); data_slice.write_to(writer) } #[inline] fn bytes_needed(&self) -> Result<usize, C::Error> { let data_slice = self.as_slice().unwrap(); Ok(Writable::<C>::bytes_needed(self.shape())? + Writable::<C>::bytes_needed(data_slice)?) } } impl<'a, C, P> Readable<'a, C> for ArrayBase<OwnedRepr<P>, ndarray::Dim<[usize; 2]>> where C: Context, P: Readable<'a, C> { #[inline] fn read_from<R: Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> { let shape: Vec<usize> = Readable::read_from(reader)?; let shape: [usize; 2] = shape.as_slice().try_into().unwrap(); let data: Vec<P> = Readable::read_from(reader)?; Ok(unsafe { Self::from_shape_vec_unchecked(shape, data) }) } #[inline] fn minimum_bytes_needed() -> usize { 8 } } impl<'a, C, P> Readable<'a, C> for ArrayBase<OwnedRepr<P>, ndarray::Dim<[usize; 1]>> where C: Context, P: Readable<'a, C>, { #[inline] fn read_from<R: Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> { let shape: Vec<usize> = Readable::read_from(reader)?; let shape: [usize; 1] = shape.as_slice().try_into().unwrap(); let data: Vec<P> = Readable::read_from(reader)?; Ok(unsafe { Self::from_shape_vec_unchecked(shape, data) }) } #[inline] fn minimum_bytes_needed() -> usize { 8 } }