Make moves explicit in vec

I'm continuing to make moves explicit, despite #3413, because that
seems like the most reliable way to make these changes. Once I've made
all the moves explicit, the test for #3413 will be that I can remove them.
This commit is contained in:
Tim Chevalier 2012-09-10 11:14:24 -07:00
parent e5cb6cc123
commit c104745255

View File

@ -190,7 +190,7 @@ pure fn from_fn<T>(n_elts: uint, op: iter::InitOp<T>) -> ~[T] {
let mut i: uint = 0u;
while i < n_elts unsafe { unsafe::set(v, i, op(i)); i += 1u; }
unsafe { unsafe::set_len(v, n_elts); }
return v;
move v
}
/**
@ -207,7 +207,7 @@ pure fn from_elem<T: Copy>(n_elts: uint, t: T) -> ~[T] {
while i < n_elts { unsafe::set(v, i, t); i += 1u; }
unsafe { unsafe::set_len(v, n_elts); }
}
return v;
move v
}
/// Creates a new unique vector with the same contents as the slice
@ -231,8 +231,8 @@ pure fn from_slice<T: Copy>(t: &[T]) -> ~[T] {
pure fn build_sized<A>(size: uint, builder: fn(push: pure fn(+A))) -> ~[A] {
let mut vec = ~[];
unchecked { reserve(vec, size); }
builder(|+x| unchecked { push(vec, x) });
return vec;
builder(|+x| unchecked { push(vec, move x) });
move vec
}
/**
@ -325,7 +325,7 @@ pure fn slice<T: Copy>(v: &[const T], start: uint, end: uint) -> ~[T] {
unchecked {
for uint::range(start, end) |i| { vec::push(result, v[i]) }
}
return result;
move result
}
/// Return a slice that points into another slice.
@ -381,7 +381,7 @@ fn split<T: Copy>(v: &[T], f: fn(T) -> bool) -> ~[~[T]] {
}
}
push(result, slice(v, start, ln));
result
move result
}
/**
@ -407,7 +407,7 @@ fn splitn<T: Copy>(v: &[T], n: uint, f: fn(T) -> bool) -> ~[~[T]] {
}
}
push(result, slice(v, start, ln));
result
move result
}
/**
@ -458,7 +458,7 @@ fn rsplitn<T: Copy>(v: &[T], n: uint, f: fn(T) -> bool) -> ~[~[T]] {
}
push(result, slice(v, 0u, end));
reverse(result);
return from_mut(result);
move from_mut(move result)
}
// Mutators
@ -479,18 +479,18 @@ fn shift<T>(&v: ~[T]) -> T {
for uint::range(1, ln) |i| {
let r <- *ptr::offset(vv, i);
push(v, r);
push(v, move r);
}
}
unsafe::set_len(vv, 0);
rr
move rr
}
}
/// Prepend an element to the vector
fn unshift<T>(&v: ~[T], +x: T) {
let mut vv = ~[x];
let mut vv = ~[move x];
v <-> vv;
while len(vv) > 0 {
push(v, shift(vv));
@ -501,7 +501,7 @@ fn consume<T>(+v: ~[T], f: fn(uint, +T)) unsafe {
do as_buf(v) |p, ln| {
for uint::range(0, ln) |i| {
let x <- *ptr::offset(p, i);
f(i, x);
f(i, move x);
}
}
@ -512,7 +512,7 @@ fn consume_mut<T>(+v: ~[mut T], f: fn(uint, +T)) unsafe {
do as_buf(v) |p, ln| {
for uint::range(0, ln) |i| {
let x <- *ptr::offset(p, i);
f(i, x);
f(i, move x);
}
}
@ -529,7 +529,7 @@ fn pop<T>(&v: ~[const T]) -> T {
unsafe {
let val <- *valptr;
unsafe::set_len(v, ln - 1u);
val
move val
}
}
@ -552,7 +552,7 @@ fn swap_remove<T>(&v: ~[const T], index: uint) -> T {
*valptr <-> val;
}
unsafe::set_len(v, ln - 1);
val
move val
}
}
@ -563,10 +563,10 @@ fn push<T>(&v: ~[const T], +initval: T) {
let repr: **unsafe::VecRepr = ::unsafe::reinterpret_cast(&addr_of(v));
let fill = (**repr).fill;
if (**repr).alloc > fill {
push_fast(v, initval);
push_fast(v, move initval);
}
else {
push_slow(v, initval);
push_slow(v, move initval);
}
}
}
@ -585,7 +585,7 @@ unsafe fn push_fast<T>(&v: ~[const T], +initval: T) {
#[inline(never)]
fn push_slow<T>(&v: ~[const T], +initval: T) {
reserve_at_least(v, v.len() + 1u);
unsafe { push_fast(v, initval) }
unsafe { push_fast(v, move initval) }
}
#[inline(always)]
@ -604,7 +604,7 @@ fn push_all_move<T>(&v: ~[const T], -rhs: ~[const T]) {
do as_buf(rhs) |p, len| {
for uint::range(0, len) |i| {
let x <- *ptr::offset(p, i);
push(v, x);
push(v, move x);
}
}
unsafe::set_len(rhs, 0);
@ -632,14 +632,14 @@ pure fn append<T: Copy>(+lhs: ~[T], rhs: &[const T]) -> ~[T] {
unchecked {
push_all(v, rhs);
}
return v;
move v
}
#[inline(always)]
pure fn append_one<T>(+lhs: ~[T], +x: T) -> ~[T] {
let mut v <- lhs;
unchecked { push(v, x); }
v
unchecked { push(v, move x); }
move v
}
#[inline(always)]
@ -659,7 +659,7 @@ pure fn append_mut<T: Copy>(lhs: &[mut T], rhs: &[const T]) -> ~[mut T] {
}
i += 1u;
}
return v;
move v
}
/**
@ -717,15 +717,15 @@ pure fn map<T, U>(v: &[T], f: fn(T) -> U) -> ~[U] {
let mut result = ~[];
unchecked{reserve(result, len(v));}
for each(v) |elem| { unsafe { push(result, f(elem)); } }
return result;
move result
}
fn map_consume<T, U>(+v: ~[T], f: fn(+T) -> U) -> ~[U] {
let mut result = ~[];
do consume(v) |_i, x| {
vec::push(result, f(x));
do consume(move v) |_i, x| {
vec::push(result, f(move x));
}
result
move result
}
/// Apply a function to each element of a vector and return the results
@ -733,7 +733,7 @@ pure fn mapi<T, U>(v: &[T], f: fn(uint, T) -> U) -> ~[U] {
let mut result = ~[];
unchecked{reserve(result, len(v));}
for eachi(v) |i, elem| { unsafe { push(result, f(i, elem)); } }
return result;
move result
}
/**
@ -743,7 +743,7 @@ pure fn mapi<T, U>(v: &[T], f: fn(uint, T) -> U) -> ~[U] {
pure fn flat_map<T, U>(v: &[T], f: fn(T) -> ~[U]) -> ~[U] {
let mut result = ~[];
for each(v) |elem| { unchecked{ push_all_move(result, f(elem)); } }
return result;
move result
}
/// Apply a function to each pair of elements and return the results
@ -757,7 +757,7 @@ pure fn map2<T: Copy, U: Copy, V>(v0: &[T], v1: &[U],
unsafe { push(u, f(copy v0[i], copy v1[i])) };
i += 1u;
}
return u;
move u
}
/**
@ -775,7 +775,7 @@ pure fn filter_map<T, U: Copy>(v: &[T], f: fn(T) -> Option<U>)
Some(result_elem) => unsafe { push(result, result_elem); }
}
}
return result;
move result
}
/**
@ -790,7 +790,7 @@ pure fn filter<T: Copy>(v: &[T], f: fn(T) -> bool) -> ~[T] {
for each(v) |elem| {
if f(elem) { unsafe { push(result, elem); } }
}
return result;
move result
}
/**
@ -801,7 +801,7 @@ pure fn filter<T: Copy>(v: &[T], f: fn(T) -> bool) -> ~[T] {
pure fn concat<T: Copy>(v: &[~[T]]) -> ~[T] {
let mut r = ~[];
for each(v) |inner| { unsafe { push_all(r, inner); } }
return r;
move r
}
/// Concatenate a vector of vectors, placing a given separator between each
@ -812,7 +812,7 @@ pure fn connect<T: Copy>(v: &[~[T]], sep: T) -> ~[T] {
if first { first = false; } else { unsafe { push(r, sep); } }
unchecked { push_all(r, inner) };
}
return r;
move r
}
/// Reduce a vector from left to right
@ -1037,7 +1037,7 @@ pure fn unzip_slice<T: Copy, U: Copy>(v: &[(T, U)]) -> (~[T], ~[U]) {
vec::push(bs, b);
}
}
return (as_, bs);
return (move as_, move bs);
}
/**
@ -1051,13 +1051,13 @@ pure fn unzip_slice<T: Copy, U: Copy>(v: &[(T, U)]) -> (~[T], ~[U]) {
pure fn unzip<T,U>(+v: ~[(T, U)]) -> (~[T], ~[U]) {
let mut ts = ~[], us = ~[];
unchecked {
do consume(v) |_i, p| {
let (a,b) = p;
push(ts, a);
push(us, b);
do consume(move v) |_i, p| {
let (a,b) = move p;
push(ts, move a);
push(us, move b);
}
}
(ts, us)
(move ts, move us)
}
/**
@ -1070,7 +1070,7 @@ pure fn zip_slice<T: Copy, U: Copy>(v: &[const T], u: &[const U])
let mut i = 0u;
assert sz == len(u);
while i < sz unchecked { vec::push(zipped, (v[i], u[i])); i += 1u; }
return zipped;
move zipped
}
/**
@ -1080,7 +1080,7 @@ pure fn zip_slice<T: Copy, U: Copy>(v: &[const T], u: &[const U])
* i-th elements from each of the input vectors.
*/
pure fn zip<T, U>(+v: ~[const T], +u: ~[const U]) -> ~[(T, U)] {
let mut v = v, u = u, i = len(v);
let mut v = move v, u = move u, i = len(v);
assert i == len(u);
let mut w = ~[mut];
while i > 0 {
@ -1088,7 +1088,7 @@ pure fn zip<T, U>(+v: ~[const T], +u: ~[const U]) -> ~[(T, U)] {
i -= 1;
}
unchecked { reverse(w); }
from_mut(w)
from_mut(move w)
}
/**
@ -1116,12 +1116,12 @@ fn reverse<T>(v: ~[mut T]) {
pure fn reversed<T: Copy>(v: &[const T]) -> ~[T] {
let mut rs: ~[T] = ~[];
let mut i = len::<T>(v);
if i == 0u { return rs; } else { i -= 1u; }
if i == 0 { return (move rs); } else { i -= 1; }
unchecked {
while i != 0u { vec::push(rs, v[i]); i -= 1u; }
while i != 0 { vec::push(rs, v[i]); i -= 1; }
vec::push(rs, v[0]);
}
return rs;
move rs
}
/**
@ -1346,7 +1346,7 @@ pure fn windowed<TT: Copy>(nn: uint, xx: &[TT]) -> ~[~[TT]] {
vec::push(ww, vec::slice(xx, ii, ii+nn));
}
});
return ww;
move ww
}
/**
@ -1617,7 +1617,7 @@ impl<T> &[T]: ImmutableVector<T> {
push(r, f(&self[i]));
i += 1;
}
r
move r
}
/**
@ -1730,7 +1730,7 @@ mod unsafe {
reserve(dst, elts);
set_len(dst, elts);
as_buf(dst, |p_dst, _len_dst| ptr::memcpy(p_dst, ptr, elts));
dst
move dst
}
/**
@ -1794,12 +1794,12 @@ mod unsafe {
*/
#[inline(always)]
unsafe fn set<T>(v: &[mut T], i: uint, +val: T) {
let mut box = Some(val);
let mut box = Some(move val);
do as_mut_buf(v) |p, _len| {
let mut box2 = None;
box2 <-> box;
rusti::move_val_init(*ptr::mut_offset(p, i),
option::unwrap(box2));
option::unwrap(move box2));
}
}
@ -1926,7 +1926,7 @@ impl<A> &[const A]: iter::ExtendedIter<A> {
pure fn all(blk: fn(A) -> bool) -> bool { iter::all(self, blk) }
pure fn any(blk: fn(A) -> bool) -> bool { iter::any(self, blk) }
pure fn foldl<B>(+b0: B, blk: fn(B, A) -> B) -> B {
iter::foldl(self, b0, blk)
iter::foldl(self, move b0, blk)
}
}