concurrent_slice/
iter.rs

1use crate::common::*;
2
3/// The iterator returned from [owning_iter()](crate::slice::ConcurrentSlice::owning_iter).
4#[derive(Debug)]
5pub struct Iter<S, T> {
6    pub(super) owner: OwningRef<S, [T]>,
7    pub(super) index: usize,
8}
9
10impl<S, T> Clone for Iter<S, T>
11where
12    S: CloneStableAddress,
13{
14    fn clone(&self) -> Self {
15        Self {
16            owner: self.owner.clone(),
17            index: self.index,
18        }
19    }
20}
21
22impl<S, T> Iterator for Iter<S, T>
23where
24    S: CloneStableAddress,
25{
26    type Item = OwningRef<S, T>;
27
28    fn next(&mut self) -> Option<Self::Item> {
29        if self.index == self.owner.len() {
30            return None;
31        }
32
33        let item = self.owner.clone().map(|slice| &slice[self.index]);
34        self.index += 1;
35        Some(item)
36    }
37
38    fn size_hint(&self) -> (usize, Option<usize>) {
39        let len = self.owner.len();
40        (len, Some(len))
41    }
42}
43
44impl<S, T> ExactSizeIterator for Iter<S, T> where S: CloneStableAddress {}