stream_io/standard/reader/
mod.rs

1use 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}