1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00

simplify stream constructor

This commit is contained in:
Robin Appelman 2019-02-27 16:26:41 +01:00
commit eec0b7a778
4 changed files with 36 additions and 54 deletions

View file

@ -9,32 +9,6 @@ use std::ops::BitOrAssign;
const USIZE_SIZE: usize = size_of::<usize>(); const USIZE_SIZE: usize = size_of::<usize>();
/// Mark source slice as not including padding
pub struct NonPadded;
/// Mark source slice as including padding
pub struct Padded;
/// Determine whether or not the source slice is padded
pub trait IsPadded {
/// Whether or not the slice is padded
fn is_padded() -> bool;
}
impl IsPadded for NonPadded {
#[inline(always)]
fn is_padded() -> bool {
false
}
}
impl IsPadded for Padded {
#[inline(always)]
fn is_padded() -> bool {
true
}
}
/// Buffer that allows reading integers of arbitrary bit length and non byte-aligned integers /// Buffer that allows reading integers of arbitrary bit length and non byte-aligned integers
/// ///
/// # Examples /// # Examples

View file

@ -1,12 +1,26 @@
//! Tools for reading integers of arbitrary bit length and non byte-aligned integers and other data types
//!
//!
//!
//! # Examples
//!
//! ```
//! use bitstream_reader::{BitBuffer, LittleEndian, BitStream};
//!
//! let bytes = vec![
//! 0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
//! 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
//! ];
//! let buffer = BitBuffer::new(bytes, LittleEndian);
//! let stream = BitStream::new(buffer);
#![warn(missing_docs)] #![warn(missing_docs)]
//#![feature(test)] //#![feature(test)]
//! Tools for reading integers of arbitrary bit length and non byte-aligned integers and other data types
// for bench on nightly // for bench on nightly
//extern crate test; //extern crate test;
pub use buffer::{BitBuffer, IsPadded, NonPadded, Padded}; pub use buffer::BitBuffer;
pub use endianness::*; pub use endianness::*;
pub use read::{Read, ReadSized}; pub use read::{Read, ReadSized};
pub use std::string::FromUtf8Error; pub use std::string::FromUtf8Error;

View file

@ -4,7 +4,6 @@ use std::rc::Rc;
use num_traits::{Float, PrimInt}; use num_traits::{Float, PrimInt};
use crate::buffer::IsPadded;
use crate::endianness::Endianness; use crate::endianness::Endianness;
use crate::is_signed::IsSigned; use crate::is_signed::IsSigned;
use crate::BitBuffer; use crate::BitBuffer;
@ -22,7 +21,7 @@ use crate::{Read, ReadError, ReadSized, Result};
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// ``` /// ```
pub struct BitStream<E> pub struct BitStream<E>
where where
@ -55,18 +54,13 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// ``` /// ```
pub fn new(buffer: BitBuffer<E>, start_pos: Option<usize>, bit_len: Option<usize>) -> Self { pub fn new(buffer: BitBuffer<E>) -> Self {
let buffer_len = buffer.bit_len();
let start = start_pos.unwrap_or_default();
if start > buffer_len {
panic!("start_pos out opf bounds of the buffer")
}
BitStream { BitStream {
start_pos: start, start_pos: 0,
pos: start, pos: 0,
bit_len: bit_len.unwrap_or(buffer_len - start), bit_len: buffer.bit_len(),
buffer: Rc::new(buffer), buffer: Rc::new(buffer),
} }
} }
@ -98,7 +92,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.read_bool().unwrap(), true); /// assert_eq!(stream.read_bool().unwrap(), true);
/// assert_eq!(stream.read_bool().unwrap(), false); /// assert_eq!(stream.read_bool().unwrap(), false);
/// assert_eq!(stream.pos(), 2); /// assert_eq!(stream.pos(), 2);
@ -129,7 +123,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.read_int::<u16>(3).unwrap(), 0b101); /// assert_eq!(stream.read_int::<u16>(3).unwrap(), 0b101);
/// assert_eq!(stream.read_int::<u16>(3).unwrap(), 0b110); /// assert_eq!(stream.read_int::<u16>(3).unwrap(), 0b110);
/// assert_eq!(stream.pos(), 6); /// assert_eq!(stream.pos(), 6);
@ -162,7 +156,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// let result = stream.read_float::<f32>().unwrap(); /// let result = stream.read_float::<f32>().unwrap();
/// assert_eq!(stream.pos(), 32); /// assert_eq!(stream.pos(), 32);
/// ``` /// ```
@ -195,7 +189,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.read_bytes(3).unwrap(), &[0b1011_0101, 0b0110_1010, 0b1010_1100]); /// assert_eq!(stream.read_bytes(3).unwrap(), &[0b1011_0101, 0b0110_1010, 0b1010_1100]);
/// assert_eq!(stream.pos(), 24); /// assert_eq!(stream.pos(), 24);
/// ``` /// ```
@ -230,7 +224,7 @@ where
/// 0, 0, 0, 0 /// 0, 0, 0, 0
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// // Fixed length string /// // Fixed length string
/// stream.set_pos(0); /// stream.set_pos(0);
/// assert_eq!(stream.read_string(Some(11)).unwrap(), "Hello world".to_owned()); /// assert_eq!(stream.read_string(Some(11)).unwrap(), "Hello world".to_owned());
@ -270,7 +264,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// let mut bits = stream.read_bits(3).unwrap(); /// let mut bits = stream.read_bits(3).unwrap();
/// assert_eq!(stream.pos(), 3); /// assert_eq!(stream.pos(), 3);
/// assert_eq!(bits.pos(), 0); /// assert_eq!(bits.pos(), 0);
@ -306,7 +300,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// stream.skip(3).unwrap(); /// stream.skip(3).unwrap();
/// assert_eq!(stream.pos(), 3); /// assert_eq!(stream.pos(), 3);
/// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110); /// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110);
@ -333,7 +327,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// stream.set_pos(3).unwrap(); /// stream.set_pos(3).unwrap();
/// assert_eq!(stream.pos(), 3); /// assert_eq!(stream.pos(), 3);
/// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110); /// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110);
@ -361,7 +355,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.bit_len(), 64); /// assert_eq!(stream.bit_len(), 64);
/// ``` /// ```
pub fn bit_len(&self) -> usize { pub fn bit_len(&self) -> usize {
@ -380,7 +374,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.pos(), 0); /// assert_eq!(stream.pos(), 0);
/// stream.skip(5).unwrap(); /// stream.skip(5).unwrap();
/// assert_eq!(stream.pos(), 5); /// assert_eq!(stream.pos(), 5);
@ -401,7 +395,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111 /// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ]; /// ];
/// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian); /// let buffer = BitBuffer::new(bytes.to_vec(), LittleEndian);
/// let mut stream = BitStream::new(buffer, None, None); /// let mut stream = BitStream::new(buffer);
/// assert_eq!(stream.bits_left(), 64); /// assert_eq!(stream.bits_left(), 64);
/// stream.skip(5).unwrap(); /// stream.skip(5).unwrap();
/// assert_eq!(stream.bits_left(), 59); /// assert_eq!(stream.bits_left(), 59);

View file

@ -227,7 +227,7 @@ fn read_f64_le() {
#[test] #[test]
fn read_trait() { fn read_trait() {
let buffer = BitBuffer::new(BYTES.to_vec(), BigEndian); let buffer = BitBuffer::new(BYTES.to_vec(), BigEndian);
let mut stream = BitStream::new(buffer, None, None); let mut stream = BitStream::new(buffer);
let a: u8 = stream.read().unwrap(); let a: u8 = stream.read().unwrap();
assert_eq!(0b1011_0101, a); assert_eq!(0b1011_0101, a);
let b: i8 = stream.read().unwrap(); let b: i8 = stream.read().unwrap();
@ -246,7 +246,7 @@ fn read_trait() {
#[test] #[test]
fn read_sized_trait() { fn read_sized_trait() {
let buffer = BitBuffer::new(BYTES.to_vec(), BigEndian); let buffer = BitBuffer::new(BYTES.to_vec(), BigEndian);
let mut stream = BitStream::new(buffer, None, None); let mut stream = BitStream::new(buffer);
let a: u8 = stream.read_sized(4).unwrap(); let a: u8 = stream.read_sized(4).unwrap();
assert_eq!(0b1011, a); assert_eq!(0b1011, a);
stream.set_pos(0).unwrap(); stream.set_pos(0).unwrap();