#[derive(Debug)]
#[repr(C)]
struct Node<T>
{
next: *mut Node<T>, data: NonNull<T>, }
impl<T> Node<T>
{
#[inline(always)]
fn clearing_queue_drop<A: Allocator, FreeData: Fn(NonNull<T>)>(this: NonNull<Self>, allocator: &mut A, free_data: &FreeData)
{
let x = unsafe { this.as_ref() };
let next = x.next;
if next.is_not_null()
{
Self::clearing_queue_drop(unsafe { NonNull::new_unchecked(next) }, allocator, free_data);
}
let data = x.data;
if data.as_ptr() != NonNull::dangling().as_ptr()
{
free_data(data);
}
Self::free_after_drop(this, allocator)
}
#[inline(always)]
fn free_after_drop<A: Allocator>(this: NonNull<Self>, allocator: &mut A)
{
allocator.free_cache_line_size(this)
}
#[inline(always)]
unsafe fn dummy_node<A: Allocator>(allocator: &mut A) -> NonNull<Self>
{
let mut dummy = allocator.align_malloc_cache_line_size();
{
let dummy: &mut Self = dummy.as_mut();
write(&mut dummy.data, NonNull::dangling());
write(&mut dummy.next, null_mut());
}
dummy
}
}