|
48 | 48 |
|
49 | 49 | #[inline]
|
50 | 50 | fn next(&mut self) -> Option<Self::Item> {
|
51 |
| - let mut array = MaybeUninit::uninit_array(); |
52 |
| - // SAFETY: `array` will still be valid if `guard` is dropped. |
53 |
| - let mut guard = unsafe { FrontGuard::new(&mut array) }; |
54 |
| - |
55 |
| - for slot in array.iter_mut() { |
56 |
| - match self.iter.next() { |
57 |
| - Some(item) => { |
58 |
| - slot.write(item); |
59 |
| - guard.init += 1; |
60 |
| - } |
61 |
| - None => { |
62 |
| - if guard.init > 0 { |
63 |
| - let init = guard.init; |
64 |
| - mem::forget(guard); |
65 |
| - self.remainder = { |
66 |
| - // SAFETY: `array` was initialized with `init` elements. |
67 |
| - Some(unsafe { array::IntoIter::new_unchecked(array, 0..init) }) |
68 |
| - }; |
69 |
| - } |
70 |
| - return None; |
71 |
| - } |
72 |
| - } |
73 |
| - } |
74 |
| - |
75 |
| - mem::forget(guard); |
76 |
| - // SAFETY: All elements of the array were populated in the loop above. |
77 |
| - Some(unsafe { MaybeUninit::array_assume_init(array) }) |
| 51 | + self.try_for_each(ControlFlow::Break).break_value() |
78 | 52 | }
|
79 | 53 |
|
80 | 54 | #[inline]
|
@@ -194,21 +168,7 @@ where
|
194 | 168 | {
|
195 | 169 | #[inline]
|
196 | 170 | fn next_back(&mut self) -> Option<Self::Item> {
|
197 |
| - // We are iterating from the back we need to first handle the remainder. |
198 |
| - self.next_back_remainder()?; |
199 |
| - |
200 |
| - let mut array = MaybeUninit::uninit_array(); |
201 |
| - // SAFETY: `array` will still be valid if `guard` is dropped. |
202 |
| - let mut guard = unsafe { BackGuard::new(&mut array) }; |
203 |
| - |
204 |
| - for slot in array.iter_mut().rev() { |
205 |
| - slot.write(self.iter.next_back()?); |
206 |
| - guard.uninit -= 1; |
207 |
| - } |
208 |
| - |
209 |
| - mem::forget(guard); |
210 |
| - // SAFETY: All elements of the array were populated in the loop above. |
211 |
| - Some(unsafe { MaybeUninit::array_assume_init(array) }) |
| 171 | + self.try_rfold((), |(), x| ControlFlow::Break(x)).break_value() |
212 | 172 | }
|
213 | 173 |
|
214 | 174 | fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R
|
|
0 commit comments