Skip to content

Commit 5b03050

Browse files
committed
Add Vec::mut_slice_from(), mut_slice_to(), and mut_split_at()
1 parent e233a43 commit 5b03050

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

src/libstd/vec.rs

+122
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,79 @@ impl<T> Vec<T> {
951951
self.as_mut_slice().mut_slice(start, end)
952952
}
953953

954+
/// Returns a mutable slice of self from `start` to the end of the vec.
955+
///
956+
/// # Failure
957+
///
958+
/// Fails when `start` points outside the bounds of self.
959+
///
960+
/// # Example
961+
///
962+
/// ```rust
963+
/// let mut vec = vec!(1, 2, 3, 4);
964+
/// assert!(vec.mut_slice_from(2) == [3, 4]);
965+
/// ```
966+
#[inline]
967+
pub fn mut_slice_from<'a>(&'a mut self, start: uint) -> &'a mut [T] {
968+
self.as_mut_slice().mut_slice_from(start)
969+
}
970+
971+
/// Returns a mutable slice of self from the start of the vec to `end`.
972+
///
973+
/// # Failure
974+
///
975+
/// Fails when `end` points outside the bounds of self.
976+
///
977+
/// # Example
978+
///
979+
/// ```rust
980+
/// let mut vec = vec!(1, 2, 3, 4);
981+
/// assert!(vec.mut_slice_to(2) == [1, 2]);
982+
/// ```
983+
#[inline]
984+
pub fn mut_slice_to<'a>(&'a mut self, end: uint) -> &'a mut [T] {
985+
self.as_mut_slice().mut_slice_to(end)
986+
}
987+
988+
/// Returns a pair of mutable slices that divides the vec at an index.
989+
///
990+
/// The first will contain all indices from `[0, mid)` (excluding
991+
/// the index `mid` itself) and the second will contain all
992+
/// indices from `[mid, len)` (excluding the index `len` itself).
993+
///
994+
/// # Failure
995+
///
996+
/// Fails if `mid > len`.
997+
///
998+
/// # Example
999+
///
1000+
/// ```rust
1001+
/// let mut vec = vec!(1, 2, 3, 4, 5, 6);
1002+
///
1003+
/// // scoped to restrict the lifetime of the borrows
1004+
/// {
1005+
/// let (left, right) = vec.mut_split_at(0);
1006+
/// assert!(left == &mut []);
1007+
/// assert!(right == &mut [1, 2, 3, 4, 5, 6]);
1008+
/// }
1009+
///
1010+
/// {
1011+
/// let (left, right) = vec.mut_split_at(2);
1012+
/// assert!(left == &mut [1, 2]);
1013+
/// assert!(right == &mut [3, 4, 5, 6]);
1014+
/// }
1015+
///
1016+
/// {
1017+
/// let (left, right) = vec.mut_split_at(6);
1018+
/// assert!(left == &mut [1, 2, 3, 4, 5, 6]);
1019+
/// assert!(right == &mut []);
1020+
/// }
1021+
/// ```
1022+
#[inline]
1023+
pub fn mut_split_at<'a>(&'a mut self, mid: uint) -> (&'a mut [T], &'a mut [T]) {
1024+
self.as_mut_slice().mut_split_at(mid)
1025+
}
1026+
9541027
/// Reverse the order of elements in a vector, in place.
9551028
///
9561029
/// # Example
@@ -1293,6 +1366,8 @@ mod tests {
12931366
use ops::Drop;
12941367
use option::{Some, None};
12951368
use ptr;
1369+
use container::Container;
1370+
use slice::{Vector, MutableVector, ImmutableVector};
12961371

12971372
#[test]
12981373
fn test_small_vec_struct() {
@@ -1375,4 +1450,51 @@ mod tests {
13751450

13761451
assert_eq!(v, w);
13771452
}
1453+
1454+
#[test]
1455+
fn test_mut_slice_from() {
1456+
let mut values = Vec::from_slice([1u8,2,3,4,5]);
1457+
{
1458+
let slice = values.mut_slice_from(2);
1459+
assert!(slice == [3, 4, 5]);
1460+
for p in slice.mut_iter() {
1461+
*p += 2;
1462+
}
1463+
}
1464+
1465+
assert!(values.as_slice() == [1, 2, 5, 6, 7]);
1466+
}
1467+
1468+
#[test]
1469+
fn test_mut_slice_to() {
1470+
let mut values = Vec::from_slice([1u8,2,3,4,5]);
1471+
{
1472+
let slice = values.mut_slice_to(2);
1473+
assert!(slice == [1, 2]);
1474+
for p in slice.mut_iter() {
1475+
*p += 1;
1476+
}
1477+
}
1478+
1479+
assert!(values.as_slice() == [2, 3, 3, 4, 5]);
1480+
}
1481+
1482+
#[test]
1483+
fn test_mut_split_at() {
1484+
let mut values = Vec::from_slice([1u8,2,3,4,5]);
1485+
{
1486+
let (left, right) = values.mut_split_at(2);
1487+
assert!(left.slice(0, left.len()) == [1, 2]);
1488+
for p in left.mut_iter() {
1489+
*p += 1;
1490+
}
1491+
1492+
assert!(right.slice(0, right.len()) == [3, 4, 5]);
1493+
for p in right.mut_iter() {
1494+
*p += 2;
1495+
}
1496+
}
1497+
1498+
assert!(values == Vec::from_slice([2u8, 3, 5, 6, 7]));
1499+
}
13781500
}

0 commit comments

Comments
 (0)