@@ -117,6 +117,10 @@ use self::in_place_drop::InPlaceDrop;
117
117
118
118
mod in_place_drop;
119
119
120
+ use self :: spec_from_iter_nested:: SpecFromIterNested ;
121
+
122
+ mod spec_from_iter_nested;
123
+
120
124
/// A contiguous growable array type, written `Vec<T>` but pronounced 'vector'.
121
125
///
122
126
/// # Examples
@@ -2176,58 +2180,6 @@ trait SpecFromIter<T, I> {
2176
2180
fn from_iter ( iter : I ) -> Self ;
2177
2181
}
2178
2182
2179
- /// Another specialization trait for Vec::from_iter
2180
- /// necessary to manually prioritize overlapping specializations
2181
- /// see [`SpecFromIter`] for details.
2182
- trait SpecFromIterNested < T , I > {
2183
- fn from_iter ( iter : I ) -> Self ;
2184
- }
2185
-
2186
- impl < T , I > SpecFromIterNested < T , I > for Vec < T >
2187
- where
2188
- I : Iterator < Item = T > ,
2189
- {
2190
- default fn from_iter ( mut iterator : I ) -> Self {
2191
- // Unroll the first iteration, as the vector is going to be
2192
- // expanded on this iteration in every case when the iterable is not
2193
- // empty, but the loop in extend_desugared() is not going to see the
2194
- // vector being full in the few subsequent loop iterations.
2195
- // So we get better branch prediction.
2196
- let mut vector = match iterator. next ( ) {
2197
- None => return Vec :: new ( ) ,
2198
- Some ( element) => {
2199
- let ( lower, _) = iterator. size_hint ( ) ;
2200
- let mut vector = Vec :: with_capacity ( lower. saturating_add ( 1 ) ) ;
2201
- unsafe {
2202
- ptr:: write ( vector. as_mut_ptr ( ) , element) ;
2203
- vector. set_len ( 1 ) ;
2204
- }
2205
- vector
2206
- }
2207
- } ;
2208
- // must delegate to spec_extend() since extend() itself delegates
2209
- // to spec_from for empty Vecs
2210
- <Vec < T > as SpecExtend < T , I > >:: spec_extend ( & mut vector, iterator) ;
2211
- vector
2212
- }
2213
- }
2214
-
2215
- impl < T , I > SpecFromIterNested < T , I > for Vec < T >
2216
- where
2217
- I : TrustedLen < Item = T > ,
2218
- {
2219
- fn from_iter ( iterator : I ) -> Self {
2220
- let mut vector = match iterator. size_hint ( ) {
2221
- ( _, Some ( upper) ) => Vec :: with_capacity ( upper) ,
2222
- _ => Vec :: new ( ) ,
2223
- } ;
2224
- // must delegate to spec_extend() since extend() itself delegates
2225
- // to spec_from for empty Vecs
2226
- vector. spec_extend ( iterator) ;
2227
- vector
2228
- }
2229
- }
2230
-
2231
2183
impl < T , I > SpecFromIter < T , I > for Vec < T >
2232
2184
where
2233
2185
I : Iterator < Item = T > ,
0 commit comments