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