sprs_rssn/sparse/
serde_traits.rs

1use super::*;
2pub(crate) use serde::ser::SerializeStruct;
3pub(crate) use serde::{Deserialize, Serialize, Serializer};
4use std::convert::TryFrom;
5use std::ops::Deref;
6
7impl<N, I: SpIndex, Iptr: SpIndex, IptrStorage, IStorage, DStorage> Serialize
8    for CsMatBase<N, I, IptrStorage, IStorage, DStorage, Iptr>
9where
10    Iptr: Serialize,
11    I: Serialize,
12    N: Serialize,
13    IptrStorage: Deref<Target = [Iptr]>,
14    IStorage: Deref<Target = [I]>,
15    DStorage: Deref<Target = [N]>,
16{
17    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
18    where
19        S: Serializer,
20    {
21        let mut state = serializer.serialize_struct("CsMatBase", 6)?;
22        state.serialize_field("storage", &self.storage)?;
23        state.serialize_field("nrows", &self.nrows)?;
24        state.serialize_field("ncols", &self.ncols)?;
25        state.serialize_field("indptr", &self.indptr.raw_storage())?;
26        state.serialize_field("indices", &self.indices[..])?;
27        state.serialize_field("data", &self.data[..])?;
28        state.end()
29    }
30}
31
32#[derive(Deserialize)]
33pub(crate) struct CsVecBaseShadow<IStorage, DStorage, N, I: SpIndex = usize>
34where
35    IStorage: Deref<Target = [I]>,
36    DStorage: Deref<Target = [N]>,
37{
38    dim: usize,
39    indices: IStorage,
40    data: DStorage,
41}
42
43impl<IStorage, DStorage, N, I: SpIndex>
44    TryFrom<CsVecBaseShadow<IStorage, DStorage, N, I>>
45    for CsVecBase<IStorage, DStorage, N, I>
46where
47    IStorage: Deref<Target = [I]>,
48    DStorage: Deref<Target = [N]>,
49{
50    type Error = StructureError;
51    fn try_from(
52        val: CsVecBaseShadow<IStorage, DStorage, N, I>,
53    ) -> Result<Self, Self::Error> {
54        let CsVecBaseShadow { dim, indices, data } = val;
55        Self::try_new(dim, indices, data).map_err(|(_, _, e)| e)
56    }
57}
58
59#[derive(Deserialize)]
60pub struct CsMatBaseShadow<N, I, IptrStorage, IndStorage, DataStorage, Iptr = I>
61where
62    I: SpIndex,
63    Iptr: SpIndex,
64    IptrStorage: Deref<Target = [Iptr]>,
65    IndStorage: Deref<Target = [I]>,
66    DataStorage: Deref<Target = [N]>,
67{
68    storage: CompressedStorage,
69    nrows: usize,
70    ncols: usize,
71    indptr: IptrStorage,
72    indices: IndStorage,
73    data: DataStorage,
74}
75
76impl<IptrStorage, IndStorage, DStorage, N, I: SpIndex, Iptr: SpIndex>
77    TryFrom<CsMatBaseShadow<N, I, IptrStorage, IndStorage, DStorage, Iptr>>
78    for CsMatBase<N, I, IptrStorage, IndStorage, DStorage, Iptr>
79where
80    IndStorage: Deref<Target = [I]>,
81    IptrStorage: Deref<Target = [Iptr]>,
82    DStorage: Deref<Target = [N]>,
83{
84    type Error = StructureError;
85    fn try_from(
86        val: CsMatBaseShadow<N, I, IptrStorage, IndStorage, DStorage, Iptr>,
87    ) -> Result<Self, Self::Error> {
88        let CsMatBaseShadow {
89            storage,
90            nrows,
91            ncols,
92            indptr,
93            indices,
94            data,
95        } = val;
96        let shape = (nrows, ncols);
97        Self::new_checked(storage, shape, indptr, indices, data)
98            .map_err(|(_, _, _, e)| e)
99    }
100}
101
102#[derive(Deserialize)]
103pub struct IndPtrBaseShadow<Iptr, Storage>
104where
105    Iptr: SpIndex,
106    Storage: Deref<Target = [Iptr]>,
107{
108    storage: Storage,
109}
110
111impl<Iptr: SpIndex, Storage> TryFrom<IndPtrBaseShadow<Iptr, Storage>>
112    for IndPtrBase<Iptr, Storage>
113where
114    Storage: Deref<Target = [Iptr]>,
115{
116    type Error = StructureError;
117    fn try_from(
118        val: IndPtrBaseShadow<Iptr, Storage>,
119    ) -> Result<Self, Self::Error> {
120        let IndPtrBaseShadow { storage } = val;
121        Self::new_checked(storage).map_err(|(_, e)| e)
122    }
123}