Skip to content

Commit

Permalink
Add slice_from and slice_to methods for vec, like the
Browse files Browse the repository at this point in the history
methods of the same names that already exist for strs.
  • Loading branch information
Dretch committed Jul 21, 2013
1 parent c4b6216 commit 30f13e6
Showing 1 changed file with 47 additions and 3 deletions.
50 changes: 47 additions & 3 deletions src/libstd/vec.rs
Expand Up @@ -702,6 +702,8 @@ impl<'self,T:Clone> CopyableVector<T> for &'self [T] {
#[allow(missing_doc)]
pub trait ImmutableVector<'self, T> {
fn slice(&self, start: uint, end: uint) -> &'self [T];
fn slice_from(&self, start: uint) -> &'self [T];
fn slice_to(&self, end: uint) -> &'self [T];
fn iter(self) -> VecIterator<'self, T>;
fn rev_iter(self) -> VecRevIterator<'self, T>;
fn split_iter(self, pred: &'self fn(&T) -> bool) -> VecSplitIterator<'self, T>;
Expand Down Expand Up @@ -733,11 +735,17 @@ pub trait ImmutableVector<'self, T> {

/// Extension methods for vectors
impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
/// Return a slice that points into another slice.

/**
* Returns a slice of self between `start` and `end`.
*
* Fails when `start` or `end` point outside the bounds of self,
* or when `start` > `end`.
*/
#[inline]
fn slice(&self, start: uint, end: uint) -> &'self [T] {
assert!(start <= end);
assert!(end <= self.len());
assert!(start <= end);
assert!(end <= self.len());
do self.as_imm_buf |p, _len| {
unsafe {
transmute((ptr::offset(p, start),
Expand All @@ -746,6 +754,26 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
}
}

/**
* Returns a slice of self from `start` to the end of the vec.
*
* Fails when `start` points outside the bounds of self.
*/
#[inline]
fn slice_from(&self, start: uint) -> &'self [T] {
self.slice(start, self.len())
}

/**
* Returns a slice of self from the start of the vec to `end`.
*
* Fails when `end` points outside the bounds of self.
*/
#[inline]
fn slice_to(&self, end: uint) -> &'self [T] {
self.slice(0, end)
}

#[inline]
fn iter(self) -> VecIterator<'self, T> {
unsafe {
Expand Down Expand Up @@ -2570,6 +2598,22 @@ mod tests {
assert_eq!(v_d[4], 6);
}

#[test]
fn test_slice_from() {
let vec = &[1, 2, 3, 4];
assert_eq!(vec.slice_from(0), vec);
assert_eq!(vec.slice_from(2), &[3, 4]);
assert_eq!(vec.slice_from(4), &[]);
}

#[test]
fn test_slice_to() {
let vec = &[1, 2, 3, 4];
assert_eq!(vec.slice_to(4), vec);
assert_eq!(vec.slice_to(2), &[1, 2]);
assert_eq!(vec.slice_to(0), &[]);
}

#[test]
fn test_pop() {
// Test on-heap pop.
Expand Down

5 comments on commit 30f13e6

@bors
Copy link
Contributor

@bors bors commented on 30f13e6 Jul 22, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from huonw
at Dretch@30f13e6

@bors
Copy link
Contributor

@bors bors commented on 30f13e6 Jul 22, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging Dretch/rust/vec-slice-from-to = 30f13e6 into auto

@bors
Copy link
Contributor

@bors bors commented on 30f13e6 Jul 22, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dretch/rust/vec-slice-from-to = 30f13e6 merged ok, testing candidate = 9ed82fb

@bors
Copy link
Contributor

@bors bors commented on 30f13e6 Jul 22, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = 9ed82fb

Please sign in to comment.