Skip to content

Commit

Permalink
impl From<Box<[u8; _]>> for Bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
MarinPostma committed Sep 23, 2023
1 parent a14ef46 commit 5c7b3f9
Showing 1 changed file with 32 additions and 15 deletions.
47 changes: 32 additions & 15 deletions src/bytes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -851,22 +851,39 @@ impl From<Box<[u8]>> for Bytes {

let len = slice.len();
let ptr = Box::into_raw(slice) as *mut u8;
from_ptr_and_len(ptr, len)
}
}

if ptr as usize & 0x1 == 0 {
let data = ptr_map(ptr, |addr| addr | KIND_VEC);
Bytes {
ptr,
len,
data: AtomicPtr::new(data.cast()),
vtable: &PROMOTABLE_EVEN_VTABLE,
}
} else {
Bytes {
ptr,
len,
data: AtomicPtr::new(ptr.cast()),
vtable: &PROMOTABLE_ODD_VTABLE,
}
impl<const N: usize> From<Box<[u8; N]>> for Bytes {
fn from(slice: Box<[u8; N]>) -> Self {
// Box<[u8]> doesn't contain a heap allocation for empty slices,
// so the pointer isn't aligned enough for the KIND_VEC stashing to
// work.
if slice.is_empty() {
return Bytes::new();
}

let ptr = Box::into_raw(slice) as *mut u8;
from_ptr_and_len(ptr, N)
}
}

fn from_ptr_and_len(ptr: *mut u8, len: usize) -> Bytes {
if ptr as usize & 0x1 == 0 {
let data = ptr_map(ptr, |addr| addr | KIND_VEC);
Bytes {
ptr,
len,
data: AtomicPtr::new(data.cast()),
vtable: &PROMOTABLE_EVEN_VTABLE,
}
} else {
Bytes {
ptr,
len,
data: AtomicPtr::new(ptr.cast()),
vtable: &PROMOTABLE_ODD_VTABLE,
}
}
}
Expand Down

0 comments on commit 5c7b3f9

Please sign in to comment.