authorgravatar for saurabh.m@proton.meSaurabh Mishra <saurabh.m@proton.me> 2026-02-18 11:58:13-08:00
committergravatar for saurabh.m@proton.meSaurabh Mishra <saurabh.m@proton.me> 2026-02-18 11:58:13-08:00
log23252c27beda48df95beb7bcf53b900e93fc7441
tree394789e9140d60e708630bb4ce9befc28da3c3b9
parent535722b37419f821650a3765e20880a3186ceff3

merge `popMinOrNull` into `popMin` and `popMaxOrNull` into `popMax`, and update tests


1 files changed, 22 insertions(+), 36 deletions(-)

lib/std/priority_dequeue.zig+22-36
......@@ -149,28 +149,14 @@ pub fn PriorityDequeue(comptime T: type, comptime Context: type, comptime compar
149149 return self.bestItemAtIndices(1, 2, .gt).index;
150150 }
151151
152 /// Pop the smallest element from the dequeue. Returns
153 /// `null` if empty.
154 pub fn popMinOrNull(self: *Self) ?T {
155 return if (self.len > 0) self.popMin() else null;
156 }
157
158 /// Remove and return the smallest element from the
159 /// dequeue.
160 pub fn popMin(self: *Self) T {
161 return self.popIndex(0);
162 }
163
164 /// Pop the largest element from the dequeue. Returns
165 /// `null` if empty.
166 pub fn popMaxOrNull(self: *Self) ?T {
167 return if (self.len > 0) self.popMax() else null;
152 /// Remove and return the smallest element from the dequeue, or `null` if empty
153 pub fn popMin(self: *Self) ?T {
154 return if (self.len > 0) self.popIndex(0) else null;
168155 }
169156
170 /// Remove and return the largest element from the
171 /// dequeue.
172 pub fn popMax(self: *Self) T {
173 return self.popIndex(self.maxIndex().?);
157 /// Remove and return the largest element from the dequeue, or `null` if empty
158 pub fn popMax(self: *Self) ?T {
159 return if (self.len > 0) self.popIndex(self.maxIndex().?) else null;
174160 }
175161
176162 /// Remove and return element at index. Indices are in the
......@@ -504,12 +490,12 @@ test "push and pop min structs" {
504490 try queue.push(gpa, .{ .size = 25 });
505491 try queue.push(gpa, .{ .size = 13 });
506492
507 try expectEqual(@as(u32, 7), queue.popMin().size);
508 try expectEqual(@as(u32, 12), queue.popMin().size);
509 try expectEqual(@as(u32, 13), queue.popMin().size);
510 try expectEqual(@as(u32, 23), queue.popMin().size);
511 try expectEqual(@as(u32, 25), queue.popMin().size);
512 try expectEqual(@as(u32, 54), queue.popMin().size);
493 try expectEqual(@as(u32, 7), queue.popMin().?.size);
494 try expectEqual(@as(u32, 12), queue.popMin().?.size);
495 try expectEqual(@as(u32, 13), queue.popMin().?.size);
496 try expectEqual(@as(u32, 23), queue.popMin().?.size);
497 try expectEqual(@as(u32, 25), queue.popMin().?.size);
498 try expectEqual(@as(u32, 54), queue.popMin().?.size);
513499}
514500
515501test "push and pop max" {
......@@ -581,8 +567,8 @@ test "popOrNull empty" {
581567 var queue = PDQ.init({});
582568 defer queue.deinit(gpa);
583569
584 try expect(queue.popMinOrNull() == null);
585 try expect(queue.popMaxOrNull() == null);
570 try expect(queue.popMin() == null);
571 try expect(queue.popMax() == null);
586572}
587573
588574test "edge case 3 elements" {
......@@ -721,7 +707,7 @@ test "fromOwnedSlice trivial case 0" {
721707 defer queue.deinit(gpa);
722708
723709 try expectEqual(@as(usize, 0), queue.len);
724 try expect(queue.popMinOrNull() == null);
710 try expect(queue.popMin() == null);
725711}
726712
727713test "fromOwnedSlice trivial case 1" {
......@@ -735,7 +721,7 @@ test "fromOwnedSlice trivial case 1" {
735721
736722 try expectEqual(@as(usize, 1), queue.len);
737723 try expectEqual(items[0], queue.popMin());
738 try expect(queue.popMinOrNull() == null);
724 try expect(queue.popMin() == null);
739725}
740726
741727test "fromOwnedSlice" {
......@@ -881,7 +867,7 @@ test "pop at index" {
881867 try expectEqual(queue.popIndex(two_idx), 2);
882868 try expectEqual(queue.popMin(), 1);
883869 try expectEqual(queue.popMin(), 3);
884 try expectEqual(queue.popMinOrNull(), null);
870 try expectEqual(queue.popMin(), null);
885871}
886872
887873test "iterator while empty" {
......@@ -917,7 +903,7 @@ test "shrinkAndFree" {
917903 try expectEqual(@as(u32, 3), queue.popMax());
918904 try expectEqual(@as(u32, 2), queue.popMax());
919905 try expectEqual(@as(u32, 1), queue.popMax());
920 try expect(queue.popMaxOrNull() == null);
906 try expect(queue.popMax() == null);
921907}
922908
923909test "fuzz testing min" {
......@@ -942,7 +928,7 @@ fn fuzzTestMin(rng: std.Random, comptime queue_size: usize) !void {
942928 defer queue.deinit(gpa);
943929
944930 var last_removed: ?u32 = null;
945 while (queue.popMinOrNull()) |next| {
931 while (queue.popMin()) |next| {
946932 if (last_removed) |last| {
947933 try expect(last <= next);
948934 }
......@@ -972,7 +958,7 @@ fn fuzzTestMax(rng: std.Random, queue_size: usize) !void {
972958 defer queue.deinit(gpa);
973959
974960 var last_removed: ?u32 = null;
975 while (queue.popMaxOrNull()) |next| {
961 while (queue.popMax()) |next| {
976962 if (last_removed) |last| {
977963 try expect(last >= next);
978964 }
......@@ -1006,13 +992,13 @@ fn fuzzTestMinMax(rng: std.Random, queue_size: usize) !void {
1006992 var i: usize = 0;
1007993 while (i < queue_size) : (i += 1) {
1008994 if (i % 2 == 0) {
1009 const next = queue.popMin();
995 const next = queue.popMin().?;
1010996 if (last_min) |last| {
1011997 try expect(last <= next);
1012998 }
1013999 last_min = next;
10141000 } else {
1015 const next = queue.popMax();
1001 const next = queue.popMax().?;
10161002 if (last_max) |last| {
10171003 try expect(last >= next);
10181004 }