restore SpecFrom<T, TrustedLen<Item=T>> specialization by nesting

specializations
This commit is contained in:
The8472 2019-11-21 13:40:49 +01:00
parent 582fbb1d62
commit dac0edfaaa

View file

@ -2108,7 +2108,13 @@ trait SpecFrom<T, I> {
fn from_iter(iter: I) -> Self;
}
impl<T, I> SpecFrom<T, I> for Vec<T>
// Another specialization trait for Vec::from_iter
// necessary to manually prioritize overlapping specializations
trait SpecFromNested<T, I> {
fn from_iter(iter: I) -> Self;
}
impl<T, I> SpecFromNested<T, I> for Vec<T>
where
I: Iterator<Item = T>,
{
@ -2137,6 +2143,28 @@ where
}
}
impl<T, I> SpecFromNested<T, I> for Vec<T>
where
I: TrustedLen<Item = T>,
{
fn from_iter(iterator: I) -> Self {
let mut vector = Vec::new();
// must delegate to spec_extend() since extend() itself delegates
// to spec_from for empty Vecs
vector.spec_extend(iterator);
vector
}
}
impl<T, I> SpecFrom<T, I> for Vec<T>
where
I: Iterator<Item = T>,
{
default fn from_iter(iterator: I) -> Self {
SpecFromNested::from_iter(iterator)
}
}
struct InPlaceDrop<T> {
inner: *mut T,
dst: *mut T,