diff options
| author | bors <bors@rust-lang.org> | 2014-08-05 03:21:27 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-08-05 03:21:27 +0000 |
| commit | ade92c6e35c75f9bbb99681bfd6f34fa4711366a (patch) | |
| tree | 43c4147d5e85e798e0b3974e792cc757b9e3f393 | |
| parent | 4b54110c3380e3cc6a641798a0be0c30e84dc907 (diff) | |
| parent | 7e5440ea9d0045741663f142e83a247fe540599e (diff) | |
| download | rust-ade92c6e35c75f9bbb99681bfd6f34fa4711366a.tar.gz rust-ade92c6e35c75f9bbb99681bfd6f34fa4711366a.zip | |
auto merge of #16188 : nham/rust/immut_slice_split_at, r=brson
This operation seems common enough that it would be convenient for it to be a standard method.
| -rw-r--r-- | src/libcore/slice.rs | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 8197a7c2dcb..d3b761f9665 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -76,6 +76,16 @@ pub trait ImmutableVector<'a, T> { * Fails when `end` points outside the bounds of self. */ fn slice_to(&self, end: uint) -> &'a [T]; + + /// Divides one slice into two at an index. + /// + /// The first will contain all indices from `[0, mid)` (excluding + /// the index `mid` itself) and the second will contain all + /// indices from `[mid, len)` (excluding the index `len` itself). + /// + /// Fails if `mid > len`. + fn split_at(&self, mid: uint) -> (&'a [T], &'a [T]); + /// Returns an iterator over the vector fn iter(self) -> Items<'a, T>; /// Returns an iterator over the subslices of the vector which are @@ -248,6 +258,11 @@ impl<'a,T> ImmutableVector<'a, T> for &'a [T] { } #[inline] + fn split_at(&self, mid: uint) -> (&'a [T], &'a [T]) { + (self.slice(0, mid), self.slice(mid, self.len())) + } + + #[inline] fn iter(self) -> Items<'a, T> { unsafe { let p = self.as_ptr(); @@ -1192,8 +1207,7 @@ impl<'a, T> Iterator<&'a [T]> for Chunks<'a, T> { None } else { let chunksz = cmp::min(self.v.len(), self.size); - let (fst, snd) = (self.v.slice_to(chunksz), - self.v.slice_from(chunksz)); + let (fst, snd) = self.v.split_at(chunksz); self.v = snd; Some(fst) } @@ -1219,8 +1233,7 @@ impl<'a, T> DoubleEndedIterator<&'a [T]> for Chunks<'a, T> { } else { let remainder = self.v.len() % self.size; let chunksz = if remainder != 0 { remainder } else { self.size }; - let (fst, snd) = (self.v.slice_to(self.v.len() - chunksz), - self.v.slice_from(self.v.len() - chunksz)); + let (fst, snd) = self.v.split_at(self.v.len() - chunksz); self.v = fst; Some(snd) } |
