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>();
/// 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
///
/// # 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)]
//#![feature(test)]
//! Tools for reading integers of arbitrary bit length and non byte-aligned integers and other data types
// for bench on nightly
//extern crate test;
pub use buffer::{BitBuffer, IsPadded, NonPadded, Padded};
pub use buffer::BitBuffer;
pub use endianness::*;
pub use read::{Read, ReadSized};
pub use std::string::FromUtf8Error;

View file

@ -4,7 +4,6 @@ use std::rc::Rc;
use num_traits::{Float, PrimInt};
use crate::buffer::IsPadded;
use crate::endianness::Endianness;
use crate::is_signed::IsSigned;
use crate::BitBuffer;
@ -22,7 +21,7 @@ use crate::{Read, ReadError, ReadSized, Result};
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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>
where
@ -55,18 +54,13 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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 {
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")
}
pub fn new(buffer: BitBuffer<E>) -> Self {
BitStream {
start_pos: start,
pos: start,
bit_len: bit_len.unwrap_or(buffer_len - start),
start_pos: 0,
pos: 0,
bit_len: buffer.bit_len(),
buffer: Rc::new(buffer),
}
}
@ -98,7 +92,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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(), false);
/// assert_eq!(stream.pos(), 2);
@ -129,7 +123,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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(), 0b110);
/// assert_eq!(stream.pos(), 6);
@ -162,7 +156,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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();
/// assert_eq!(stream.pos(), 32);
/// ```
@ -195,7 +189,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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.pos(), 24);
/// ```
@ -230,7 +224,7 @@ where
/// 0, 0, 0, 0
/// ];
/// 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
/// stream.set_pos(0);
/// 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
/// ];
/// 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();
/// assert_eq!(stream.pos(), 3);
/// assert_eq!(bits.pos(), 0);
@ -306,7 +300,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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();
/// assert_eq!(stream.pos(), 3);
/// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110);
@ -333,7 +327,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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();
/// assert_eq!(stream.pos(), 3);
/// assert_eq!(stream.read_int::<u8>(3).unwrap(), 0b110);
@ -361,7 +355,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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);
/// ```
pub fn bit_len(&self) -> usize {
@ -380,7 +374,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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);
/// stream.skip(5).unwrap();
/// assert_eq!(stream.pos(), 5);
@ -401,7 +395,7 @@ where
/// 0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
/// ];
/// 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);
/// stream.skip(5).unwrap();
/// assert_eq!(stream.bits_left(), 59);

View file

@ -227,7 +227,7 @@ fn read_f64_le() {
#[test]
fn read_trait() {
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();
assert_eq!(0b1011_0101, a);
let b: i8 = stream.read().unwrap();
@ -246,7 +246,7 @@ fn read_trait() {
#[test]
fn read_sized_trait() {
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();
assert_eq!(0b1011, a);
stream.set_pos(0).unwrap();