Implement in-place iteratation markers for iter::{Copied, Cloned}
This commit is contained in:
parent
3aa73135cf
commit
37d26c719d
@ -1166,10 +1166,14 @@ fn test_from_iter_partially_drained_in_place_specialization() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_from_iter_specialization_with_iterator_adapters() {
|
fn test_from_iter_specialization_with_iterator_adapters() {
|
||||||
fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {}
|
fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {}
|
||||||
let src: Vec<usize> = vec![0usize; 256];
|
let owned: Vec<usize> = vec![0usize; 256];
|
||||||
|
let refd: Vec<&usize> = owned.iter().collect();
|
||||||
|
let src: Vec<&&usize> = refd.iter().collect();
|
||||||
let srcptr = src.as_ptr();
|
let srcptr = src.as_ptr();
|
||||||
let iter = src
|
let iter = src
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
.copied()
|
||||||
|
.cloned()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|i| i.0 + i.1)
|
.map(|i| i.0 + i.1)
|
||||||
.zip(std::iter::repeat(1usize))
|
.zip(std::iter::repeat(1usize))
|
||||||
@ -1180,7 +1184,7 @@ fn test_from_iter_specialization_with_iterator_adapters() {
|
|||||||
assert_in_place_trait(&iter);
|
assert_in_place_trait(&iter);
|
||||||
let sink = iter.collect::<Result<Vec<_>, _>>().unwrap();
|
let sink = iter.collect::<Result<Vec<_>, _>>().unwrap();
|
||||||
let sinkptr = sink.as_ptr();
|
let sinkptr = sink.as_ptr();
|
||||||
assert_eq!(srcptr, sinkptr as *const usize);
|
assert_eq!(srcptr as *const usize, sinkptr as *const usize);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
use crate::iter::adapters::{
|
use crate::iter::adapters::{
|
||||||
zip::try_get_unchecked, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
|
zip::try_get_unchecked, SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
|
||||||
};
|
};
|
||||||
use crate::iter::{FusedIterator, TrustedLen, UncheckedIterator};
|
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen, UncheckedIterator};
|
||||||
use crate::ops::Try;
|
use crate::ops::Try;
|
||||||
|
use core::num::NonZeroUsize;
|
||||||
|
|
||||||
/// An iterator that clones the elements of an underlying iterator.
|
/// An iterator that clones the elements of an underlying iterator.
|
||||||
///
|
///
|
||||||
@ -167,3 +168,23 @@ impl<I: Default> Default for Cloned<I> {
|
|||||||
Self::new(Default::default())
|
Self::new(Default::default())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||||
|
unsafe impl<I> SourceIter for Cloned<I>
|
||||||
|
where
|
||||||
|
I: SourceIter,
|
||||||
|
{
|
||||||
|
type Source = I::Source;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn as_inner(&mut self) -> &mut I::Source {
|
||||||
|
// SAFETY: unsafe function forwarding to unsafe function with the same requirements
|
||||||
|
unsafe { SourceIter::as_inner(&mut self.it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||||
|
unsafe impl<I: InPlaceIterable> InPlaceIterable for Cloned<I> {
|
||||||
|
const EXPAND_BY: Option<NonZeroUsize> = I::EXPAND_BY;
|
||||||
|
const MERGE_BY: Option<NonZeroUsize> = I::MERGE_BY;
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::iter::adapters::{
|
use crate::iter::adapters::{
|
||||||
zip::try_get_unchecked, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
|
zip::try_get_unchecked, SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
|
||||||
};
|
};
|
||||||
use crate::iter::{FusedIterator, TrustedLen};
|
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen};
|
||||||
use crate::mem::MaybeUninit;
|
use crate::mem::MaybeUninit;
|
||||||
use crate::mem::SizedTypeProperties;
|
use crate::mem::SizedTypeProperties;
|
||||||
use crate::num::NonZeroUsize;
|
use crate::num::NonZeroUsize;
|
||||||
@ -255,3 +255,23 @@ impl<I: Default> Default for Copied<I> {
|
|||||||
Self::new(Default::default())
|
Self::new(Default::default())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||||
|
unsafe impl<I> SourceIter for Copied<I>
|
||||||
|
where
|
||||||
|
I: SourceIter,
|
||||||
|
{
|
||||||
|
type Source = I::Source;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn as_inner(&mut self) -> &mut I::Source {
|
||||||
|
// SAFETY: unsafe function forwarding to unsafe function with the same requirements
|
||||||
|
unsafe { SourceIter::as_inner(&mut self.it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||||
|
unsafe impl<I: InPlaceIterable> InPlaceIterable for Copied<I> {
|
||||||
|
const EXPAND_BY: Option<NonZeroUsize> = I::EXPAND_BY;
|
||||||
|
const MERGE_BY: Option<NonZeroUsize> = I::MERGE_BY;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user