| ... | ... | @@ -108,21 +108,18 @@ pub const ArenaAllocator = struct { |
| 108 | 108 | // Thus, only the first hand full of calls to reset() will actually need to iterate the linked |
| 109 | 109 | // list, all future calls are just taking the first node, and only resetting the `end_index` |
| 110 | 110 | // value. |
| 111 | | const current_capacity = if (mode != .free_all) |
| 112 | | @sizeOf(BufNode) + self.queryCapacity() // we need at least space for exactly one node + the current capacity |
| 113 | | else |
| 114 | | 0; |
| 115 | | if (mode == .free_all or current_capacity == 0) { |
| 111 | const requested_capacity = switch (mode) { |
| 112 | .retain_capacity => self.queryCapacity(), |
| 113 | .retain_with_limit => |limit| std.math.min(limit, self.queryCapacity()), |
| 114 | .free_all => 0, |
| 115 | }; |
| 116 | if (requested_capacity == 0) { |
| 116 | 117 | // just reset when we don't have anything to reallocate |
| 117 | 118 | self.deinit(); |
| 118 | 119 | self.state = State{}; |
| 119 | 120 | return true; |
| 120 | 121 | } |
| 121 | | const total_size = switch (mode) { |
| 122 | | .retain_capacity => current_capacity, |
| 123 | | .retain_with_limit => |limit| std.math.min(@sizeOf(BufNode) + limit, current_capacity), |
| 124 | | .free_all => unreachable, |
| 125 | | }; |
| 122 | const total_size = requested_capacity + @sizeOf(BufNode); |
| 126 | 123 | const align_bits = std.math.log2_int(usize, @alignOf(BufNode)); |
| 127 | 124 | // Free all nodes except for the last one |
| 128 | 125 | var it = self.state.buffer_list.first; |