use std::alloc::Layout;
use allocative::Allocative;
use crate::values::layout::aligned_size::AlignedSize;
use crate::values::layout::heap::arena::MIN_ALLOC;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Allocative)]
pub(crate) struct ValueAllocSize {
size: AlignedSize,
}
impl ValueAllocSize {
#[inline]
pub(crate) fn try_new(size: AlignedSize) -> Option<ValueAllocSize> {
if size < MIN_ALLOC {
None
} else {
Some(ValueAllocSize { size })
}
}
#[inline]
pub(crate) fn new(size: AlignedSize) -> ValueAllocSize {
match ValueAllocSize::try_new(size) {
Some(value) => value,
None => panic!("{size} is too small for a value (minimum is {MIN_ALLOC})"),
}
}
#[inline]
pub(crate) fn layout(self) -> Layout {
self.size.layout()
}
#[inline]
pub(crate) fn size(self) -> AlignedSize {
self.size
}
#[inline]
pub(crate) const fn bytes(self) -> u32 {
self.size.bytes()
}
}