use std::sync::{RwLock, atomic::AtomicUsize};
use crate::prelude::*;
#[derive(Default)]
pub(crate) struct Tail(pub usize);
pub struct State<T> {
pub(crate) ring: Vec<Seat<T>>,
pub(crate) tail: AtomicUsize,
pub(crate) internal_tail: RwLock<Tail>,
pub(crate) num_writers: AtomicUsize,
pub(crate) len: usize,
pub(crate) num_readers: AtomicUsize,
}
impl<T: Clone> State<T> {
pub(crate) fn new(mut len: usize) -> Self {
len += 1;
Self {
ring: (0..len).map(|_| Seat::default()).collect(),
tail: AtomicUsize::new(0),
internal_tail: RwLock::new(Tail::default()),
num_writers: AtomicUsize::new(0),
len,
num_readers: AtomicUsize::new(0),
}
}
}