@@ -26,34 +26,11 @@ use codemap::{respan, Span, Spanned};
26
26
use owned_slice:: OwnedSlice ;
27
27
use parse:: token;
28
28
use ptr:: P ;
29
- use std:: ptr;
30
29
use util:: small_vector:: SmallVector ;
30
+ use util:: move_map:: MoveMap ;
31
31
32
32
use std:: rc:: Rc ;
33
33
34
- // This could have a better place to live.
35
- pub trait MoveMap < T > {
36
- fn move_map < F > ( self , f : F ) -> Self where F : FnMut ( T ) -> T ;
37
- }
38
-
39
- impl < T > MoveMap < T > for Vec < T > {
40
- fn move_map < F > ( mut self , mut f : F ) -> Vec < T > where F : FnMut ( T ) -> T {
41
- for p in & mut self {
42
- unsafe {
43
- // FIXME(#5016) this shouldn't need to zero to be safe.
44
- ptr:: write ( p, f ( ptr:: read_and_drop ( p) ) ) ;
45
- }
46
- }
47
- self
48
- }
49
- }
50
-
51
- impl < T > MoveMap < T > for OwnedSlice < T > {
52
- fn move_map < F > ( self , f : F ) -> OwnedSlice < T > where F : FnMut ( T ) -> T {
53
- OwnedSlice :: from_vec ( self . into_vec ( ) . move_map ( f) )
54
- }
55
- }
56
-
57
34
pub trait Folder : Sized {
58
35
// Any additions to this trait should happen in form
59
36
// of a call to a public `noop_*` function that only calls
@@ -362,7 +339,7 @@ pub fn noop_fold_view_path<T: Folder>(view_path: P<ViewPath>, fld: &mut T) -> P<
362
339
}
363
340
364
341
pub fn fold_attrs < T : Folder > ( attrs : Vec < Attribute > , fld : & mut T ) -> Vec < Attribute > {
365
- attrs. into_iter ( ) . flat_map ( |x| fld. fold_attribute ( x) ) . collect ( )
342
+ attrs. move_flat_map ( |x| fld. fold_attribute ( x) )
366
343
}
367
344
368
345
pub fn fold_thin_attrs < T : Folder > ( attrs : ThinAttributes , fld : & mut T ) -> ThinAttributes {
@@ -623,6 +600,8 @@ pub fn noop_fold_tt<T: Folder>(tt: &TokenTree, fld: &mut T) -> TokenTree {
623
600
}
624
601
625
602
pub fn noop_fold_tts < T : Folder > ( tts : & [ TokenTree ] , fld : & mut T ) -> Vec < TokenTree > {
603
+ // FIXME: Does this have to take a tts slice?
604
+ // Could use move_map otherwise...
626
605
tts. iter ( ) . map ( |tt| fld. fold_tt ( tt) ) . collect ( )
627
606
}
628
607
@@ -904,7 +883,7 @@ fn noop_fold_bounds<T: Folder>(bounds: TyParamBounds, folder: &mut T)
904
883
pub fn noop_fold_block < T : Folder > ( b : P < Block > , folder : & mut T ) -> P < Block > {
905
884
b. map ( |Block { id, stmts, expr, rules, span} | Block {
906
885
id : folder. new_id ( id) ,
907
- stmts : stmts. into_iter ( ) . flat_map ( |s| folder. fold_stmt ( s) . into_iter ( ) ) . collect ( ) ,
886
+ stmts : stmts. move_flat_map ( |s| folder. fold_stmt ( s) . into_iter ( ) ) ,
908
887
expr : expr. and_then ( |x| folder. fold_opt_expr ( x) ) ,
909
888
rules : rules,
910
889
span : folder. new_span ( span) ,
@@ -953,9 +932,9 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
953
932
ItemDefaultImpl ( unsafety, folder. fold_trait_ref ( ( * trait_ref) . clone ( ) ) )
954
933
}
955
934
ItemImpl ( unsafety, polarity, generics, ifce, ty, impl_items) => {
956
- let new_impl_items = impl_items. into_iter ( ) . flat_map ( |item| {
957
- folder. fold_impl_item ( item) . into_iter ( )
958
- } ) . collect ( ) ;
935
+ let new_impl_items = impl_items. move_flat_map ( |item| {
936
+ folder. fold_impl_item ( item)
937
+ } ) ;
959
938
let ifce = match ifce {
960
939
None => None ,
961
940
Some ( ref trait_ref) => {
@@ -971,9 +950,9 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
971
950
}
972
951
ItemTrait ( unsafety, generics, bounds, items) => {
973
952
let bounds = folder. fold_bounds ( bounds) ;
974
- let items = items. into_iter ( ) . flat_map ( |item| {
975
- folder. fold_trait_item ( item) . into_iter ( )
976
- } ) . collect ( ) ;
953
+ let items = items. move_flat_map ( |item| {
954
+ folder. fold_trait_item ( item)
955
+ } ) ;
977
956
ItemTrait ( unsafety,
978
957
folder. fold_generics ( generics) ,
979
958
bounds,
@@ -1032,7 +1011,7 @@ pub fn noop_fold_impl_item<T: Folder>(i: P<ImplItem>, folder: &mut T)
1032
1011
pub fn noop_fold_mod < T : Folder > ( Mod { inner, items} : Mod , folder : & mut T ) -> Mod {
1033
1012
Mod {
1034
1013
inner : folder. new_span ( inner) ,
1035
- items : items. into_iter ( ) . flat_map ( |x| folder. fold_item ( x) . into_iter ( ) ) . collect ( ) ,
1014
+ items : items. move_flat_map ( |x| folder. fold_item ( x) ) ,
1036
1015
}
1037
1016
}
1038
1017
@@ -1353,8 +1332,7 @@ pub fn noop_fold_opt_expr<T: Folder>(e: P<Expr>, folder: &mut T) -> Option<P<Exp
1353
1332
}
1354
1333
1355
1334
pub fn noop_fold_exprs < T : Folder > ( es : Vec < P < Expr > > , folder : & mut T ) -> Vec < P < Expr > > {
1356
- // FIXME: Needs a efficient in-place flat_map
1357
- es. into_iter ( ) . flat_map ( |e| folder. fold_opt_expr ( e) ) . collect ( )
1335
+ es. move_flat_map ( |e| folder. fold_opt_expr ( e) )
1358
1336
}
1359
1337
1360
1338
pub fn noop_fold_stmt < T : Folder > ( Spanned { node, span} : Stmt , folder : & mut T )
0 commit comments