Skip to content

Commit 425aefb

Browse files
committed
Fix Debug impl of ExtractIf
Signed-off-by: tison <[email protected]>
1 parent a7d0a43 commit 425aefb

File tree

2 files changed

+26
-21
lines changed

2 files changed

+26
-21
lines changed

library/alloc/src/collections/vec_deque/extract_if.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,21 @@ where
129129
A: Allocator,
130130
{
131131
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
132-
let peek = if self.idx < self.end { self.vec.get(self.idx) } else { None };
132+
let peek = if self.idx < self.end {
133+
let idx = self.vec.to_physical_idx(self.idx);
134+
// This has to use pointer arithmetic as `self.vec[self.idx]` or
135+
// `self.vec.get_unchecked(self.idx)` wouldn't work since we
136+
// temporarily set the length of `self.vec` to zero.
137+
//
138+
// SAFETY:
139+
// Since `self.idx` is smaller than `self.end` and `self.end` is
140+
// smaller than `self.old_len`, `idx` is valid for indexing the
141+
// buffer. Also, per the invariant of `self.idx`, this element
142+
// has not been inspected/moved out yet.
143+
Some(unsafe { &*self.vec.ptr().add(idx) })
144+
} else {
145+
None
146+
};
133147
f.debug_struct("ExtractIf").field("peek", &peek).finish_non_exhaustive()
134148
}
135149
}

library/alloc/src/collections/vec_deque/tests.rs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ fn extract_if_test() {
11701170
let deleted = m.extract_if(.., |v| *v < 4).collect::<Vec<_>>();
11711171

11721172
assert_eq!(deleted, &[1, 2, 3]);
1173-
assert_eq!(m.into_iter().collect::<Vec<_>>(), &[4, 5, 6]);
1173+
assert_eq!(m, &[4, 5, 6]);
11741174
}
11751175

11761176
#[test]
@@ -1179,7 +1179,7 @@ fn drain_to_empty_test() {
11791179
let deleted = m.extract_if(.., |_| true).collect::<Vec<_>>();
11801180

11811181
assert_eq!(deleted, &[1, 2, 3, 4, 5, 6]);
1182-
assert_eq!(m.into_iter().collect::<Vec<_>>(), &[]);
1182+
assert_eq!(m, &[]);
11831183
}
11841184

11851185
#[test]
@@ -1196,7 +1196,7 @@ fn extract_if_empty() {
11961196
}
11971197

11981198
assert_eq!(list.len(), 0);
1199-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![]);
1199+
assert_eq!(list, vec![]);
12001200
}
12011201

12021202
#[test]
@@ -1219,7 +1219,7 @@ fn extract_if_zst() {
12191219

12201220
assert_eq!(count, initial_len);
12211221
assert_eq!(list.len(), 0);
1222-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![]);
1222+
assert_eq!(list, vec![]);
12231223
}
12241224

12251225
#[test]
@@ -1242,7 +1242,7 @@ fn extract_if_false() {
12421242

12431243
assert_eq!(count, 0);
12441244
assert_eq!(list.len(), initial_len);
1245-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
1245+
assert_eq!(list, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
12461246
}
12471247

12481248
#[test]
@@ -1266,7 +1266,7 @@ fn extract_if_true() {
12661266

12671267
assert_eq!(count, initial_len);
12681268
assert_eq!(list.len(), 0);
1269-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![]);
1269+
assert_eq!(list, vec![]);
12701270
}
12711271

12721272
#[test]
@@ -1285,10 +1285,7 @@ fn extract_if_complex() {
12851285
assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
12861286

12871287
assert_eq!(list.len(), 14);
1288-
assert_eq!(
1289-
list.into_iter().collect::<Vec<_>>(),
1290-
vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
1291-
);
1288+
assert_eq!(list, vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
12921289
}
12931290

12941291
{
@@ -1303,10 +1300,7 @@ fn extract_if_complex() {
13031300
assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
13041301

13051302
assert_eq!(list.len(), 13);
1306-
assert_eq!(
1307-
list.into_iter().collect::<Vec<_>>(),
1308-
vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
1309-
);
1303+
assert_eq!(list, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
13101304
}
13111305

13121306
{
@@ -1321,10 +1315,7 @@ fn extract_if_complex() {
13211315
assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
13221316

13231317
assert_eq!(list.len(), 11);
1324-
assert_eq!(
1325-
list.into_iter().collect::<Vec<_>>(),
1326-
vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]
1327-
);
1318+
assert_eq!(list, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
13281319
}
13291320

13301321
{
@@ -1338,7 +1329,7 @@ fn extract_if_complex() {
13381329
assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
13391330

13401331
assert_eq!(list.len(), 10);
1341-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
1332+
assert_eq!(list, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
13421333
}
13431334

13441335
{
@@ -1352,7 +1343,7 @@ fn extract_if_complex() {
13521343
assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
13531344

13541345
assert_eq!(list.len(), 10);
1355-
assert_eq!(list.into_iter().collect::<Vec<_>>(), vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
1346+
assert_eq!(list, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
13561347
}
13571348
}
13581349

0 commit comments

Comments
 (0)