Skip to content

Commit 5c9dc57

Browse files
committed
Don't return empty slice on last iteration with matched terminator. Test reverse iteration.
1 parent 86bf962 commit 5c9dc57

File tree

4 files changed

+255
-132
lines changed

4 files changed

+255
-132
lines changed

src/liballoc/tests/slice.rs

+62-2
Original file line numberDiff line numberDiff line change
@@ -859,18 +859,78 @@ fn test_splitator_inclusive() {
859859
assert_eq!(xs.split_inclusive(|x| *x % 2 == 0).collect::<Vec<_>>(), splits);
860860
let splits: &[&[_]] = &[&[1], &[2, 3, 4, 5]];
861861
assert_eq!(xs.split_inclusive(|x| *x == 1).collect::<Vec<_>>(), splits);
862-
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5], &[]];
862+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
863863
assert_eq!(xs.split_inclusive(|x| *x == 5).collect::<Vec<_>>(), splits);
864864
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
865865
assert_eq!(xs.split_inclusive(|x| *x == 10).collect::<Vec<_>>(), splits);
866-
let splits: &[&[_]] = &[&[1], &[2], &[3], &[4], &[5], &[]];
866+
let splits: &[&[_]] = &[&[1], &[2], &[3], &[4], &[5]];
867867
assert_eq!(xs.split_inclusive(|_| true).collect::<Vec<&[i32]>>(), splits);
868868

869869
let xs: &[i32] = &[];
870870
let splits: &[&[i32]] = &[&[]];
871871
assert_eq!(xs.split_inclusive(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
872872
}
873873

874+
#[test]
875+
fn test_splitator_inclusive_reverse() {
876+
let xs = &[1, 2, 3, 4, 5];
877+
878+
let splits: &[&[_]] = &[&[5], &[3, 4], &[1, 2]];
879+
assert_eq!(xs.split_inclusive(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits);
880+
let splits: &[&[_]] = &[&[2, 3, 4, 5], &[1]];
881+
assert_eq!(xs.split_inclusive(|x| *x == 1).rev().collect::<Vec<_>>(), splits);
882+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
883+
assert_eq!(xs.split_inclusive(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
884+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
885+
assert_eq!(xs.split_inclusive(|x| *x == 10).rev().collect::<Vec<_>>(), splits);
886+
let splits: &[&[_]] = &[&[5], &[4], &[3], &[2], &[1]];
887+
assert_eq!(xs.split_inclusive(|_| true).rev().collect::<Vec<_>>(), splits);
888+
889+
let xs: &[i32] = &[];
890+
let splits: &[&[i32]] = &[&[]];
891+
assert_eq!(xs.split_inclusive(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
892+
}
893+
894+
#[test]
895+
fn test_splitator_mut_inclusive() {
896+
let xs = &mut [1, 2, 3, 4, 5];
897+
898+
let splits: &[&[_]] = &[&[1, 2], &[3, 4], &[5]];
899+
assert_eq!(xs.split_inclusive_mut(|x| *x % 2 == 0).collect::<Vec<_>>(), splits);
900+
let splits: &[&[_]] = &[&[1], &[2, 3, 4, 5]];
901+
assert_eq!(xs.split_inclusive_mut(|x| *x == 1).collect::<Vec<_>>(), splits);
902+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
903+
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).collect::<Vec<_>>(), splits);
904+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
905+
assert_eq!(xs.split_inclusive_mut(|x| *x == 10).collect::<Vec<_>>(), splits);
906+
let splits: &[&[_]] = &[&[1], &[2], &[3], &[4], &[5]];
907+
assert_eq!(xs.split_inclusive_mut(|_| true).collect::<Vec<_>>(), splits);
908+
909+
let xs: &mut [i32] = &mut [];
910+
let splits: &[&[i32]] = &[&[]];
911+
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).collect::<Vec<_>>(), splits);
912+
}
913+
914+
#[test]
915+
fn test_splitator_mut_inclusive_reverse() {
916+
let xs = &mut [1, 2, 3, 4, 5];
917+
918+
let splits: &[&[_]] = &[&[5], &[3, 4], &[1, 2]];
919+
assert_eq!(xs.split_inclusive_mut(|x| *x % 2 == 0).rev().collect::<Vec<_>>(), splits);
920+
let splits: &[&[_]] = &[&[2, 3, 4, 5], &[1]];
921+
assert_eq!(xs.split_inclusive_mut(|x| *x == 1).rev().collect::<Vec<_>>(), splits);
922+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
923+
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
924+
let splits: &[&[_]] = &[&[1, 2, 3, 4, 5]];
925+
assert_eq!(xs.split_inclusive_mut(|x| *x == 10).rev().collect::<Vec<_>>(), splits);
926+
let splits: &[&[_]] = &[&[5], &[4], &[3], &[2], &[1]];
927+
assert_eq!(xs.split_inclusive_mut(|_| true).rev().collect::<Vec<_>>(), splits);
928+
929+
let xs: &mut [i32] = &mut [];
930+
let splits: &[&[i32]] = &[&[]];
931+
assert_eq!(xs.split_inclusive_mut(|x| *x == 5).rev().collect::<Vec<_>>(), splits);
932+
}
933+
874934
#[test]
875935
fn test_splitnator() {
876936
let xs = &[1, 2, 3, 4, 5];

src/liballoc/tests/str.rs

+32-7
Original file line numberDiff line numberDiff line change
@@ -1252,18 +1252,43 @@ fn test_split_char_iterator_inclusive() {
12521252
let data = "\nMäry häd ä little lämb\nLittle lämb\n";
12531253

12541254
let split: Vec<&str> = data.split_inclusive('\n').collect();
1255-
assert_eq!(split, ["\n", "Märy häd ä little lämb\n", "Little lämb\n", ""]);
1255+
assert_eq!(split, ["\n", "Märy häd ä little lämb\n", "Little lämb\n"]);
12561256

12571257
let uppercase_separated = "SheePSharKTurtlECaT";
12581258
let mut first_char = true;
1259-
let split: Vec<&str> = uppercase_separated.split_inclusive(|c: char| {
1260-
let split = !first_char && c.is_uppercase();
1261-
first_char = split;
1262-
split
1263-
}).collect();
1264-
assert_eq!(split, ["SheeP", "SharK", "TurtlE", "CaT", ""]);
1259+
let split: Vec<&str> = uppercase_separated
1260+
.split_inclusive(|c: char| {
1261+
let split = !first_char && c.is_uppercase();
1262+
first_char = split;
1263+
split
1264+
})
1265+
.collect();
1266+
assert_eq!(split, ["SheeP", "SharK", "TurtlE", "CaT"]);
12651267
}
12661268

1269+
#[test]
1270+
fn test_split_char_iterator_inclusive_rev() {
1271+
let data = "\nMäry häd ä little lämb\nLittle lämb\n";
1272+
1273+
let split: Vec<&str> = data.split_inclusive('\n').rev().collect();
1274+
assert_eq!(split, ["Little lämb\n", "Märy häd ä little lämb\n", "\n"]);
1275+
1276+
// Note that the predicate is stateful and thus dependent
1277+
// on the iteration order.
1278+
// (A different predicate is needed for reverse iterator vs normal iterator.)
1279+
// Not sure if anything can be done though.
1280+
let uppercase_separated = "SheePSharKTurtlECaT";
1281+
let mut term_char = true;
1282+
let split: Vec<&str> = uppercase_separated
1283+
.split_inclusive(|c: char| {
1284+
let split = term_char && c.is_uppercase();
1285+
term_char = c.is_uppercase();
1286+
split
1287+
})
1288+
.rev()
1289+
.collect();
1290+
assert_eq!(split, ["CaT", "TurtlE", "SharK", "SheeP"]);
1291+
}
12671292

12681293
#[test]
12691294
fn test_rsplit() {

0 commit comments

Comments
 (0)