use super::Synced; use crate::runtime::task; use std::marker::PhantomData; pub(crate) struct Pop<'a, T: 'static> { len: usize, synced: &'a mut Synced, _p: PhantomData, } impl<'a, T: 'static> Pop<'a, T> { pub(super) fn new(len: usize, synced: &'a mut Synced) -> Pop<'a, T> { Pop { len, synced, _p: PhantomData, } } } impl<'a, T: 'static> Iterator for Pop<'a, T> { type Item = task::Notified; fn next(&mut self) -> Option { if self.len == 0 { return None; } let ret = self.synced.pop(); // Should be `Some` when `len > 0` debug_assert!(ret.is_some()); self.len -= 1; ret } fn size_hint(&self) -> (usize, Option) { (self.len, Some(self.len)) } } impl<'a, T: 'static> ExactSizeIterator for Pop<'a, T> { fn len(&self) -> usize { self.len } } impl<'a, T: 'static> Drop for Pop<'a, T> { fn drop(&mut self) { for _ in self.by_ref() {} } }