@@ -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);
@@ -1468,9 +1459,9 @@ pure fn each_permutation<T: Copy>(v: &[T], put: fn(ts: &[T]) -> bool) {
1468
1459
let mut i = 0 u;
1469
1460
while i < ln {
1470
1461
let elt = v[ i] ;
1471
- let mut rest = slice ( v, 0 u, i) ;
1462
+ let mut rest = slice ( v, 0 u, i) . to_vec ( ) ;
1472
1463
unsafe {
1473
- rest. push_all ( const_view ( v, i+1 u, ln) ) ;
1464
+ rest. push_all ( const_slice ( v, i+1 u, ln) ) ;
1474
1465
for each_permutation( rest) |permutation| {
1475
1466
if !put ( append ( ~[ elt] , permutation) ) {
1476
1467
return ;
@@ -1489,7 +1480,7 @@ pub pure fn windowed<TT: Copy>(nn: uint, xx: &[TT]) -> ~[~[TT]] {
1489
1480
let len = vec:: len ( xx) ;
1490
1481
if ii+nn <= len {
1491
1482
unsafe {
1492
- ww. push ( vec :: slice ( xx, ii, ii+nn) ) ;
1483
+ ww. push ( slice ( xx, ii, ii+nn) . to_vec ( ) ) ;
1493
1484
}
1494
1485
}
1495
1486
}
@@ -1700,7 +1691,7 @@ impl<T: Copy> &[const T]: CopyableVector<T> {
1700
1691
/// Returns a copy of the elements from [`start`..`end`) from `v`.
1701
1692
#[ inline]
1702
1693
pure fn slice ( & self , start : uint , end : uint ) -> ~[ T ] {
1703
- slice ( * self , start, end)
1694
+ slice ( * self , start, end) . to_vec ( )
1704
1695
}
1705
1696
1706
1697
/// Returns all but the first element of a vector
@@ -1724,7 +1715,7 @@ impl<T> &[T]: ImmutableVector<T> {
1724
1715
/// Return a slice that points into another slice.
1725
1716
#[ inline]
1726
1717
pure fn view ( & self , start : uint , end : uint ) -> & self /[ T ] {
1727
- view ( * self , start, end)
1718
+ slice ( * self , start, end)
1728
1719
}
1729
1720
1730
1721
/// Reduce a vector from right to left
@@ -2577,42 +2568,45 @@ mod tests {
2577
2568
2578
2569
#[ test]
2579
2570
fn test_slice ( ) {
2580
- // Test on-stack -> on-stack slice.
2581
- let mut v = slice ( ~[ 1 , 2 , 3 ] , 1 u, 3 u) ;
2582
- assert ( len ( v) == 2 u) ;
2583
- assert ( v[ 0 ] == 2 ) ;
2584
- assert ( v[ 1 ] == 3 ) ;
2585
-
2586
- // Test on-heap -> on-stack slice.
2587
- v = slice ( ~[ 1 , 2 , 3 , 4 , 5 ] , 0 u, 3 u) ;
2588
- assert ( len ( v) == 3 u) ;
2589
- assert ( v[ 0 ] == 1 ) ;
2590
- assert ( v[ 1 ] == 2 ) ;
2591
- assert ( v[ 2 ] == 3 ) ;
2592
-
2593
- // Test on-heap -> on-heap slice.
2594
- v = slice ( ~[ 1 , 2 , 3 , 4 , 5 , 6 ] , 1 u, 6 u) ;
2595
- assert ( len ( v) == 5 u) ;
2596
- assert ( v[ 0 ] == 2 ) ;
2597
- assert ( v[ 1 ] == 3 ) ;
2598
- assert ( v[ 2 ] == 4 ) ;
2599
- assert ( v[ 3 ] == 5 ) ;
2600
- assert ( v[ 4 ] == 6 ) ;
2571
+ // Test fixed length vector.
2572
+ let vec_fixed = [ 1 , 2 , 3 , 4 ] ;
2573
+ let v_a = slice ( vec_fixed, 1 u, len ( vec_fixed) ) . to_vec ( ) ;
2574
+ assert ( len ( v_a) == 3 u) ;
2575
+ assert ( v_a[ 0 ] == 2 ) ;
2576
+ assert ( v_a[ 1 ] == 3 ) ;
2577
+ assert ( v_a[ 2 ] == 4 ) ;
2578
+
2579
+ // Test on stack.
2580
+ let vec_stack = & [ 1 , 2 , 3 ] ;
2581
+ let v_b = slice ( vec_stack, 1 u, 3 u) . to_vec ( ) ;
2582
+ assert ( len ( v_b) == 2 u) ;
2583
+ assert ( v_b[ 0 ] == 2 ) ;
2584
+ assert ( v_b[ 1 ] == 3 ) ;
2585
+
2586
+ // Test on managed heap.
2587
+ let vec_managed = @[ 1 , 2 , 3 , 4 , 5 ] ;
2588
+ let v_c = slice ( vec_managed, 0 u, 3 u) . to_vec ( ) ;
2589
+ assert ( len ( v_c) == 3 u) ;
2590
+ assert ( v_c[ 0 ] == 1 ) ;
2591
+ assert ( v_c[ 1 ] == 2 ) ;
2592
+ assert ( v_c[ 2 ] == 3 ) ;
2593
+
2594
+ // Test on exchange heap.
2595
+ let vec_unique = ~[ 1 , 2 , 3 , 4 , 5 , 6 ] ;
2596
+ let v_d = slice ( vec_unique, 1 u, 6 u) . to_vec ( ) ;
2597
+ assert ( len ( v_d) == 5 u) ;
2598
+ assert ( v_d[ 0 ] == 2 ) ;
2599
+ assert ( v_d[ 1 ] == 3 ) ;
2600
+ assert ( v_d[ 2 ] == 4 ) ;
2601
+ assert ( v_d[ 3 ] == 5 ) ;
2602
+ assert ( v_d[ 4 ] == 6 ) ;
2601
2603
}
2602
2604
2603
2605
#[ test]
2604
2606
fn test_pop ( ) {
2605
- // Test on-stack pop.
2606
- let mut v = ~[ 1 , 2 , 3 ] ;
2607
- let mut e = v. pop ( ) ;
2608
- assert ( len ( v) == 2 u) ;
2609
- assert ( v[ 0 ] == 1 ) ;
2610
- assert ( v[ 1 ] == 2 ) ;
2611
- assert ( e == 3 ) ;
2612
-
2613
2607
// Test on-heap pop.
2614
- v = ~[ 1 , 2 , 3 , 4 , 5 ] ;
2615
- e = v. pop ( ) ;
2608
+ let mut v = ~[ 1 , 2 , 3 , 4 , 5 ] ;
2609
+ let e = v. pop ( ) ;
2616
2610
assert ( len ( v) == 4 u) ;
2617
2611
assert ( v[ 0 ] == 1 ) ;
2618
2612
assert ( v[ 1 ] == 2 ) ;
0 commit comments