Skip to content

Commit c552fc8

Browse files
committed
Implement PeekableIterator for IntoIter
1 parent 56d74c6 commit c552fc8

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

library/core/src/array/iter.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Defines the `IntoIter` owned iterator for arrays.
22
33
use crate::intrinsics::transmute_unchecked;
4-
use crate::iter::{FusedIterator, TrustedLen, TrustedRandomAccessNoCoerce};
4+
use crate::iter::{FusedIterator, PeekableIterator, TrustedLen, TrustedRandomAccessNoCoerce};
55
use crate::mem::MaybeUninit;
66
use crate::num::NonZero;
77
use crate::ops::{IndexRange, Range, Try};
@@ -350,6 +350,13 @@ impl<T, const N: usize> FusedIterator for IntoIter<T, N> {}
350350
#[stable(feature = "array_value_iter_impls", since = "1.40.0")]
351351
unsafe impl<T, const N: usize> TrustedLen for IntoIter<T, N> {}
352352

353+
#[unstable(feature = "peekable_iterator", issue = "132973")]
354+
impl<T, const N: usize> PeekableIterator for IntoIter<T, N> {
355+
fn peek_with<U>(&mut self, func: impl for<'b> FnOnce(Option<&'b Self::Item>) -> U) -> U {
356+
self.unsize_mut().peek_with(func)
357+
}
358+
}
359+
353360
#[doc(hidden)]
354361
#[unstable(issue = "none", feature = "std_internals")]
355362
#[rustc_unsafe_specialization_marker]

library/core/src/array/iter/iter_inner.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,16 @@ impl<T> PolymorphicIter<[MaybeUninit<T>]> {
175175
})
176176
}
177177

178+
#[inline]
179+
pub(super) fn peek_with<U>(&mut self, func: impl for<'b> FnOnce(Option<&'b T>) -> U) -> U {
180+
let tmp = self.alive.clone().next().map(|idx| {
181+
// SAFETY: `idx` is in self.alive range
182+
unsafe { self.data.get_unchecked(idx).assume_init_read() }
183+
});
184+
185+
func(tmp.as_ref())
186+
}
187+
178188
#[inline]
179189
pub(super) fn size_hint(&self) -> (usize, Option<usize>) {
180190
let len = self.len();

0 commit comments

Comments
 (0)