authorgravatar for eric.shrewsberry@gmail.comEric Shrewsberry <eric.shrewsberry@gmail.com> 2022-04-13 10:10:20+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-04-14 02:54:41-04:00
log497f8a60986eac6c5abd3230b34b975bd1701c53
treece685d1a268815c37b9e3f94d958e26b37c687be
parent59fa548be8944962d5882e2ac38f6013ac00e84a

Fix bug in PriorityQueue::removeIndex()

Fix to call siftDown on the removed index instead of always on index 0. Updated test to a test that fails before and passes now. PriorityDequeue does not have this issue.

1 files changed, 13 insertions(+), 10 deletions(-)

lib/std/priority_queue.zig+13-10
...@@ -100,7 +100,7 @@ pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareF...@@ -100,7 +100,7 @@ pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareF
100 const item = self.items[index];100 const item = self.items[index];
101 self.items[index] = last;101 self.items[index] = last;
102 self.len -= 1;102 self.len -= 1;
103 siftDown(self, 0);103 siftDown(self, index);
104 return item;104 return item;
105 }105 }
106106
...@@ -460,22 +460,25 @@ test "std.PriorityQueue: remove at index" {...@@ -460,22 +460,25 @@ test "std.PriorityQueue: remove at index" {
460 var queue = PQlt.init(testing.allocator, {});460 var queue = PQlt.init(testing.allocator, {});
461 defer queue.deinit();461 defer queue.deinit();
462462
463 try queue.add(3);463 const items = [_]u32{ 2, 1, 8, 9, 3, 4, 5 };
464 try queue.add(2);464 for (items) |e| {
465 try queue.add(1);465 _ = try queue.add(e);
466 }
466467
467 var it = queue.iterator();468 var it = queue.iterator();
468 var elem = it.next();
469 var idx: usize = 0;469 var idx: usize = 0;
470 const two_idx = while (elem != null) : (elem = it.next()) {470 const two_idx = while (it.next()) |elem| {
471 if (elem.? == 2)471 if (elem == 2)
472 break idx;472 break idx;
473 idx += 1;473 idx += 1;
474 } else unreachable;474 } else unreachable;
475475 var sorted_items = [_]u32{ 1, 3, 4, 5, 8, 9 };
476 try expectEqual(queue.removeIndex(two_idx), 2);476 try expectEqual(queue.removeIndex(two_idx), 2);
477 try expectEqual(queue.remove(), 1);477
478 try expectEqual(queue.remove(), 3);478 var i: usize = 0;
479 while (queue.removeOrNull()) |n| : (i += 1) {
480 try expectEqual(n, sorted_items[i]);
481 }
479 try expectEqual(queue.removeOrNull(), null);482 try expectEqual(queue.removeOrNull(), null);
480}483}
481484