use core::fmt::{self, Debug};
use core::mem::MaybeUninit;
use core::pin::Pin;
use super::{Slot, Storage};
pub struct ArrayStorage<T, const N: usize> {
data: [Slot<T>; N],
}
impl<T, const N: usize> ArrayStorage<T, N> {
const CAPACITY_IS_NONZERO: () =
assert!(N != 0, "Ring buffers require a non-zero capacity!");
pub fn new() -> Self {
let _ = Self::CAPACITY_IS_NONZERO;
Self { data: unsafe { MaybeUninit::uninit().assume_init() } }
}
}
unsafe impl<T, const N: usize> Storage for ArrayStorage<T, N> {
type Item = T;
fn cap(&self) -> usize {
N
}
fn get(&self) -> &[Slot<Self::Item>] {
&self.data
}
fn get_mut(&mut self) -> &mut [Slot<Self::Item>] {
&mut self.data
}
fn get_pin(self: Pin<&mut Self>) -> Pin<&mut [Slot<Self::Item>]> {
unsafe { self.map_unchecked_mut(|this| &mut this.data) }
}
}
impl<T, const N: usize> Clone for ArrayStorage<T, N> {
fn clone(&self) -> Self {
Self::new()
}
}
impl<T, const N: usize> Debug for ArrayStorage<T, N> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "ArrayStorage")
}
}