tigerbeetle-node 0.11.13 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/bin/aarch64-linux-gnu/client.node +0 -0
  2. package/dist/bin/aarch64-linux-musl/client.node +0 -0
  3. package/dist/bin/aarch64-macos/client.node +0 -0
  4. package/dist/bin/x86_64-linux-gnu/client.node +0 -0
  5. package/dist/bin/x86_64-linux-musl/client.node +0 -0
  6. package/dist/bin/x86_64-macos/client.node +0 -0
  7. package/dist/index.js +33 -1
  8. package/dist/index.js.map +1 -1
  9. package/package-lock.json +66 -0
  10. package/package.json +6 -16
  11. package/src/index.ts +56 -1
  12. package/src/node.zig +9 -9
  13. package/dist/.client.node.sha256 +0 -1
  14. package/scripts/build_lib.sh +0 -61
  15. package/scripts/download_node_headers.sh +0 -32
  16. package/src/tigerbeetle/scripts/benchmark.bat +0 -55
  17. package/src/tigerbeetle/scripts/benchmark.sh +0 -66
  18. package/src/tigerbeetle/scripts/confirm_image.sh +0 -44
  19. package/src/tigerbeetle/scripts/fail_on_diff.sh +0 -9
  20. package/src/tigerbeetle/scripts/fuzz_loop.sh +0 -15
  21. package/src/tigerbeetle/scripts/fuzz_loop_hash_log.sh +0 -12
  22. package/src/tigerbeetle/scripts/fuzz_unique_errors.sh +0 -7
  23. package/src/tigerbeetle/scripts/install.bat +0 -7
  24. package/src/tigerbeetle/scripts/install.sh +0 -21
  25. package/src/tigerbeetle/scripts/install_zig.bat +0 -113
  26. package/src/tigerbeetle/scripts/install_zig.sh +0 -90
  27. package/src/tigerbeetle/scripts/lint.zig +0 -199
  28. package/src/tigerbeetle/scripts/pre-commit.sh +0 -9
  29. package/src/tigerbeetle/scripts/scripts/benchmark.bat +0 -55
  30. package/src/tigerbeetle/scripts/scripts/benchmark.sh +0 -66
  31. package/src/tigerbeetle/scripts/scripts/confirm_image.sh +0 -44
  32. package/src/tigerbeetle/scripts/scripts/fail_on_diff.sh +0 -9
  33. package/src/tigerbeetle/scripts/scripts/fuzz_loop.sh +0 -15
  34. package/src/tigerbeetle/scripts/scripts/fuzz_loop_hash_log.sh +0 -12
  35. package/src/tigerbeetle/scripts/scripts/fuzz_unique_errors.sh +0 -7
  36. package/src/tigerbeetle/scripts/scripts/install.bat +0 -7
  37. package/src/tigerbeetle/scripts/scripts/install.sh +0 -21
  38. package/src/tigerbeetle/scripts/scripts/install_zig.bat +0 -113
  39. package/src/tigerbeetle/scripts/scripts/install_zig.sh +0 -90
  40. package/src/tigerbeetle/scripts/scripts/lint.zig +0 -199
  41. package/src/tigerbeetle/scripts/scripts/pre-commit.sh +0 -9
  42. package/src/tigerbeetle/scripts/scripts/shellcheck.sh +0 -5
  43. package/src/tigerbeetle/scripts/scripts/tests_on_alpine.sh +0 -10
  44. package/src/tigerbeetle/scripts/scripts/tests_on_ubuntu.sh +0 -14
  45. package/src/tigerbeetle/scripts/scripts/upgrade_ubuntu_kernel.sh +0 -48
  46. package/src/tigerbeetle/scripts/scripts/validate_docs.sh +0 -23
  47. package/src/tigerbeetle/scripts/scripts/vr_state_enumerate +0 -46
  48. package/src/tigerbeetle/scripts/shellcheck.sh +0 -5
  49. package/src/tigerbeetle/scripts/tests_on_alpine.sh +0 -10
  50. package/src/tigerbeetle/scripts/tests_on_ubuntu.sh +0 -14
  51. package/src/tigerbeetle/scripts/upgrade_ubuntu_kernel.sh +0 -48
  52. package/src/tigerbeetle/scripts/validate_docs.sh +0 -23
  53. package/src/tigerbeetle/scripts/vr_state_enumerate +0 -46
  54. package/src/tigerbeetle/src/benchmark.zig +0 -336
  55. package/src/tigerbeetle/src/config.zig +0 -233
  56. package/src/tigerbeetle/src/constants.zig +0 -428
  57. package/src/tigerbeetle/src/ewah.zig +0 -286
  58. package/src/tigerbeetle/src/ewah_benchmark.zig +0 -120
  59. package/src/tigerbeetle/src/ewah_fuzz.zig +0 -130
  60. package/src/tigerbeetle/src/fifo.zig +0 -120
  61. package/src/tigerbeetle/src/io/benchmark.zig +0 -213
  62. package/src/tigerbeetle/src/io/darwin.zig +0 -814
  63. package/src/tigerbeetle/src/io/linux.zig +0 -1071
  64. package/src/tigerbeetle/src/io/test.zig +0 -643
  65. package/src/tigerbeetle/src/io/windows.zig +0 -1183
  66. package/src/tigerbeetle/src/io.zig +0 -34
  67. package/src/tigerbeetle/src/iops.zig +0 -107
  68. package/src/tigerbeetle/src/lsm/README.md +0 -308
  69. package/src/tigerbeetle/src/lsm/binary_search.zig +0 -341
  70. package/src/tigerbeetle/src/lsm/bloom_filter.zig +0 -125
  71. package/src/tigerbeetle/src/lsm/compaction.zig +0 -603
  72. package/src/tigerbeetle/src/lsm/composite_key.zig +0 -77
  73. package/src/tigerbeetle/src/lsm/direction.zig +0 -11
  74. package/src/tigerbeetle/src/lsm/eytzinger.zig +0 -587
  75. package/src/tigerbeetle/src/lsm/eytzinger_benchmark.zig +0 -330
  76. package/src/tigerbeetle/src/lsm/forest.zig +0 -205
  77. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +0 -450
  78. package/src/tigerbeetle/src/lsm/grid.zig +0 -573
  79. package/src/tigerbeetle/src/lsm/groove.zig +0 -1036
  80. package/src/tigerbeetle/src/lsm/k_way_merge.zig +0 -474
  81. package/src/tigerbeetle/src/lsm/level_iterator.zig +0 -332
  82. package/src/tigerbeetle/src/lsm/manifest.zig +0 -617
  83. package/src/tigerbeetle/src/lsm/manifest_level.zig +0 -878
  84. package/src/tigerbeetle/src/lsm/manifest_log.zig +0 -789
  85. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +0 -691
  86. package/src/tigerbeetle/src/lsm/merge_iterator.zig +0 -106
  87. package/src/tigerbeetle/src/lsm/node_pool.zig +0 -235
  88. package/src/tigerbeetle/src/lsm/posted_groove.zig +0 -381
  89. package/src/tigerbeetle/src/lsm/segmented_array.zig +0 -1329
  90. package/src/tigerbeetle/src/lsm/segmented_array_benchmark.zig +0 -148
  91. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +0 -9
  92. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +0 -850
  93. package/src/tigerbeetle/src/lsm/table.zig +0 -1009
  94. package/src/tigerbeetle/src/lsm/table_immutable.zig +0 -192
  95. package/src/tigerbeetle/src/lsm/table_iterator.zig +0 -340
  96. package/src/tigerbeetle/src/lsm/table_mutable.zig +0 -203
  97. package/src/tigerbeetle/src/lsm/test.zig +0 -439
  98. package/src/tigerbeetle/src/lsm/tree.zig +0 -1169
  99. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +0 -479
  100. package/src/tigerbeetle/src/message_bus.zig +0 -1013
  101. package/src/tigerbeetle/src/message_pool.zig +0 -156
  102. package/src/tigerbeetle/src/ring_buffer.zig +0 -399
  103. package/src/tigerbeetle/src/simulator.zig +0 -580
  104. package/src/tigerbeetle/src/state_machine/auditor.zig +0 -578
  105. package/src/tigerbeetle/src/state_machine/workload.zig +0 -883
  106. package/src/tigerbeetle/src/state_machine.zig +0 -2099
  107. package/src/tigerbeetle/src/static_allocator.zig +0 -65
  108. package/src/tigerbeetle/src/stdx.zig +0 -171
  109. package/src/tigerbeetle/src/storage.zig +0 -393
  110. package/src/tigerbeetle/src/testing/cluster/message_bus.zig +0 -82
  111. package/src/tigerbeetle/src/testing/cluster/network.zig +0 -237
  112. package/src/tigerbeetle/src/testing/cluster/state_checker.zig +0 -169
  113. package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +0 -202
  114. package/src/tigerbeetle/src/testing/cluster.zig +0 -444
  115. package/src/tigerbeetle/src/testing/fuzz.zig +0 -140
  116. package/src/tigerbeetle/src/testing/hash_log.zig +0 -66
  117. package/src/tigerbeetle/src/testing/id.zig +0 -99
  118. package/src/tigerbeetle/src/testing/packet_simulator.zig +0 -374
  119. package/src/tigerbeetle/src/testing/priority_queue.zig +0 -645
  120. package/src/tigerbeetle/src/testing/reply_sequence.zig +0 -139
  121. package/src/tigerbeetle/src/testing/state_machine.zig +0 -250
  122. package/src/tigerbeetle/src/testing/storage.zig +0 -757
  123. package/src/tigerbeetle/src/testing/table.zig +0 -247
  124. package/src/tigerbeetle/src/testing/time.zig +0 -84
  125. package/src/tigerbeetle/src/tigerbeetle.zig +0 -227
  126. package/src/tigerbeetle/src/time.zig +0 -112
  127. package/src/tigerbeetle/src/tracer.zig +0 -529
  128. package/src/tigerbeetle/src/unit_tests.zig +0 -40
  129. package/src/tigerbeetle/src/vopr.zig +0 -495
  130. package/src/tigerbeetle/src/vsr/README.md +0 -209
  131. package/src/tigerbeetle/src/vsr/client.zig +0 -544
  132. package/src/tigerbeetle/src/vsr/clock.zig +0 -855
  133. package/src/tigerbeetle/src/vsr/journal.zig +0 -2415
  134. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +0 -111
  135. package/src/tigerbeetle/src/vsr/marzullo.zig +0 -309
  136. package/src/tigerbeetle/src/vsr/replica.zig +0 -6616
  137. package/src/tigerbeetle/src/vsr/replica_format.zig +0 -219
  138. package/src/tigerbeetle/src/vsr/superblock.zig +0 -1631
  139. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +0 -256
  140. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +0 -929
  141. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +0 -334
  142. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +0 -390
  143. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +0 -615
  144. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +0 -394
  145. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +0 -314
  146. package/src/tigerbeetle/src/vsr.zig +0 -1425
@@ -1,645 +0,0 @@
1
- // Backport PriorityQueue fixes from 0.10 to 0.9.
2
- // https://github.com/ziglang/zig/blob/d925d19cfcabd96fdc4459e11ecb85a4f42ec655/lib/std/priority_queue.zig
3
- //
4
- // In particular, the ReplySequence hits this bug:
5
- // https://github.com/ziglang/zig/commit/7deae071014237e995ec3017825f7534305ec0c4
6
- //
7
- // Also https://github.com/ziglang/zig/commit/d925d19cfcabd96fdc4459e11ecb85a4f42ec655
8
- // is convinient, to avoid calling `remove()` then `add()`.
9
-
10
- const std = @import("std");
11
- const Allocator = std.mem.Allocator;
12
- const assert = std.debug.assert;
13
- const Order = std.math.Order;
14
- const testing = std.testing;
15
- const expect = testing.expect;
16
- const expectEqual = testing.expectEqual;
17
- const expectError = testing.expectError;
18
-
19
- /// Priority queue for storing generic data. Initialize with `init`.
20
- /// Provide `compareFn` that returns `Order.lt` when its second
21
- /// argument should get popped before its third argument,
22
- /// `Order.eq` if the arguments are of equal priority, or `Order.gt`
23
- /// if the third argument should be popped first.
24
- /// For example, to make `pop` return the smallest number, provide
25
- /// `fn lessThan(context: void, a: T, b: T) Order { _ = context; return std.math.order(a, b); }`
26
- pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareFn: fn (context: Context, a: T, b: T) Order) type {
27
- return struct {
28
- const Self = @This();
29
-
30
- items: []T,
31
- len: usize,
32
- allocator: Allocator,
33
- context: Context,
34
-
35
- /// Initialize and return a priority queue.
36
- pub fn init(allocator: Allocator, context: Context) Self {
37
- return Self{
38
- .items = &[_]T{},
39
- .len = 0,
40
- .allocator = allocator,
41
- .context = context,
42
- };
43
- }
44
-
45
- /// Free memory used by the queue.
46
- pub fn deinit(self: Self) void {
47
- self.allocator.free(self.items);
48
- }
49
-
50
- /// Insert a new element, maintaining priority.
51
- pub fn add(self: *Self, elem: T) !void {
52
- try self.ensureUnusedCapacity(1);
53
- addUnchecked(self, elem);
54
- }
55
-
56
- fn addUnchecked(self: *Self, elem: T) void {
57
- self.items[self.len] = elem;
58
- siftUp(self, self.len);
59
- self.len += 1;
60
- }
61
-
62
- fn siftUp(self: *Self, start_index: usize) void {
63
- var child_index = start_index;
64
- while (child_index > 0) {
65
- var parent_index = ((child_index - 1) >> 1);
66
- const child = self.items[child_index];
67
- const parent = self.items[parent_index];
68
-
69
- if (compareFn(self.context, child, parent) != .lt) break;
70
-
71
- self.items[parent_index] = child;
72
- self.items[child_index] = parent;
73
- child_index = parent_index;
74
- }
75
- }
76
-
77
- /// Add each element in `items` to the queue.
78
- pub fn addSlice(self: *Self, items: []const T) !void {
79
- try self.ensureUnusedCapacity(items.len);
80
- for (items) |e| {
81
- self.addUnchecked(e);
82
- }
83
- }
84
-
85
- /// Look at the highest priority element in the queue. Returns
86
- /// `null` if empty.
87
- pub fn peek(self: *Self) ?T {
88
- return if (self.len > 0) self.items[0] else null;
89
- }
90
-
91
- /// Pop the highest priority element from the queue. Returns
92
- /// `null` if empty.
93
- pub fn removeOrNull(self: *Self) ?T {
94
- return if (self.len > 0) self.remove() else null;
95
- }
96
-
97
- /// Remove and return the highest priority element from the
98
- /// queue.
99
- pub fn remove(self: *Self) T {
100
- return self.removeIndex(0);
101
- }
102
-
103
- /// Remove and return element at index. Indices are in the
104
- /// same order as iterator, which is not necessarily priority
105
- /// order.
106
- pub fn removeIndex(self: *Self, index: usize) T {
107
- assert(self.len > index);
108
- const last = self.items[self.len - 1];
109
- const item = self.items[index];
110
- self.items[index] = last;
111
- self.len -= 1;
112
-
113
- if (index == 0) {
114
- siftDown(self, index);
115
- } else {
116
- const parent_index = ((index - 1) >> 1);
117
- const parent = self.items[parent_index];
118
- if (compareFn(self.context, last, parent) == .gt) {
119
- siftDown(self, index);
120
- } else {
121
- siftUp(self, index);
122
- }
123
- }
124
-
125
- return item;
126
- }
127
-
128
- /// Return the number of elements remaining in the priority
129
- /// queue.
130
- pub fn count(self: Self) usize {
131
- return self.len;
132
- }
133
-
134
- /// Return the number of elements that can be added to the
135
- /// queue before more memory is allocated.
136
- pub fn capacity(self: Self) usize {
137
- return self.items.len;
138
- }
139
-
140
- fn siftDown(self: *Self, start_index: usize) void {
141
- var index = start_index;
142
- const half = self.len >> 1;
143
- while (true) {
144
- var left_index = (index << 1) + 1;
145
- var right_index = left_index + 1;
146
- var left = if (left_index < self.len) self.items[left_index] else null;
147
- var right = if (right_index < self.len) self.items[right_index] else null;
148
-
149
- var smallest_index = index;
150
- var smallest = self.items[index];
151
-
152
- if (left) |e| {
153
- if (compareFn(self.context, e, smallest) == .lt) {
154
- smallest_index = left_index;
155
- smallest = e;
156
- }
157
- }
158
-
159
- if (right) |e| {
160
- if (compareFn(self.context, e, smallest) == .lt) {
161
- smallest_index = right_index;
162
- smallest = e;
163
- }
164
- }
165
-
166
- if (smallest_index == index) return;
167
-
168
- self.items[smallest_index] = self.items[index];
169
- self.items[index] = smallest;
170
- index = smallest_index;
171
-
172
- if (index >= half) return;
173
- }
174
- }
175
-
176
- /// PriorityQueue takes ownership of the passed in slice. The slice must have been
177
- /// allocated with `allocator`.
178
- /// Deinitialize with `deinit`.
179
- pub fn fromOwnedSlice(allocator: Allocator, items: []T, context: Context) Self {
180
- var queue = Self{
181
- .items = items,
182
- .len = items.len,
183
- .allocator = allocator,
184
- .context = context,
185
- };
186
-
187
- if (queue.len <= 1) return queue;
188
-
189
- const half = (queue.len >> 1) - 1;
190
- var i: usize = 0;
191
- while (i <= half) : (i += 1) {
192
- queue.siftDown(half - i);
193
- }
194
- return queue;
195
- }
196
-
197
- pub const ensureCapacity = @compileError("deprecated; use ensureUnusedCapacity or ensureTotalCapacity");
198
-
199
- /// Ensure that the queue can fit at least `new_capacity` items.
200
- pub fn ensureTotalCapacity(self: *Self, new_capacity: usize) !void {
201
- var better_capacity = self.capacity();
202
- if (better_capacity >= new_capacity) return;
203
- while (true) {
204
- better_capacity += better_capacity / 2 + 8;
205
- if (better_capacity >= new_capacity) break;
206
- }
207
- self.items = try self.allocator.realloc(self.items, better_capacity);
208
- }
209
-
210
- /// Ensure that the queue can fit at least `additional_count` **more** item.
211
- pub fn ensureUnusedCapacity(self: *Self, additional_count: usize) !void {
212
- return self.ensureTotalCapacity(self.len + additional_count);
213
- }
214
-
215
- /// Reduce allocated capacity to `new_len`.
216
- pub fn shrinkAndFree(self: *Self, new_len: usize) void {
217
- assert(new_len <= self.items.len);
218
-
219
- // Cannot shrink to smaller than the current queue size without invalidating the heap property
220
- assert(new_len >= self.len);
221
-
222
- self.items = self.allocator.realloc(self.items[0..], new_len) catch |e| switch (e) {
223
- error.OutOfMemory => { // no problem, capacity is still correct then.
224
- self.items.len = new_len;
225
- return;
226
- },
227
- };
228
- }
229
-
230
- pub fn update(self: *Self, elem: T, new_elem: T) !void {
231
- const update_index = blk: {
232
- for (self.items) |item, idx| {
233
- if (compareFn(self.context, item, elem).compare(.eq)) break :blk idx;
234
- }
235
- return error.ElementNotFound;
236
- };
237
- const old_elem: T = self.items[update_index];
238
- self.items[update_index] = new_elem;
239
- switch (compareFn(self.context, new_elem, old_elem)) {
240
- .lt => siftUp(self, update_index),
241
- .gt => siftDown(self, update_index),
242
- .eq => {}, // Nothing to do as the items have equal priority
243
- }
244
- }
245
-
246
- pub const Iterator = struct {
247
- queue: *PriorityQueue(T, Context, compareFn),
248
- count: usize,
249
-
250
- pub fn next(it: *Iterator) ?T {
251
- if (it.count >= it.queue.len) return null;
252
- const out = it.count;
253
- it.count += 1;
254
- return it.queue.items[out];
255
- }
256
-
257
- pub fn reset(it: *Iterator) void {
258
- it.count = 0;
259
- }
260
- };
261
-
262
- /// Return an iterator that walks the queue without consuming
263
- /// it. Invalidated if the heap is modified.
264
- pub fn iterator(self: *Self) Iterator {
265
- return Iterator{
266
- .queue = self,
267
- .count = 0,
268
- };
269
- }
270
-
271
- fn dump(self: *Self) void {
272
- const print = std.debug.print;
273
- print("{{ ", .{});
274
- print("items: ", .{});
275
- for (self.items) |e, i| {
276
- if (i >= self.len) break;
277
- print("{}, ", .{e});
278
- }
279
- print("array: ", .{});
280
- for (self.items) |e| {
281
- print("{}, ", .{e});
282
- }
283
- print("len: {} ", .{self.len});
284
- print("capacity: {}", .{self.capacity()});
285
- print(" }}\n", .{});
286
- }
287
- };
288
- }
289
-
290
- fn lessThan(context: void, a: u32, b: u32) Order {
291
- _ = context;
292
- return std.math.order(a, b);
293
- }
294
-
295
- fn greaterThan(context: void, a: u32, b: u32) Order {
296
- return lessThan(context, a, b).invert();
297
- }
298
-
299
- const PQlt = PriorityQueue(u32, void, lessThan);
300
- const PQgt = PriorityQueue(u32, void, greaterThan);
301
-
302
- test "std.PriorityQueue: add and remove min heap" {
303
- var queue = PQlt.init(testing.allocator, {});
304
- defer queue.deinit();
305
-
306
- try queue.add(54);
307
- try queue.add(12);
308
- try queue.add(7);
309
- try queue.add(23);
310
- try queue.add(25);
311
- try queue.add(13);
312
- try expectEqual(@as(u32, 7), queue.remove());
313
- try expectEqual(@as(u32, 12), queue.remove());
314
- try expectEqual(@as(u32, 13), queue.remove());
315
- try expectEqual(@as(u32, 23), queue.remove());
316
- try expectEqual(@as(u32, 25), queue.remove());
317
- try expectEqual(@as(u32, 54), queue.remove());
318
- }
319
-
320
- test "std.PriorityQueue: add and remove same min heap" {
321
- var queue = PQlt.init(testing.allocator, {});
322
- defer queue.deinit();
323
-
324
- try queue.add(1);
325
- try queue.add(1);
326
- try queue.add(2);
327
- try queue.add(2);
328
- try queue.add(1);
329
- try queue.add(1);
330
- try expectEqual(@as(u32, 1), queue.remove());
331
- try expectEqual(@as(u32, 1), queue.remove());
332
- try expectEqual(@as(u32, 1), queue.remove());
333
- try expectEqual(@as(u32, 1), queue.remove());
334
- try expectEqual(@as(u32, 2), queue.remove());
335
- try expectEqual(@as(u32, 2), queue.remove());
336
- }
337
-
338
- test "std.PriorityQueue: removeOrNull on empty" {
339
- var queue = PQlt.init(testing.allocator, {});
340
- defer queue.deinit();
341
-
342
- try expect(queue.removeOrNull() == null);
343
- }
344
-
345
- test "std.PriorityQueue: edge case 3 elements" {
346
- var queue = PQlt.init(testing.allocator, {});
347
- defer queue.deinit();
348
-
349
- try queue.add(9);
350
- try queue.add(3);
351
- try queue.add(2);
352
- try expectEqual(@as(u32, 2), queue.remove());
353
- try expectEqual(@as(u32, 3), queue.remove());
354
- try expectEqual(@as(u32, 9), queue.remove());
355
- }
356
-
357
- test "std.PriorityQueue: peek" {
358
- var queue = PQlt.init(testing.allocator, {});
359
- defer queue.deinit();
360
-
361
- try expect(queue.peek() == null);
362
- try queue.add(9);
363
- try queue.add(3);
364
- try queue.add(2);
365
- try expectEqual(@as(u32, 2), queue.peek().?);
366
- try expectEqual(@as(u32, 2), queue.peek().?);
367
- }
368
-
369
- test "std.PriorityQueue: sift up with odd indices" {
370
- var queue = PQlt.init(testing.allocator, {});
371
- defer queue.deinit();
372
- const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
373
- for (items) |e| {
374
- try queue.add(e);
375
- }
376
-
377
- const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 };
378
- for (sorted_items) |e| {
379
- try expectEqual(e, queue.remove());
380
- }
381
- }
382
-
383
- test "std.PriorityQueue: addSlice" {
384
- var queue = PQlt.init(testing.allocator, {});
385
- defer queue.deinit();
386
- const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
387
- try queue.addSlice(items[0..]);
388
-
389
- const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 };
390
- for (sorted_items) |e| {
391
- try expectEqual(e, queue.remove());
392
- }
393
- }
394
-
395
- test "std.PriorityQueue: fromOwnedSlice trivial case 0" {
396
- const items = [0]u32{};
397
- const queue_items = try testing.allocator.dupe(u32, &items);
398
- var queue = PQlt.fromOwnedSlice(testing.allocator, queue_items[0..], {});
399
- defer queue.deinit();
400
- try expectEqual(@as(usize, 0), queue.len);
401
- try expect(queue.removeOrNull() == null);
402
- }
403
-
404
- test "std.PriorityQueue: fromOwnedSlice trivial case 1" {
405
- const items = [1]u32{1};
406
- const queue_items = try testing.allocator.dupe(u32, &items);
407
- var queue = PQlt.fromOwnedSlice(testing.allocator, queue_items[0..], {});
408
- defer queue.deinit();
409
-
410
- try expectEqual(@as(usize, 1), queue.len);
411
- try expectEqual(items[0], queue.remove());
412
- try expect(queue.removeOrNull() == null);
413
- }
414
-
415
- test "std.PriorityQueue: fromOwnedSlice" {
416
- const items = [_]u32{ 15, 7, 21, 14, 13, 22, 12, 6, 7, 25, 5, 24, 11, 16, 15, 24, 2, 1 };
417
- const heap_items = try testing.allocator.dupe(u32, items[0..]);
418
- var queue = PQlt.fromOwnedSlice(testing.allocator, heap_items[0..], {});
419
- defer queue.deinit();
420
-
421
- const sorted_items = [_]u32{ 1, 2, 5, 6, 7, 7, 11, 12, 13, 14, 15, 15, 16, 21, 22, 24, 24, 25 };
422
- for (sorted_items) |e| {
423
- try expectEqual(e, queue.remove());
424
- }
425
- }
426
-
427
- test "std.PriorityQueue: add and remove max heap" {
428
- var queue = PQgt.init(testing.allocator, {});
429
- defer queue.deinit();
430
-
431
- try queue.add(54);
432
- try queue.add(12);
433
- try queue.add(7);
434
- try queue.add(23);
435
- try queue.add(25);
436
- try queue.add(13);
437
- try expectEqual(@as(u32, 54), queue.remove());
438
- try expectEqual(@as(u32, 25), queue.remove());
439
- try expectEqual(@as(u32, 23), queue.remove());
440
- try expectEqual(@as(u32, 13), queue.remove());
441
- try expectEqual(@as(u32, 12), queue.remove());
442
- try expectEqual(@as(u32, 7), queue.remove());
443
- }
444
-
445
- test "std.PriorityQueue: add and remove same max heap" {
446
- var queue = PQgt.init(testing.allocator, {});
447
- defer queue.deinit();
448
-
449
- try queue.add(1);
450
- try queue.add(1);
451
- try queue.add(2);
452
- try queue.add(2);
453
- try queue.add(1);
454
- try queue.add(1);
455
- try expectEqual(@as(u32, 2), queue.remove());
456
- try expectEqual(@as(u32, 2), queue.remove());
457
- try expectEqual(@as(u32, 1), queue.remove());
458
- try expectEqual(@as(u32, 1), queue.remove());
459
- try expectEqual(@as(u32, 1), queue.remove());
460
- try expectEqual(@as(u32, 1), queue.remove());
461
- }
462
-
463
- test "std.PriorityQueue: iterator" {
464
- var queue = PQlt.init(testing.allocator, {});
465
- var map = std.AutoHashMap(u32, void).init(testing.allocator);
466
- defer {
467
- queue.deinit();
468
- map.deinit();
469
- }
470
-
471
- const items = [_]u32{ 54, 12, 7, 23, 25, 13 };
472
- for (items) |e| {
473
- _ = try queue.add(e);
474
- try map.put(e, {});
475
- }
476
-
477
- var it = queue.iterator();
478
- while (it.next()) |e| {
479
- _ = map.remove(e);
480
- }
481
-
482
- try expectEqual(@as(usize, 0), map.count());
483
- }
484
-
485
- test "std.PriorityQueue: remove at index" {
486
- var queue = PQlt.init(testing.allocator, {});
487
- defer queue.deinit();
488
-
489
- const items = [_]u32{ 2, 1, 8, 9, 3, 4, 5 };
490
- for (items) |e| {
491
- _ = try queue.add(e);
492
- }
493
-
494
- var it = queue.iterator();
495
- var idx: usize = 0;
496
- const two_idx = while (it.next()) |elem| {
497
- if (elem == 2)
498
- break idx;
499
- idx += 1;
500
- } else unreachable;
501
- var sorted_items = [_]u32{ 1, 3, 4, 5, 8, 9 };
502
- try expectEqual(queue.removeIndex(two_idx), 2);
503
-
504
- var i: usize = 0;
505
- while (queue.removeOrNull()) |n| : (i += 1) {
506
- try expectEqual(n, sorted_items[i]);
507
- }
508
- try expectEqual(queue.removeOrNull(), null);
509
- }
510
-
511
- test "std.PriorityQueue: iterator while empty" {
512
- var queue = PQlt.init(testing.allocator, {});
513
- defer queue.deinit();
514
-
515
- var it = queue.iterator();
516
-
517
- try expectEqual(it.next(), null);
518
- }
519
-
520
- test "std.PriorityQueue: shrinkAndFree" {
521
- var queue = PQlt.init(testing.allocator, {});
522
- defer queue.deinit();
523
-
524
- try queue.ensureTotalCapacity(4);
525
- try expect(queue.capacity() >= 4);
526
-
527
- try queue.add(1);
528
- try queue.add(2);
529
- try queue.add(3);
530
- try expect(queue.capacity() >= 4);
531
- try expectEqual(@as(usize, 3), queue.len);
532
-
533
- queue.shrinkAndFree(3);
534
- try expectEqual(@as(usize, 3), queue.capacity());
535
- try expectEqual(@as(usize, 3), queue.len);
536
-
537
- try expectEqual(@as(u32, 1), queue.remove());
538
- try expectEqual(@as(u32, 2), queue.remove());
539
- try expectEqual(@as(u32, 3), queue.remove());
540
- try expect(queue.removeOrNull() == null);
541
- }
542
-
543
- test "std.PriorityQueue: update min heap" {
544
- var queue = PQlt.init(testing.allocator, {});
545
- defer queue.deinit();
546
-
547
- try queue.add(55);
548
- try queue.add(44);
549
- try queue.add(11);
550
- try queue.update(55, 5);
551
- try queue.update(44, 4);
552
- try queue.update(11, 1);
553
- try expectEqual(@as(u32, 1), queue.remove());
554
- try expectEqual(@as(u32, 4), queue.remove());
555
- try expectEqual(@as(u32, 5), queue.remove());
556
- }
557
-
558
- test "std.PriorityQueue: update same min heap" {
559
- var queue = PQlt.init(testing.allocator, {});
560
- defer queue.deinit();
561
-
562
- try queue.add(1);
563
- try queue.add(1);
564
- try queue.add(2);
565
- try queue.add(2);
566
- try queue.update(1, 5);
567
- try queue.update(2, 4);
568
- try expectEqual(@as(u32, 1), queue.remove());
569
- try expectEqual(@as(u32, 2), queue.remove());
570
- try expectEqual(@as(u32, 4), queue.remove());
571
- try expectEqual(@as(u32, 5), queue.remove());
572
- }
573
-
574
- test "std.PriorityQueue: update max heap" {
575
- var queue = PQgt.init(testing.allocator, {});
576
- defer queue.deinit();
577
-
578
- try queue.add(55);
579
- try queue.add(44);
580
- try queue.add(11);
581
- try queue.update(55, 5);
582
- try queue.update(44, 1);
583
- try queue.update(11, 4);
584
- try expectEqual(@as(u32, 5), queue.remove());
585
- try expectEqual(@as(u32, 4), queue.remove());
586
- try expectEqual(@as(u32, 1), queue.remove());
587
- }
588
-
589
- test "std.PriorityQueue: update same max heap" {
590
- var queue = PQgt.init(testing.allocator, {});
591
- defer queue.deinit();
592
-
593
- try queue.add(1);
594
- try queue.add(1);
595
- try queue.add(2);
596
- try queue.add(2);
597
- try queue.update(1, 5);
598
- try queue.update(2, 4);
599
- try expectEqual(@as(u32, 5), queue.remove());
600
- try expectEqual(@as(u32, 4), queue.remove());
601
- try expectEqual(@as(u32, 2), queue.remove());
602
- try expectEqual(@as(u32, 1), queue.remove());
603
- }
604
-
605
- test "std.PriorityQueue: siftUp in remove" {
606
- var queue = PQlt.init(testing.allocator, {});
607
- defer queue.deinit();
608
-
609
- try queue.addSlice(&.{ 0, 1, 100, 2, 3, 101, 102, 4, 5, 6, 7, 103, 104, 105, 106, 8 });
610
-
611
- _ = queue.removeIndex(std.mem.indexOfScalar(u32, queue.items[0..queue.len], 102).?);
612
-
613
- const sorted_items = [_]u32{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 100, 101, 103, 104, 105, 106 };
614
- for (sorted_items) |e| {
615
- try expectEqual(e, queue.remove());
616
- }
617
- }
618
-
619
- fn contextLessThan(context: []const u32, a: usize, b: usize) Order {
620
- return std.math.order(context[a], context[b]);
621
- }
622
-
623
- const CPQlt = PriorityQueue(usize, []const u32, contextLessThan);
624
-
625
- test "std.PriorityQueue: add and remove min heap with contextful comparator" {
626
- const context = [_]u32{ 5, 3, 4, 2, 2, 8, 0 };
627
-
628
- var queue = CPQlt.init(testing.allocator, context[0..]);
629
- defer queue.deinit();
630
-
631
- try queue.add(0);
632
- try queue.add(1);
633
- try queue.add(2);
634
- try queue.add(3);
635
- try queue.add(4);
636
- try queue.add(5);
637
- try queue.add(6);
638
- try expectEqual(@as(usize, 6), queue.remove());
639
- try expectEqual(@as(usize, 4), queue.remove());
640
- try expectEqual(@as(usize, 3), queue.remove());
641
- try expectEqual(@as(usize, 1), queue.remove());
642
- try expectEqual(@as(usize, 2), queue.remove());
643
- try expectEqual(@as(usize, 0), queue.remove());
644
- try expectEqual(@as(usize, 5), queue.remove());
645
- }