use std::{mem, ptr, slice};
use crate::depot::{self, queue::ring};
impl<T> ring::Fifo<T> {
pub fn front(&self) -> Option<&T> {
if self.state.is_empty() {
return None;
}
Some(unsafe { &*self.block.as_ptr().add(self.state.head()).cast::<T>() })
}
pub fn get(&self, index: usize) -> Option<&T> {
if index >= self.state.len() {
return None;
}
let position = unsafe { self.state.position(self.capacity(), index) };
Some(unsafe { &*self.block.as_ptr().add(position).cast::<T>() })
}
pub fn as_slices(&self) -> (&[T], &[T]) {
let state = self.state;
let (start, [front, back]) = state.prefix(self.capacity(), state.len());
let entries = self.block.as_ptr().cast::<T>();
unsafe {
(
slice::from_raw_parts(entries.add(start), front),
slice::from_raw_parts(entries, back),
)
}
}
}
pub(crate) unsafe fn drop_ring<S: depot::raw::RingEdit + ?Sized>(source: &mut S) {
if mem::needs_drop::<S::Item>() {
let (front, back) = unsafe { depot::raw::RingEdit::slices_mut(source) };
unsafe {
ptr::drop_in_place(front);
ptr::drop_in_place(back);
}
}
}
unsafe impl<T> crate::depot::raw::RingEdit for ring::Fifo<T> {
unsafe fn parts_mut(&mut self) -> (&mut ring::State<u32>, &mut [mem::MaybeUninit<T>]) {
(&mut self.state, &mut self.block)
}
}
unsafe impl<T, S> crate::depot::raw::RingCell for ring::pool::Shared<T, S> {
unsafe fn publish(&self, state: ring::State<u32>) {
self.state.set(state);
}
}
unsafe impl<T, S> crate::depot::raw::RingEdit for ring::pool::Shared<T, S> {
unsafe fn parts_mut(&mut self) -> (&mut ring::State<u32>, &mut [mem::MaybeUninit<T>]) {
(self.state.get_mut(), &mut self.block)
}
}
unsafe impl<T> crate::depot::raw::RingStore for ring::Fifo<T> {
type Item = T;
type Word = u32;
fn state(&self) -> ring::State<u32> {
self.state
}
fn capacity(&self) -> usize {
self.capacity()
}
fn entries(&self) -> *const mem::MaybeUninit<T> {
self.block.as_ptr()
}
}
unsafe impl<T, S> crate::depot::raw::RingStore for ring::pool::Shared<T, S> {
type Item = T;
type Word = u32;
fn state(&self) -> ring::State<u32> {
self.state.get()
}
fn capacity(&self) -> usize {
self.capacity()
}
fn entries(&self) -> *const mem::MaybeUninit<T> {
self.block.as_ptr()
}
}