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
    }
}