1use std::io::{Write, Read};
8use std::io::Result as IOResult;
9
10pub mod padding;
11pub use padding::{Padding, NoPadding, LengthPadding};
12
13pub struct BitWriter<W, P> where W: Write, P: Padding {
33 inner: W,
34 padder: P,
35 last_byte: u8,
36 last_fill: u8,
37}
38
39
40pub struct BitReader<R, P> where R: Read, P: Padding {
59 padder: P,
60 inner: R,
61 ended: bool,
62 fill: usize,
63 current: u8,
64 buffer: Box<[u8]>,
65 bits_left: usize,
66}
67
68
69impl<W> BitWriter<W, NoPadding> where W: Write {
70 pub fn new(write: W) -> Self {
72 BitWriter::with_padding(write, NoPadding::new())
73 }
74}
75
76impl<W, P> BitWriter<W, P> where W: Write, P: Padding {
77 pub fn with_padding(write: W, padder: P) -> Self {
79 BitWriter {
80 inner: write,
81 padder: padder,
82 last_byte: 0,
83 last_fill: 0,
84 }
85 }
86
87 pub fn write_bit(&mut self, bit: bool) -> IOResult<()> {
92 if bit {
93 let data = 128u8 >> self.last_fill;
94 self.last_byte |= data;
95 }
96
97 self.last_fill += 1;
98 if self.last_fill == 8 {
99 self.inner.write_all(&[self.last_byte])?;
100 self.last_byte = 0;
101 self.last_fill = 0
102 }
103 Ok(())
104 }
105}
106
107impl<W, P> Drop for BitWriter<W, P> where W: Write, P: Padding {
108 fn drop(&mut self) {
109 let _ = self.padder.pad(self.last_byte, self.last_fill, &mut self.inner);
110 }
111}
112
113
114impl<R> BitReader<R, NoPadding> where R: Read {
115 pub fn new(reader: R) -> Self {
117 BitReader::with_padding(reader, NoPadding::new())
118 }
119}
120
121impl<R, P> BitReader<R, P> where R: Read, P: Padding {
122
123 pub fn with_padding(reader: R, padder: P) -> Self {
143 let buf_size = padder.max_size() + 1;
144 let buffer = vec![0; buf_size];
145
146 BitReader {
147 inner: reader,
148 padder: padder,
149 fill: 0,
150 ended: false,
151 buffer: buffer.into_boxed_slice(),
152 current: 0,
153 bits_left: 0,
154 }
155 }
156
157 fn fill_buffer(&mut self) -> IOResult<()> {
158 while !self.ended && self.fill != self.buffer.len() {
159 match self.inner.read(&mut self.buffer[self.fill..]) {
160 Ok(0) => {
161 self.ended = true;
162 let buf_pad_start = if self.fill < self.buffer.len() {
163 0
164 } else {
165 1
166 };
167 self.bits_left = self.padder.bits_left(&self.buffer[buf_pad_start..self.fill])?;
168 }
169 Ok(n) => {
170 self.fill += n;
171 self.bits_left = 8;
172 }
173 Err(e) => return Err(e),
174 }
175 }
176 Ok(())
177 }
178
179 pub fn read_bit(&mut self) -> IOResult<Option<bool>> {
186 self.fill_buffer()?;
187 if self.bits_left == 0 {
188 Ok(None)
189 } else {
190 let res = (self.buffer[0] & (128u8 >> self.current)) == (128u8 >> self.current);
191 self.current += 1;
192 self.bits_left -= 1;
193
194 if self.current == 8 {
195 self.current = 0;
196 self.fill -= 1;
197 unsafe {
198 std::ptr::copy(self.buffer[1..].as_ptr(), self.buffer[..].as_mut_ptr(), self.buffer.len() - 1);
199 }
200 }
201 Ok(Some(res))
202 }
203 }
204}
205
206impl<R, P> Iterator for BitReader<R, P> where R: Read, P: Padding {
207 type Item = bool;
208
209 fn next(&mut self) -> Option<Self::Item> {
210 match self.read_bit() {
211 Ok(opt) => opt,
212 Err(_) => None,
213 }
214 }
215}
216
217#[cfg(test)]
218mod tests {
219 use super::*;
220 use std::io::Cursor;
221
222 #[test]
223 fn test_writer_no_pad() {
224 let mut vec = Vec::new();
225 {
226 let mut bit_writer = BitWriter::new(&mut vec);
227 assert!(bit_writer.write_bit(true).is_ok());
228 assert!(bit_writer.write_bit(true).is_ok());
229 assert!(bit_writer.write_bit(false).is_ok());
230 assert!(bit_writer.write_bit(true).is_ok());
231 assert!(bit_writer.write_bit(true).is_ok());
232 assert!(bit_writer.write_bit(false).is_ok());
233 assert!(bit_writer.write_bit(false).is_ok());
234 assert!(bit_writer.write_bit(true).is_ok());
235 assert!(bit_writer.write_bit(true).is_ok());
236 assert!(bit_writer.write_bit(true).is_ok());
237 }
238 assert_eq!(vec.len(), 2);
239 assert_eq!(vec[0], 217);
240 assert_eq!(vec[1], 192);
241 }
242
243 #[test]
244 fn test_writer_no_pad_empty() {
245 let mut vec = Vec::new();
246 {
247 BitWriter::new(&mut vec);
248 }
249 assert_eq!(vec.len(), 0);
250 }
251
252 #[test]
253 fn test_reader_no_pad() {
254 let mut vec = Cursor::new(vec![200, 192]);
255 let mut bit_reader = BitReader::new(&mut vec);
256 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
257 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
258 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
259 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
260 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
261 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
262 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
263 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
264 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
265 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
266 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
267 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
268 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
269 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
270 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
271 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
272 assert!(bit_reader.read_bit().unwrap().is_none());
273 }
274
275 #[test]
276 fn test_reader_no_pad_empty() {
277 let mut vec = Cursor::new(&[]);
278 let mut bit_reader = BitReader::new(&mut vec);
279 assert!(bit_reader.read_bit().unwrap().is_none());
280 }
281
282 #[test]
283 fn test_writer_length_pad() {
284 let mut vec = Vec::new();
285 {
286 let mut bit_writer = BitWriter::with_padding(&mut vec, LengthPadding::new());
287 assert!(bit_writer.write_bit(true).is_ok());
288 assert!(bit_writer.write_bit(true).is_ok());
289 assert!(bit_writer.write_bit(false).is_ok());
290 assert!(bit_writer.write_bit(true).is_ok());
291 assert!(bit_writer.write_bit(true).is_ok());
292 assert!(bit_writer.write_bit(false).is_ok());
293 assert!(bit_writer.write_bit(false).is_ok());
294 assert!(bit_writer.write_bit(true).is_ok());
295 assert!(bit_writer.write_bit(true).is_ok());
296 assert!(bit_writer.write_bit(true).is_ok());
297 }
298 assert_eq!(vec.len(), 3);
299 assert_eq!(vec[0], 217);
300 assert_eq!(vec[1], 192);
301 assert_eq!(vec[2], 2);
302 }
303
304 #[test]
305 fn test_writer_length_pad_empty() {
306 let mut vec = Vec::new();
307 {
308 BitWriter::with_padding(&mut vec, LengthPadding::new());
309 }
310 assert_eq!(vec.len(), 1);
311 assert_eq!(vec[0], 8);
312 }
313
314 #[test]
315 fn test_write_read_length_pad_empty() {
316 let mut vec = Vec::new();
317 {
318 BitWriter::with_padding(&mut vec, LengthPadding::new());
319 }
320 {
321 let mut cur = Cursor::new(&vec);
322 let mut bit_reader = BitReader::with_padding(&mut cur, LengthPadding::new());
323 assert!(bit_reader.read_bit().unwrap().is_none());
324 }
325 }
326
327 #[test]
328 fn test_write_read_length_pad() {
329 let mut vec = Vec::new();
330 {
331 let mut bit_writer = BitWriter::with_padding(&mut vec, LengthPadding::new());
332 assert!(bit_writer.write_bit(true).is_ok());
333 assert!(bit_writer.write_bit(true).is_ok());
334 assert!(bit_writer.write_bit(false).is_ok());
335 assert!(bit_writer.write_bit(true).is_ok());
336 assert!(bit_writer.write_bit(true).is_ok());
337 assert!(bit_writer.write_bit(false).is_ok());
338 assert!(bit_writer.write_bit(false).is_ok());
339 assert!(bit_writer.write_bit(true).is_ok());
340 assert!(bit_writer.write_bit(true).is_ok());
341 assert!(bit_writer.write_bit(true).is_ok());
342 }
343 {
344 let mut cur = Cursor::new(&vec);
345 let mut bit_reader = BitReader::with_padding(&mut cur, LengthPadding::new());
346 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
347 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
348 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
349 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
350 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
351 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
352 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), false);
353 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
354 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
355 assert_eq!(bit_reader.read_bit().unwrap().unwrap(), true);
356 assert!(bit_reader.read_bit().unwrap().is_none());
357 }
358 }
359}