fn split<P>(&self, pred: P) -> Split<Self::Item, P>
where P: FnMut(&Self::Item) -> bool;
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ fn rsplit<P>(&self, pred: P) -> RSplit<Self::Item, P>
+ where P: FnMut(&Self::Item) -> bool;
+
#[stable(feature = "core", since = "1.6.0")]
fn splitn<P>(&self, n: usize, pred: P) -> SplitN<Self::Item, P>
where P: FnMut(&Self::Item) -> bool;
fn split_mut<P>(&mut self, pred: P) -> SplitMut<Self::Item, P>
where P: FnMut(&Self::Item) -> bool;
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ fn rsplit_mut<P>(&mut self, pred: P) -> RSplitMut<Self::Item, P>
+ where P: FnMut(&Self::Item) -> bool;
+
#[stable(feature = "core", since = "1.6.0")]
fn splitn_mut<P>(&mut self, n: usize, pred: P) -> SplitNMut<Self::Item, P>
where P: FnMut(&Self::Item) -> bool;
}
}
+ #[inline]
+ fn rsplit<P>(&self, pred: P) -> RSplit<T, P>
+ where P: FnMut(&T) -> bool
+ {
+ RSplit { inner: self.split(pred) }
+ }
+
#[inline]
fn splitn<P>(&self, n: usize, pred: P) -> SplitN<T, P>
where P: FnMut(&T) -> bool
SplitN {
inner: GenericSplitN {
iter: self.split(pred),
- count: n,
- invert: false
+ count: n
}
}
}
{
RSplitN {
inner: GenericSplitN {
- iter: self.split(pred),
- count: n,
- invert: true
+ iter: self.rsplit(pred),
+ count: n
}
}
}
SplitMut { v: self, pred: pred, finished: false }
}
+ #[inline]
+ fn rsplit_mut<P>(&mut self, pred: P) -> RSplitMut<T, P>
+ where P: FnMut(&T) -> bool
+ {
+ RSplitMut { inner: self.split_mut(pred) }
+ }
+
#[inline]
fn splitn_mut<P>(&mut self, n: usize, pred: P) -> SplitNMut<T, P>
where P: FnMut(&T) -> bool
SplitNMut {
inner: GenericSplitN {
iter: self.split_mut(pred),
- count: n,
- invert: false
+ count: n
}
}
}
{
RSplitNMut {
inner: GenericSplitN {
- iter: self.split_mut(pred),
- count: n,
- invert: true
+ iter: self.rsplit_mut(pred),
+ count: n
}
}
}
// Return the arithmetic difference if `T` is zero size.
#[inline(always)]
fn ptrdistance<T>(start: *const T, end: *const T) -> usize {
- let diff = (end as usize).wrapping_sub(start as usize);
- let size = mem::size_of::<T>();
- diff / (if size == 0 { 1 } else { size })
+ match start.offset_to(end) {
+ Some(x) => x as usize,
+ None => (end as usize).wrapping_sub(start as usize),
+ }
}
// Extension methods for raw pointers, used by the iterators
#[unstable(feature = "fused", issue = "35602")]
impl<'a, T, P> FusedIterator for SplitMut<'a, T, P> where P: FnMut(&T) -> bool {}
+ /// An iterator over subslices separated by elements that match a predicate
+ /// function, starting from the end of the slice.
+ ///
+ /// This struct is created by the [`rsplit`] method on [slices].
+ ///
+ /// [`rsplit`]: ../../std/primitive.slice.html#method.rsplit
+ /// [slices]: ../../std/primitive.slice.html
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ #[derive(Clone)] // Is this correct, or does it incorrectly require `T: Clone`?
+ pub struct RSplit<'a, T:'a, P> where P: FnMut(&T) -> bool {
+ inner: Split<'a, T, P>
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for RSplit<'a, T, P> where P: FnMut(&T) -> bool {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.debug_struct("RSplit")
+ .field("v", &self.inner.v)
+ .field("finished", &self.inner.finished)
+ .finish()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> Iterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool {
+ type Item = &'a [T];
+
+ #[inline]
+ fn next(&mut self) -> Option<&'a [T]> {
+ self.inner.next_back()
+ }
+
+ #[inline]
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.inner.size_hint()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> DoubleEndedIterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool {
+ #[inline]
+ fn next_back(&mut self) -> Option<&'a [T]> {
+ self.inner.next()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> SplitIter for RSplit<'a, T, P> where P: FnMut(&T) -> bool {
+ #[inline]
+ fn finish(&mut self) -> Option<&'a [T]> {
+ self.inner.finish()
+ }
+ }
+
+ //#[unstable(feature = "fused", issue = "35602")]
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> FusedIterator for RSplit<'a, T, P> where P: FnMut(&T) -> bool {}
+
+ /// An iterator over the subslices of the vector which are separated
+ /// by elements that match `pred`, starting from the end of the slice.
+ ///
+ /// This struct is created by the [`rsplit_mut`] method on [slices].
+ ///
+ /// [`rsplit_mut`]: ../../std/primitive.slice.html#method.rsplit_mut
+ /// [slices]: ../../std/primitive.slice.html
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ pub struct RSplitMut<'a, T:'a, P> where P: FnMut(&T) -> bool {
+ inner: SplitMut<'a, T, P>
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ f.debug_struct("RSplitMut")
+ .field("v", &self.inner.v)
+ .field("finished", &self.inner.finished)
+ .finish()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> SplitIter for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool {
+ #[inline]
+ fn finish(&mut self) -> Option<&'a mut [T]> {
+ self.inner.finish()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> Iterator for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool {
+ type Item = &'a mut [T];
+
+ #[inline]
+ fn next(&mut self) -> Option<&'a mut [T]> {
+ self.inner.next_back()
+ }
+
+ #[inline]
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.inner.size_hint()
+ }
+ }
+
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> DoubleEndedIterator for RSplitMut<'a, T, P> where
+ P: FnMut(&T) -> bool,
+ {
+ #[inline]
+ fn next_back(&mut self) -> Option<&'a mut [T]> {
+ self.inner.next()
+ }
+ }
+
+ //#[unstable(feature = "fused", issue = "35602")]
+ #[unstable(feature = "slice_rsplit", issue = "41020")]
+ impl<'a, T, P> FusedIterator for RSplitMut<'a, T, P> where P: FnMut(&T) -> bool {}
+
/// An private iterator over subslices separated by elements that
/// match a predicate function, splitting at most a fixed number of
/// times.
struct GenericSplitN<I> {
iter: I,
count: usize,
- invert: bool
}
impl<T, I: SplitIter<Item=T>> Iterator for GenericSplitN<I> {
match self.count {
0 => None,
1 => { self.count -= 1; self.iter.finish() }
- _ => {
- self.count -= 1;
- if self.invert {self.iter.next_back()} else {self.iter.next()}
- }
+ _ => { self.count -= 1; self.iter.next() }
}
}
/// [slices]: ../../std/primitive.slice.html
#[stable(feature = "rust1", since = "1.0.0")]
pub struct RSplitN<'a, T: 'a, P> where P: FnMut(&T) -> bool {
- inner: GenericSplitN<Split<'a, T, P>>
+ inner: GenericSplitN<RSplit<'a, T, P>>
}
#[stable(feature = "core_impl_debug", since = "1.9.0")]
/// [slices]: ../../std/primitive.slice.html
#[stable(feature = "rust1", since = "1.0.0")]
pub struct RSplitNMut<'a, T: 'a, P> where P: FnMut(&T) -> bool {
- inner: GenericSplitN<SplitMut<'a, T, P>>
+ inner: GenericSplitN<RSplitMut<'a, T, P>>
}
#[stable(feature = "core_impl_debug", since = "1.9.0")]