mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 08:34:07 +02:00
simplify stream constructor
This commit is contained in:
parent
eee2cf5c43
commit
eec0b7a778
4 changed files with 36 additions and 54 deletions
|
|
@ -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
|
||||
|
|
|
|||
20
src/lib.rs
20
src/lib.rs
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue