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