mallockit 0.1.0

A framework for building malloc implementations in Rust
Documentation
use std::alloc::Layout;

use crate::util::constants::LOG_MIN_ALIGNMENT;

use super::layout_utils::LayoutUtils;

const LOG_MIN_ALIGNMENT_U8: u8 = LOG_MIN_ALIGNMENT as u8;

#[repr(transparent)]
#[derive(Debug, Clone, Copy)]
pub struct SizeClass<const LOG_COVERAGE: u8 = LOG_MIN_ALIGNMENT_U8>(pub u8);

impl<const LOG_COVERAGE: u8> SizeClass<LOG_COVERAGE> {
    pub const fn as_usize(self) -> usize {
        self.0 as usize
    }

    pub const fn log_bytes(self) -> usize {
        self.0 as usize + LOG_COVERAGE as usize
    }

    pub const fn bytes(self) -> usize {
        1 << self.log_bytes()
    }

    pub fn layout(self) -> Layout {
        let size = 1usize << (self.0 + LOG_COVERAGE);
        Layout::from_size_align(size, size).unwrap()
    }

    pub const fn from_bytes(bytes: usize) -> Self {
        Self(bytes.trailing_zeros() as u8 - LOG_COVERAGE)
    }

    pub fn from_layout(layout: Layout) -> Self {
        let layout = unsafe { layout.pad_to_align_unchecked() };
        let size = layout.size().next_power_of_two();
        Self::from_bytes(size)
    }
}