stream_io/standard/reader/
mod.rs1use concat_idents::concat_idents;
2
3use super::*;
4
5impl StreamReader for () {
6 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
7 Ok(())
8 }
9}
10
11impl StreamReader for bool {
12 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
13 match buffer.read_u8()? {
14 0 => Ok(true),
15 _ => Ok(false),
16 }
17 }
18}
19
20impl StreamReader for u8 {
21 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
22 buffer.read_u8()
23 }
24}
25
26impl StreamReader for i8 {
27 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
28 buffer.read_i8()
29 }
30}
31
32macro_rules! r_number {
33 ($($t:ty),*) => {
34 $(
35 impl StreamReader for $t {
36 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
37 concat_idents!(read_fn = read_, $t {
38 match order {
39 ByteOrder::BigEndian => buffer.read_fn::<BigEndian>(),
40 ByteOrder::LittleEndian => buffer.read_fn::<LittleEndian>(),
41 }
42 })
43 }
44 }
45 )*
46 };
47}
48
49r_number![u16, u32, u64, u128];
50r_number![i16, i32, i64, i128];
51r_number![f32, f64];
52
53impl<T> StreamReader for Vec<T>
54where
55 T: StreamReader,
56{
57 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
58 let mut out = <Vec<T>>::with_capacity(u32::read_from(buffer, order)? as usize);
59 for _ in 0..out.capacity() {
60 out.push(T::read_from(buffer, order)?);
61 }
62 Ok(out)
63 }
64}
65
66impl<T> StreamReader for VecDeque<T>
67where
68 T: StreamReader,
69{
70 fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
71 let mut out = <VecDeque<T>>::with_capacity(u32::read_from(buffer, order)? as usize);
72 for _ in 0..out.capacity() {
73 out.push_back(T::read_from(buffer, order)?);
74 }
75 Ok(out)
76 }
77}