use dope_core::driver::route::Identity;
use o3::depot::{
self,
arena::slab,
queue::{links, tagged},
};
use crate::client::attempt::queue::{storage::Occupied, table::Table};
unsafe impl<'d, T: dope_net::Transport, ID: Identity> depot::raw::TagStore for Table<'d, T, ID> {
type Head = links::Chain;
type Heads = [links::Chain; 2];
fn heads(&self) -> &Self::Heads {
&self.heads
}
fn capacity(&self) -> usize {
self.nodes.capacity()
}
unsafe fn hook(&self, index: links::Index) -> &tagged::Hook {
unsafe {
slab::Cell::project(depot::raw::Proof::new((&self.nodes, index, |node| {
&raw const (*node).hook
})))
}
}
}
unsafe impl<'d, T: dope_net::Transport, ID: Identity> depot::raw::TagEntry
for Occupied<'_, 'd, T, ID>
{
type Store = Table<'d, T, ID>;
fn store(&self) -> &Self::Store {
self.table
}
fn hook(&self) -> &tagged::Hook {
&self.entry.value().hook
}
fn index(&self) -> links::Index {
self.key.handle.index().into()
}
}