@@ -340,59 +340,36 @@ pub fn flat_map<T, U>(v: &[T], f: &fn(t: &T) -> ~[U]) -> ~[U] {
340
340
result
341
341
}
342
342
343
- /// Flattens a vector of vectors of T into a single vector of T.
344
- pub fn concat < T : Clone > ( v : & [ ~[ T ] ] ) -> ~[ T ] { v. concat_vec ( ) }
345
-
346
- /// Concatenate a vector of vectors, placing a given separator between each
347
- pub fn connect < T : Clone > ( v : & [ ~[ T ] ] , sep : & T ) -> ~[ T ] { v. connect_vec ( sep) }
348
-
349
- /// Flattens a vector of vectors of T into a single vector of T.
350
- pub fn concat_slices < T : Clone > ( v : & [ & [ T ] ] ) -> ~[ T ] { v. concat_vec ( ) }
351
-
352
- /// Concatenate a vector of vectors, placing a given separator between each
353
- pub fn connect_slices < T : Clone > ( v : & [ & [ T ] ] , sep : & T ) -> ~[ T ] { v. connect_vec ( sep) }
354
-
355
343
#[ allow( missing_doc) ]
356
344
pub trait VectorVector < T > {
357
345
// FIXME #5898: calling these .concat and .connect conflicts with
358
346
// StrVector::con{cat,nect}, since they have generic contents.
347
+ /// Flattens a vector of vectors of T into a single vector of T.
359
348
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
349
369
350
/// 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
- }
351
+ fn connect_vec ( & self , sep : & T ) -> ~[ T ] ;
379
352
}
380
353
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.
354
+ impl < ' self , T : Clone , V : Vector < T > > VectorVector < T > for & ' self [ V ] {
383
355
fn concat_vec ( & self ) -> ~[ T ] {
384
- self . flat_map ( |& inner| inner. to_owned ( ) )
356
+ let size = self . iter ( ) . fold ( 0 u, |acc, v| acc + v. as_slice ( ) . len ( ) ) ;
357
+ let mut result = with_capacity ( size) ;
358
+ for v in self . iter ( ) {
359
+ result. push_all ( v. as_slice ( ) )
360
+ }
361
+ result
385
362
}
386
363
387
- /// Concatenate a vector of slices, placing a given separator between each.
388
364
fn connect_vec ( & self , sep : & T ) -> ~[ T ] {
389
- let mut r = ~[ ] ;
365
+ let size = self . iter ( ) . fold ( 0 u, |acc, v| acc + v. as_slice ( ) . len ( ) ) ;
366
+ let mut result = with_capacity ( size + self . len ( ) ) ;
390
367
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 ) ;
368
+ for v in self . iter ( ) {
369
+ if first { first = false } else { result . push ( sep. clone ( ) ) }
370
+ result . push_all ( v . as_slice ( ) )
394
371
}
395
- r
372
+ result
396
373
}
397
374
}
398
375
@@ -3109,24 +3086,21 @@ mod tests {
3109
3086
3110
3087
#[ test]
3111
3088
fn test_concat ( ) {
3112
- assert_eq ! ( concat( [ ~[ 1 ] , ~[ 2 , 3 ] ] ) , ~[ 1 , 2 , 3 ] ) ;
3089
+ let v: [ ~[ int ] , ..0 ] = [ ] ;
3090
+ assert_eq ! ( v. concat_vec( ) , ~[ ] ) ;
3113
3091
assert_eq ! ( [ ~[ 1 ] , ~[ 2 , 3 ] ] . concat_vec( ) , ~[ 1 , 2 , 3 ] ) ;
3114
3092
3115
- assert_eq ! ( concat_slices( [ & [ 1 ] , & [ 2 , 3 ] ] ) , ~[ 1 , 2 , 3 ] ) ;
3116
3093
assert_eq ! ( [ & [ 1 ] , & [ 2 , 3 ] ] . concat_vec( ) , ~[ 1 , 2 , 3 ] ) ;
3117
3094
}
3118
3095
3119
3096
#[ test]
3120
3097
fn test_connect ( ) {
3121
- assert_eq ! ( connect( [ ] , & 0 ) , ~[ ] ) ;
3122
- assert_eq ! ( connect( [ ~[ 1 ] , ~[ 2 , 3 ] ] , & 0 ) , ~[ 1 , 0 , 2 , 3 ] ) ;
3123
- assert_eq ! ( connect( [ ~[ 1 ] , ~[ 2 ] , ~[ 3 ] ] , & 0 ) , ~[ 1 , 0 , 2 , 0 , 3 ] ) ;
3098
+ let v: [ ~[ int ] , ..0 ] = [ ] ;
3099
+ assert_eq ! ( v. connect_vec( & 0 ) , ~[ ] ) ;
3124
3100
assert_eq ! ( [ ~[ 1 ] , ~[ 2 , 3 ] ] . connect_vec( & 0 ) , ~[ 1 , 0 , 2 , 3 ] ) ;
3125
3101
assert_eq ! ( [ ~[ 1 ] , ~[ 2 ] , ~[ 3 ] ] . connect_vec( & 0 ) , ~[ 1 , 0 , 2 , 0 , 3 ] ) ;
3126
3102
3127
- assert_eq ! ( connect_slices( [ ] , & 0 ) , ~[ ] ) ;
3128
- assert_eq ! ( connect_slices( [ & [ 1 ] , & [ 2 , 3 ] ] , & 0 ) , ~[ 1 , 0 , 2 , 3 ] ) ;
3129
- assert_eq ! ( connect_slices( [ & [ 1 ] , & [ 2 ] , & [ 3 ] ] , & 0 ) , ~[ 1 , 0 , 2 , 0 , 3 ] ) ;
3103
+ assert_eq ! ( v. connect_vec( & 0 ) , ~[ ] ) ;
3130
3104
assert_eq ! ( [ & [ 1 ] , & [ 2 , 3 ] ] . connect_vec( & 0 ) , ~[ 1 , 0 , 2 , 3 ] ) ;
3131
3105
assert_eq ! ( [ & [ 1 ] , & [ 2 ] , & [ 3 ] ] . connect_vec( & 0 ) , ~[ 1 , 0 , 2 , 0 , 3 ] ) ;
3132
3106
}
@@ -3758,7 +3732,9 @@ mod tests {
3758
3732
#[ cfg( test) ]
3759
3733
mod bench {
3760
3734
use extra:: test:: BenchHarness ;
3735
+ use iter:: range;
3761
3736
use vec;
3737
+ use vec:: VectorVector ;
3762
3738
use option:: * ;
3763
3739
3764
3740
#[ bench]
@@ -3798,4 +3774,20 @@ mod bench {
3798
3774
xs + ys;
3799
3775
}
3800
3776
}
3777
+
3778
+ #[ bench]
3779
+ fn concat ( bh : & mut BenchHarness ) {
3780
+ let xss: & [ ~[ uint ] ] = vec:: from_fn ( 100 , |i| range ( 0 , i) . collect ( ) ) ;
3781
+ do bh. iter {
3782
+ xss. concat_vec ( ) ;
3783
+ }
3784
+ }
3785
+
3786
+ #[ bench]
3787
+ fn connect ( bh : & mut BenchHarness ) {
3788
+ let xss: & [ ~[ uint ] ] = vec:: from_fn ( 100 , |i| range ( 0 , i) . collect ( ) ) ;
3789
+ do bh. iter {
3790
+ xss. connect_vec ( & 0 ) ;
3791
+ }
3792
+ }
3801
3793
}
0 commit comments