mirror of
https://codeberg.org/icewind/bitbuffer.git
synced 2026-06-03 08:34:07 +02:00
dont read unalligned usize
This commit is contained in:
parent
5b89a5940d
commit
8147ae1988
1 changed files with 9 additions and 15 deletions
|
|
@ -103,32 +103,26 @@ where
|
|||
let bit_offset = position & 7;
|
||||
let usize_bit_size = size_of::<usize>() * 8;
|
||||
|
||||
let container = if cfg!(feature = "unsafe") {
|
||||
let bytes: [u8; USIZE_SIZE] = if cfg!(feature = "unsafe") {
|
||||
use std::mem::transmute;
|
||||
// panic instead of accessing out of bounds data when the caller didn't do it's job bounds checking
|
||||
// due to the magic of branch prediction and this check "always" passing, the cost for this
|
||||
// is below the point of being measurable by `cargo bench`
|
||||
assert!(position + count <= self.bit_len());
|
||||
|
||||
let raw_container: &usize = unsafe {
|
||||
unsafe {
|
||||
// this is safe here because we already have checks that we don't read past the slice
|
||||
let ptr = self.bytes.as_ptr().add(byte_index);
|
||||
transmute(ptr)
|
||||
};
|
||||
|
||||
if E::is_le() {
|
||||
usize::from_le(*raw_container)
|
||||
} else {
|
||||
usize::from_be(*raw_container)
|
||||
*transmute::<_, &[u8; USIZE_SIZE]>(ptr)
|
||||
}
|
||||
} else {
|
||||
let bytes = self.read_usize_bytes(byte_index);
|
||||
self.read_usize_bytes(byte_index)
|
||||
};
|
||||
|
||||
if E::is_le() {
|
||||
usize::from_le_bytes(bytes)
|
||||
} else {
|
||||
usize::from_be_bytes(bytes)
|
||||
}
|
||||
let container = if E::is_le() {
|
||||
usize::from_le_bytes(bytes)
|
||||
} else {
|
||||
usize::from_be_bytes(bytes)
|
||||
};
|
||||
|
||||
let shifted = if E::is_le() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue