Skip to content

Commit 979d7a7

Browse files
committed
code review feedback: try to remove saturating_ ops from next_back
1 parent 625c2b9 commit 979d7a7

File tree

1 file changed

+48
-41
lines changed

1 file changed

+48
-41
lines changed

src/pad_tail.rs

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,36 @@ use std::iter::{Fuse, FusedIterator};
1010
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
1111
pub struct PadUsing<I, F> {
1212
iter: Fuse<I>,
13-
min: usize,
14-
pos: usize,
15-
back: usize,
16-
total_len: usize,
13+
elements_from_next: usize,
14+
elements_from_next_back: usize,
15+
elements_required: usize,
1716
filler: F,
1817
}
1918

2019
impl<I, F> std::fmt::Debug for PadUsing<I, F>
2120
where
2221
I: std::fmt::Debug,
2322
{
24-
debug_fmt_fields!(PadUsing, iter, min, pos, back, total_len);
23+
debug_fmt_fields!(
24+
PadUsing,
25+
iter,
26+
elements_from_next,
27+
elements_from_next_back,
28+
elements_required
29+
);
2530
}
2631

2732
/// Create a new `PadUsing` iterator.
28-
pub fn pad_using<I, F>(iter: I, min: usize, filler: F) -> PadUsing<I, F>
33+
pub fn pad_using<I, F>(iter: I, elements_required: usize, filler: F) -> PadUsing<I, F>
2934
where
3035
I: Iterator,
3136
F: FnMut(usize) -> I::Item,
3237
{
3338
PadUsing {
3439
iter: iter.fuse(),
35-
min,
36-
pos: 0,
37-
back: 0,
38-
total_len: min,
40+
elements_from_next: 0,
41+
elements_from_next_back: 0,
42+
elements_required,
3943
filler,
4044
}
4145
}
@@ -51,30 +55,36 @@ where
5155
fn next(&mut self) -> Option<Self::Item> {
5256
match self.iter.next() {
5357
None => {
54-
if self.pos + self.back < self.total_len {
55-
let e = Some((self.filler)(self.pos));
56-
self.pos += 1;
58+
if self.elements_from_next + self.elements_from_next_back < self.elements_required {
59+
let e = Some((self.filler)(self.elements_from_next));
60+
self.elements_from_next += 1;
5761
e
5862
} else {
5963
None
6064
}
6165
}
6266
e => {
63-
self.pos += 1;
67+
self.elements_from_next += 1;
6468
e
6569
}
6670
}
6771
}
6872

6973
fn size_hint(&self) -> (usize, Option<usize>) {
7074
let (iter_lower, iter_upper) = self.iter.size_hint();
71-
let consumed = self.pos.saturating_add(self.back);
75+
let consumed = self
76+
.elements_from_next
77+
.saturating_add(self.elements_from_next_back);
7278

73-
let total_lower = iter_lower.saturating_add(self.pos).max(self.min);
79+
let total_lower = iter_lower
80+
.saturating_add(self.elements_from_next)
81+
.max(self.elements_required);
7482
let lower_bound = total_lower.saturating_sub(consumed);
7583

7684
let upper_bound = iter_upper.map(|iter_upper| {
77-
let total_upper = iter_upper.saturating_add(self.pos).max(self.min);
85+
let total_upper = iter_upper
86+
.saturating_add(self.elements_from_next)
87+
.max(self.elements_required);
7888
total_upper.saturating_sub(consumed)
7989
});
8090

@@ -85,12 +95,12 @@ where
8595
where
8696
G: FnMut(B, Self::Item) -> B,
8797
{
88-
let mut pos = self.pos;
98+
let mut pos = self.elements_from_next;
8999
init = self.iter.fold(init, |acc, item| {
90100
pos += 1;
91101
f(acc, item)
92102
});
93-
(pos..self.min).map(self.filler).fold(init, f)
103+
(pos..self.elements_required).map(self.filler).fold(init, f)
94104
}
95105
}
96106

@@ -100,25 +110,23 @@ where
100110
F: FnMut(usize) -> I::Item,
101111
{
102112
fn next_back(&mut self) -> Option<Self::Item> {
103-
let current_iter_len = self.iter.len();
104-
let original_iter_len = current_iter_len.saturating_add(self.pos);
105-
if self.total_len < original_iter_len {
106-
self.total_len = original_iter_len;
107-
}
113+
let total_consumed = self.elements_from_next + self.elements_from_next_back;
108114

109-
if self.pos + self.back >= self.total_len {
115+
if self.iter.len() == 0 && total_consumed >= self.elements_required {
110116
return None;
111117
}
112118

113-
let padding_count = self.total_len.saturating_sub(current_iter_len + self.pos);
119+
let elements_remaining = self.elements_required.saturating_sub(total_consumed);
120+
self.elements_from_next_back += 1;
114121

115-
if self.back < padding_count {
116-
let idx = self.total_len - self.back - 1;
117-
self.back += 1;
118-
Some((self.filler)(idx))
122+
if self.iter.len() < elements_remaining {
123+
Some((self.filler)(
124+
self.elements_required - self.elements_from_next_back,
125+
))
119126
} else {
120-
self.back += 1;
121-
self.iter.next_back()
127+
let e = self.iter.next_back();
128+
assert!(e.is_some());
129+
e
122130
}
123131
}
124132

@@ -128,20 +136,19 @@ where
128136
{
129137
let PadUsing {
130138
iter,
131-
min: _,
132-
pos,
133-
back,
134-
mut total_len,
139+
elements_from_next,
140+
elements_from_next_back,
141+
mut elements_required,
135142
filler,
136143
} = self;
137144
let iter_len = iter.len();
138-
let original_iter_len = iter_len.saturating_add(pos);
139-
if total_len < original_iter_len {
140-
total_len = original_iter_len;
145+
let original_iter_len = iter_len.saturating_add(elements_from_next);
146+
if elements_required < original_iter_len {
147+
elements_required = original_iter_len;
141148
}
142149

143-
let start_idx = iter_len + pos;
144-
let end_idx = total_len - back;
150+
let start_idx = iter_len + elements_from_next;
151+
let end_idx = elements_required - elements_from_next_back;
145152

146153
init = (start_idx..end_idx).rev().map(filler).fold(init, &mut f);
147154

0 commit comments

Comments
 (0)