#[inline(always)] pubfn bytes_remaining(&self) -> usize { self.end as usize - self.ptr as usize
}
#[inline(always)] pubfn need_bits(&mutself, n: usize) -> Result<(), ReturnCode> { while (self.bits_used as usize) < n { self.pull_byte()?;
}
Ok(())
}
/// Remove zero to seven bits as needed to go to a byte boundary #[inline(always)] pubfn next_byte_boundary(&mutself) { self.bit_buffer >>= self.bits_used & 0b0111; self.bits_used -= self.bits_used & 0b0111;
}
// the trick of this function is that the read can happen concurrently // with the arithmetic below. That makes the read effectively free. let read = unsafe { core::ptr::read_unaligned(self.ptr.cast::<u64>()) }.to_le(); let next_bit_buffer = self.bit_buffer | read << self.bits_used;
let increment = (63 - self.bits_used) >> 3; self.ptr = self.ptr.wrapping_add(increment as usize); self.bits_used |= 56;
let result = f(self.bit_buffer);
self.bit_buffer = next_bit_buffer;
result
}
#[inline(always)] pubfn bits(&mutself, n: usize) -> u64 { // debug_assert!( n <= self.bits_used, "{n} bits requested, but only {} avaliable", self.bits_used);
#[inline(always)] pubfn prime(&mutself, bits: u8, value: u64) { let value = value & ((1 << bits) - 1); self.bit_buffer += value << self.bits_used; self.bits_used += bits;
}
#[inline(always)] pubfn return_unused_bytes(&mutself) { let len = self.bits_used >> 3; self.ptr = unsafe { self.ptr.sub(len as usize) }; self.bits_used -= len << 3; self.bit_buffer &= (1u64 << self.bits_used) - 1u64;
assert!(self.bits_used <= 32);
}
}
#[cfg(feature = "std")] impl std::io::Read for BitReader<'_> { fn read(&mutself, buf: &mut [u8]) -> std::io::Result<usize> {
assert_eq!(self.bits_used, 0, "bit buffer not cleared before read");
let number_of_bytes = Ord::min(buf.len(), self.bytes_remaining());
// safety: `buf` is a mutable (exclusive) reference, so it cannot overlap the memory that // the reader contains unsafe { core::ptr::copy_nonoverlapping(self.ptr, buf.as_mut_ptr(), number_of_bytes) }
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.