| ... | ... | @@ -98,9 +98,9 @@ test "HeaderEntry" { |
| 98 | 98 | testing.expectEqualSlices(u8, "x", e.value); |
| 99 | 99 | } |
| 100 | 100 | |
| 101 | | const HeaderList = std.ArrayList(HeaderEntry); |
| 102 | | const HeaderIndexList = std.ArrayList(usize); |
| 103 | | const HeaderIndex = std.StringHashMap(HeaderIndexList); |
| 101 | const HeaderList = std.ArrayListUnmanaged(HeaderEntry); |
| 102 | const HeaderIndexList = std.ArrayListUnmanaged(usize); |
| 103 | const HeaderIndex = std.StringHashMapUnmanaged(HeaderIndexList); |
| 104 | 104 | |
| 105 | 105 | pub const Headers = struct { |
| 106 | 106 | // the owned header field name is stored in the index as part of the key |
| ... | ... | @@ -113,8 +113,8 @@ pub const Headers = struct { |
| 113 | 113 | pub fn init(allocator: *Allocator) Self { |
| 114 | 114 | return Self{ |
| 115 | 115 | .allocator = allocator, |
| 116 | | .data = HeaderList.init(allocator), |
| 117 | | .index = HeaderIndex.init(allocator), |
| 116 | .data = HeaderList{}, |
| 117 | .index = HeaderIndex{}, |
| 118 | 118 | }; |
| 119 | 119 | } |
| 120 | 120 | |
| ... | ... | @@ -122,16 +122,16 @@ pub const Headers = struct { |
| 122 | 122 | { |
| 123 | 123 | for (self.index.items()) |*entry| { |
| 124 | 124 | const dex = &entry.value; |
| 125 | | dex.deinit(); |
| 125 | dex.deinit(self.allocator); |
| 126 | 126 | self.allocator.free(entry.key); |
| 127 | 127 | } |
| 128 | | self.index.deinit(); |
| 128 | self.index.deinit(self.allocator); |
| 129 | 129 | } |
| 130 | 130 | { |
| 131 | | for (self.data.span()) |entry| { |
| 131 | for (self.data.items) |entry| { |
| 132 | 132 | entry.deinit(); |
| 133 | 133 | } |
| 134 | | self.data.deinit(); |
| 134 | self.data.deinit(self.allocator); |
| 135 | 135 | } |
| 136 | 136 | self.* = undefined; |
| 137 | 137 | } |
| ... | ... | @@ -139,36 +139,36 @@ pub const Headers = struct { |
| 139 | 139 | pub fn clone(self: Self, allocator: *Allocator) !Self { |
| 140 | 140 | var other = Headers.init(allocator); |
| 141 | 141 | errdefer other.deinit(); |
| 142 | | try other.data.ensureCapacity(self.data.items.len); |
| 143 | | try other.index.initCapacity(self.index.entries.len); |
| 144 | | for (self.data.span()) |entry| { |
| 142 | try other.data.ensureCapacity(allocator, self.data.items.len); |
| 143 | try other.index.initCapacity(allocator, self.index.entries.len); |
| 144 | for (self.data.items) |entry| { |
| 145 | 145 | try other.append(entry.name, entry.value, entry.never_index); |
| 146 | 146 | } |
| 147 | 147 | return other; |
| 148 | 148 | } |
| 149 | 149 | |
| 150 | 150 | pub fn toSlice(self: Self) []const HeaderEntry { |
| 151 | | return self.data.span(); |
| 151 | return self.data.items; |
| 152 | 152 | } |
| 153 | 153 | |
| 154 | 154 | pub fn append(self: *Self, name: []const u8, value: []const u8, never_index: ?bool) !void { |
| 155 | 155 | const n = self.data.items.len + 1; |
| 156 | | try self.data.ensureCapacity(n); |
| 156 | try self.data.ensureCapacity(self.allocator, n); |
| 157 | 157 | var entry: HeaderEntry = undefined; |
| 158 | 158 | if (self.index.getEntry(name)) |kv| { |
| 159 | 159 | entry = try HeaderEntry.init(self.allocator, kv.key, value, never_index); |
| 160 | 160 | errdefer entry.deinit(); |
| 161 | 161 | const dex = &kv.value; |
| 162 | | try dex.append(n - 1); |
| 162 | try dex.append(self.allocator, n - 1); |
| 163 | 163 | } else { |
| 164 | 164 | const name_dup = try self.allocator.dupe(u8, name); |
| 165 | 165 | errdefer self.allocator.free(name_dup); |
| 166 | 166 | entry = try HeaderEntry.init(self.allocator, name_dup, value, never_index); |
| 167 | 167 | errdefer entry.deinit(); |
| 168 | | var dex = HeaderIndexList.init(self.allocator); |
| 169 | | try dex.append(n - 1); |
| 170 | | errdefer dex.deinit(); |
| 171 | | _ = try self.index.put(name_dup, dex); |
| 168 | var dex = HeaderIndexList{}; |
| 169 | try dex.append(self.allocator, n - 1); |
| 170 | errdefer dex.deinit(self.allocator); |
| 171 | _ = try self.index.put(self.allocator, name_dup, dex); |
| 172 | 172 | } |
| 173 | 173 | self.data.appendAssumeCapacity(entry); |
| 174 | 174 | } |
| ... | ... | @@ -194,7 +194,7 @@ pub const Headers = struct { |
| 194 | 194 | |
| 195 | 195 | /// Returns boolean indicating if something was deleted. |
| 196 | 196 | pub fn delete(self: *Self, name: []const u8) bool { |
| 197 | | if (self.index.remove(name)) |kv| { |
| 197 | if (self.index.remove(name)) |*kv| { |
| 198 | 198 | const dex = &kv.value; |
| 199 | 199 | // iterate backwards |
| 200 | 200 | var i = dex.items.len; |
| ... | ... | @@ -205,7 +205,7 @@ pub const Headers = struct { |
| 205 | 205 | assert(mem.eql(u8, removed.name, name)); |
| 206 | 206 | removed.deinit(); |
| 207 | 207 | } |
| 208 | | dex.deinit(); |
| 208 | dex.deinit(self.allocator); |
| 209 | 209 | self.allocator.free(kv.key); |
| 210 | 210 | self.rebuildIndex(); |
| 211 | 211 | return true; |
| ... | ... | @@ -225,13 +225,13 @@ pub const Headers = struct { |
| 225 | 225 | const dex = &kv.value; |
| 226 | 226 | if (dex.items.len == 1) { |
| 227 | 227 | // was last item; delete the index |
| 228 | | dex.deinit(); |
| 228 | dex.deinit(self.allocator); |
| 229 | 229 | removed.deinit(); |
| 230 | 230 | const key = kv.key; |
| 231 | 231 | _ = self.index.remove(key); // invalidates `kv` and `dex` |
| 232 | 232 | self.allocator.free(key); |
| 233 | 233 | } else { |
| 234 | | dex.shrink(dex.items.len - 1); |
| 234 | dex.shrink(self.allocator, dex.items.len - 1); |
| 235 | 235 | removed.deinit(); |
| 236 | 236 | } |
| 237 | 237 | // if it was the last item; no need to rebuild index |
| ... | ... | @@ -250,13 +250,13 @@ pub const Headers = struct { |
| 250 | 250 | const dex = &kv.value; |
| 251 | 251 | if (dex.items.len == 1) { |
| 252 | 252 | // was last item; delete the index |
| 253 | | dex.deinit(); |
| 253 | dex.deinit(self.allocator); |
| 254 | 254 | removed.deinit(); |
| 255 | 255 | const key = kv.key; |
| 256 | 256 | _ = self.index.remove(key); // invalidates `kv` and `dex` |
| 257 | 257 | self.allocator.free(key); |
| 258 | 258 | } else { |
| 259 | | dex.shrink(dex.items.len - 1); |
| 259 | dex.shrink(self.allocator, dex.items.len - 1); |
| 260 | 260 | removed.deinit(); |
| 261 | 261 | } |
| 262 | 262 | // if it was the last item; no need to rebuild index |
| ... | ... | @@ -282,7 +282,7 @@ pub const Headers = struct { |
| 282 | 282 | |
| 283 | 283 | const buf = try allocator.alloc(HeaderEntry, dex.items.len); |
| 284 | 284 | var n: usize = 0; |
| 285 | | for (dex.span()) |idx| { |
| 285 | for (dex.items) |idx| { |
| 286 | 286 | buf[n] = self.data.items[idx]; |
| 287 | 287 | n += 1; |
| 288 | 288 | } |
| ... | ... | @@ -305,7 +305,7 @@ pub const Headers = struct { |
| 305 | 305 | // adapted from mem.join |
| 306 | 306 | const total_len = blk: { |
| 307 | 307 | var sum: usize = dex.items.len - 1; // space for separator(s) |
| 308 | | for (dex.span()) |idx| |
| 308 | for (dex.items) |idx| |
| 309 | 309 | sum += self.data.items[idx].value.len; |
| 310 | 310 | break :blk sum; |
| 311 | 311 | }; |
| ... | ... | @@ -493,8 +493,8 @@ test "Headers.getIndices" { |
| 493 | 493 | try h.append("set-cookie", "y=2", null); |
| 494 | 494 | |
| 495 | 495 | testing.expect(null == h.getIndices("not-present")); |
| 496 | | testing.expectEqualSlices(usize, &[_]usize{0}, h.getIndices("foo").?.span()); |
| 497 | | testing.expectEqualSlices(usize, &[_]usize{ 1, 2 }, h.getIndices("set-cookie").?.span()); |
| 496 | testing.expectEqualSlices(usize, &[_]usize{0}, h.getIndices("foo").?.items); |
| 497 | testing.expectEqualSlices(usize, &[_]usize{ 1, 2 }, h.getIndices("set-cookie").?.items); |
| 498 | 498 | } |
| 499 | 499 | |
| 500 | 500 | test "Headers.get" { |