mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #77858 - ijackson:split-inclusive, r=KodrAus
Stabilize split_inclusive ### Contents of this MR This stabilises: * `slice::split_inclusive` * `slice::split_inclusive_mut` * `str::split_inclusive` Closes #72360. ### A possible concern The proliferation of `split_*` methods is not particularly pretty. The existence of `split_inclusive` seems to invite the addition of `rsplit_inclusive`, `splitn_inclusive`, etc. We could instead have a more general API, along these kinds of lines maybe: ``` pub fn split_generic('a,P,H>(&'a self, pat: P, how: H) -> ... where P: Pattern where H: SplitHow; pub fn split_generic_mut('a,P,H>(&'a mut self, pat: P, how: H) -> ... where P: Pattern where H: SplitHow; trait SplitHow { fn reverse(&self) -> bool; fn inclusive -> bool; fn limit(&self) -> Option<usize>; } pub struct SplitFwd; ... pub struct SplitRevInclN(pub usize); ``` But maybe that is worse. ### Let us defer that? ### This seems like a can of worms. I think we can defer opening it now; if and when we have something more general, these two methods can become convenience aliases. But I thought I would mention it so the lang API team can consider it and have an opinion.
This commit is contained in:
commit
9f3998b4aa
@ -14,7 +14,6 @@
|
||||
#![feature(binary_heap_into_iter_sorted)]
|
||||
#![feature(binary_heap_drain_sorted)]
|
||||
#![feature(slice_ptr_get)]
|
||||
#![feature(split_inclusive)]
|
||||
#![feature(binary_heap_retain)]
|
||||
#![feature(inplace_iteration)]
|
||||
#![feature(iter_map_while)]
|
||||
|
@ -446,15 +446,13 @@ impl<T, P> FusedIterator for Split<'_, T, P> where P: FnMut(&T) -> bool {}
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
///
|
||||
/// let slice = [10, 40, 33, 20];
|
||||
/// let mut iter = slice.split_inclusive(|num| num % 3 == 0);
|
||||
/// ```
|
||||
///
|
||||
/// [`split_inclusive`]: ../../std/primitive.slice.html#method.split_inclusive
|
||||
/// [slices]: ../../std/primitive.slice.html
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
pub struct SplitInclusive<'a, T: 'a, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -471,7 +469,7 @@ impl<'a, T: 'a, P: FnMut(&T) -> bool> SplitInclusive<'a, T, P> {
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<T: fmt::Debug, P> fmt::Debug for SplitInclusive<'_, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -485,7 +483,7 @@ where
|
||||
}
|
||||
|
||||
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<T, P> Clone for SplitInclusive<'_, T, P>
|
||||
where
|
||||
P: Clone + FnMut(&T) -> bool,
|
||||
@ -495,7 +493,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, T, P> Iterator for SplitInclusive<'a, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -524,7 +522,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, T, P> DoubleEndedIterator for SplitInclusive<'a, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -549,7 +547,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<T, P> FusedIterator for SplitInclusive<'_, T, P> where P: FnMut(&T) -> bool {}
|
||||
|
||||
/// An iterator over the mutable subslices of the vector which are separated
|
||||
@ -689,15 +687,13 @@ impl<T, P> FusedIterator for SplitMut<'_, T, P> where P: FnMut(&T) -> bool {}
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
///
|
||||
/// let mut v = [10, 40, 30, 20, 60, 50];
|
||||
/// let iter = v.split_inclusive_mut(|num| *num % 3 == 0);
|
||||
/// ```
|
||||
///
|
||||
/// [`split_inclusive_mut`]: ../../std/primitive.slice.html#method.split_inclusive_mut
|
||||
/// [slices]: ../../std/primitive.slice.html
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
pub struct SplitInclusiveMut<'a, T: 'a, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -714,7 +710,7 @@ impl<'a, T: 'a, P: FnMut(&T) -> bool> SplitInclusiveMut<'a, T, P> {
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<T: fmt::Debug, P> fmt::Debug for SplitInclusiveMut<'_, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -727,7 +723,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, T, P> Iterator for SplitInclusiveMut<'a, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -767,7 +763,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, T, P> DoubleEndedIterator for SplitInclusiveMut<'a, T, P>
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
@ -801,7 +797,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<T, P> FusedIterator for SplitInclusiveMut<'_, T, P> where P: FnMut(&T) -> bool {}
|
||||
|
||||
/// An iterator over subslices separated by elements that match a predicate
|
||||
|
@ -60,7 +60,7 @@ pub use iter::ArrayWindows;
|
||||
#[unstable(feature = "slice_group_by", issue = "80552")]
|
||||
pub use iter::{GroupBy, GroupByMut};
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
pub use iter::{SplitInclusive, SplitInclusiveMut};
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -1546,7 +1546,6 @@ impl<T> [T] {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let slice = [10, 40, 33, 20];
|
||||
/// let mut iter = slice.split_inclusive(|num| num % 3 == 0);
|
||||
///
|
||||
@ -1560,7 +1559,6 @@ impl<T> [T] {
|
||||
/// That slice will be the last item returned by the iterator.
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let slice = [3, 10, 40, 33];
|
||||
/// let mut iter = slice.split_inclusive(|num| num % 3 == 0);
|
||||
///
|
||||
@ -1568,7 +1566,7 @@ impl<T> [T] {
|
||||
/// assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
|
||||
/// assert!(iter.next().is_none());
|
||||
/// ```
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
#[inline]
|
||||
pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
|
||||
where
|
||||
@ -1584,7 +1582,6 @@ impl<T> [T] {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let mut v = [10, 40, 30, 20, 60, 50];
|
||||
///
|
||||
/// for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
|
||||
@ -1593,7 +1590,7 @@ impl<T> [T] {
|
||||
/// }
|
||||
/// assert_eq!(v, [10, 40, 1, 20, 1, 1]);
|
||||
/// ```
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
#[inline]
|
||||
pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
|
||||
where
|
||||
|
@ -1174,7 +1174,7 @@ pub struct SplitAsciiWhitespace<'a> {
|
||||
/// See its documentation for more.
|
||||
///
|
||||
/// [`split_inclusive`]: str::split_inclusive
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
pub struct SplitInclusive<'a, P: Pattern<'a>>(pub(super) SplitInternal<'a, P>);
|
||||
|
||||
#[stable(feature = "split_whitespace", since = "1.1.0")]
|
||||
@ -1239,7 +1239,7 @@ impl<'a> DoubleEndedIterator for SplitAsciiWhitespace<'a> {
|
||||
#[stable(feature = "split_ascii_whitespace", since = "1.34.0")]
|
||||
impl FusedIterator for SplitAsciiWhitespace<'_> {}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, P: Pattern<'a>> Iterator for SplitInclusive<'a, P> {
|
||||
type Item = &'a str;
|
||||
|
||||
@ -1249,7 +1249,7 @@ impl<'a, P: Pattern<'a>> Iterator for SplitInclusive<'a, P> {
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, P: Pattern<'a, Searcher: fmt::Debug>> fmt::Debug for SplitInclusive<'a, P> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("SplitInclusive").field("0", &self.0).finish()
|
||||
@ -1257,14 +1257,14 @@ impl<'a, P: Pattern<'a, Searcher: fmt::Debug>> fmt::Debug for SplitInclusive<'a,
|
||||
}
|
||||
|
||||
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, P: Pattern<'a, Searcher: Clone>> Clone for SplitInclusive<'a, P> {
|
||||
fn clone(&self) -> Self {
|
||||
SplitInclusive(self.0.clone())
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, P: Pattern<'a, Searcher: ReverseSearcher<'a>>> DoubleEndedIterator
|
||||
for SplitInclusive<'a, P>
|
||||
{
|
||||
@ -1274,7 +1274,7 @@ impl<'a, P: Pattern<'a, Searcher: ReverseSearcher<'a>>> DoubleEndedIterator
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
impl<'a, P: Pattern<'a>> FusedIterator for SplitInclusive<'a, P> {}
|
||||
|
||||
impl<'a, P: Pattern<'a>> SplitInclusive<'a, P> {
|
||||
@ -1284,7 +1284,6 @@ impl<'a, P: Pattern<'a>> SplitInclusive<'a, P> {
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(str_split_inclusive_as_str)]
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let mut split = "Mary had a little lamb".split_inclusive(' ');
|
||||
/// assert_eq!(split.as_str(), "Mary had a little lamb");
|
||||
/// split.next();
|
||||
|
@ -65,7 +65,7 @@ pub use iter::{EscapeDebug, EscapeDefault, EscapeUnicode};
|
||||
#[stable(feature = "split_ascii_whitespace", since = "1.34.0")]
|
||||
pub use iter::SplitAsciiWhitespace;
|
||||
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
use iter::SplitInclusive;
|
||||
|
||||
#[unstable(feature = "str_internals", issue = "none")]
|
||||
@ -1227,7 +1227,6 @@ impl str {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
|
||||
/// .split_inclusive('\n').collect();
|
||||
/// assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
|
||||
@ -1238,12 +1237,11 @@ impl str {
|
||||
/// That substring will be the last item returned by the iterator.
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(split_inclusive)]
|
||||
/// let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
|
||||
/// .split_inclusive('\n').collect();
|
||||
/// assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
|
||||
/// ```
|
||||
#[unstable(feature = "split_inclusive", issue = "72360")]
|
||||
#[stable(feature = "split_inclusive", since = "1.51.0")]
|
||||
#[inline]
|
||||
pub fn split_inclusive<'a, P: Pattern<'a>>(&'a self, pat: P) -> SplitInclusive<'a, P> {
|
||||
SplitInclusive(SplitInternal {
|
||||
|
@ -15,7 +15,6 @@
|
||||
#![feature(never_type)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(type_ascription)]
|
||||
#![feature(split_inclusive)]
|
||||
#![feature(str_split_once)]
|
||||
#![feature(iter_intersperse)]
|
||||
#![recursion_limit = "256"]
|
||||
|
Loading…
Reference in New Issue
Block a user