use std::borrow::Borrow;
use std::hash::Hash;
use std::ptr::NonNull;
use oxidd_core::util::AllocResult;
use crate::manager::Edge;
mod r#static;
pub use r#static::*;
pub unsafe trait TerminalManager<
'id,
InnerNode,
EdgeTag,
ManagerData,
const PAGE_SIZE: usize,
const TAG_BITS: u32,
>: Sized
{
type TerminalNode: Eq + Hash;
type TerminalNodeRef<'a>: Borrow<Self::TerminalNode> + Copy
where
Self: 'a;
type Iterator<'a>: Iterator<Item = Edge<'id, InnerNode, EdgeTag, TAG_BITS>>
where
Self: 'a;
unsafe fn new_in(slot: *mut Self);
fn terminal_manager(edge: &Edge<'id, InnerNode, EdgeTag, TAG_BITS>) -> NonNull<Self>;
#[must_use]
fn len(&self) -> usize;
#[must_use]
fn is_empty(&self) -> bool {
self.len() == 0
}
fn deref_edge(
&self,
edge: &Edge<'id, InnerNode, EdgeTag, TAG_BITS>,
) -> Self::TerminalNodeRef<'_>;
fn clone_edge(
edge: &Edge<'id, InnerNode, EdgeTag, TAG_BITS>,
) -> Edge<'id, InnerNode, EdgeTag, TAG_BITS>;
fn drop_edge(edge: Edge<'id, InnerNode, EdgeTag, TAG_BITS>);
unsafe fn get(
this: *const Self,
terminal: Self::TerminalNode,
) -> AllocResult<Edge<'id, InnerNode, EdgeTag, TAG_BITS>>;
unsafe fn iter<'a>(this: *const Self) -> Self::Iterator<'a>
where
Self: 'a;
fn gc(&self) -> usize;
}