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 {}