@@ -356,43 +356,32 @@ pub fn connect_slices<T:Clone>(v: &[&[T]], sep: &T) -> ~[T] { v.connect_vec(sep)
356
356
pub trait VectorVector < T > {
357
357
// FIXME #5898: calling these .concat and .connect conflicts with
358
358
// StrVector::con{cat,nect}, since they have generic contents.
359
+ /// Flattens a vector of vectors of T into a single vector of T.
359
360
fn concat_vec ( & self ) -> ~[ T ] ;
360
- fn connect_vec ( & self , sep : & T ) -> ~[ T ] ;
361
- }
362
-
363
- impl < ' self , T : Clone > VectorVector < T > for & ' self [ ~[ T ] ] {
364
- /// Flattens a vector of slices of T into a single vector of T.
365
- fn concat_vec ( & self ) -> ~[ T ] {
366
- self . flat_map ( |inner| ( * inner) . clone ( ) )
367
- }
368
361
369
362
/// Concatenate a vector of vectors, placing a given separator between each.
370
- fn connect_vec ( & self , sep : & T ) -> ~[ T ] {
371
- let mut r = ~[ ] ;
372
- let mut first = true ;
373
- for inner in self . iter ( ) {
374
- if first { first = false ; } else { r. push ( ( * sep) . clone ( ) ) ; }
375
- r. push_all ( ( * inner) . clone ( ) ) ;
376
- }
377
- r
378
- }
363
+ fn connect_vec ( & self , sep : & T ) -> ~[ T ] ;
379
364
}
380
365
381
- impl < ' self , T : Clone > VectorVector < T > for & ' self [ & ' self [ T ] ] {
382
- /// Flattens a vector of slices of T into a single vector of T.
366
+ impl < ' self , T : Clone , V : Vector < T > > VectorVector < T > for & ' self [ V ] {
383
367
fn concat_vec ( & self ) -> ~[ T ] {
384
- self . flat_map ( |& inner| inner. to_owned ( ) )
368
+ let size = self . iter ( ) . fold ( 0 u, |acc, v| acc + v. as_slice ( ) . len ( ) ) ;
369
+ let mut result = with_capacity ( size) ;
370
+ for v in self . iter ( ) {
371
+ result. push_all ( v. as_slice ( ) )
372
+ }
373
+ result
385
374
}
386
375
387
- /// Concatenate a vector of slices, placing a given separator between each.
388
376
fn connect_vec ( & self , sep : & T ) -> ~[ T ] {
389
- let mut r = ~[ ] ;
377
+ let size = self . iter ( ) . fold ( 0 u, |acc, v| acc + v. as_slice ( ) . len ( ) ) ;
378
+ let mut result = with_capacity ( size + self . len ( ) ) ;
390
379
let mut first = true ;
391
- for & inner in self . iter ( ) {
392
- if first { first = false ; } else { r . push ( ( * sep) . clone ( ) ) ; }
393
- r . push_all ( inner ) ;
380
+ for v in self . iter ( ) {
381
+ if first { first = false } else { result . push ( sep. clone ( ) ) }
382
+ result . push_all ( v . as_slice ( ) )
394
383
}
395
- r
384
+ result
396
385
}
397
386
}
398
387
0 commit comments