| ... | @@ -138,18 +138,23 @@ fn finalize(self: *Trie, allocator: Allocator) !void { | ... | @@ -138,18 +138,23 @@ fn finalize(self: *Trie, allocator: Allocator) !void { |
| 138 | defer ordered_nodes.deinit(); | 138 | defer ordered_nodes.deinit(); |
| 139 | try ordered_nodes.ensureTotalCapacityPrecise(self.nodes.items(.is_terminal).len); | 139 | try ordered_nodes.ensureTotalCapacityPrecise(self.nodes.items(.is_terminal).len); |
| 140 | | 140 | |
| 141 | var fifo = std.fifo.LinearFifo(Node.Index, .Dynamic).init(allocator); | 141 | { |
| 142 | defer fifo.deinit(); | 142 | var fifo: std.ArrayListUnmanaged(Node.Index) = .empty; |
| 143 | | 143 | defer fifo.deinit(allocator); |
| 144 | try fifo.writeItem(self.root.?); | 144 | |
| 145 | | 145 | try fifo.append(allocator, self.root.?); |
| 146 | while (fifo.readItem()) |next_index| { | 146 | |
| 147 | const edges = &self.nodes.items(.edges)[next_index]; | 147 | var i: usize = 0; |
| 148 | for (edges.items) |edge_index| { | 148 | while (i < fifo.items.len) { |
| 149 | const edge = self.edges.items[edge_index]; | 149 | const next_index = fifo.items[i]; |
| 150 | try fifo.writeItem(edge.node); | 150 | i += 1; |
| | 151 | const edges = &self.nodes.items(.edges)[next_index]; |
| | 152 | for (edges.items) |edge_index| { |
| | 153 | const edge = self.edges.items[edge_index]; |
| | 154 | try fifo.append(allocator, edge.node); |
| | 155 | } |
| | 156 | ordered_nodes.appendAssumeCapacity(next_index); |
| 151 | } | 157 | } |
| 152 | ordered_nodes.appendAssumeCapacity(next_index); | | |
| 153 | } | 158 | } |
| 154 | | 159 | |
| 155 | var more: bool = true; | 160 | var more: bool = true; |