use crate::cache::delta::Item;
pub struct ItemSliceSend<T>(pub *mut [T])
where
T: Send;
impl<T> Clone for ItemSliceSend<T>
where
T: Send,
{
fn clone(&self) -> Self {
ItemSliceSend(self.0)
}
}
#[allow(unsafe_code)]
unsafe impl<T> Send for ItemSliceSend<T> where T: Send {}
pub struct Node<'a, T> {
pub item: &'a mut Item<T>,
pub child_items: *mut [Item<T>],
}
impl<'a, T> Node<'a, T> {
pub fn offset(&self) -> u64 {
self.item.offset
}
pub fn entry_slice(&self) -> crate::data::EntryRange {
self.item.offset..self.item.next_offset
}
pub fn data(&mut self) -> &mut T {
&mut self.item.data
}
pub fn has_children(&self) -> bool {
!self.item.children.is_empty()
}
pub fn into_child_iter(self) -> impl Iterator<Item = Node<'a, T>> + 'a {
let children = self.child_items;
self.item.children.iter().map(move |&index| {
#[allow(unsafe_code)]
Node {
item: unsafe { &mut *(children as *mut Item<T>).add(index as usize) },
child_items: children,
}
})
}
}