diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2014-05-19 12:11:06 +0300 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2014-09-14 04:20:35 +0300 |
| commit | f8df4fadc86f44cb5f6e69f29634dcfa6701b070 (patch) | |
| tree | b256bdaeeef6909c39cf7af6ab70814991fc29bf /src | |
| parent | 946bb4b10b3b758dbebf773a178cf99de1dd023c (diff) | |
| download | rust-f8df4fadc86f44cb5f6e69f29634dcfa6701b070.tar.gz rust-f8df4fadc86f44cb5f6e69f29634dcfa6701b070.zip | |
syntax: implement in-place folding of P<T> and Vec<T>.
Diffstat (limited to 'src')
| -rw-r--r-- | src/libsyntax/fold.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/ptr.rs | 10 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 44ed347d70c..e63954c3680 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -35,8 +35,15 @@ pub trait MoveMap<T> { } impl<T> MoveMap<T> for Vec<T> { - fn move_map(self, f: |T| -> T) -> Vec<T> { - self.move_iter().map(f).collect() + fn move_map(mut self, f: |T| -> T) -> Vec<T> { + use std::{mem, ptr}; + for p in self.mut_iter() { + unsafe { + // FIXME(#5016) this shouldn't need to zero to be safe. + mem::move_val_init(p, f(ptr::read_and_zero(p))); + } + } + self } } diff --git a/src/libsyntax/ptr.rs b/src/libsyntax/ptr.rs index 92315a870f2..71cb2635280 100644 --- a/src/libsyntax/ptr.rs +++ b/src/libsyntax/ptr.rs @@ -31,8 +31,14 @@ impl<T: 'static> P<T> { f(*self.ptr) } - pub fn map(self, f: |T| -> T) -> P<T> { - self.and_then(|x| P(f(x))) + pub fn map(mut self, f: |T| -> T) -> P<T> { + use std::{mem, ptr}; + unsafe { + let p = &mut *self.ptr; + // FIXME(#5016) this shouldn't need to zero to be safe. + mem::move_val_init(p, f(ptr::read_and_zero(p))); + } + self } } |
