Make split_inclusive() on an empty slice yield an empty output
`[].split_inclusive()` currently yields a single, empty slice. That's different from `"".split_inslusive()`, which yields no output at all. I think that makes the slice version harder to use. The case where I ran into this bug was when writing code for generating a diff between two slices of bytes. I wanted to prefix removed lines with "-" and a added lines with "+". Due to `split_inclusive()`'s current behavior, that means that my code prints just a "-" or "+" for empty files. I suspect most existing callers have similar "bugs" (which would be fixed by this patch). Closes #89716.
This commit is contained in:
parent
1067e2ca5e
commit
f6e4c742f4
2 changed files with 8 additions and 6 deletions
|
@ -863,7 +863,7 @@ fn test_splitator_inclusive() {
|
|||
assert_eq!(xs.split_inclusive(|_| true).collect::<Vec<&[i32]>>(), splits);
|
||||
|
||||
let xs: &[i32] = &[];
|
||||
let splits: &[&[i32]] = &[&[]];
|
||||
let splits: &[&[i32]] = &[];
|
||||
assert_eq!(xs.split_inclusive(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
|
||||
}
|
||||
|
||||
|
@ -883,7 +883,7 @@ fn test_splitator_inclusive_reverse() {
|
|||
assert_eq!(xs.split_inclusive(|_| true).rev().collect::<Vec<_>>(), splits);
|
||||
|
||||
let xs: &[i32] = &[];
|
||||
let splits: &[&[i32]] = &[&[]];
|
||||
let splits: &[&[i32]] = &[];
|
||||
assert_eq!(xs.split_inclusive(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
|
||||
}
|
||||
|
||||
|
@ -903,7 +903,7 @@ fn test_splitator_mut_inclusive() {
|
|||
assert_eq!(xs.split_inclusive_mut(|_| true).collect::<Vec<_>>(), splits);
|
||||
|
||||
let xs: &mut [i32] = &mut [];
|
||||
let splits: &[&[i32]] = &[&[]];
|
||||
let splits: &[&[i32]] = &[];
|
||||
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).collect::<Vec<_>>(), splits);
|
||||
}
|
||||
|
||||
|
@ -923,7 +923,7 @@ fn test_splitator_mut_inclusive_reverse() {
|
|||
assert_eq!(xs.split_inclusive_mut(|_| true).rev().collect::<Vec<_>>(), splits);
|
||||
|
||||
let xs: &mut [i32] = &mut [];
|
||||
let splits: &[&[i32]] = &[&[]];
|
||||
let splits: &[&[i32]] = &[];
|
||||
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
|
||||
}
|
||||
|
||||
|
|
|
@ -479,7 +479,8 @@ where
|
|||
impl<'a, T: 'a, P: FnMut(&T) -> bool> SplitInclusive<'a, T, P> {
|
||||
#[inline]
|
||||
pub(super) fn new(slice: &'a [T], pred: P) -> Self {
|
||||
Self { v: slice, pred, finished: false }
|
||||
let finished = slice.is_empty();
|
||||
Self { v: slice, pred, finished }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -727,7 +728,8 @@ where
|
|||
impl<'a, T: 'a, P: FnMut(&T) -> bool> SplitInclusiveMut<'a, T, P> {
|
||||
#[inline]
|
||||
pub(super) fn new(slice: &'a mut [T], pred: P) -> Self {
|
||||
Self { v: slice, pred, finished: false }
|
||||
let finished = slice.is_empty();
|
||||
Self { v: slice, pred, finished }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue