Skip to content

Commit 37d26c7

Browse files
committed
Implement in-place iteratation markers for iter::{Copied, Cloned}
1 parent 3aa7313 commit 37d26c7

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

library/alloc/tests/vec.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -1166,10 +1166,14 @@ fn test_from_iter_partially_drained_in_place_specialization() {
11661166
#[test]
11671167
fn test_from_iter_specialization_with_iterator_adapters() {
11681168
fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {}
1169-
let src: Vec<usize> = vec![0usize; 256];
1169+
let owned: Vec<usize> = vec![0usize; 256];
1170+
let refd: Vec<&usize> = owned.iter().collect();
1171+
let src: Vec<&&usize> = refd.iter().collect();
11701172
let srcptr = src.as_ptr();
11711173
let iter = src
11721174
.into_iter()
1175+
.copied()
1176+
.cloned()
11731177
.enumerate()
11741178
.map(|i| i.0 + i.1)
11751179
.zip(std::iter::repeat(1usize))
@@ -1180,7 +1184,7 @@ fn test_from_iter_specialization_with_iterator_adapters() {
11801184
assert_in_place_trait(&iter);
11811185
let sink = iter.collect::<Result<Vec<_>, _>>().unwrap();
11821186
let sinkptr = sink.as_ptr();
1183-
assert_eq!(srcptr, sinkptr as *const usize);
1187+
assert_eq!(srcptr as *const usize, sinkptr as *const usize);
11841188
}
11851189

11861190
#[test]

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

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
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;
6+
use core::num::NonZeroUsize;
67

78
/// An iterator that clones the elements of an underlying iterator.
89
///
@@ -167,3 +168,23 @@ impl<I: Default> Default for Cloned<I> {
167168
Self::new(Default::default())
168169
}
169170
}
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+
}

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

+22-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,23 @@ 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> {
275+
const EXPAND_BY: Option<NonZeroUsize> = I::EXPAND_BY;
276+
const MERGE_BY: Option<NonZeroUsize> = I::MERGE_BY;
277+
}

0 commit comments

Comments
 (0)