bitstream/
lib.rs

1//! **bitstream** is a crate for dealing with single bit input and output
2//!
3//! This crate provides a writer that can write single bits to an
4//! underlying Write implementation, and read them back using a reader
5//! implementation.
6
7use std::io::{Write, Read};
8use std::io::Result as IOResult;
9
10pub mod padding;
11pub use padding::{Padding, NoPadding, LengthPadding};
12
13/// **BitWriter** is a writer for single bit values
14///
15/// Bits will be grouped to a single byte before writing to the inner writer.
16/// The first Bit will be the most significant bit of the byte.
17///
18/// When dropping this writer, any remaining bits will be written according to the padding used.
19/// The default padding is [NoPadding](struct.NoPadding.html)
20///
21/// # Examples
22///
23/// ```
24/// extern crate bitstream;
25///
26/// let vec = Vec::new();
27/// let mut bit_writer = bitstream::BitWriter::new(vec);
28///
29/// assert!(bit_writer.write_bit(true).is_ok());
30/// assert!(bit_writer.write_bit(false).is_ok());
31/// ```
32pub 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
40/// **BitReader** is a reader for single bit values
41///
42/// This reader expects the last byte in the input to contain the number of significant bits in the
43/// second to last byte. This is the same format produced by [BitWriter]
44///
45/// # Examples
46/// ```
47/// extern crate bitstream;
48/// use std::io::Cursor;
49///
50/// let vec = vec![192, 2];
51/// let mut bit_reader = bitstream::BitReader::new(Cursor::new(vec));
52/// let first_read = bit_reader.read_bit();
53/// assert!(first_read.is_ok());
54/// let option = first_read.unwrap();
55/// assert!(option.is_some());
56/// assert!(option.unwrap());
57/// ```
58pub 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    /// Create a new BitWriter with no padding, writing to the inner writer.
71    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    /// Create a new BitWriter with the given padding
78    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    /// Write a single bit to the inner writer.
88    ///
89    /// # Failures
90    /// Returns an error if the inner writer returns an error
91    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    /// Create a new BitReader, with no padding, reading from the inner reader.
116    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    /// Create a new BitReader, using the supplied padding.
124    ///
125    /// This can be used to supply a custom padding to the bit reader.
126    ///
127    /// # Examples
128    /// ```
129    /// extern crate bitstream;
130    /// use std::io::Cursor;
131    ///
132    /// let vec = vec![192, 2];
133    /// let mut bit_reader = bitstream::BitReader::with_padding(Cursor::new(vec),
134    ///                                                         bitstream::LengthPadding::new());
135    /// let _ = bit_reader.read_bit();
136    /// let _ = bit_reader.read_bit();
137    /// let last = bit_reader.read_bit();
138    /// assert!(last.is_ok());
139    /// /// None indicates there is nothing left to read
140    /// assert!(last.unwrap().is_none());
141    /// ```
142    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    /// Read a single bit.
180    ///
181    /// End of stream is signaled by returning  `Ok(None)`
182    ///
183    /// # Failures
184    /// Will return an error if the inner reader returns one
185    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}