Skip to content

Commit 1eb57aa

Browse files
committed
syntax: implement in-place folding of P<T> and Vec<T>.
1 parent a133c83 commit 1eb57aa

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/libsyntax/fold.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,15 @@ pub trait MoveMap<T> {
3535
}
3636

3737
impl<T> MoveMap<T> for Vec<T> {
38-
fn move_map(self, f: |T| -> T) -> Vec<T> {
39-
self.move_iter().map(f).collect()
38+
fn move_map(mut self, f: |T| -> T) -> Vec<T> {
39+
use std::{mem, ptr};
40+
for p in self.mut_iter() {
41+
unsafe {
42+
// FIXME(#5016) this shouldn't need to zero to be safe.
43+
mem::move_val_init(p, f(ptr::read_and_zero(p)));
44+
}
45+
}
46+
self
4047
}
4148
}
4249

src/libsyntax/ptr.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,14 @@ impl<T: 'static> P<T> {
3131
f(*self.ptr)
3232
}
3333

34-
pub fn map(self, f: |T| -> T) -> P<T> {
35-
self.and_then(|x| P(f(x)))
34+
pub fn map(mut self, f: |T| -> T) -> P<T> {
35+
use std::{mem, ptr};
36+
unsafe {
37+
let p = &mut *self.ptr;
38+
// FIXME(#5016) this shouldn't need to zero to be safe.
39+
mem::move_val_init(p, f(ptr::read_and_zero(p)));
40+
}
41+
self
3642
}
3743
}
3844

0 commit comments

Comments
 (0)