bits_io/
bit_write_exts.rs

1use crate::{bit_write::BitWrite, byte_order::ByteOrder, prelude::*};
2use nsw_types::*;
3
4#[allow(non_snake_case)]
5fn write_uN<B: ByteOrder, const N: usize, W: BitWrite + ?Sized>(
6    writer: &mut W,
7    value: u32,
8) -> std::io::Result<()> {
9    let mut tmp = BitVec::repeat(false, N);
10    B::write_u32_to_bits(tmp.as_mut_bitslice(), value);
11    writer.write_all_bits(tmp.as_bitslice())
12}
13
14/// A trait which extends BitWrite to add explicit write methods for non-standard-width types.
15pub trait BitWriteExts: BitWrite {
16    fn write_bool(&mut self, value: bool) -> std::io::Result<()> {
17        self.write_u1(value.into())
18    }
19
20    fn write_u1(&mut self, value: u1) -> std::io::Result<()> {
21        write_uN::<BigEndian, 1, _>(self, value.into())
22    }
23
24    fn write_u2(&mut self, value: u2) -> std::io::Result<()> {
25        write_uN::<BigEndian, 2, _>(self, value.into())
26    }
27
28    fn write_u3(&mut self, value: u3) -> std::io::Result<()> {
29        write_uN::<BigEndian, 3, _>(self, value.into())
30    }
31
32    fn write_u4(&mut self, value: u4) -> std::io::Result<()> {
33        write_uN::<BigEndian, 4, _>(self, value.into())
34    }
35
36    fn write_u5(&mut self, value: u5) -> std::io::Result<()> {
37        write_uN::<BigEndian, 5, _>(self, value.into())
38    }
39
40    fn write_u6(&mut self, value: u6) -> std::io::Result<()> {
41        write_uN::<BigEndian, 6, _>(self, value.into())
42    }
43
44    fn write_u7(&mut self, value: u7) -> std::io::Result<()> {
45        write_uN::<BigEndian, 7, _>(self, value.into())
46    }
47
48    fn write_u8(&mut self, value: u8) -> std::io::Result<()> {
49        write_uN::<BigEndian, 8, _>(self, value.into())
50    }
51
52    fn write_u9<B: ByteOrder>(&mut self, value: u9) -> std::io::Result<()> {
53        write_uN::<B, 9, _>(self, value.into())
54    }
55
56    fn write_u10<B: ByteOrder>(&mut self, value: u10) -> std::io::Result<()> {
57        write_uN::<B, 10, _>(self, value.into())
58    }
59
60    fn write_u11<B: ByteOrder>(&mut self, value: u11) -> std::io::Result<()> {
61        write_uN::<B, 11, _>(self, value.into())
62    }
63
64    fn write_u12<B: ByteOrder>(&mut self, value: u12) -> std::io::Result<()> {
65        write_uN::<B, 12, _>(self, value.into())
66    }
67
68    fn write_u13<B: ByteOrder>(&mut self, value: u13) -> std::io::Result<()> {
69        write_uN::<B, 13, _>(self, value.into())
70    }
71
72    fn write_u14<B: ByteOrder>(&mut self, value: u14) -> std::io::Result<()> {
73        write_uN::<B, 14, _>(self, value.into())
74    }
75
76    fn write_u15<B: ByteOrder>(&mut self, value: u15) -> std::io::Result<()> {
77        write_uN::<B, 15, _>(self, value.into())
78    }
79
80    fn write_u16<B: ByteOrder>(&mut self, value: u16) -> std::io::Result<()> {
81        write_uN::<B, 16, _>(self, value.into())
82    }
83
84    fn write_u17<B: ByteOrder>(&mut self, value: u17) -> std::io::Result<()> {
85        write_uN::<B, 17, _>(self, value.into())
86    }
87
88    fn write_u18<B: ByteOrder>(&mut self, value: u18) -> std::io::Result<()> {
89        write_uN::<B, 18, _>(self, value.into())
90    }
91
92    fn write_u19<B: ByteOrder>(&mut self, value: u19) -> std::io::Result<()> {
93        write_uN::<B, 19, _>(self, value.into())
94    }
95
96    fn write_u20<B: ByteOrder>(&mut self, value: u20) -> std::io::Result<()> {
97        write_uN::<B, 20, _>(self, value.into())
98    }
99
100    fn write_u21<B: ByteOrder>(&mut self, value: u21) -> std::io::Result<()> {
101        write_uN::<B, 21, _>(self, value.into())
102    }
103
104    fn write_u22<B: ByteOrder>(&mut self, value: u22) -> std::io::Result<()> {
105        write_uN::<B, 22, _>(self, value.into())
106    }
107
108    fn write_u23<B: ByteOrder>(&mut self, value: u23) -> std::io::Result<()> {
109        write_uN::<B, 23, _>(self, value.into())
110    }
111
112    fn write_u24<B: ByteOrder>(&mut self, value: u24) -> std::io::Result<()> {
113        write_uN::<B, 24, _>(self, value.into())
114    }
115
116    fn write_u25<B: ByteOrder>(&mut self, value: u25) -> std::io::Result<()> {
117        write_uN::<B, 25, _>(self, value.into())
118    }
119
120    fn write_u26<B: ByteOrder>(&mut self, value: u26) -> std::io::Result<()> {
121        write_uN::<B, 26, _>(self, value.into())
122    }
123
124    fn write_u27<B: ByteOrder>(&mut self, value: u27) -> std::io::Result<()> {
125        write_uN::<B, 27, _>(self, value.into())
126    }
127
128    fn write_u28<B: ByteOrder>(&mut self, value: u28) -> std::io::Result<()> {
129        write_uN::<B, 28, _>(self, value.into())
130    }
131
132    fn write_u29<B: ByteOrder>(&mut self, value: u29) -> std::io::Result<()> {
133        write_uN::<B, 29, _>(self, value.into())
134    }
135
136    fn write_u30<B: ByteOrder>(&mut self, value: u30) -> std::io::Result<()> {
137        write_uN::<B, 30, _>(self, value.into())
138    }
139
140    fn write_u31<B: ByteOrder>(&mut self, value: u31) -> std::io::Result<()> {
141        write_uN::<B, 31, _>(self, value.into())
142    }
143
144    fn write_u32<B: ByteOrder>(&mut self, value: u32) -> std::io::Result<()> {
145        write_uN::<B, 32, _>(self, value)
146    }
147}
148
149impl<T> BitWriteExts for T where T: BitWrite + ?Sized {}