use std::{
fmt,
ops::{Deref, DerefMut},
sync::atomic::AtomicUsize,
};
mod lock;
mod waiter;
mod consumer;
mod pollable;
mod producer;
mod shared;
mod weak;
#[cfg(feature = "tokio")]
pub mod tokio;
#[cfg(test)]
mod tests;
pub use consumer::Consumer;
pub use pollable::{Pending, Pollable};
pub use producer::{Mut, Producer, Ref};
pub use shared::Shared;
pub use waiter::{Waiter, WaiterList, wait};
pub use weak::{ConsumerWeak, ProducerWeak};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Closed;
impl fmt::Display for Closed {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "channel closed")
}
}
impl std::error::Error for Closed {}
#[derive(Debug)]
pub(crate) struct State<T> {
pub value: T,
pub waiters_value: waiter::WaiterList,
pub waiters_closed: waiter::WaiterList,
pub waiters_consumer: waiter::WaiterList,
pub closed: bool,
}
impl<T: Default> Default for State<T> {
fn default() -> Self {
Self::new(Default::default())
}
}
impl<T> State<T> {
pub fn new(value: T) -> Self {
Self {
value,
closed: false,
waiters_value: waiter::WaiterList::new(),
waiters_closed: waiter::WaiterList::new(),
waiters_consumer: waiter::WaiterList::new(),
}
}
pub fn take_close_waiters(&mut self) -> [waiter::WaiterList; 3] {
[
self.waiters_value.take(),
self.waiters_closed.take(),
self.waiters_consumer.take(),
]
}
}
impl<T> Deref for State<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T> DerefMut for State<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.value
}
}
#[derive(Debug)]
pub(crate) struct Counts {
pub producers: AtomicUsize,
pub consumers: AtomicUsize,
}
impl Default for Counts {
fn default() -> Self {
Self {
producers: AtomicUsize::new(1),
consumers: AtomicUsize::new(0),
}
}
}