|
1 | 1 | use crate::iter::adapters::{
|
2 |
| - zip::try_get_unchecked, TrustedRandomAccess, TrustedRandomAccessNoCoerce, |
| 2 | + zip::try_get_unchecked, SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce, |
3 | 3 | };
|
4 |
| -use crate::iter::{FusedIterator, TrustedLen, UncheckedIterator}; |
| 4 | +use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen, UncheckedIterator}; |
5 | 5 | use crate::ops::Try;
|
| 6 | +use core::num::NonZeroUsize; |
6 | 7 |
|
7 | 8 | /// An iterator that clones the elements of an underlying iterator.
|
8 | 9 | ///
|
@@ -167,3 +168,23 @@ impl<I: Default> Default for Cloned<I> {
|
167 | 168 | Self::new(Default::default())
|
168 | 169 | }
|
169 | 170 | }
|
| 171 | + |
| 172 | +#[unstable(issue = "none", feature = "inplace_iteration")] |
| 173 | +unsafe impl<I> SourceIter for Cloned<I> |
| 174 | +where |
| 175 | + I: SourceIter, |
| 176 | +{ |
| 177 | + type Source = I::Source; |
| 178 | + |
| 179 | + #[inline] |
| 180 | + unsafe fn as_inner(&mut self) -> &mut I::Source { |
| 181 | + // SAFETY: unsafe function forwarding to unsafe function with the same requirements |
| 182 | + unsafe { SourceIter::as_inner(&mut self.it) } |
| 183 | + } |
| 184 | +} |
| 185 | + |
| 186 | +#[unstable(issue = "none", feature = "inplace_iteration")] |
| 187 | +unsafe impl<I: InPlaceIterable> InPlaceIterable for Cloned<I> { |
| 188 | + const EXPAND_BY: Option<NonZeroUsize> = I::EXPAND_BY; |
| 189 | + const MERGE_BY: Option<NonZeroUsize> = I::MERGE_BY; |
| 190 | +} |
0 commit comments