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
use serialize::{Encodable, Encoder, Decodable, Decoder};
use super::arraytraits::ARRAY_FORMAT_VERSION;
use imp_prelude::*;
impl<I> Encodable for Dim<I>
where I: Encodable,
{
fn encode<E: Encoder>(&self, s: &mut E) -> Result<(), E::Error> {
self.ix().encode(s)
}
}
impl<I> Decodable for Dim<I>
where I: Decodable,
{
fn decode<E: Decoder>(d: &mut E) -> Result<Self, E::Error> {
I::decode(d).map(Dim::new)
}
}
impl<A, S, D> Encodable for ArrayBase<S, D>
where A: Encodable,
D: Dimension + Encodable,
S: Data<Elem = A>
{
fn encode<E: Encoder>(&self, s: &mut E) -> Result<(), E::Error> {
s.emit_struct("Array", 3, |e| {
try!(e.emit_struct_field("v", 0, |e| ARRAY_FORMAT_VERSION.encode(e)));
try!(e.emit_struct_field("dim", 1, |e| self.dim.encode(e)));
try!(e.emit_struct_field("data", 2, |e| {
let sz = self.dim.size();
e.emit_seq(sz, |e| {
for (i, elt) in self.iter().enumerate() {
try!(e.emit_seq_elt(i, |e| elt.encode(e)))
}
Ok(())
})
}));
Ok(())
})
}
}
impl<A, S, D> Decodable for ArrayBase<S, D>
where A: Decodable,
D: Dimension + Decodable,
S: DataOwned<Elem = A>
{
fn decode<E: Decoder>(d: &mut E) -> Result<Self, E::Error> {
d.read_struct("Array", 3, |d| {
let version: u8 = try!(d.read_struct_field("v", 0, Decodable::decode));
if version > ARRAY_FORMAT_VERSION {
return Err(d.error("unknown array version"))
}
let dim: D = try!(d.read_struct_field("dim", 1, |d| {
Decodable::decode(d)
}));
let elements = try!(
d.read_struct_field("data", 2, |d| {
d.read_seq(|d, len| {
if len != dim.size() {
Err(d.error("data and dimension must match in size"))
} else {
let mut elements = Vec::with_capacity(len);
for i in 0..len {
elements.push(try!(d.read_seq_elt::<A, _>(i, Decodable::decode)))
}
Ok(elements)
}
})
}));
unsafe {
Ok(ArrayBase::from_shape_vec_unchecked(dim, elements))
}
})
}
}