Skip to content

Commit 566bcf2

Browse files
committed
auto merge of #4969 : nickdesaulniers/rust/issue3869, r=brson
Issue #3869 review? @nikomatsakis Convert all uses of vec::slice to vec::view Issue #3869 Rename const_view to const_slice Renamed mut_view to mut_slice Fix windows build error. `buf` is borrowed by the call to `as_mut_buf()` and so we must invoke `slice()` outside of that call.
2 parents 0528329 + 91af527 commit 566bcf2

File tree

21 files changed

+130
-124
lines changed

21 files changed

+130
-124
lines changed

src/compiletest/runtest.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,8 @@ fn make_run_args(config: config, _props: TestProps, testfile: &Path) ->
570570
};
571571

572572
let args = toolargs + ~[make_exe_name(config, testfile).to_str()];
573-
return ProcArgs {prog: args[0], args: vec::slice(args, 1, args.len())};
573+
return ProcArgs {prog: args[0],
574+
args: vec::slice(args, 1, args.len()).to_vec()};
574575
}
575576

576577
fn split_maybe_args(argstr: Option<~str>) -> ~[~str] {

src/libcargo/cargo.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1553,7 +1553,7 @@ pub fn cmd_list(c: &Cargo) {
15531553
sync(c);
15541554

15551555
if vec::len(c.opts.free) >= 3u {
1556-
let v = vec::view(c.opts.free, 2u, vec::len(c.opts.free));
1556+
let v = vec::slice(c.opts.free, 2u, vec::len(c.opts.free));
15571557
for vec::each(v) |name| {
15581558
if !valid_pkg_name(*name) {
15591559
error(fmt!("'%s' is an invalid source name", *name));

src/libcore/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl<T: Reader> ReaderUtil for T {
246246
// over-read by reading 1-byte per char needed
247247
nbread = if ncreq > nbreq { ncreq } else { nbreq };
248248
if nbread > 0 {
249-
bytes = vec::slice(bytes, offset, bytes.len());
249+
bytes = vec::slice(bytes, offset, bytes.len()).to_vec();
250250
}
251251
}
252252
chars
@@ -531,7 +531,7 @@ impl Reader for BytesReader {
531531
fn read(&self, bytes: &mut [u8], len: uint) -> uint {
532532
let count = uint::min(len, self.bytes.len() - self.pos);
533533
534-
let view = vec::view(self.bytes, self.pos, self.bytes.len());
534+
let view = vec::slice(self.bytes, self.pos, self.bytes.len());
535535
vec::bytes::copy_memory(bytes, view, count);
536536
537537
self.pos += count;
@@ -1008,7 +1008,7 @@ impl Writer for BytesWriter {
10081008
unsafe { vec::raw::set_len(&mut bytes, count); }
10091009
10101010
{
1011-
let view = vec::mut_view(bytes, self.pos, count);
1011+
let view = vec::mut_slice(bytes, self.pos, count);
10121012
vec::bytes::copy_memory(view, v, v_len);
10131013
}
10141014

src/libcore/os.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,24 @@ pub mod win32 {
108108
let mut res = None;
109109
let mut done = false;
110110
while !done {
111-
let mut buf = vec::from_elem(n as uint, 0u16);
111+
let mut k: DWORD = 0;
112+
let buf = vec::cast_to_mut(vec::from_elem(n as uint, 0u16));
112113
do vec::as_mut_buf(buf) |b, _sz| {
113-
let k : DWORD = f(b, TMPBUF_SZ as DWORD);
114+
k = f(b, TMPBUF_SZ as DWORD);
114115
if k == (0 as DWORD) {
115116
done = true;
116117
} else if (k == n &&
117118
libc::GetLastError() ==
118119
libc::ERROR_INSUFFICIENT_BUFFER as DWORD) {
119120
n *= (2 as DWORD);
120121
} else {
121-
let sub = vec::slice(buf, 0u, k as uint);
122-
res = option::Some(str::from_utf16(sub));
123122
done = true;
124123
}
125124
}
125+
if k != 0 && done {
126+
let sub = vec::slice(buf, 0u, k as uint);
127+
res = option::Some(str::from_utf16(sub));
128+
}
126129
}
127130
return res;
128131
}

src/libcore/vec.rs

Lines changed: 59 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -220,21 +220,21 @@ pub pure fn head<T: Copy>(v: &[const T]) -> T { v[0] }
220220

221221
/// Returns a vector containing all but the first element of a slice
222222
pub pure fn tail<T: Copy>(v: &[const T]) -> ~[T] {
223-
return slice(v, 1u, len(v));
223+
slice(v, 1u, len(v)).to_vec()
224224
}
225225

226226
/**
227227
* Returns a vector containing all but the first `n` \
228228
* elements of a slice
229229
*/
230230
pub pure fn tailn<T: Copy>(v: &[const T], n: uint) -> ~[T] {
231-
slice(v, n, len(v))
231+
slice(v, n, len(v)).to_vec()
232232
}
233233

234234
/// Returns a vector containing all but the last element of a slice
235235
pub pure fn init<T: Copy>(v: &[const T]) -> ~[T] {
236236
assert len(v) != 0u;
237-
slice(v, 0u, len(v) - 1u)
237+
slice(v, 0u, len(v) - 1u).to_vec()
238238
}
239239

240240
/// Returns the last element of the slice `v`, failing if the slice is empty.
@@ -252,20 +252,9 @@ pub pure fn last_opt<T: Copy>(v: &[const T]) -> Option<T> {
252252
Some(v[len(v) - 1u])
253253
}
254254
255-
/// Returns a copy of the elements from [`start`..`end`) from `v`.
256-
pub pure fn slice<T: Copy>(v: &[const T], start: uint, end: uint) -> ~[T] {
257-
assert (start <= end);
258-
assert (end <= len(v));
259-
let mut result = ~[];
260-
unsafe {
261-
for uint::range(start, end) |i| { result.push(v[i]) }
262-
}
263-
result
264-
}
265-
266255
/// Return a slice that points into another slice.
267256
#[inline(always)]
268-
pub pure fn view<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] {
257+
pub pure fn slice<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] {
269258
assert (start <= end);
270259
assert (end <= len(v));
271260
do as_imm_buf(v) |p, _len| {
@@ -279,7 +268,9 @@ pub pure fn view<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] {
279268
280269
/// Return a slice that points into another slice.
281270
#[inline(always)]
282-
pub pure fn mut_view<T>(v: &r/[mut T], start: uint, end: uint) -> &r/[mut T] {
271+
pub pure fn mut_slice<T>(v: &r/[mut T], start: uint,
272+
end: uint) -> &r/[mut T] {
273+
283274
assert (start <= end);
284275
assert (end <= len(v));
285276
do as_mut_buf(v) |p, _len| {
@@ -293,7 +284,7 @@ pub pure fn mut_view<T>(v: &r/[mut T], start: uint, end: uint) -> &r/[mut T] {
293284
294285
/// Return a slice that points into another slice.
295286
#[inline(always)]
296-
pub pure fn const_view<T>(v: &r/[const T], start: uint,
287+
pub pure fn const_slice<T>(v: &r/[const T], start: uint,
297288
end: uint) -> &r/[const T] {
298289
assert (start <= end);
299290
assert (end <= len(v));
@@ -319,12 +310,12 @@ pub fn split<T: Copy>(v: &[T], f: fn(t: &T) -> bool) -> ~[~[T]] {
319310
match position_between(v, start, ln, f) {
320311
None => break,
321312
Some(i) => {
322-
result.push(slice(v, start, i));
313+
result.push(slice(v, start, i).to_vec());
323314
start = i + 1u;
324315
}
325316
}
326317
}
327-
result.push(slice(v, start, ln));
318+
result.push(slice(v, start, ln).to_vec());
328319
result
329320
}
330321
@@ -343,14 +334,14 @@ pub fn splitn<T: Copy>(v: &[T], n: uint, f: fn(t: &T) -> bool) -> ~[~[T]] {
343334
match position_between(v, start, ln, f) {
344335
None => break,
345336
Some(i) => {
346-
result.push(slice(v, start, i));
337+
result.push(slice(v, start, i).to_vec());
347338
// Make sure to skip the separator.
348339
start = i + 1u;
349340
count -= 1u;
350341
}
351342
}
352343
}
353-
result.push(slice(v, start, ln));
344+
result.push(slice(v, start, ln).to_vec());
354345
result
355346
}
356347
@@ -368,12 +359,12 @@ pub fn rsplit<T: Copy>(v: &[T], f: fn(t: &T) -> bool) -> ~[~[T]] {
368359
match rposition_between(v, 0, end, f) {
369360
None => break,
370361
Some(i) => {
371-
result.push(slice(v, i + 1, end));
362+
result.push(slice(v, i + 1, end).to_vec());
372363
end = i;
373364
}
374365
}
375366
}
376-
result.push(slice(v, 0u, end));
367+
result.push(slice(v, 0u, end).to_vec());
377368
reverse(result);
378369
return result;
379370
}
@@ -393,14 +384,14 @@ pub fn rsplitn<T: Copy>(v: &[T], n: uint, f: fn(t: &T) -> bool) -> ~[~[T]] {
393384
match rposition_between(v, 0u, end, f) {
394385
None => break,
395386
Some(i) => {
396-
result.push(slice(v, i + 1u, end));
387+
result.push(slice(v, i + 1u, end).to_vec());
397388
// Make sure to skip the separator.
398389
end = i;
399390
count -= 1u;
400391
}
401392
}
402393
}
403-
result.push(slice(v, 0u, end));
394+
result.push(slice(v, 0u, end).to_vec());
404395
reverse(result);
405396
result
406397
}
@@ -478,15 +469,15 @@ pub fn shift<T>(v: &mut ~[T]) -> T {
478469
// popped. For the moment it unsafely exists at both the head and last
479470
// positions
480471
{
481-
let first_slice = view(*v, 0, 1);
482-
let last_slice = view(*v, next_ln, ln);
472+
let first_slice = slice(*v, 0, 1);
473+
let last_slice = slice(*v, next_ln, ln);
483474
raw::copy_memory(::cast::transmute(last_slice), first_slice, 1);
484475
}
485476
486477
// Memcopy everything to the left one element
487478
{
488-
let init_slice = view(*v, 0, next_ln);
489-
let tail_slice = view(*v, 1, ln);
479+
let init_slice = slice(*v, 0, next_ln);
480+
let tail_slice = slice(*v, 1, ln);
490481
raw::copy_memory(::cast::transmute(init_slice),
491482
tail_slice,
492483
next_ln);
@@ -1464,9 +1455,9 @@ pure fn each_permutation<T: Copy>(v: &[T], put: fn(ts: &[T]) -> bool) {
14641455
let mut i = 0u;
14651456
while i < ln {
14661457
let elt = v[i];
1467-
let mut rest = slice(v, 0u, i);
1458+
let mut rest = slice(v, 0u, i).to_vec();
14681459
unsafe {
1469-
rest.push_all(const_view(v, i+1u, ln));
1460+
rest.push_all(const_slice(v, i+1u, ln));
14701461
for each_permutation(rest) |permutation| {
14711462
if !put(append(~[elt], permutation)) {
14721463
return;
@@ -1485,7 +1476,7 @@ pub pure fn windowed<TT: Copy>(nn: uint, xx: &[TT]) -> ~[~[TT]] {
14851476
let len = vec::len(xx);
14861477
if ii+nn <= len {
14871478
unsafe {
1488-
ww.push(vec::slice(xx, ii, ii+nn));
1479+
ww.push(slice(xx, ii, ii+nn).to_vec());
14891480
}
14901481
}
14911482
}
@@ -1689,7 +1680,7 @@ impl<T: Copy> CopyableVector<T> for &[const T] {
16891680
/// Returns a copy of the elements from [`start`..`end`) from `v`.
16901681
#[inline]
16911682
pure fn slice(&self, start: uint, end: uint) -> ~[T] {
1692-
slice(*self, start, end)
1683+
slice(*self, start, end).to_vec()
16931684
}
16941685

16951686
/// Returns all but the first element of a vector
@@ -1713,7 +1704,7 @@ impl<T> ImmutableVector<T> for &[T] {
17131704
/// Return a slice that points into another slice.
17141705
#[inline]
17151706
pure fn view(&self, start: uint, end: uint) -> &self/[T] {
1716-
view(*self, start, end)
1707+
slice(*self, start, end)
17171708
}
17181709

17191710
/// Reduce a vector from right to left
@@ -2566,42 +2557,45 @@ mod tests {
25662557

25672558
#[test]
25682559
fn test_slice() {
2569-
// Test on-stack -> on-stack slice.
2570-
let mut v = slice(~[1, 2, 3], 1u, 3u);
2571-
assert (len(v) == 2u);
2572-
assert (v[0] == 2);
2573-
assert (v[1] == 3);
2574-
2575-
// Test on-heap -> on-stack slice.
2576-
v = slice(~[1, 2, 3, 4, 5], 0u, 3u);
2577-
assert (len(v) == 3u);
2578-
assert (v[0] == 1);
2579-
assert (v[1] == 2);
2580-
assert (v[2] == 3);
2581-
2582-
// Test on-heap -> on-heap slice.
2583-
v = slice(~[1, 2, 3, 4, 5, 6], 1u, 6u);
2584-
assert (len(v) == 5u);
2585-
assert (v[0] == 2);
2586-
assert (v[1] == 3);
2587-
assert (v[2] == 4);
2588-
assert (v[3] == 5);
2589-
assert (v[4] == 6);
2560+
// Test fixed length vector.
2561+
let vec_fixed = [1, 2, 3, 4];
2562+
let v_a = slice(vec_fixed, 1u, len(vec_fixed)).to_vec();
2563+
assert (len(v_a) == 3u);
2564+
assert (v_a[0] == 2);
2565+
assert (v_a[1] == 3);
2566+
assert (v_a[2] == 4);
2567+
2568+
// Test on stack.
2569+
let vec_stack = &[1, 2, 3];
2570+
let v_b = slice(vec_stack, 1u, 3u).to_vec();
2571+
assert (len(v_b) == 2u);
2572+
assert (v_b[0] == 2);
2573+
assert (v_b[1] == 3);
2574+
2575+
// Test on managed heap.
2576+
let vec_managed = @[1, 2, 3, 4, 5];
2577+
let v_c = slice(vec_managed, 0u, 3u).to_vec();
2578+
assert (len(v_c) == 3u);
2579+
assert (v_c[0] == 1);
2580+
assert (v_c[1] == 2);
2581+
assert (v_c[2] == 3);
2582+
2583+
// Test on exchange heap.
2584+
let vec_unique = ~[1, 2, 3, 4, 5, 6];
2585+
let v_d = slice(vec_unique, 1u, 6u).to_vec();
2586+
assert (len(v_d) == 5u);
2587+
assert (v_d[0] == 2);
2588+
assert (v_d[1] == 3);
2589+
assert (v_d[2] == 4);
2590+
assert (v_d[3] == 5);
2591+
assert (v_d[4] == 6);
25902592
}
25912593

25922594
#[test]
25932595
fn test_pop() {
2594-
// Test on-stack pop.
2595-
let mut v = ~[1, 2, 3];
2596-
let mut e = v.pop();
2597-
assert (len(v) == 2u);
2598-
assert (v[0] == 1);
2599-
assert (v[1] == 2);
2600-
assert (e == 3);
2601-
26022596
// Test on-heap pop.
2603-
v = ~[1, 2, 3, 4, 5];
2604-
e = v.pop();
2597+
let mut v = ~[1, 2, 3, 4, 5];
2598+
let e = v.pop();
26052599
assert (len(v) == 4u);
26062600
assert (v[0] == 1);
26072601
assert (v[1] == 2);

src/librustc/back/rpath.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ pub fn get_relative_to(abs1: &Path, abs2: &Path) -> Path {
157157
let mut path = ~[];
158158
for uint::range(start_idx, len1 - 1) |_i| { path.push(~".."); };
159159

160-
path.push_all(vec::view(split2, start_idx, len2 - 1));
160+
path.push_all(vec::slice(split2, start_idx, len2 - 1));
161161

162162
if !path.is_empty() {
163163
return Path("").push_many(path);

src/librustc/metadata/decoder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ fn lookup_hash(d: ebml::Doc, eq_fn: fn(x:&[u8]) -> bool, hash: uint) ->
6464
let belt = tag_index_buckets_bucket_elt;
6565
for reader::tagged_docs(tagged_doc.doc, belt) |elt| {
6666
let pos = io::u64_from_be_bytes(*elt.data, elt.start, 4u) as uint;
67-
if eq_fn(vec::view(*elt.data, elt.start + 4u, elt.end)) {
67+
if eq_fn(vec::slice(*elt.data, elt.start + 4u, elt.end)) {
6868
return Some(reader::doc_at(d.data, pos).doc);
6969
}
7070
};
@@ -75,7 +75,8 @@ pub type GetCrateDataCb = &fn(ast::crate_num) -> cmd;
7575

7676
pub fn maybe_find_item(item_id: int, items: ebml::Doc) -> Option<ebml::Doc> {
7777
fn eq_item(bytes: &[u8], item_id: int) -> bool {
78-
return io::u64_from_be_bytes(vec::view(bytes, 0u, 4u), 0u, 4u) as int
78+
return io::u64_from_be_bytes(
79+
vec::slice(bytes, 0u, 4u), 0u, 4u) as int
7980
== item_id;
8081
}
8182
lookup_hash(items,

src/librustc/metadata/encoder.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,7 @@ fn encode_crate_deps(ecx: @encode_ctxt,
11471147
}
11481148
11491149
// mut -> immutable hack for vec::map
1150-
return vec::slice(deps, 0u, vec::len(deps));
1150+
return vec::slice(deps, 0u, vec::len(deps)).to_vec();
11511151
}
11521152
11531153
// We're just going to write a list of crate 'name-hash-version's, with
@@ -1307,7 +1307,7 @@ pub fn encode_metadata(parms: encode_parms, crate: &crate) -> ~[u8] {
13071307
// vec::from_slice(metadata_encoding_version) +
13081308
13091309
(do str::as_bytes(&~"rust\x00\x00\x00\x01") |bytes| {
1310-
vec::slice(*bytes, 0, 8)
1310+
vec::slice(*bytes, 0, 8).to_vec()
13111311
}) + flate::deflate_bytes(wr.bytes.check_out(|buf| buf))
13121312
}
13131313

src/librustc/metadata/tydecode.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,8 +493,8 @@ pub fn parse_def_id(buf: &[u8]) -> ast::def_id {
493493
fail!();
494494
}
495495
496-
let crate_part = vec::view(buf, 0u, colon_idx);
497-
let def_part = vec::view(buf, colon_idx + 1u, len);
496+
let crate_part = vec::slice(buf, 0u, colon_idx);
497+
let def_part = vec::slice(buf, colon_idx + 1u, len);
498498
499499
let crate_num = match uint::parse_bytes(crate_part, 10u) {
500500
Some(cn) => cn as int,

0 commit comments

Comments
 (0)