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...@@ -149,28 +149,14 @@ pub fn PriorityDequeue(comptime T: type, comptime Context: type, comptime compar
149 return self.bestItemAtIndices(1, 2, .gt).index;149 return self.bestItemAtIndices(1, 2, .gt).index;
150 }150 }
151151
152 /// Pop the smallest element from the dequeue. Returns152 /// Remove and return the smallest element from the dequeue, or `null` if empty
153 /// `null` if empty.153 pub fn popMin(self: *Self) ?T {
154 pub fn popMinOrNull(self: *Self) ?T {154 return if (self.len > 0) self.popIndex(0) else null;
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;
168 }155 }
169156
170 /// Remove and return the largest element from the157 /// Remove and return the largest element from the dequeue, or `null` if empty
171 /// dequeue.158 pub fn popMax(self: *Self) ?T {
172 pub fn popMax(self: *Self) T {159 return if (self.len > 0) self.popIndex(self.maxIndex().?) else null;
173 return self.popIndex(self.maxIndex().?);
174 }160 }
175161
176 /// Remove and return element at index. Indices are in the162 /// Remove and return element at index. Indices are in the
...@@ -504,12 +490,12 @@ test "push and pop min structs" {...@@ -504,12 +490,12 @@ test "push and pop min structs" {
504 try queue.push(gpa, .{ .size = 25 });490 try queue.push(gpa, .{ .size = 25 });
505 try queue.push(gpa, .{ .size = 13 });491 try queue.push(gpa, .{ .size = 13 });
506492
507 try expectEqual(@as(u32, 7), queue.popMin().size);493 try expectEqual(@as(u32, 7), queue.popMin().?.size);
508 try expectEqual(@as(u32, 12), queue.popMin().size);494 try expectEqual(@as(u32, 12), queue.popMin().?.size);
509 try expectEqual(@as(u32, 13), queue.popMin().size);495 try expectEqual(@as(u32, 13), queue.popMin().?.size);
510 try expectEqual(@as(u32, 23), queue.popMin().size);496 try expectEqual(@as(u32, 23), queue.popMin().?.size);
511 try expectEqual(@as(u32, 25), queue.popMin().size);497 try expectEqual(@as(u32, 25), queue.popMin().?.size);
512 try expectEqual(@as(u32, 54), queue.popMin().size);498 try expectEqual(@as(u32, 54), queue.popMin().?.size);
513}499}
514500
515test "push and pop max" {501test "push and pop max" {
...@@ -581,8 +567,8 @@ test "popOrNull empty" {...@@ -581,8 +567,8 @@ test "popOrNull empty" {
581 var queue = PDQ.init({});567 var queue = PDQ.init({});
582 defer queue.deinit(gpa);568 defer queue.deinit(gpa);
583569
584 try expect(queue.popMinOrNull() == null);570 try expect(queue.popMin() == null);
585 try expect(queue.popMaxOrNull() == null);571 try expect(queue.popMax() == null);
586}572}
587573
588test "edge case 3 elements" {574test "edge case 3 elements" {
...@@ -721,7 +707,7 @@ test "fromOwnedSlice trivial case 0" {...@@ -721,7 +707,7 @@ test "fromOwnedSlice trivial case 0" {
721 defer queue.deinit(gpa);707 defer queue.deinit(gpa);
722708
723 try expectEqual(@as(usize, 0), queue.len);709 try expectEqual(@as(usize, 0), queue.len);
724 try expect(queue.popMinOrNull() == null);710 try expect(queue.popMin() == null);
725}711}
726712
727test "fromOwnedSlice trivial case 1" {713test "fromOwnedSlice trivial case 1" {
...@@ -735,7 +721,7 @@ test "fromOwnedSlice trivial case 1" {...@@ -735,7 +721,7 @@ test "fromOwnedSlice trivial case 1" {
735721
736 try expectEqual(@as(usize, 1), queue.len);722 try expectEqual(@as(usize, 1), queue.len);
737 try expectEqual(items[0], queue.popMin());723 try expectEqual(items[0], queue.popMin());
738 try expect(queue.popMinOrNull() == null);724 try expect(queue.popMin() == null);
739}725}
740726
741test "fromOwnedSlice" {727test "fromOwnedSlice" {
...@@ -881,7 +867,7 @@ test "pop at index" {...@@ -881,7 +867,7 @@ test "pop at index" {
881 try expectEqual(queue.popIndex(two_idx), 2);867 try expectEqual(queue.popIndex(two_idx), 2);
882 try expectEqual(queue.popMin(), 1);868 try expectEqual(queue.popMin(), 1);
883 try expectEqual(queue.popMin(), 3);869 try expectEqual(queue.popMin(), 3);
884 try expectEqual(queue.popMinOrNull(), null);870 try expectEqual(queue.popMin(), null);
885}871}
886872
887test "iterator while empty" {873test "iterator while empty" {
...@@ -917,7 +903,7 @@ test "shrinkAndFree" {...@@ -917,7 +903,7 @@ test "shrinkAndFree" {
917 try expectEqual(@as(u32, 3), queue.popMax());903 try expectEqual(@as(u32, 3), queue.popMax());
918 try expectEqual(@as(u32, 2), queue.popMax());904 try expectEqual(@as(u32, 2), queue.popMax());
919 try expectEqual(@as(u32, 1), queue.popMax());905 try expectEqual(@as(u32, 1), queue.popMax());
920 try expect(queue.popMaxOrNull() == null);906 try expect(queue.popMax() == null);
921}907}
922908
923test "fuzz testing min" {909test "fuzz testing min" {
...@@ -942,7 +928,7 @@ fn fuzzTestMin(rng: std.Random, comptime queue_size: usize) !void {...@@ -942,7 +928,7 @@ fn fuzzTestMin(rng: std.Random, comptime queue_size: usize) !void {
942 defer queue.deinit(gpa);928 defer queue.deinit(gpa);
943929
944 var last_removed: ?u32 = null;930 var last_removed: ?u32 = null;
945 while (queue.popMinOrNull()) |next| {931 while (queue.popMin()) |next| {
946 if (last_removed) |last| {932 if (last_removed) |last| {
947 try expect(last <= next);933 try expect(last <= next);
948 }934 }
...@@ -972,7 +958,7 @@ fn fuzzTestMax(rng: std.Random, queue_size: usize) !void {...@@ -972,7 +958,7 @@ fn fuzzTestMax(rng: std.Random, queue_size: usize) !void {
972 defer queue.deinit(gpa);958 defer queue.deinit(gpa);
973959
974 var last_removed: ?u32 = null;960 var last_removed: ?u32 = null;
975 while (queue.popMaxOrNull()) |next| {961 while (queue.popMax()) |next| {
976 if (last_removed) |last| {962 if (last_removed) |last| {
977 try expect(last >= next);963 try expect(last >= next);
978 }964 }
...@@ -1006,13 +992,13 @@ fn fuzzTestMinMax(rng: std.Random, queue_size: usize) !void {...@@ -1006,13 +992,13 @@ fn fuzzTestMinMax(rng: std.Random, queue_size: usize) !void {
1006 var i: usize = 0;992 var i: usize = 0;
1007 while (i < queue_size) : (i += 1) {993 while (i < queue_size) : (i += 1) {
1008 if (i % 2 == 0) {994 if (i % 2 == 0) {
1009 const next = queue.popMin();995 const next = queue.popMin().?;
1010 if (last_min) |last| {996 if (last_min) |last| {
1011 try expect(last <= next);997 try expect(last <= next);
1012 }998 }
1013 last_min = next;999 last_min = next;
1014 } else {1000 } else {
1015 const next = queue.popMax();1001 const next = queue.popMax().?;
1016 if (last_max) |last| {1002 if (last_max) |last| {
1017 try expect(last >= next);1003 try expect(last >= next);
1018 }1004 }