use std::{alloc::Layout, ptr::NonNull};
use crate::{block::Block, header::Header};
pub(crate) struct Realloc {
pub block: NonNull<Header<Block>>,
pub address: NonNull<u8>,
pub new_layout: Layout,
pub old_layout: Layout,
pub method: ReallocMethod,
}
#[derive(Clone, Copy)]
pub(crate) enum ReallocMethod {
Shrink,
Grow,
}
impl Realloc {
pub unsafe fn new(
address: NonNull<u8>,
old_layout: Layout,
new_layout: Layout,
method: ReallocMethod,
) -> Self {
let block = Header::<Block>::from_allocated_pointer(address, old_layout);
Self {
block,
address,
new_layout,
old_layout,
method,
}
}
pub unsafe fn shrink(address: NonNull<u8>, old_layout: Layout, new_layout: Layout) -> Self {
Self::new(address, old_layout, new_layout, ReallocMethod::Shrink)
}
pub unsafe fn grow(address: NonNull<u8>, old_layout: Layout, new_layout: Layout) -> Self {
Self::new(address, old_layout, new_layout, ReallocMethod::Grow)
}
pub fn count(&self) -> usize {
match self.method {
ReallocMethod::Shrink => self.new_layout.size(),
ReallocMethod::Grow => self.old_layout.size(),
}
}
pub unsafe fn map(&self, block: NonNull<Header<Block>>) -> Self {
Self { block, ..*self }
}
}