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
use {Parcel, Error, TryFromIntError, Settings};
use types::Integer;
use std::io::prelude::*;
pub type SizeType = u32;
pub fn read_string(byte_count: usize,
read: &mut Read,
settings: &Settings)
-> Result<String, Error> {
let bytes: Vec<u8> = read_items(byte_count, read, settings)?.collect();
String::from_utf8(bytes).map_err(Into::into)
}
pub fn read_items<T>(item_count: usize,
read: &mut Read,
settings: &Settings)
-> Result<impl Iterator<Item=T>, Error>
where T: Parcel {
let mut elements = Vec::with_capacity(item_count);
for _ in 0..item_count {
let element = T::read(read, settings)?;
elements.push(element);
}
Ok(elements.into_iter())
}
pub fn write_items<'a,T>(write: &mut Write,
items: impl IntoIterator<Item=&'a T>,
settings: &Settings)
-> Result<(), Error>
where T: Parcel + 'a {
for item in items.into_iter() {
item.write(write, settings)?;
}
Ok(())
}
pub fn read_list<T>(read: &mut Read,
settings: &Settings)
-> Result<Vec<T>, Error>
where T: Parcel {
self::read_list_ext::<SizeType, T>(read, settings)
}
pub fn write_list<'a,T,I>(write: &mut Write,
elements: I,
settings: &Settings)
-> Result<(), Error>
where T: Parcel+'a,
I: IntoIterator<Item=&'a T> {
self::write_list_ext::<SizeType, T, I>(write, elements, settings)
}
pub fn read_list_ext<S,T>(read: &mut Read,
settings: &Settings)
-> Result<Vec<T>, Error>
where S: Integer,
T: Parcel {
let size = S::read(read, settings)?;
let size: usize = size.to_usize().ok_or(TryFromIntError{ })?;
read_items(size, read, settings).map(|i| i.collect())
}
pub fn write_list_ext<'a,S,T,I>(write: &mut Write,
elements: I,
settings: &Settings)
-> Result<(), Error>
where S: Integer,
T: Parcel+'a,
I: IntoIterator<Item=&'a T> {
let elements: Vec<_> = elements.into_iter().collect();
let length = S::from_usize(elements.len()).ok_or(TryFromIntError{ })?;
length.write(write, settings)?;
write_items(write, elements.into_iter(), settings)?;
Ok(())
}