1use std::io::{Read, Result, Write};
2
3pub trait ReadExt: Read {
5 fn read_u8(&mut self) -> Result<u8> {
6 let mut buf = [0u8; 1];
7 self.read_exact(&mut buf)?;
8 Ok(buf[0])
9 }
10
11 fn read_u16_le(&mut self) -> Result<u16> {
12 let mut buf = [0u8; 2];
13 self.read_exact(&mut buf)?;
14 Ok(u16::from_le_bytes(buf))
15 }
16
17 fn read_u32_le(&mut self) -> Result<u32> {
18 let mut buf = [0u8; 4];
19 self.read_exact(&mut buf)?;
20 Ok(u32::from_le_bytes(buf))
21 }
22
23 fn read_u64_le(&mut self) -> Result<u64> {
24 let mut buf = [0u8; 8];
25 self.read_exact(&mut buf)?;
26 Ok(u64::from_le_bytes(buf))
27 }
28
29 fn read_i8(&mut self) -> Result<i8> {
30 let mut buf = [0u8; 1];
31 self.read_exact(&mut buf)?;
32 Ok(i8::from_le_bytes(buf))
33 }
34
35 fn read_i16_le(&mut self) -> Result<i16> {
36 let mut buf = [0u8; 2];
37 self.read_exact(&mut buf)?;
38 Ok(i16::from_le_bytes(buf))
39 }
40
41 fn read_i32_le(&mut self) -> Result<i32> {
42 let mut buf = [0u8; 4];
43 self.read_exact(&mut buf)?;
44 Ok(i32::from_le_bytes(buf))
45 }
46
47 fn read_i64_le(&mut self) -> Result<i64> {
48 let mut buf = [0u8; 8];
49 self.read_exact(&mut buf)?;
50 Ok(i64::from_le_bytes(buf))
51 }
52
53 fn read_f32_le(&mut self) -> Result<f32> {
54 let mut buf = [0u8; 4];
55 self.read_exact(&mut buf)?;
56 Ok(f32::from_le_bytes(buf))
57 }
58
59 fn read_f64_le(&mut self) -> Result<f64> {
60 let mut buf = [0u8; 8];
61 self.read_exact(&mut buf)?;
62 Ok(f64::from_le_bytes(buf))
63 }
64}
65
66pub trait WriteExt: Write {
68 fn write_u8(&mut self, n: u8) -> Result<()> {
69 self.write_all(&[n])
70 }
71
72 fn write_u16_le(&mut self, n: u16) -> Result<()> {
73 self.write_all(&n.to_le_bytes())
74 }
75
76 fn write_u32_le(&mut self, n: u32) -> Result<()> {
77 self.write_all(&n.to_le_bytes())
78 }
79
80 fn write_u64_le(&mut self, n: u64) -> Result<()> {
81 self.write_all(&n.to_le_bytes())
82 }
83
84 fn write_i8(&mut self, n: i8) -> Result<()> {
85 self.write_all(&n.to_le_bytes())
86 }
87
88 fn write_i16_le(&mut self, n: i16) -> Result<()> {
89 self.write_all(&n.to_le_bytes())
90 }
91
92 fn write_i32_le(&mut self, n: i32) -> Result<()> {
93 self.write_all(&n.to_le_bytes())
94 }
95
96 fn write_i64_le(&mut self, n: i64) -> Result<()> {
97 self.write_all(&n.to_le_bytes())
98 }
99
100 fn write_f32_le(&mut self, n: f32) -> Result<()> {
101 self.write_all(&n.to_le_bytes())
102 }
103
104 fn write_f64_le(&mut self, n: f64) -> Result<()> {
105 self.write_all(&n.to_le_bytes())
106 }
107}
108
109impl<R: Read + ?Sized> ReadExt for R {}
111impl<W: Write + ?Sized> WriteExt for W {}