Zig utility library
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Document Queue functions

IamPyu d4fecfdf 8864024e

+12 -1
+12 -1
src/Queue.zig
··· 5 5 return struct { 6 6 const Self = @This(); 7 7 8 + /// Queue node 8 9 pub const Node = struct { 9 10 value: T, 10 11 next: ?*Node = null, ··· 18 19 first: ?*Node = null, 19 20 last: ?*Node = null, 20 21 22 + /// Initialize the `Queue` 21 23 pub fn init() !Self { 22 24 return Self{ 23 25 .first = null, ··· 25 27 }; 26 28 } 27 29 30 + /// Insert `new_node` after `node` 28 31 pub fn insertAfter(self: *Self, node: *Node, new_node: *Node) void { 29 32 new_node.prev = node; 30 33 if (node.next == null) { ··· 37 40 node.next = new_node; 38 41 } 39 42 43 + /// Insert `new_node` before `node` 40 44 pub fn insertBefore(self: *Self, node: *Node, new_node: *Node) void { 41 45 new_node.next = node; 42 46 if (node.next == null) { ··· 49 53 node.prev = new_node; 50 54 } 51 55 56 + /// Insert `node` at the beginning of the queue 52 57 pub fn insertBeginning(self: *Self, node: *Node) void { 53 58 if (self.first == null) { 54 59 self.first = node; ··· 60 65 } 61 66 } 62 67 68 + /// Enqueue `node` 63 69 pub fn enqueue(self: *Self, node: *Node) void { 64 70 if (self.last == null) 65 71 self.insertBeginning(node) ··· 67 73 self.insertAfter(self.last.?, node); 68 74 } 69 75 76 + /// Dequeue the first queued node 70 77 pub fn dequeue(self: *Self) ?*Node { 71 78 if (self.first) |first| { 72 79 self.first = first.next; ··· 87 94 queue: IQueue, 88 95 nodes: NodeList, 89 96 97 + /// Initialize the `ArrayQueue` 90 98 pub fn init(allocator: Allocator) !Self { 91 99 return .{ 92 100 .allocator = allocator, ··· 95 103 }; 96 104 } 97 105 106 + /// Deinitialize the queue 98 107 pub fn deinit(self: *Self) void { 99 108 self.nodes.deinit(self.allocator); 100 109 } 101 110 111 + /// Enqueue a value 102 112 pub fn enqueue(self: *Self, value: T) !void { 103 113 try self.nodes.append(self.allocator, IQueue.Node.init(value)); 104 114 const node = &self.nodes.items[self.nodes.items.len - 1]; 105 115 self.queue.enqueue(node); 106 116 } 107 117 118 + /// Dequeue the first queued node 108 119 pub fn dequeue(self: *Self) ?*IQueue.Node { 109 120 return self.queue.dequeue(); 110 121 } ··· 116 127 defer queue.deinit(); 117 128 try queue.enqueue(1); 118 129 try queue.enqueue(2); 130 + _ = queue.dequeue(); 119 131 try queue.enqueue(3); 120 132 121 - try std.testing.expectEqual(1, queue.dequeue().?.value); 122 133 try std.testing.expectEqual(2, queue.dequeue().?.value); 123 134 try std.testing.expectEqual(3, queue.dequeue().?.value); 124 135 }