use data::{Flow, LinkReference};
use crate::{data::WriteHandler, Doublets, Error};
pub trait Release<T: LinkReference>: Doublets<T> {
unsafe fn release_unchecked(&mut self, index: T, handler: WriteHandler<'_, T>) -> Flow;
#[inline]
fn release_with(&mut self, index: T, handler: WriteHandler<'_, T>) -> Result<Flow, Error<T>> {
let link = self.try_get_link(index)?;
if link.source != T::from_byte(0) || link.target != T::from_byte(0) {
return Err(Error::NonNullContents(link));
}
Ok(unsafe { self.release_unchecked(index, handler) })
}
#[inline]
fn release(&mut self, index: T) -> Result<T, Error<T>> {
self.release_with(index, &mut |_, _| Flow::Continue)
.map(|_| index)
}
}