| ... | @@ -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 | } |
| 151 | | 151 | |
| 152 | /// Pop the smallest element from the dequeue. Returns | 152 | /// 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 | } |
| 169 | | 156 | |
| 170 | /// Remove and return the largest element from the | 157 | /// 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 | } |
| 175 | | 161 | |
| 176 | /// Remove and return element at index. Indices are in the | 162 | /// 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 }); |
| 506 | | 492 | |
| 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 | } |
| 514 | | 500 | |
| 515 | test "push and pop max" { | 501 | test "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); |
| 583 | | 569 | |
| 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 | } |
| 587 | | 573 | |
| 588 | test "edge case 3 elements" { | 574 | test "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); |
| 722 | | 708 | |
| 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 | } |
| 726 | | 712 | |
| 727 | test "fromOwnedSlice trivial case 1" { | 713 | test "fromOwnedSlice trivial case 1" { |
| ... | @@ -735,7 +721,7 @@ test "fromOwnedSlice trivial case 1" { | ... | @@ -735,7 +721,7 @@ test "fromOwnedSlice trivial case 1" { |
| 735 | | 721 | |
| 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 | } |
| 740 | | 726 | |
| 741 | test "fromOwnedSlice" { | 727 | test "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 | } |
| 886 | | 872 | |
| 887 | test "iterator while empty" { | 873 | test "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 | } |
| 922 | | 908 | |
| 923 | test "fuzz testing min" { | 909 | test "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); |
| 943 | | 929 | |
| 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); |
| 973 | | 959 | |
| 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 | } |