abi_stable/type_layout/
iterators.rs

1#![allow(clippy::missing_const_for_fn)]
2
3#[derive(Debug, Clone)]
4pub(crate) struct ChainOnce<I, T> {
5    iter: I,
6    once: Option<T>,
7}
8
9impl<I> ChainOnce<I, I::Item>
10where
11    I: ExactSizeIterator,
12{
13    pub(crate) fn new(iter: I, once: I::Item) -> Self {
14        Self {
15            iter,
16            once: Some(once),
17        }
18    }
19    fn length(&self) -> usize {
20        self.iter.len() + (self.once.is_some() as usize)
21    }
22}
23impl<I> Iterator for ChainOnce<I, I::Item>
24where
25    I: ExactSizeIterator,
26{
27    type Item = I::Item;
28    fn next(&mut self) -> Option<I::Item> {
29        if let ret @ Some(_) = self.iter.next() {
30            return ret;
31        }
32        self.once.take()
33    }
34
35    fn size_hint(&self) -> (usize, Option<usize>) {
36        let len = self.length();
37        (len, Some(len))
38    }
39    fn count(self) -> usize {
40        self.length()
41    }
42}
43
44impl<I> std::iter::ExactSizeIterator for ChainOnce<I, I::Item> where I: ExactSizeIterator {}