1 use super::Synced; 2 3 use crate::runtime::task; 4 5 use std::marker::PhantomData; 6 7 pub(crate) struct Pop<'a, T: 'static> { 8 len: usize, 9 synced: &'a mut Synced, 10 _p: PhantomData<T>, 11 } 12 13 impl<'a, T: 'static> Pop<'a, T> { new(len: usize, synced: &'a mut Synced) -> Pop<'a, T>14 pub(super) fn new(len: usize, synced: &'a mut Synced) -> Pop<'a, T> { 15 Pop { 16 len, 17 synced, 18 _p: PhantomData, 19 } 20 } 21 } 22 23 impl<'a, T: 'static> Iterator for Pop<'a, T> { 24 type Item = task::Notified<T>; 25 next(&mut self) -> Option<Self::Item>26 fn next(&mut self) -> Option<Self::Item> { 27 if self.len == 0 { 28 return None; 29 } 30 31 let ret = self.synced.pop(); 32 33 // Should be `Some` when `len > 0` 34 debug_assert!(ret.is_some()); 35 36 self.len -= 1; 37 ret 38 } 39 size_hint(&self) -> (usize, Option<usize>)40 fn size_hint(&self) -> (usize, Option<usize>) { 41 (self.len, Some(self.len)) 42 } 43 } 44 45 impl<'a, T: 'static> ExactSizeIterator for Pop<'a, T> { len(&self) -> usize46 fn len(&self) -> usize { 47 self.len 48 } 49 } 50 51 impl<'a, T: 'static> Drop for Pop<'a, T> { drop(&mut self)52 fn drop(&mut self) { 53 for _ in self.by_ref() {} 54 } 55 } 56