Skip to content

Commit 12d6238

Browse files
committed
Add as_str method for split whitespace str iterators
This commit adds `as_str` methods to `SplitWhitespace` and `SplitAsciiWhitespace` str iterators. The methods return the remainder, similar to `as_str` methods on `Chars` and other split iterators. This commit also makes fields of some iterators `pub(crate)`.
1 parent cecdb18 commit 12d6238

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

library/core/src/iter/adapters/filter.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use crate::ops::Try;
1313
#[stable(feature = "rust1", since = "1.0.0")]
1414
#[derive(Clone)]
1515
pub struct Filter<I, P> {
16-
iter: I,
16+
// Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods
17+
pub(crate) iter: I,
1718
predicate: P,
1819
}
1920
impl<I, P> Filter<I, P> {

library/core/src/iter/adapters/map.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ use crate::ops::Try;
5757
#[stable(feature = "rust1", since = "1.0.0")]
5858
#[derive(Clone)]
5959
pub struct Map<I, F> {
60-
iter: I,
60+
// Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods
61+
pub(crate) iter: I,
6162
f: F,
6263
}
6364

library/core/src/slice/iter.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,11 @@ pub struct Split<'a, T: 'a, P>
335335
where
336336
P: FnMut(&T) -> bool,
337337
{
338-
v: &'a [T],
338+
// Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods
339+
pub(crate) v: &'a [T],
339340
pred: P,
340-
finished: bool,
341+
// Used for `SplitAsciiWhitespace` `as_str` method
342+
pub(crate) finished: bool,
341343
}
342344

343345
impl<'a, T: 'a, P: FnMut(&T) -> bool> Split<'a, T, P> {

library/core/src/str/iter.rs

+55
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,30 @@ impl<'a> DoubleEndedIterator for SplitWhitespace<'a> {
12031203
#[stable(feature = "fused", since = "1.26.0")]
12041204
impl FusedIterator for SplitWhitespace<'_> {}
12051205

1206+
impl<'a> SplitWhitespace<'a> {
1207+
/// Returns remainder of the splitted string
1208+
///
1209+
/// # Examples
1210+
///
1211+
/// ```
1212+
/// #![feature(str_split_whitespace_as_str)]
1213+
///
1214+
/// let mut split = "Mary had a little lamb".split_whitespace();
1215+
/// assert_eq!(split.as_str(), "Mary had a little lamb");
1216+
///
1217+
/// split.next();
1218+
/// assert_eq!(split.as_str(), "had a little lamb");
1219+
///
1220+
/// split.by_ref().for_each(drop);
1221+
/// assert_eq!(split.as_str(), "");
1222+
/// ```
1223+
#[inline]
1224+
#[unstable(feature = "str_split_whitespace_as_str", issue = "77998")]
1225+
pub fn as_str(&self) -> &'a str {
1226+
self.inner.iter.as_str()
1227+
}
1228+
}
1229+
12061230
#[stable(feature = "split_ascii_whitespace", since = "1.34.0")]
12071231
impl<'a> Iterator for SplitAsciiWhitespace<'a> {
12081232
type Item = &'a str;
@@ -1234,6 +1258,37 @@ impl<'a> DoubleEndedIterator for SplitAsciiWhitespace<'a> {
12341258
#[stable(feature = "split_ascii_whitespace", since = "1.34.0")]
12351259
impl FusedIterator for SplitAsciiWhitespace<'_> {}
12361260

1261+
impl<'a> SplitAsciiWhitespace<'a> {
1262+
/// Returns remainder of the splitted string
1263+
///
1264+
/// # Examples
1265+
///
1266+
/// ```
1267+
/// #![feature(str_split_whitespace_as_str)]
1268+
///
1269+
/// let mut split = "Mary had a little lamb".split_ascii_whitespace();
1270+
/// assert_eq!(split.as_str(), "Mary had a little lamb");
1271+
///
1272+
/// split.next();
1273+
/// assert_eq!(split.as_str(), "had a little lamb");
1274+
///
1275+
/// split.by_ref().for_each(drop);
1276+
/// assert_eq!(split.as_str(), "");
1277+
/// ```
1278+
#[inline]
1279+
#[unstable(feature = "str_split_whitespace_as_str", issue = "77998")]
1280+
pub fn as_str(&self) -> &'a str {
1281+
if self.inner.iter.iter.finished {
1282+
return "";
1283+
}
1284+
1285+
// Safety:
1286+
//
1287+
// Slice is created from str.
1288+
unsafe { crate::str::from_utf8_unchecked(&self.inner.iter.iter.v) }
1289+
}
1290+
}
1291+
12371292
#[stable(feature = "split_inclusive", since = "1.51.0")]
12381293
impl<'a, P: Pattern<'a>> Iterator for SplitInclusive<'a, P> {
12391294
type Item = &'a str;

0 commit comments

Comments
 (0)