use core::ptr::NonNull;
pub(crate) const INLINE_CAP: usize = 23;
pub(crate) const INLINE_LEN_MAX: u8 = (INLINE_CAP - 1) as u8;
#[cfg(target_pointer_width = "64")]
const TAG_HEAP_BIT: usize = 0xFFusize << 56;
#[cfg(target_pointer_width = "64")]
const CAP_MASK: usize = (1usize << 56) - 1;
#[cfg(target_pointer_width = "32")]
const HEAP_TAG_BYTE: u8 = 0xFF;
#[repr(C)]
#[derive(Copy, Clone)]
pub(crate) struct Inline {
pub(crate) data: [u8; INLINE_CAP],
pub(crate) tag: u8,
}
#[cfg(target_pointer_width = "64")]
#[repr(C)]
#[derive(Copy, Clone)]
pub(crate) struct Heap {
pub(crate) ptr: NonNull<u8>,
pub(crate) len: usize,
pub(crate) cap_and_tag: usize,
}
#[cfg(target_pointer_width = "32")]
#[repr(C)]
#[derive(Copy, Clone)]
pub(crate) struct Heap {
pub(crate) ptr: NonNull<u8>,
pub(crate) len: u32,
pub(crate) cap: u32,
pub(crate) _pad: [u8; 11],
pub(crate) tag: u8,
}
impl Heap {
#[cfg(target_pointer_width = "64")]
#[inline]
pub(crate) fn new(ptr: NonNull<u8>, len: usize, cap: usize) -> Self {
debug_assert!(cap <= CAP_MASK, "kevy-bytes: capacity exceeds 56-bit field");
Self { ptr, len, cap_and_tag: TAG_HEAP_BIT | (cap & CAP_MASK) }
}
#[cfg(target_pointer_width = "32")]
#[inline]
pub(crate) fn new(ptr: NonNull<u8>, len: usize, cap: usize) -> Self {
debug_assert!(
len <= u32::MAX as usize && cap <= u32::MAX as usize,
"kevy-bytes: len/cap exceeds u32 on 32-bit platform"
);
Self { ptr, len: len as u32, cap: cap as u32, _pad: [0; 11], tag: HEAP_TAG_BYTE }
}
#[cfg(target_pointer_width = "64")]
#[inline]
pub(crate) fn capacity(&self) -> usize {
self.cap_and_tag & CAP_MASK
}
#[cfg(target_pointer_width = "32")]
#[inline]
pub(crate) fn capacity(&self) -> usize {
self.cap as usize
}
#[cfg(target_pointer_width = "64")]
#[inline]
pub(crate) fn length(&self) -> usize {
self.len
}
#[cfg(target_pointer_width = "32")]
#[inline]
pub(crate) fn length(&self) -> usize {
self.len as usize
}
}