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}