use crate::{
buffer,
buffer::segments::{
self, Chain, Handle, Header, Pool,
chain::{edit, view},
handles,
},
};
pub struct Front<'a, T, H: Handle<T> = Pool<T>> {
pub(in crate::buffer::segments::chain) sequence: &'a mut Chain<T, H>,
}
impl<'a, T: buffer::raw::Segment, H: Handle<T>> Front<'a, T, H> {
pub(in crate::buffer::segments::chain) fn new(sequence: &'a mut Chain<T, H>) -> Option<Self> {
if sequence.key.is_empty() {
return None;
}
Some(Self { sequence })
}
pub fn get(&self) -> &T {
match unsafe { self.sequence.occupied() } {
view::Occupied::Single(_, item) => item,
view::Occupied::Multi(desc) => {
unsafe { handles::nodes(&self.sequence.handle).value(desc.links.head_raw()) }
}
}
.as_ref()
}
pub(in crate::buffer::segments::chain) fn position(&self) -> handles::Occupied {
unsafe { self.sequence.key.occupied() }
}
pub fn pop(self) -> T {
self.take().into_inner()
}
#[inline(always)]
pub fn take(self) -> segments::Item<T> {
match self.position() {
handles::Occupied::Single(index) => edit::Single {
sequence: self.sequence,
index,
}
.take(),
handles::Occupied::Multi(index) => edit::Multi {
sequence: self.sequence,
index,
}
.take(),
}
}
}
const _: () = {
assert!(size_of::<Front<'static, (), Pool<()>>>() == size_of::<usize>());
assert!(size_of::<Option<Front<'static, (), Pool<()>>>>() == size_of::<usize>());
assert!(size_of::<Front<'static, (), &Header<()>>>() == size_of::<usize>());
assert!(size_of::<Option<Front<'static, (), &Header<()>>>>() == size_of::<usize>());
};