use std::alloc::{alloc, dealloc, Layout};
use std::ptr::NonNull;
#[inline]
pub fn allocate_padded_buffer(length: usize, padding: usize) -> Result<NonNull<u8>, String> {
let total_size = length + padding;
let layout =
Layout::from_size_align(total_size, 64).map_err(|e| format!("Invalid layout: {}", e))?;
let ptr = unsafe { alloc(layout) };
NonNull::new(ptr).ok_or_else(|| "Failed to allocate memory".to_string())
}
#[inline]
pub unsafe fn aligned_free(ptr: NonNull<u8>, length: usize, padding: usize) {
let total_size = length + padding;
let layout = Layout::from_size_align_unchecked(total_size, 64);
dealloc(ptr.as_ptr(), layout);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_allocate_and_free() {
let length = 1024;
let padding = 64;
let ptr = allocate_padded_buffer(length, padding).unwrap();
assert_eq!(
ptr.as_ptr() as usize % 64,
0,
"Pointer should be 64-byte aligned"
);
unsafe {
*ptr.as_ptr() = 42;
assert_eq!(*ptr.as_ptr(), 42);
aligned_free(ptr, length, padding);
}
}
#[test]
fn test_zero_length() {
let result = allocate_padded_buffer(0, 64);
assert!(result.is_ok());
if let Ok(ptr) = result {
unsafe {
aligned_free(ptr, 0, 64);
}
}
}
}