Skip to main content

BitWriter

Struct BitWriter 

Source
pub struct BitWriter<'a> { /* private fields */ }
Expand description

Writes packed bits to a caller-supplied byte slice, most-significant-bit first.

Every bit inside the prefix reported by BitWriter::finish is written explicitly: field bits by BitWriter::write_bits, padding bits as zero by BitWriter::align_to_byte and BitWriter::finish. A reused buffer holding stale data therefore produces the same output as a zeroed one. Bytes past that prefix are left untouched.

§Example

use wire_codec::BitWriter;

let mut storage = [0u8; 1];
let mut w = BitWriter::new(&mut storage);
w.write_bits(0b101, 3).unwrap();
w.write_bits(0b01100, 5).unwrap();
assert_eq!(w.finish(), 1);
assert_eq!(storage[0], 0xAC);

Implementations§

Source§

impl<'a> BitWriter<'a>

Source

pub fn new(bytes: &'a mut [u8]) -> Self

Wrap bytes in a new bit cursor. Existing contents of bytes are overwritten as bits are written.

Source

pub fn bits_written(&self) -> usize

Number of bits written so far.

Source

pub fn align_to_byte(&mut self) -> Result<()>

Pad the cursor with zero bits up to the next byte boundary.

Has no effect when the cursor is already byte-aligned.

§Errors

Never fails in practice: a partially written byte always lies inside the backing slice, so rounding up to its end cannot run out of room. The Result return type is kept for API stability.

Source

pub fn write_bits(&mut self, value: u64, n: u32) -> Result<()>

Write the low n bits of value into the buffer.

§Errors
Source

pub fn write_bool(&mut self, value: bool) -> Result<()>

Write one bit: 1 for true, 0 for false.

§Errors

Returns Error::BufferFull if no bits remain in the buffer.

§Example
use wire_codec::BitWriter;

let mut storage = [0u8; 1];
let mut w = BitWriter::new(&mut storage);
w.write_bool(true).unwrap();
w.write_bool(false).unwrap();
w.write_bool(true).unwrap();
assert_eq!(w.finish(), 1);
assert_eq!(storage[0], 0b1010_0000);
Source

pub fn write_signed_bits(&mut self, value: i64, n: u32) -> Result<()>

Write value as an n-bit two’s-complement field.

§Errors
§Example
use wire_codec::{BitReader, BitWriter, Error};

let mut storage = [0u8; 1];
let mut w = BitWriter::new(&mut storage);
w.write_signed_bits(-3, 3).unwrap();
assert_eq!(w.write_signed_bits(4, 3), Err(Error::BitOverflow));
assert_eq!(w.finish(), 1);
assert_eq!(BitReader::new(&storage).read_signed_bits(3).unwrap(), -3);
Source

pub fn finish(self) -> usize

Finalize writes and return the number of whole bytes consumed.

A partially-filled trailing byte counts as one full byte, and its remaining low-order bits are cleared to zero.

Trait Implementations§

Source§

impl<'a> Debug for BitWriter<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> !UnwindSafe for BitWriter<'a>

§

impl<'a> Forget for BitWriter<'a>

§

impl<'a> Freeze for BitWriter<'a>

§

impl<'a> Move for BitWriter<'a>

§

impl<'a> RefUnwindSafe for BitWriter<'a>

§

impl<'a> Send for BitWriter<'a>

§

impl<'a> Sync for BitWriter<'a>

§

impl<'a> Unpin for BitWriter<'a>

§

impl<'a> UnsafeUnpin for BitWriter<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.