-
Notifications
You must be signed in to change notification settings - Fork 320
/
Copy patharray_borsh.rs
101 lines (95 loc) · 3.27 KB
/
array_borsh.rs
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use crate::imp_prelude::*;
use crate::IntoDimension;
use alloc::vec::Vec;
use borsh::{BorshDeserialize, BorshSerialize};
use core::ops::Deref;
/// **Requires crate feature `"borsh"`**
impl<I> BorshSerialize for Dim<I>
where
I: BorshSerialize,
{
fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
<I as BorshSerialize>::serialize(&self.ix(), writer)
}
}
/// **Requires crate feature `"borsh"`**
impl<I> BorshDeserialize for Dim<I>
where
I: BorshDeserialize,
{
fn deserialize_reader<R: borsh::io::Read>(reader: &mut R) -> borsh::io::Result<Self> {
<I as BorshDeserialize>::deserialize_reader(reader).map(Dim::new)
}
}
/// **Requires crate feature `"borsh"`**
impl BorshSerialize for IxDyn {
fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
let elts = self.ix().deref();
// Output length of dimensions.
<usize as BorshSerialize>::serialize(&elts.len(), writer)?;
// Followed by actual data.
for elt in elts {
<Ix as BorshSerialize>::serialize(elt, writer)?;
}
Ok(())
}
}
/// **Requires crate feature `"borsh"`**
impl BorshDeserialize for IxDyn {
fn deserialize_reader<R: borsh::io::Read>(reader: &mut R) -> borsh::io::Result<Self> {
// Deserialize the length.
let len = <usize as BorshDeserialize>::deserialize_reader(reader)?;
// Deserialize the given number of elements. We assume the source is
// trusted so we use a capacity hint...
let mut elts = Vec::with_capacity(len);
for _ix in 0..len {
elts.push(<Ix as BorshDeserialize>::deserialize_reader(reader)?);
}
Ok(elts.into_dimension())
}
}
/// **Requires crate feature `"borsh"`**
impl<A, D, S> BorshSerialize for ArrayBase<S, D>
where
A: BorshSerialize,
D: Dimension + BorshSerialize,
S: Data<Elem = A>,
{
fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
// Dimensions
<D as BorshSerialize>::serialize(&self.raw_dim(), writer)?;
// Followed by length of data
let iter = self.iter();
<usize as BorshSerialize>::serialize(&iter.len(), writer)?;
// Followed by data itself.
for elt in iter {
<A as BorshSerialize>::serialize(elt, writer)?;
}
Ok(())
}
}
/// **Requires crate feature `"borsh"`**
impl<A, D, S> BorshDeserialize for ArrayBase<S, D>
where
A: BorshDeserialize,
D: BorshDeserialize + Dimension,
S: DataOwned<Elem = A>,
{
fn deserialize_reader<R: borsh::io::Read>(reader: &mut R) -> borsh::io::Result<Self> {
// Dimensions
let dim = <D as BorshDeserialize>::deserialize_reader(reader)?;
// Followed by length of data
let len = <usize as BorshDeserialize>::deserialize_reader(reader)?;
// Followed by data itself.
let mut data = Vec::with_capacity(len);
for _ix in 0..len {
data.push(<A as BorshDeserialize>::deserialize_reader(reader)?);
}
ArrayBase::from_shape_vec(dim, data).map_err(|_shape_err| {
borsh::io::Error::new(
borsh::io::ErrorKind::InvalidData,
"data and dimensions must match in size",
)
})
}
}