authorgravatar for hollmannm1@gmail.comMax Hollmann <hollmannm1@gmail.com> 2021-10-17 01:10:01+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-17 17:47:43-04:00
log53b87fa78a3ee2c261f3bdd6a71d5733fe17ffd5
treec3ff20f7501d461adf58ccb817f10566c9192cd1
parent22beaf5afcfb4c9c29016f19f363a24f159b5b82

Move `compareFn` from init to type constructor in `PriorityQueue` and `PriorityDequeue`.

This change significantly improves performance for simple compare functions and modifies the API to be more consistent with e.g. `HashMap`.

2 files changed, 90 insertions(+), 97 deletions(-)

lib/std/priority_dequeue.zig+52-56
......@@ -9,30 +9,27 @@ const expectEqual = testing.expectEqual;
99const expectError = testing.expectError;
1010
1111/// Priority Dequeue for storing generic data. Initialize with `init`.
12pub fn PriorityDequeue(comptime T: type) type {
12/// Provide `compareFn` that returns `Order.lt` when its first
13/// argument should get min-popped before its second argument,
14/// `Order.eq` if the arguments are of equal priority, or `Order.gt`
15/// if the second argument should be min-popped first.
16/// Popping the max element works in reverse. For example,
17/// to make `popMin` return the smallest number, provide
18/// `fn lessThan(a: T, b: T) Order { return std.math.order(a, b); }`
19pub fn PriorityDequeue(comptime T: type, comptime compareFn: fn (T, T) Order) type {
1320 return struct {
1421 const Self = @This();
1522
1623 items: []T,
1724 len: usize,
1825 allocator: *Allocator,
19 compareFn: fn (a: T, b: T) Order,
20
21 /// Initialize and return a new priority dequeue. Provide `compareFn`
22 /// that returns `Order.lt` when its first argument should
23 /// get min-popped before its second argument, `Order.eq` if the
24 /// arguments are of equal priority, or `Order.gt` if the second
25 /// argument should be min-popped first. Popping the max element works
26 /// in reverse. For example, to make `popMin` return the smallest
27 /// number, provide
28 ///
29 /// `fn lessThan(a: T, b: T) Order { return std.math.order(a, b); }`
30 pub fn init(allocator: *Allocator, compareFn: fn (T, T) Order) Self {
26
27 /// Initialize and return a new priority dequeue.
28 pub fn init(allocator: *Allocator) Self {
3129 return Self{
3230 .items = &[_]T{},
3331 .len = 0,
3432 .allocator = allocator,
35 .compareFn = compareFn,
3633 };
3734 }
3835
......@@ -91,7 +88,7 @@ pub fn PriorityDequeue(comptime T: type) type {
9188 const parent = self.items[parent_index];
9289
9390 const min_layer = self.nextIsMinLayer();
94 const order = self.compareFn(child, parent);
91 const order = compareFn(child, parent);
9592 if ((min_layer and order == .gt) or (!min_layer and order == .lt)) {
9693 // We must swap the item with it's parent if it is on the "wrong" layer
9794 self.items[parent_index] = child;
......@@ -124,7 +121,7 @@ pub fn PriorityDequeue(comptime T: type) type {
124121 const grandparent = self.items[grandparent_index];
125122
126123 // If the grandparent is already better or equal, we have gone as far as we need to
127 if (self.compareFn(child, grandparent) != target_order) break;
124 if (compareFn(child, grandparent) != target_order) break;
128125
129126 // Otherwise swap the item with it's grandparent
130127 self.items[grandparent_index] = child;
......@@ -219,10 +216,10 @@ pub fn PriorityDequeue(comptime T: type) type {
219216 // Find the best grandchild
220217 const best_left = self.bestItemAtIndices(first_grandchild_index, index2, target_order);
221218 const best_right = self.bestItemAtIndices(index3, last_grandchild_index, target_order);
222 const best_grandchild = self.bestItem(best_left, best_right, target_order);
219 const best_grandchild = Self.bestItem(best_left, best_right, target_order);
223220
224221 // If the item is better than or equal to its best grandchild, we are done
225 if (self.compareFn(best_grandchild.item, elem) != target_order) return;
222 if (compareFn(best_grandchild.item, elem) != target_order) return;
226223
227224 // Otherwise, swap them
228225 self.items[best_grandchild.index] = elem;
......@@ -239,7 +236,7 @@ pub fn PriorityDequeue(comptime T: type) type {
239236 const best_descendent = self.bestDescendent(first_child_index, first_grandchild_index, target_order);
240237
241238 // If the item is better than or equal to its best descendant, we are done
242 if (self.compareFn(best_descendent.item, elem) != target_order) return;
239 if (compareFn(best_descendent.item, elem) != target_order) return;
243240
244241 // Otherwise swap them
245242 self.items[best_descendent.index] = elem;
......@@ -263,7 +260,7 @@ pub fn PriorityDequeue(comptime T: type) type {
263260 const parent_index = parentIndex(child_index);
264261 const parent = self.items[parent_index];
265262
266 if (self.compareFn(parent, child) == target_order) {
263 if (compareFn(parent, child) == target_order) {
267264 self.items[parent_index] = child;
268265 self.items[child_index] = parent;
269266 }
......@@ -281,8 +278,8 @@ pub fn PriorityDequeue(comptime T: type) type {
281278 };
282279 }
283280
284 fn bestItem(self: Self, item1: ItemAndIndex, item2: ItemAndIndex, target_order: Order) ItemAndIndex {
285 if (self.compareFn(item1.item, item2.item) == target_order) {
281 fn bestItem(item1: ItemAndIndex, item2: ItemAndIndex, target_order: Order) ItemAndIndex {
282 if (compareFn(item1.item, item2.item) == target_order) {
286283 return item1;
287284 } else {
288285 return item2;
......@@ -292,7 +289,7 @@ pub fn PriorityDequeue(comptime T: type) type {
292289 fn bestItemAtIndices(self: Self, index1: usize, index2: usize, target_order: Order) ItemAndIndex {
293290 var item1 = self.getItem(index1);
294291 var item2 = self.getItem(index2);
295 return self.bestItem(item1, item2, target_order);
292 return Self.bestItem(item1, item2, target_order);
296293 }
297294
298295 fn bestDescendent(self: Self, first_child_index: usize, first_grandchild_index: usize, target_order: Order) ItemAndIndex {
......@@ -340,12 +337,11 @@ pub fn PriorityDequeue(comptime T: type) type {
340337 /// Dequeue takes ownership of the passed in slice. The slice must have been
341338 /// allocated with `allocator`.
342339 /// De-initialize with `deinit`.
343 pub fn fromOwnedSlice(allocator: *Allocator, compareFn: fn (T, T) Order, items: []T) Self {
340 pub fn fromOwnedSlice(allocator: *Allocator, items: []T) Self {
344341 var queue = Self{
345342 .items = items,
346343 .len = items.len,
347344 .allocator = allocator,
348 .compareFn = compareFn,
349345 };
350346
351347 if (queue.len <= 1) return queue;
......@@ -400,7 +396,7 @@ pub fn PriorityDequeue(comptime T: type) type {
400396 }
401397
402398 pub const Iterator = struct {
403 queue: *PriorityDequeue(T),
399 queue: *PriorityDequeue(T, compareFn),
404400 count: usize,
405401
406402 pub fn next(it: *Iterator) ?T {
......@@ -462,10 +458,10 @@ fn lessThanComparison(a: u32, b: u32) Order {
462458 return std.math.order(a, b);
463459}
464460
465const PDQ = PriorityDequeue(u32);
461const PDQ = PriorityDequeue(u32, lessThanComparison);
466462
467463test "std.PriorityDequeue: add and remove min" {
468 var queue = PDQ.init(testing.allocator, lessThanComparison);
464 var queue = PDQ.init(testing.allocator);
469465 defer queue.deinit();
470466
471467 try queue.add(54);
......@@ -487,11 +483,11 @@ test "std.PriorityDequeue: add and remove min structs" {
487483 const S = struct {
488484 size: u32,
489485 };
490 var queue = PriorityDequeue(S).init(testing.allocator, struct {
486 var queue = PriorityDequeue(S, struct {
491487 fn order(a: S, b: S) Order {
492488 return std.math.order(a.size, b.size);
493489 }
494 }.order);
490 }.order).init(testing.allocator);
495491 defer queue.deinit();
496492
497493 try queue.add(.{ .size = 54 });
......@@ -510,7 +506,7 @@ test "std.PriorityDequeue: add and remove min structs" {
510506}
511507
512508test "std.PriorityDequeue: add and remove max" {
513 var queue = PDQ.init(testing.allocator, lessThanComparison);
509 var queue = PDQ.init(testing.allocator);
514510 defer queue.deinit();
515511
516512 try queue.add(54);
......@@ -529,7 +525,7 @@ test "std.PriorityDequeue: add and remove max" {
529525}
530526
531527test "std.PriorityDequeue: add and remove same min" {
532 var queue = PDQ.init(testing.allocator, lessThanComparison);
528 var queue = PDQ.init(testing.allocator);
533529 defer queue.deinit();
534530
535531 try queue.add(1);
......@@ -548,7 +544,7 @@ test "std.PriorityDequeue: add and remove same min" {
548544}
549545
550546test "std.PriorityDequeue: add and remove same max" {
551 var queue = PDQ.init(testing.allocator, lessThanComparison);
547 var queue = PDQ.init(testing.allocator);
552548 defer queue.deinit();
553549
554550 try queue.add(1);
......@@ -567,7 +563,7 @@ test "std.PriorityDequeue: add and remove same max" {
567563}
568564
569565test "std.PriorityDequeue: removeOrNull empty" {
570 var queue = PDQ.init(testing.allocator, lessThanComparison);
566 var queue = PDQ.init(testing.allocator);
571567 defer queue.deinit();
572568
573569 try expect(queue.removeMinOrNull() == null);
......@@ -575,7 +571,7 @@ test "std.PriorityDequeue: removeOrNull empty" {
575571}
576572
577573test "std.PriorityDequeue: edge case 3 elements" {
578 var queue = PDQ.init(testing.allocator, lessThanComparison);
574 var queue = PDQ.init(testing.allocator);
579575 defer queue.deinit();
580576
581577 try queue.add(9);
......@@ -588,7 +584,7 @@ test "std.PriorityDequeue: edge case 3 elements" {
588584}
589585
590586test "std.PriorityDequeue: edge case 3 elements max" {
591 var queue = PDQ.init(testing.allocator, lessThanComparison);
587 var queue = PDQ.init(testing.allocator);
592588 defer queue.deinit();
593589
594590 try queue.add(9);
......@@ -601,7 +597,7 @@ test "std.PriorityDequeue: edge case 3 elements max" {
601597}
602598
603599test "std.PriorityDequeue: peekMin" {
604 var queue = PDQ.init(testing.allocator, lessThanComparison);
600 var queue = PDQ.init(testing.allocator);
605601 defer queue.deinit();
606602
607603 try expect(queue.peekMin() == null);
......@@ -615,7 +611,7 @@ test "std.PriorityDequeue: peekMin" {
615611}
616612
617613test "std.PriorityDequeue: peekMax" {
618 var queue = PDQ.init(testing.allocator, lessThanComparison);
614 var queue = PDQ.init(testing.allocator);
619615 defer queue.deinit();
620616
621617 try expect(queue.peekMin() == null);
......@@ -629,7 +625,7 @@ test "std.PriorityDequeue: peekMax" {
629625}
630626
631627test "std.PriorityDequeue: sift up with odd indices" {
632 var queue = PDQ.init(testing.allocator, lessThanComparison);
628 var queue = PDQ.init(testing.allocator);
633629 defer queue.deinit();
634630 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
635631 for (items) |e| {
......@@ -643,7 +639,7 @@ test "std.PriorityDequeue: sift up with odd indices" {
643639}
644640
645641test "std.PriorityDequeue: sift up with odd indices" {
646 var queue = PDQ.init(testing.allocator, lessThanComparison);
642 var queue = PDQ.init(testing.allocator);
647643 defer queue.deinit();
648644 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
649645 for (items) |e| {
......@@ -657,7 +653,7 @@ test "std.PriorityDequeue: sift up with odd indices" {
657653}
658654
659655test "std.PriorityDequeue: addSlice min" {
660 var queue = PDQ.init(testing.allocator, lessThanComparison);
656 var queue = PDQ.init(testing.allocator);
661657 defer queue.deinit();
662658 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
663659 try queue.addSlice(items[0..]);
......@@ -669,7 +665,7 @@ test "std.PriorityDequeue: addSlice min" {
669665}
670666
671667test "std.PriorityDequeue: addSlice max" {
672 var queue = PDQ.init(testing.allocator, lessThanComparison);
668 var queue = PDQ.init(testing.allocator);
673669 defer queue.deinit();
674670 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
675671 try queue.addSlice(items[0..]);
......@@ -683,7 +679,7 @@ test "std.PriorityDequeue: addSlice max" {
683679test "std.PriorityDequeue: fromOwnedSlice trivial case 0" {
684680 const items = [0]u32{};
685681 const queue_items = try testing.allocator.dupe(u32, &items);
686 var queue = PDQ.fromOwnedSlice(testing.allocator, lessThanComparison, queue_items[0..]);
682 var queue = PDQ.fromOwnedSlice(testing.allocator, queue_items[0..]);
687683 defer queue.deinit();
688684 try expectEqual(@as(usize, 0), queue.len);
689685 try expect(queue.removeMinOrNull() == null);
......@@ -692,7 +688,7 @@ test "std.PriorityDequeue: fromOwnedSlice trivial case 0" {
692688test "std.PriorityDequeue: fromOwnedSlice trivial case 1" {
693689 const items = [1]u32{1};
694690 const queue_items = try testing.allocator.dupe(u32, &items);
695 var queue = PDQ.fromOwnedSlice(testing.allocator, lessThanComparison, queue_items[0..]);
691 var queue = PDQ.fromOwnedSlice(testing.allocator, queue_items[0..]);
696692 defer queue.deinit();
697693
698694 try expectEqual(@as(usize, 1), queue.len);
......@@ -703,7 +699,7 @@ test "std.PriorityDequeue: fromOwnedSlice trivial case 1" {
703699test "std.PriorityDequeue: fromOwnedSlice" {
704700 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
705701 const queue_items = try testing.allocator.dupe(u32, items[0..]);
706 var queue = PDQ.fromOwnedSlice(testing.allocator, lessThanComparison, queue_items[0..]);
702 var queue = PDQ.fromOwnedSlice(testing.allocator, queue_items[0..]);
707703 defer queue.deinit();
708704
709705 const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 };
......@@ -713,7 +709,7 @@ test "std.PriorityDequeue: fromOwnedSlice" {
713709}
714710
715711test "std.PriorityDequeue: update min queue" {
716 var queue = PDQ.init(testing.allocator, lessThanComparison);
712 var queue = PDQ.init(testing.allocator);
717713 defer queue.deinit();
718714
719715 try queue.add(55);
......@@ -728,7 +724,7 @@ test "std.PriorityDequeue: update min queue" {
728724}
729725
730726test "std.PriorityDequeue: update same min queue" {
731 var queue = PDQ.init(testing.allocator, lessThanComparison);
727 var queue = PDQ.init(testing.allocator);
732728 defer queue.deinit();
733729
734730 try queue.add(1);
......@@ -744,7 +740,7 @@ test "std.PriorityDequeue: update same min queue" {
744740}
745741
746742test "std.PriorityDequeue: update max queue" {
747 var queue = PDQ.init(testing.allocator, lessThanComparison);
743 var queue = PDQ.init(testing.allocator);
748744 defer queue.deinit();
749745
750746 try queue.add(55);
......@@ -760,7 +756,7 @@ test "std.PriorityDequeue: update max queue" {
760756}
761757
762758test "std.PriorityDequeue: update same max queue" {
763 var queue = PDQ.init(testing.allocator, lessThanComparison);
759 var queue = PDQ.init(testing.allocator);
764760 defer queue.deinit();
765761
766762 try queue.add(1);
......@@ -776,7 +772,7 @@ test "std.PriorityDequeue: update same max queue" {
776772}
777773
778774test "std.PriorityDequeue: iterator" {
779 var queue = PDQ.init(testing.allocator, lessThanComparison);
775 var queue = PDQ.init(testing.allocator);
780776 var map = std.AutoHashMap(u32, void).init(testing.allocator);
781777 defer {
782778 queue.deinit();
......@@ -798,7 +794,7 @@ test "std.PriorityDequeue: iterator" {
798794}
799795
800796test "std.PriorityDequeue: remove at index" {
801 var queue = PDQ.init(testing.allocator, lessThanComparison);
797 var queue = PDQ.init(testing.allocator);
802798 defer queue.deinit();
803799
804800 try queue.add(3);
......@@ -821,7 +817,7 @@ test "std.PriorityDequeue: remove at index" {
821817}
822818
823819test "std.PriorityDequeue: iterator while empty" {
824 var queue = PDQ.init(testing.allocator, lessThanComparison);
820 var queue = PDQ.init(testing.allocator);
825821 defer queue.deinit();
826822
827823 var it = queue.iterator();
......@@ -830,7 +826,7 @@ test "std.PriorityDequeue: iterator while empty" {
830826}
831827
832828test "std.PriorityDequeue: shrinkAndFree" {
833 var queue = PDQ.init(testing.allocator, lessThanComparison);
829 var queue = PDQ.init(testing.allocator);
834830 defer queue.deinit();
835831
836832 try queue.ensureTotalCapacity(4);
......@@ -868,7 +864,7 @@ fn fuzzTestMin(rng: *std.rand.Random, comptime queue_size: usize) !void {
868864 const allocator = testing.allocator;
869865 const items = try generateRandomSlice(allocator, rng, queue_size);
870866
871 var queue = PDQ.fromOwnedSlice(allocator, lessThanComparison, items);
867 var queue = PDQ.fromOwnedSlice(allocator, items);
872868 defer queue.deinit();
873869
874870 var last_removed: ?u32 = null;
......@@ -896,7 +892,7 @@ fn fuzzTestMax(rng: *std.rand.Random, queue_size: usize) !void {
896892 const allocator = testing.allocator;
897893 const items = try generateRandomSlice(allocator, rng, queue_size);
898894
899 var queue = PDQ.fromOwnedSlice(testing.allocator, lessThanComparison, items);
895 var queue = PDQ.fromOwnedSlice(testing.allocator, items);
900896 defer queue.deinit();
901897
902898 var last_removed: ?u32 = null;
......@@ -924,7 +920,7 @@ fn fuzzTestMinMax(rng: *std.rand.Random, queue_size: usize) !void {
924920 const allocator = testing.allocator;
925921 const items = try generateRandomSlice(allocator, rng, queue_size);
926922
927 var queue = PDQ.fromOwnedSlice(allocator, lessThanComparison, items);
923 var queue = PDQ.fromOwnedSlice(allocator, items);
928924 defer queue.deinit();
929925
930926 var last_min: ?u32 = null;
lib/std/priority_queue.zig+38-41
......@@ -9,29 +9,26 @@ const expectEqual = testing.expectEqual;
99const expectError = testing.expectError;
1010
1111/// Priority queue for storing generic data. Initialize with `init`.
12pub fn PriorityQueue(comptime T: type) type {
12/// Provide `compareFn` that returns `Order.lt` when its first
13/// argument should get popped before its second argument,
14/// `Order.eq` if the arguments are of equal priority, or `Order.gt`
15/// if the second argument should be popped first.
16/// For example, to make `pop` return the smallest number, provide
17/// `fn lessThan(a: T, b: T) Order { return std.math.order(a, b); }`
18pub fn PriorityQueue(comptime T: type, comptime compareFn: fn (a: T, b: T) Order) type {
1319 return struct {
1420 const Self = @This();
1521
1622 items: []T,
1723 len: usize,
1824 allocator: *Allocator,
19 compareFn: fn (a: T, b: T) Order,
20
21 /// Initialize and return a priority queue. Provide `compareFn`
22 /// that returns `Order.lt` when its first argument should
23 /// get popped before its second argument, `Order.eq` if the
24 /// arguments are of equal priority, or `Order.gt` if the second
25 /// argument should be popped first. For example, to make `pop`
26 /// return the smallest number, provide
27 ///
28 /// `fn lessThan(a: T, b: T) Order { return std.math.order(a, b); }`
29 pub fn init(allocator: *Allocator, compareFn: fn (a: T, b: T) Order) Self {
25
26 /// Initialize and return a priority queue.
27 pub fn init(allocator: *Allocator) Self {
3028 return Self{
3129 .items = &[_]T{},
3230 .len = 0,
3331 .allocator = allocator,
34 .compareFn = compareFn,
3532 };
3633 }
3734
......@@ -59,7 +56,7 @@ pub fn PriorityQueue(comptime T: type) type {
5956 const child = self.items[child_index];
6057 const parent = self.items[parent_index];
6158
62 if (self.compareFn(child, parent) != .lt) break;
59 if (compareFn(child, parent) != .lt) break;
6360
6461 self.items[parent_index] = child;
6562 self.items[child_index] = parent;
......@@ -131,14 +128,14 @@ pub fn PriorityQueue(comptime T: type) type {
131128 var smallest = self.items[index];
132129
133130 if (left) |e| {
134 if (self.compareFn(e, smallest) == .lt) {
131 if (compareFn(e, smallest) == .lt) {
135132 smallest_index = left_index;
136133 smallest = e;
137134 }
138135 }
139136
140137 if (right) |e| {
141 if (self.compareFn(e, smallest) == .lt) {
138 if (compareFn(e, smallest) == .lt) {
142139 smallest_index = right_index;
143140 smallest = e;
144141 }
......@@ -157,12 +154,11 @@ pub fn PriorityQueue(comptime T: type) type {
157154 /// PriorityQueue takes ownership of the passed in slice. The slice must have been
158155 /// allocated with `allocator`.
159156 /// Deinitialize with `deinit`.
160 pub fn fromOwnedSlice(allocator: *Allocator, compareFn: fn (a: T, b: T) Order, items: []T) Self {
157 pub fn fromOwnedSlice(allocator: *Allocator, items: []T) Self {
161158 var queue = Self{
162159 .items = items,
163160 .len = items.len,
164161 .allocator = allocator,
165 .compareFn = compareFn,
166162 };
167163
168164 if (queue.len <= 1) return queue;
......@@ -213,7 +209,7 @@ pub fn PriorityQueue(comptime T: type) type {
213209 var update_index: usize = std.mem.indexOfScalar(T, self.items[0..self.len], elem) orelse return error.ElementNotFound;
214210 const old_elem: T = self.items[update_index];
215211 self.items[update_index] = new_elem;
216 switch (self.compareFn(new_elem, old_elem)) {
212 switch (compareFn(new_elem, old_elem)) {
217213 .lt => siftUp(self, update_index),
218214 .gt => siftDown(self, update_index),
219215 .eq => {}, // Nothing to do as the items have equal priority
......@@ -221,7 +217,7 @@ pub fn PriorityQueue(comptime T: type) type {
221217 }
222218
223219 pub const Iterator = struct {
224 queue: *PriorityQueue(T),
220 queue: *PriorityQueue(T, compareFn),
225221 count: usize,
226222
227223 pub fn next(it: *Iterator) ?T {
......@@ -271,10 +267,11 @@ fn greaterThan(a: u32, b: u32) Order {
271267 return lessThan(a, b).invert();
272268}
273269
274const PQ = PriorityQueue(u32);
270const PQlt = PriorityQueue(u32, lessThan);
271const PQgt = PriorityQueue(u32, greaterThan);
275272
276273test "std.PriorityQueue: add and remove min heap" {
277 var queue = PQ.init(testing.allocator, lessThan);
274 var queue = PQlt.init(testing.allocator);
278275 defer queue.deinit();
279276
280277 try queue.add(54);
......@@ -292,7 +289,7 @@ test "std.PriorityQueue: add and remove min heap" {
292289}
293290
294291test "std.PriorityQueue: add and remove same min heap" {
295 var queue = PQ.init(testing.allocator, lessThan);
292 var queue = PQlt.init(testing.allocator);
296293 defer queue.deinit();
297294
298295 try queue.add(1);
......@@ -310,14 +307,14 @@ test "std.PriorityQueue: add and remove same min heap" {
310307}
311308
312309test "std.PriorityQueue: removeOrNull on empty" {
313 var queue = PQ.init(testing.allocator, lessThan);
310 var queue = PQlt.init(testing.allocator);
314311 defer queue.deinit();
315312
316313 try expect(queue.removeOrNull() == null);
317314}
318315
319316test "std.PriorityQueue: edge case 3 elements" {
320 var queue = PQ.init(testing.allocator, lessThan);
317 var queue = PQlt.init(testing.allocator);
321318 defer queue.deinit();
322319
323320 try queue.add(9);
......@@ -329,7 +326,7 @@ test "std.PriorityQueue: edge case 3 elements" {
329326}
330327
331328test "std.PriorityQueue: peek" {
332 var queue = PQ.init(testing.allocator, lessThan);
329 var queue = PQlt.init(testing.allocator);
333330 defer queue.deinit();
334331
335332 try expect(queue.peek() == null);
......@@ -341,7 +338,7 @@ test "std.PriorityQueue: peek" {
341338}
342339
343340test "std.PriorityQueue: sift up with odd indices" {
344 var queue = PQ.init(testing.allocator, lessThan);
341 var queue = PQlt.init(testing.allocator);
345342 defer queue.deinit();
346343 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
347344 for (items) |e| {
......@@ -355,7 +352,7 @@ test "std.PriorityQueue: sift up with odd indices" {
355352}
356353
357354test "std.PriorityQueue: addSlice" {
358 var queue = PQ.init(testing.allocator, lessThan);
355 var queue = PQlt.init(testing.allocator);
359356 defer queue.deinit();
360357 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
361358 try queue.addSlice(items[0..]);
......@@ -369,7 +366,7 @@ test "std.PriorityQueue: addSlice" {
369366test "std.PriorityQueue: fromOwnedSlice trivial case 0" {
370367 const items = [0]u32{};
371368 const queue_items = try testing.allocator.dupe(u32, &items);
372 var queue = PQ.fromOwnedSlice(testing.allocator, lessThan, queue_items[0..]);
369 var queue = PQlt.fromOwnedSlice(testing.allocator, queue_items[0..]);
373370 defer queue.deinit();
374371 try expectEqual(@as(usize, 0), queue.len);
375372 try expect(queue.removeOrNull() == null);
......@@ -378,7 +375,7 @@ test "std.PriorityQueue: fromOwnedSlice trivial case 0" {
378375test "std.PriorityQueue: fromOwnedSlice trivial case 1" {
379376 const items = [1]u32{1};
380377 const queue_items = try testing.allocator.dupe(u32, &items);
381 var queue = PQ.fromOwnedSlice(testing.allocator, lessThan, queue_items[0..]);
378 var queue = PQlt.fromOwnedSlice(testing.allocator, queue_items[0..]);
382379 defer queue.deinit();
383380
384381 try expectEqual(@as(usize, 1), queue.len);
......@@ -389,7 +386,7 @@ test "std.PriorityQueue: fromOwnedSlice trivial case 1" {
389386test "std.PriorityQueue: fromOwnedSlice" {
390387 const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
391388 const heap_items = try testing.allocator.dupe(u32, items[0..]);
392 var queue = PQ.fromOwnedSlice(testing.allocator, lessThan, heap_items[0..]);
389 var queue = PQlt.fromOwnedSlice(testing.allocator, heap_items[0..]);
393390 defer queue.deinit();
394391
395392 const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 };
......@@ -399,7 +396,7 @@ test "std.PriorityQueue: fromOwnedSlice" {
399396}
400397
401398test "std.PriorityQueue: add and remove max heap" {
402 var queue = PQ.init(testing.allocator, greaterThan);
399 var queue = PQgt.init(testing.allocator);
403400 defer queue.deinit();
404401
405402 try queue.add(54);
......@@ -417,7 +414,7 @@ test "std.PriorityQueue: add and remove max heap" {
417414}
418415
419416test "std.PriorityQueue: add and remove same max heap" {
420 var queue = PQ.init(testing.allocator, greaterThan);
417 var queue = PQgt.init(testing.allocator);
421418 defer queue.deinit();
422419
423420 try queue.add(1);
......@@ -435,7 +432,7 @@ test "std.PriorityQueue: add and remove same max heap" {
435432}
436433
437434test "std.PriorityQueue: iterator" {
438 var queue = PQ.init(testing.allocator, lessThan);
435 var queue = PQlt.init(testing.allocator);
439436 var map = std.AutoHashMap(u32, void).init(testing.allocator);
440437 defer {
441438 queue.deinit();
......@@ -457,7 +454,7 @@ test "std.PriorityQueue: iterator" {
457454}
458455
459456test "std.PriorityQueue: remove at index" {
460 var queue = PQ.init(testing.allocator, lessThan);
457 var queue = PQlt.init(testing.allocator);
461458 defer queue.deinit();
462459
463460 try queue.add(3);
......@@ -480,7 +477,7 @@ test "std.PriorityQueue: remove at index" {
480477}
481478
482479test "std.PriorityQueue: iterator while empty" {
483 var queue = PQ.init(testing.allocator, lessThan);
480 var queue = PQlt.init(testing.allocator);
484481 defer queue.deinit();
485482
486483 var it = queue.iterator();
......@@ -489,7 +486,7 @@ test "std.PriorityQueue: iterator while empty" {
489486}
490487
491488test "std.PriorityQueue: shrinkAndFree" {
492 var queue = PQ.init(testing.allocator, lessThan);
489 var queue = PQlt.init(testing.allocator);
493490 defer queue.deinit();
494491
495492 try queue.ensureTotalCapacity(4);
......@@ -512,7 +509,7 @@ test "std.PriorityQueue: shrinkAndFree" {
512509}
513510
514511test "std.PriorityQueue: update min heap" {
515 var queue = PQ.init(testing.allocator, lessThan);
512 var queue = PQlt.init(testing.allocator);
516513 defer queue.deinit();
517514
518515 try queue.add(55);
......@@ -527,7 +524,7 @@ test "std.PriorityQueue: update min heap" {
527524}
528525
529526test "std.PriorityQueue: update same min heap" {
530 var queue = PQ.init(testing.allocator, lessThan);
527 var queue = PQlt.init(testing.allocator);
531528 defer queue.deinit();
532529
533530 try queue.add(1);
......@@ -543,7 +540,7 @@ test "std.PriorityQueue: update same min heap" {
543540}
544541
545542test "std.PriorityQueue: update max heap" {
546 var queue = PQ.init(testing.allocator, greaterThan);
543 var queue = PQgt.init(testing.allocator);
547544 defer queue.deinit();
548545
549546 try queue.add(55);
......@@ -558,7 +555,7 @@ test "std.PriorityQueue: update max heap" {
558555}
559556
560557test "std.PriorityQueue: update same max heap" {
561 var queue = PQ.init(testing.allocator, greaterThan);
558 var queue = PQgt.init(testing.allocator);
562559 defer queue.deinit();
563560
564561 try queue.add(1);