bit_cursor/
bit_write_exts.rs

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
23/// A trait which extends BitWrite to add explicit write methods for non-standard-width types.
24pub 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 {}