1use std::ops::{BitAnd, ShrAssign};
2
3use crate::{bit_write::BitWrite, byte_order::ByteOrder};
4use nsw_types::*;
5use num_traits::{ConstOne, ConstZero};
6
7fn bit_write_exts_helper<T, const N: usize, U>(buf: &mut U, mut value: T) -> std::io::Result<()>
8where
9 T: ConstOne + BitAnd<Output = T> + Copy + ShrAssign<u32> + Eq,
10 U: BitWrite + ?Sized,
11{
12 let mut arr = [u1::ZERO; N];
13 let index_offset = N - 1;
14 for i in 0..N {
15 let lsb = value & T::ONE;
16 let bit = if lsb == T::ONE { u1::ONE } else { u1::ZERO };
17 arr[index_offset - i] = bit;
18 value >>= 1;
19 }
20 buf.write_all_bits(&arr)
21}
22
23pub trait BitWriteExts: BitWrite {
25 fn write_bool(&mut self, value: bool) -> std::io::Result<()> {
26 self.write_u1(value.into())
27 }
28
29 fn write_u1(&mut self, value: u1) -> std::io::Result<()> {
30 self.write_all_bits(&[value])
31 }
32
33 fn write_u2(&mut self, value: u2) -> std::io::Result<()> {
34 bit_write_exts_helper::<u2, 2, Self>(self, value)
35 }
36
37 fn write_u3(&mut self, value: u3) -> std::io::Result<()> {
38 bit_write_exts_helper::<u3, 3, Self>(self, value)
39 }
40
41 fn write_u4(&mut self, value: u4) -> std::io::Result<()> {
42 bit_write_exts_helper::<u4, 4, Self>(self, value)
43 }
44
45 fn write_u5(&mut self, value: u5) -> std::io::Result<()> {
46 bit_write_exts_helper::<u5, 5, Self>(self, value)
47 }
48
49 fn write_u6(&mut self, value: u6) -> std::io::Result<()> {
50 bit_write_exts_helper::<u6, 6, Self>(self, value)
51 }
52
53 fn write_u7(&mut self, value: u7) -> std::io::Result<()> {
54 bit_write_exts_helper::<u7, 7, Self>(self, value)
55 }
56
57 fn write_u8(&mut self, value: u8) -> std::io::Result<()> {
58 bit_write_exts_helper::<u8, 8, Self>(self, value)
59 }
60
61 fn write_u9<T: ByteOrder>(&mut self, value: u9) -> std::io::Result<()> {
62 let mut arr = [u1::default(); 9];
63 T::write_u9(&mut arr, value);
64 self.write_all_bits(&arr)
65 }
66
67 fn write_u10<T: ByteOrder>(&mut self, value: u10) -> std::io::Result<()> {
68 let mut arr = [u1::default(); 10];
69 T::write_u10(&mut arr, value);
70 self.write_all_bits(&arr)
71 }
72
73 fn write_u11<T: ByteOrder>(&mut self, value: u11) -> std::io::Result<()> {
74 let mut arr = [u1::default(); 11];
75 T::write_u11(&mut arr, value);
76 self.write_all_bits(&arr)
77 }
78
79 fn write_u12<T: ByteOrder>(&mut self, value: u12) -> std::io::Result<()> {
80 let mut arr = [u1::default(); 12];
81 T::write_u12(&mut arr, value);
82 self.write_all_bits(&arr)
83 }
84
85 fn write_u13<T: ByteOrder>(&mut self, value: u13) -> std::io::Result<()> {
86 let mut arr = [u1::default(); 13];
87 T::write_u13(&mut arr, value);
88 self.write_all_bits(&arr)
89 }
90
91 fn write_u14<T: ByteOrder>(&mut self, value: u14) -> std::io::Result<()> {
92 let mut arr = [u1::default(); 14];
93 T::write_u14(&mut arr, value);
94 self.write_all_bits(&arr)
95 }
96
97 fn write_u15<T: ByteOrder>(&mut self, value: u15) -> std::io::Result<()> {
98 let mut arr = [u1::default(); 15];
99 T::write_u15(&mut arr, value);
100 self.write_all_bits(&arr)
101 }
102
103 fn write_u16<T: ByteOrder>(&mut self, value: u16) -> std::io::Result<()> {
104 let mut arr = [u1::default(); 16];
105 T::write_u16(&mut arr, value);
106 self.write_all_bits(&arr)
107 }
108
109 fn write_u17<T: ByteOrder>(&mut self, value: u17) -> std::io::Result<()> {
110 let mut arr = [u1::default(); 17];
111 T::write_u17(&mut arr, value);
112 self.write_all_bits(&arr)
113 }
114
115 fn write_u18<T: ByteOrder>(&mut self, value: u18) -> std::io::Result<()> {
116 let mut arr = [u1::default(); 18];
117 T::write_u18(&mut arr, value);
118 self.write_all_bits(&arr)
119 }
120
121 fn write_u19<T: ByteOrder>(&mut self, value: u19) -> std::io::Result<()> {
122 let mut arr = [u1::default(); 19];
123 T::write_u19(&mut arr, value);
124 self.write_all_bits(&arr)
125 }
126
127 fn write_u20<T: ByteOrder>(&mut self, value: u20) -> std::io::Result<()> {
128 let mut arr = [u1::default(); 20];
129 T::write_u20(&mut arr, value);
130 self.write_all_bits(&arr)
131 }
132
133 fn write_u21<T: ByteOrder>(&mut self, value: u21) -> std::io::Result<()> {
134 let mut arr = [u1::default(); 21];
135 T::write_u21(&mut arr, value);
136 self.write_all_bits(&arr)
137 }
138
139 fn write_u22<T: ByteOrder>(&mut self, value: u22) -> std::io::Result<()> {
140 let mut arr = [u1::default(); 22];
141 T::write_u22(&mut arr, value);
142 self.write_all_bits(&arr)
143 }
144
145 fn write_u23<T: ByteOrder>(&mut self, value: u23) -> std::io::Result<()> {
146 let mut arr = [u1::default(); 23];
147 T::write_u23(&mut arr, value);
148 self.write_all_bits(&arr)
149 }
150
151 fn write_u24<T: ByteOrder>(&mut self, value: u24) -> std::io::Result<()> {
152 let mut arr = [u1::default(); 24];
153 T::write_u24(&mut arr, value);
154 self.write_all_bits(&arr)
155 }
156
157 fn write_u25<T: ByteOrder>(&mut self, value: u25) -> std::io::Result<()> {
158 let mut arr = [u1::default(); 25];
159 T::write_u25(&mut arr, value);
160 self.write_all_bits(&arr)
161 }
162
163 fn write_u26<T: ByteOrder>(&mut self, value: u26) -> std::io::Result<()> {
164 let mut arr = [u1::default(); 26];
165 T::write_u26(&mut arr, value);
166 self.write_all_bits(&arr)
167 }
168
169 fn write_u27<T: ByteOrder>(&mut self, value: u27) -> std::io::Result<()> {
170 let mut arr = [u1::default(); 27];
171 T::write_u27(&mut arr, value);
172 self.write_all_bits(&arr)
173 }
174
175 fn write_u28<T: ByteOrder>(&mut self, value: u28) -> std::io::Result<()> {
176 let mut arr = [u1::default(); 28];
177 T::write_u28(&mut arr, value);
178 self.write_all_bits(&arr)
179 }
180
181 fn write_u29<T: ByteOrder>(&mut self, value: u29) -> std::io::Result<()> {
182 let mut arr = [u1::default(); 29];
183 T::write_u29(&mut arr, value);
184 self.write_all_bits(&arr)
185 }
186
187 fn write_u30<T: ByteOrder>(&mut self, value: u30) -> std::io::Result<()> {
188 let mut arr = [u1::default(); 30];
189 T::write_u30(&mut arr, value);
190 self.write_all_bits(&arr)
191 }
192
193 fn write_u31<T: ByteOrder>(&mut self, value: u31) -> std::io::Result<()> {
194 let mut arr = [u1::default(); 31];
195 T::write_u31(&mut arr, value);
196 self.write_all_bits(&arr)
197 }
198
199 fn write_u32<T: ByteOrder>(&mut self, value: u32) -> std::io::Result<()> {
200 let mut arr = [u1::default(); 32];
201 T::write_u32(&mut arr, value);
202 self.write_all_bits(&arr)
203 }
204}
205
206impl<T> BitWriteExts for T where T: BitWrite {}