use std::sync::{Arc, Weak};
use crossbeam_queue::ArrayQueue;
use super::Receiver;
use crate::{ChannelSharedDetails, LimitedWakerPermitQueue};
pub struct WeakReceiver<T>
{
shared_details: Weak<ChannelSharedDetails<ArrayQueue<T>, LimitedWakerPermitQueue>>,
senders_count: Weak<()>,
receivers_count: Weak<()>
}
impl<T> WeakReceiver<T>
{
pub fn new(shared_details: &Arc<ChannelSharedDetails<ArrayQueue<T>, LimitedWakerPermitQueue>>, senders_count: &Weak<()>, receivers_count: &Arc<()>) -> Self
{
Self
{
shared_details: Arc::downgrade(shared_details),
senders_count: senders_count.clone(),
receivers_count: Arc::downgrade(receivers_count)
}
}
pub fn upgrade(&self) -> Option<Receiver<T>>
{
if let Some(shared_details) = self.shared_details.upgrade() && let Some(receivers_count) = self.receivers_count.upgrade()
{
Some(Receiver::new(shared_details, self.senders_count.clone(), receivers_count))
}
else
{
None
}
}
pub fn strong_count(&self) -> usize
{
self.receivers_count.strong_count()
}
pub fn weak_count(&self) -> usize
{
self.receivers_count.weak_count()
}
}