Skip to content

Commit 64f6fb5

Browse files
Merge #727
727: Fuse the iterator in `LazyBuffer` r=phimuemue a=Philippe-Cholet Fuse the iterator in `LazyBuffer`. `@phimuemue` Do I push the new `LazyBuffer::size_hint` here? EDIT: It could also have a "fill" method `pub fn fill(&mut self) { self.buffer.extend(self.it.by_ref()) }` that would later be better than `while self.get_next() {}`. I did not created it before but would have a use for it basically to then know the real length in "count" methods. Co-authored-by: Philippe-Cholet <[email protected]>
2 parents c5afdd3 + e85f3f6 commit 64f6fb5

File tree

2 files changed

+6
-14
lines changed

2 files changed

+6
-14
lines changed

src/combinations.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::fmt;
2-
use std::iter::FusedIterator;
2+
use std::iter::{Fuse, FusedIterator};
33

44
use super::lazy_buffer::LazyBuffer;
55
use alloc::vec::Vec;
@@ -54,7 +54,7 @@ impl<I: Iterator> Combinations<I> {
5454

5555
/// Returns a reference to the source iterator.
5656
#[inline]
57-
pub(crate) fn src(&self) -> &I { &self.pool.it }
57+
pub(crate) fn src(&self) -> &Fuse<I> { &self.pool.it }
5858

5959
/// Resets this `Combinations` back to an initial state for combinations of length
6060
/// `k` over the same pool data source. If `k` is larger than the current length

src/lazy_buffer.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
use std::iter::Fuse;
12
use std::ops::Index;
23
use alloc::vec::Vec;
34

45
#[derive(Debug, Clone)]
56
pub struct LazyBuffer<I: Iterator> {
6-
pub it: I,
7-
done: bool,
7+
pub it: Fuse<I>,
88
buffer: Vec<I::Item>,
99
}
1010

@@ -14,8 +14,7 @@ where
1414
{
1515
pub fn new(it: I) -> LazyBuffer<I> {
1616
LazyBuffer {
17-
it,
18-
done: false,
17+
it: it.fuse(),
1918
buffer: Vec::new(),
2019
}
2120
}
@@ -25,26 +24,19 @@ where
2524
}
2625

2726
pub fn get_next(&mut self) -> bool {
28-
if self.done {
29-
return false;
30-
}
3127
if let Some(x) = self.it.next() {
3228
self.buffer.push(x);
3329
true
3430
} else {
35-
self.done = true;
3631
false
3732
}
3833
}
3934

4035
pub fn prefill(&mut self, len: usize) {
4136
let buffer_len = self.buffer.len();
42-
43-
if !self.done && len > buffer_len {
37+
if len > buffer_len {
4438
let delta = len - buffer_len;
45-
4639
self.buffer.extend(self.it.by_ref().take(delta));
47-
self.done = self.buffer.len() < len;
4840
}
4941
}
5042
}

0 commit comments

Comments
 (0)