Skip to content

Commit 3af552a

Browse files
committed
Implement in-place iteratation markers for iter::{Copied, Cloned}
1 parent 94f5f62 commit 3af552a

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

library/alloc/tests/vec.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -1167,10 +1167,14 @@ fn test_from_iter_partially_drained_in_place_specialization() {
11671167
#[test]
11681168
fn test_from_iter_specialization_with_iterator_adapters() {
11691169
fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {}
1170-
let src: Vec<usize> = vec![0usize; 256];
1170+
let owned: Vec<usize> = vec![0usize; 256];
1171+
let refd: Vec<&usize> = owned.iter().collect();
1172+
let src: Vec<&&usize> = refd.iter().collect();
11711173
let srcptr = src.as_ptr();
11721174
let iter = src
11731175
.into_iter()
1176+
.copied()
1177+
.cloned()
11741178
.enumerate()
11751179
.map(|i| i.0 + i.1)
11761180
.zip(std::iter::repeat(1usize))
@@ -1181,7 +1185,7 @@ fn test_from_iter_specialization_with_iterator_adapters() {
11811185
assert_in_place_trait(&iter);
11821186
let sink = iter.collect::<Result<Vec<_>, _>>().unwrap();
11831187
let sinkptr = sink.as_ptr();
1184-
assert_eq!(srcptr, sinkptr as *const usize);
1188+
assert_eq!(srcptr as *const usize, sinkptr as *const usize);
11851189
}
11861190

11871191
#[test]

library/core/src/iter/adapters/cloned.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::iter::adapters::{
2-
zip::try_get_unchecked, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
2+
zip::try_get_unchecked, SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
33
};
4-
use crate::iter::{FusedIterator, TrustedLen, UncheckedIterator};
4+
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen, UncheckedIterator};
55
use crate::ops::Try;
66

77
/// An iterator that clones the elements of an underlying iterator.
@@ -167,3 +167,20 @@ impl<I: Default> Default for Cloned<I> {
167167
Self::new(Default::default())
168168
}
169169
}
170+
171+
#[unstable(issue = "none", feature = "inplace_iteration")]
172+
unsafe impl<I> SourceIter for Cloned<I>
173+
where
174+
I: SourceIter,
175+
{
176+
type Source = I::Source;
177+
178+
#[inline]
179+
unsafe fn as_inner(&mut self) -> &mut I::Source {
180+
// SAFETY: unsafe function forwarding to unsafe function with the same requirements
181+
unsafe { SourceIter::as_inner(&mut self.it) }
182+
}
183+
}
184+
185+
#[unstable(issue = "none", feature = "inplace_iteration")]
186+
unsafe impl<I: InPlaceIterable> InPlaceIterable for Cloned<I> where Self: Iterator {}

library/core/src/iter/adapters/copied.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::iter::adapters::{
2-
zip::try_get_unchecked, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
2+
zip::try_get_unchecked, SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
33
};
4-
use crate::iter::{FusedIterator, TrustedLen};
4+
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen};
55
use crate::mem::MaybeUninit;
66
use crate::mem::SizedTypeProperties;
77
use crate::num::NonZeroUsize;
@@ -255,3 +255,20 @@ impl<I: Default> Default for Copied<I> {
255255
Self::new(Default::default())
256256
}
257257
}
258+
259+
#[unstable(issue = "none", feature = "inplace_iteration")]
260+
unsafe impl<I> SourceIter for Copied<I>
261+
where
262+
I: SourceIter,
263+
{
264+
type Source = I::Source;
265+
266+
#[inline]
267+
unsafe fn as_inner(&mut self) -> &mut I::Source {
268+
// SAFETY: unsafe function forwarding to unsafe function with the same requirements
269+
unsafe { SourceIter::as_inner(&mut self.it) }
270+
}
271+
}
272+
273+
#[unstable(issue = "none", feature = "inplace_iteration")]
274+
unsafe impl<I: InPlaceIterable> InPlaceIterable for Copied<I> where Self: Iterator {}

0 commit comments

Comments
 (0)