@@ -220,21 +220,21 @@ pub pure fn head<T: Copy>(v: &[const T]) -> T { v[0] }
220
220
221
221
/// Returns a vector containing all but the first element of a slice
222
222
pub pure fn tail < T : Copy > ( v : & [ const T ] ) -> ~[ T ] {
223
- return slice ( v, 1 u, len ( v) ) ;
223
+ slice ( v, 1 u, len ( v) ) . to_vec ( )
224
224
}
225
225
226
226
/**
227
227
* Returns a vector containing all but the first `n` \
228
228
* elements of a slice
229
229
*/
230
230
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 ( )
232
232
}
233
233
234
234
/// Returns a vector containing all but the last element of a slice
235
235
pub pure fn init < T : Copy > ( v : & [ const T ] ) -> ~[ T ] {
236
236
assert len( v) != 0 u;
237
- slice ( v, 0 u, len ( v) - 1 u)
237
+ slice ( v, 0 u, len ( v) - 1 u) . to_vec ( )
238
238
}
239
239
240
240
/// 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> {
252
252
Some(v[len(v) - 1u])
253
253
}
254
254
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
-
266
255
/// Return a slice that points into another slice.
267
256
#[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] {
269
258
assert (start <= end);
270
259
assert (end <= len(v));
271
260
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] {
279
268
280
269
/// Return a slice that points into another slice.
281
270
#[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
+
283
274
assert (start <= end);
284
275
assert (end <= len(v));
285
276
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] {
293
284
294
285
/// Return a slice that points into another slice.
295
286
#[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,
297
288
end: uint) -> &r/[const T] {
298
289
assert (start <= end);
299
290
assert (end <= len(v));
@@ -319,12 +310,12 @@ pub fn split<T: Copy>(v: &[T], f: fn(t: &T) -> bool) -> ~[~[T]] {
319
310
match position_between(v, start, ln, f) {
320
311
None => break,
321
312
Some(i) => {
322
- result.push(slice(v, start, i));
313
+ result.push(slice(v, start, i).to_vec() );
323
314
start = i + 1u;
324
315
}
325
316
}
326
317
}
327
- result.push(slice(v, start, ln));
318
+ result.push(slice(v, start, ln).to_vec() );
328
319
result
329
320
}
330
321
@@ -343,14 +334,14 @@ pub fn splitn<T: Copy>(v: &[T], n: uint, f: fn(t: &T) -> bool) -> ~[~[T]] {
343
334
match position_between(v, start, ln, f) {
344
335
None => break,
345
336
Some(i) => {
346
- result.push(slice(v, start, i));
337
+ result.push(slice(v, start, i).to_vec() );
347
338
// Make sure to skip the separator.
348
339
start = i + 1u;
349
340
count -= 1u;
350
341
}
351
342
}
352
343
}
353
- result.push(slice(v, start, ln));
344
+ result.push(slice(v, start, ln).to_vec() );
354
345
result
355
346
}
356
347
@@ -368,12 +359,12 @@ pub fn rsplit<T: Copy>(v: &[T], f: fn(t: &T) -> bool) -> ~[~[T]] {
368
359
match rposition_between(v, 0, end, f) {
369
360
None => break,
370
361
Some(i) => {
371
- result.push(slice(v, i + 1, end));
362
+ result.push(slice(v, i + 1, end).to_vec() );
372
363
end = i;
373
364
}
374
365
}
375
366
}
376
- result.push(slice(v, 0u, end));
367
+ result.push(slice(v, 0u, end).to_vec() );
377
368
reverse(result);
378
369
return result;
379
370
}
@@ -393,14 +384,14 @@ pub fn rsplitn<T: Copy>(v: &[T], n: uint, f: fn(t: &T) -> bool) -> ~[~[T]] {
393
384
match rposition_between(v, 0u, end, f) {
394
385
None => break,
395
386
Some(i) => {
396
- result.push(slice(v, i + 1u, end));
387
+ result.push(slice(v, i + 1u, end).to_vec() );
397
388
// Make sure to skip the separator.
398
389
end = i;
399
390
count -= 1u;
400
391
}
401
392
}
402
393
}
403
- result.push(slice(v, 0u, end));
394
+ result.push(slice(v, 0u, end).to_vec() );
404
395
reverse(result);
405
396
result
406
397
}
@@ -478,15 +469,15 @@ pub fn shift<T>(v: &mut ~[T]) -> T {
478
469
// popped. For the moment it unsafely exists at both the head and last
479
470
// positions
480
471
{
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);
483
474
raw::copy_memory(::cast::transmute(last_slice), first_slice, 1);
484
475
}
485
476
486
477
// Memcopy everything to the left one element
487
478
{
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);
490
481
raw::copy_memory(::cast::transmute(init_slice),
491
482
tail_slice,
492
483
next_ln);
@@ -1464,9 +1455,9 @@ pure fn each_permutation<T: Copy>(v: &[T], put: fn(ts: &[T]) -> bool) {
1464
1455
let mut i = 0 u;
1465
1456
while i < ln {
1466
1457
let elt = v[ i] ;
1467
- let mut rest = slice ( v, 0 u, i) ;
1458
+ let mut rest = slice ( v, 0 u, i) . to_vec ( ) ;
1468
1459
unsafe {
1469
- rest. push_all ( const_view ( v, i+1 u, ln) ) ;
1460
+ rest. push_all ( const_slice ( v, i+1 u, ln) ) ;
1470
1461
for each_permutation( rest) |permutation| {
1471
1462
if !put ( append ( ~[ elt] , permutation) ) {
1472
1463
return ;
@@ -1485,7 +1476,7 @@ pub pure fn windowed<TT: Copy>(nn: uint, xx: &[TT]) -> ~[~[TT]] {
1485
1476
let len = vec:: len ( xx) ;
1486
1477
if ii+nn <= len {
1487
1478
unsafe {
1488
- ww. push ( vec :: slice ( xx, ii, ii+nn) ) ;
1479
+ ww. push ( slice ( xx, ii, ii+nn) . to_vec ( ) ) ;
1489
1480
}
1490
1481
}
1491
1482
}
@@ -1689,7 +1680,7 @@ impl<T: Copy> CopyableVector<T> for &[const T] {
1689
1680
/// Returns a copy of the elements from [`start`..`end`) from `v`.
1690
1681
#[ inline]
1691
1682
pure fn slice ( & self , start : uint , end : uint ) -> ~[ T ] {
1692
- slice ( * self , start, end)
1683
+ slice ( * self , start, end) . to_vec ( )
1693
1684
}
1694
1685
1695
1686
/// Returns all but the first element of a vector
@@ -1713,7 +1704,7 @@ impl<T> ImmutableVector<T> for &[T] {
1713
1704
/// Return a slice that points into another slice.
1714
1705
#[ inline]
1715
1706
pure fn view ( & self , start : uint , end : uint ) -> & self /[ T ] {
1716
- view ( * self , start, end)
1707
+ slice ( * self , start, end)
1717
1708
}
1718
1709
1719
1710
/// Reduce a vector from right to left
@@ -2566,42 +2557,45 @@ mod tests {
2566
2557
2567
2558
#[ test]
2568
2559
fn test_slice ( ) {
2569
- // Test on-stack -> on-stack slice.
2570
- let mut v = slice ( ~[ 1 , 2 , 3 ] , 1 u, 3 u) ;
2571
- assert ( len ( v) == 2 u) ;
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 ] , 0 u, 3 u) ;
2577
- assert ( len ( v) == 3 u) ;
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 ] , 1 u, 6 u) ;
2584
- assert ( len ( v) == 5 u) ;
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, 1 u, len ( vec_fixed) ) . to_vec ( ) ;
2563
+ assert ( len ( v_a) == 3 u) ;
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, 1 u, 3 u) . to_vec ( ) ;
2571
+ assert ( len ( v_b) == 2 u) ;
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, 0 u, 3 u) . to_vec ( ) ;
2578
+ assert ( len ( v_c) == 3 u) ;
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, 1 u, 6 u) . to_vec ( ) ;
2586
+ assert ( len ( v_d) == 5 u) ;
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 ) ;
2590
2592
}
2591
2593
2592
2594
#[ test]
2593
2595
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) == 2 u) ;
2598
- assert ( v[ 0 ] == 1 ) ;
2599
- assert ( v[ 1 ] == 2 ) ;
2600
- assert ( e == 3 ) ;
2601
-
2602
2596
// 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 ( ) ;
2605
2599
assert ( len ( v) == 4 u) ;
2606
2600
assert ( v[ 0 ] == 1 ) ;
2607
2601
assert ( v[ 1 ] == 2 ) ;
0 commit comments