Skip to content

Commit 8e8b98a

Browse files
committed
refactor most implementations of pad_tail to remove saturating ops + clean up rfold
1 parent 979d7a7 commit 8e8b98a

File tree

1 file changed

+31
-53
lines changed

1 file changed

+31
-53
lines changed

src/pad_tail.rs

Lines changed: 31 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -53,40 +53,32 @@ where
5353

5454
#[inline]
5555
fn next(&mut self) -> Option<Self::Item> {
56-
match self.iter.next() {
57-
None => {
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;
61-
e
62-
} else {
63-
None
64-
}
65-
}
66-
e => {
67-
self.elements_from_next += 1;
68-
e
69-
}
56+
let total_consumed = self.elements_from_next + self.elements_from_next_back;
57+
58+
if total_consumed >= self.elements_required {
59+
self.iter.next()
60+
} else if let Some(e) = self.iter.next() {
61+
self.elements_from_next += 1;
62+
Some(e)
63+
} else {
64+
let e = (self.filler)(self.elements_from_next);
65+
self.elements_from_next += 1;
66+
Some(e)
7067
}
7168
}
7269

7370
fn size_hint(&self) -> (usize, Option<usize>) {
74-
let (iter_lower, iter_upper) = self.iter.size_hint();
75-
let consumed = self
76-
.elements_from_next
77-
.saturating_add(self.elements_from_next_back);
78-
79-
let total_lower = iter_lower
80-
.saturating_add(self.elements_from_next)
81-
.max(self.elements_required);
82-
let lower_bound = total_lower.saturating_sub(consumed);
83-
84-
let upper_bound = iter_upper.map(|iter_upper| {
85-
let total_upper = iter_upper
86-
.saturating_add(self.elements_from_next)
87-
.max(self.elements_required);
88-
total_upper.saturating_sub(consumed)
89-
});
71+
let total_consumed = self.elements_from_next + self.elements_from_next_back;
72+
73+
if total_consumed >= self.elements_required {
74+
return self.iter.size_hint();
75+
}
76+
77+
let elements_remaining = self.elements_required - total_consumed;
78+
let (low, high) = self.iter.size_hint();
79+
80+
let lower_bound = low.max(elements_remaining);
81+
let upper_bound = high.map(|h| h.max(elements_remaining));
9082

9183
(lower_bound, upper_bound)
9284
}
@@ -112,47 +104,33 @@ where
112104
fn next_back(&mut self) -> Option<Self::Item> {
113105
let total_consumed = self.elements_from_next + self.elements_from_next_back;
114106

115-
if self.iter.len() == 0 && total_consumed >= self.elements_required {
116-
return None;
107+
if total_consumed >= self.elements_required {
108+
return self.iter.next_back();
117109
}
118110

119-
let elements_remaining = self.elements_required.saturating_sub(total_consumed);
111+
let elements_remaining = self.elements_required - total_consumed;
120112
self.elements_from_next_back += 1;
121113

122114
if self.iter.len() < elements_remaining {
123115
Some((self.filler)(
124116
self.elements_required - self.elements_from_next_back,
125117
))
126118
} else {
127-
let e = self.iter.next_back();
128-
assert!(e.is_some());
129-
e
119+
self.iter.next_back()
130120
}
131121
}
132122

133123
fn rfold<B, G>(self, mut init: B, mut f: G) -> B
134124
where
135125
G: FnMut(B, Self::Item) -> B,
136126
{
137-
let PadUsing {
138-
iter,
139-
elements_from_next,
140-
elements_from_next_back,
141-
mut elements_required,
142-
filler,
143-
} = self;
144-
let iter_len = 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;
148-
}
149-
150-
let start_idx = iter_len + elements_from_next;
151-
let end_idx = elements_required - elements_from_next_back;
127+
let start = self.iter.len() + self.elements_from_next;
128+
let remaining = self.elements_required.max(start);
129+
let end = remaining - self.elements_from_next_back;
152130

153-
init = (start_idx..end_idx).rev().map(filler).fold(init, &mut f);
131+
init = (start..end).rev().map(self.filler).fold(init, &mut f);
154132

155-
iter.rfold(init, f)
133+
self.iter.rfold(init, f)
156134
}
157135
}
158136

0 commit comments

Comments
 (0)