/rust/registry/src/index.crates.io-6f17d22bba15001f/itertools-0.10.5/src/lazy_buffer.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use std::ops::Index; |
2 | | use alloc::vec::Vec; |
3 | | |
4 | | #[derive(Debug, Clone)] |
5 | | pub struct LazyBuffer<I: Iterator> { |
6 | | pub it: I, |
7 | | done: bool, |
8 | | buffer: Vec<I::Item>, |
9 | | } |
10 | | |
11 | | impl<I> LazyBuffer<I> |
12 | | where |
13 | | I: Iterator, |
14 | | { |
15 | 0 | pub fn new(it: I) -> LazyBuffer<I> { |
16 | 0 | LazyBuffer { |
17 | 0 | it, |
18 | 0 | done: false, |
19 | 0 | buffer: Vec::new(), |
20 | 0 | } |
21 | 0 | } |
22 | | |
23 | 0 | pub fn len(&self) -> usize { |
24 | 0 | self.buffer.len() |
25 | 0 | } |
26 | | |
27 | 0 | pub fn get_next(&mut self) -> bool { |
28 | 0 | if self.done { |
29 | 0 | return false; |
30 | 0 | } |
31 | 0 | if let Some(x) = self.it.next() { |
32 | 0 | self.buffer.push(x); |
33 | 0 | true |
34 | | } else { |
35 | 0 | self.done = true; |
36 | 0 | false |
37 | | } |
38 | 0 | } |
39 | | |
40 | 0 | pub fn prefill(&mut self, len: usize) { |
41 | 0 | let buffer_len = self.buffer.len(); |
42 | 0 |
|
43 | 0 | if !self.done && len > buffer_len { |
44 | 0 | let delta = len - buffer_len; |
45 | 0 |
|
46 | 0 | self.buffer.extend(self.it.by_ref().take(delta)); |
47 | 0 | self.done = self.buffer.len() < len; |
48 | 0 | } |
49 | 0 | } |
50 | | } |
51 | | |
52 | | impl<I, J> Index<J> for LazyBuffer<I> |
53 | | where |
54 | | I: Iterator, |
55 | | I::Item: Sized, |
56 | | Vec<I::Item>: Index<J> |
57 | | { |
58 | | type Output = <Vec<I::Item> as Index<J>>::Output; |
59 | | |
60 | 0 | fn index(&self, index: J) -> &Self::Output { |
61 | 0 | self.buffer.index(index) |
62 | 0 | } |
63 | | } |