mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-03 18:43:38 +00:00
restore SpecFrom<T, TrustedLen<Item=T>> specialization by nesting
specializations
This commit is contained in:
parent
582fbb1d62
commit
dac0edfaaa
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user