diff options
| author | C <DeveloperC@protonmail.com> | 2020-12-05 01:30:20 +0000 |
|---|---|---|
| committer | C <DeveloperC@protonmail.com> | 2020-12-29 14:03:30 +0000 |
| commit | 56d82b3dcc73e227dd2fa4dd4a8ef8d96ce75805 (patch) | |
| tree | 5d00f752a39c3b6700c073ca1af06daa1f8124d3 /library/alloc/src | |
| parent | 9e08ce7190dd63afc3e5a12f89134c760566513a (diff) | |
| download | rust-56d82b3dcc73e227dd2fa4dd4a8ef8d96ce75805.tar.gz rust-56d82b3dcc73e227dd2fa4dd4a8ef8d96ce75805.zip | |
refactor: moved SpecFromIterNested to spec_from_iter_nested.rs
Diffstat (limited to 'library/alloc/src')
| -rw-r--r-- | library/alloc/src/vec/mod.rs | 56 | ||||
| -rw-r--r-- | library/alloc/src/vec/spec_from_iter_nested.rs | 56 |
2 files changed, 60 insertions, 52 deletions
diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 08a920a9c60..438246ab4cb 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -117,6 +117,10 @@ use self::in_place_drop::InPlaceDrop; mod in_place_drop; +use self::spec_from_iter_nested::SpecFromIterNested; + +mod spec_from_iter_nested; + /// A contiguous growable array type, written `Vec<T>` but pronounced 'vector'. /// /// # Examples @@ -2176,58 +2180,6 @@ trait SpecFromIter<T, I> { fn from_iter(iter: I) -> Self; } -/// Another specialization trait for Vec::from_iter -/// necessary to manually prioritize overlapping specializations -/// see [`SpecFromIter`] for details. -trait SpecFromIterNested<T, I> { - fn from_iter(iter: I) -> Self; -} - -impl<T, I> SpecFromIterNested<T, I> for Vec<T> -where - I: Iterator<Item = T>, -{ - default fn from_iter(mut iterator: I) -> Self { - // Unroll the first iteration, as the vector is going to be - // expanded on this iteration in every case when the iterable is not - // empty, but the loop in extend_desugared() is not going to see the - // vector being full in the few subsequent loop iterations. - // So we get better branch prediction. - let mut vector = match iterator.next() { - None => return Vec::new(), - Some(element) => { - let (lower, _) = iterator.size_hint(); - let mut vector = Vec::with_capacity(lower.saturating_add(1)); - unsafe { - ptr::write(vector.as_mut_ptr(), element); - vector.set_len(1); - } - vector - } - }; - // must delegate to spec_extend() since extend() itself delegates - // to spec_from for empty Vecs - <Vec<T> as SpecExtend<T, I>>::spec_extend(&mut vector, iterator); - vector - } -} - -impl<T, I> SpecFromIterNested<T, I> for Vec<T> -where - I: TrustedLen<Item = T>, -{ - fn from_iter(iterator: I) -> Self { - let mut vector = match iterator.size_hint() { - (_, Some(upper)) => Vec::with_capacity(upper), - _ => 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> SpecFromIter<T, I> for Vec<T> where I: Iterator<Item = T>, diff --git a/library/alloc/src/vec/spec_from_iter_nested.rs b/library/alloc/src/vec/spec_from_iter_nested.rs new file mode 100644 index 00000000000..0da42844c96 --- /dev/null +++ b/library/alloc/src/vec/spec_from_iter_nested.rs @@ -0,0 +1,56 @@ +use core::ptr::{self}; +use core::iter::{TrustedLen}; + +use super::{Vec, SpecExtend}; + +/// Another specialization trait for Vec::from_iter +/// necessary to manually prioritize overlapping specializations +/// see [`SpecFromIter`] for details. +pub(super) trait SpecFromIterNested<T, I> { + fn from_iter(iter: I) -> Self; +} + +impl<T, I> SpecFromIterNested<T, I> for Vec<T> + where + I: Iterator<Item = T>, +{ + default fn from_iter(mut iterator: I) -> Self { + // Unroll the first iteration, as the vector is going to be + // expanded on this iteration in every case when the iterable is not + // empty, but the loop in extend_desugared() is not going to see the + // vector being full in the few subsequent loop iterations. + // So we get better branch prediction. + let mut vector = match iterator.next() { + None => return Vec::new(), + Some(element) => { + let (lower, _) = iterator.size_hint(); + let mut vector = Vec::with_capacity(lower.saturating_add(1)); + unsafe { + ptr::write(vector.as_mut_ptr(), element); + vector.set_len(1); + } + vector + } + }; + // must delegate to spec_extend() since extend() itself delegates + // to spec_from for empty Vecs + <Vec<T> as SpecExtend<T, I>>::spec_extend(&mut vector, iterator); + vector + } +} + +impl<T, I> SpecFromIterNested<T, I> for Vec<T> + where + I: TrustedLen<Item = T>, +{ + fn from_iter(iterator: I) -> Self { + let mut vector = match iterator.size_hint() { + (_, Some(upper)) => Vec::with_capacity(upper), + _ => Vec::new(), + }; + // must delegate to spec_extend() since extend() itself delegates + // to spec_from for empty Vecs + vector.spec_extend(iterator); + vector + } +} |
