1use error::*;
2use formatter::*;
3use util;
4
5use std::io::Seek;
6use byteorder::{ReadBytesExt, WriteBytesExt};
7use std::borrow::Cow;
8
9fn try_deserialize<R, A>(s: &mut R, n: i32, v: &mut Vec<A>, offset: &mut u64) -> ZeroFormatterResult<()>
10 where R: Seek + ReadBytesExt + WriteBytesExt + Formatter<A> {
11 if n < 0 {
12 Ok(())
13 } else {
14 let a = try!(s.deserialize(offset));
15 v.push(a);
16 try_deserialize(s, n - 1, v, offset)
17 }
18}
19
20impl<'a, R, A: Clone> Formatter<Cow<'a, [A]>> for R
21 where R: Seek + ReadBytesExt + WriteBytesExt + Formatter<A> + Formatter<i32> {
22
23 fn serialize(&mut self, offset: u64, value: Cow<'a, [A]>) -> ZeroFormatterResult<i32> {
24 let v: Vec<A> = value.into_owned();
25 let lr = try!(self.serialize(offset, v.len() as i32));
26 let byte_size = try!(v.iter().fold(
27 Ok(lr),
28 |b, a| {
29 b.and_then(|bs| {
30 self.serialize(offset + (bs as u64), a.clone())
31 .map(|s| bs + s)
32 })
33 }
34 ));
35 Ok(byte_size as i32)
36 }
37
38 fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<Cow<'a, [A]>> {
39 let l: i32 = try!(util::check_non_null(self, offset));
40 let mut v: Vec<A> = Vec::with_capacity(l as usize);
41 try!(try_deserialize(self, l - 1, &mut v, offset));
42 Ok(Cow::from(v))
43 }
44}
45
46#[cfg(test)]
47mod tests {
48
49 use std::io::Cursor;
50 use std::borrow::Cow;
51 use std::io::{Seek, SeekFrom};
52 use error::*;
53 use formatter::*;
54 use util;
55
56 #[test]
57 fn serialize_vec() {
58 let mut wtr = Cursor::new(Vec::new());
59 assert_eq!(wtr.serialize(0, Cow::from(vec![1i32, 2i32, 3i32])).unwrap(), 16);
60 assert_eq!(wtr.into_inner(), vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
61 }
62
63 #[test]
64 fn deserialize_vec() {
65 let mut rdr = Cursor::new(vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
66 let mut offset = 0;
67 let actual: Cow<'static, [i32]> = rdr.deserialize(&mut offset).unwrap();
68 assert_eq!(offset, 16);
69 assert_eq!(Cow::from(vec![1, 2, 3]), actual);
70 }
71
72 struct_formatter! {
73 #[target(Cursor<Vec<u8>>)]
74 S {
75 a: i32
76 }
77 }
78
79 #[test]
80 fn serialize_vec_struct() {
81 let mut wtr = Cursor::new(Vec::new());
82 assert_eq!(wtr.serialize(0, Cow::from(vec![S{a: 1}, S{a: 2}, S{a: 3}])).unwrap(), 16);
83 assert_eq!(wtr.into_inner(), vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
84 }
85
86 #[test]
87 fn deserialize_vec_struct() {
88 let mut rdr = Cursor::new(vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
89 let mut offset = 0;
90 let actual: Cow<'static, [S]> = rdr.deserialize(&mut offset).unwrap();
91 assert_eq!(offset, 16);
92 assert_eq!(Cow::from(vec![S{a: 1}, S{a: 2}, S{a: 3}]), actual);
93 }
94
95 object_formatter! {
96 #[target(Cursor<Vec<u8>>)]
97 O {
98 0; a: i32
99 }
100 }
101
102 #[test]
103 fn serialize_vec_object() {
104 let mut wtr = Cursor::new(Vec::new());
105 assert_eq!(wtr.serialize(0, Cow::from(vec![O{a: 1}, O{a: 2}, O{a: 3}])).unwrap(), 52);
106 let expected = vec![
107 3, 0, 0, 0,
108
109 16, 0, 0, 0,
110 0, 0, 0, 0,
111 16, 0, 0, 0,
112 1, 0, 0, 0,
113
114 16, 0, 0, 0,
115 0, 0, 0, 0,
116 32, 0, 0, 0,
117 2, 0, 0, 0,
118
119 16, 0, 0, 0,
120 0, 0, 0, 0,
121 48, 0, 0, 0,
122 3, 0, 0, 0,
123 ];
124 assert_eq!(wtr.into_inner(), expected);
125 }
126
127 #[test]
128 fn deserialize_vec_object() {
129 let mut rdr = Cursor::new(vec![
130 3, 0, 0, 0,
131
132 16, 0, 0, 0,
133 0, 0, 0, 0,
134 16, 0, 0, 0,
135 1, 0, 0, 0,
136
137 16, 0, 0, 0,
138 0, 0, 0, 0,
139 32, 0, 0, 0,
140 2, 0, 0, 0,
141
142 16, 0, 0, 0,
143 0, 0, 0, 0,
144 48, 0, 0, 0,
145 3, 0, 0, 0,
146 ]);
147 let mut offset = 0;
148 let actual: Cow<'static, [O]> = rdr.deserialize(&mut offset).unwrap();
149 assert_eq!(offset, 52);
150 assert_eq!(Cow::from(vec![O{a: 1}, O{a: 2}, O{a: 3}]), actual);
151 }
152}