authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-07-13 00:34:58+10:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2020-07-13 00:34:58+10:00
logf7e4014c823f1134040beed700c2b0fff5384da1
tree869f7bce5a8dbc839d6d37b1a398ab807b2621d4
parent4b48266bb7dd0a9f9353c0695a2c98c497c0165c
signaturelock-open Commit is signed but in an unrecognized format.

std: use *Unmanaged data structures in http.Headers object


1 files changed, 29 insertions(+), 29 deletions(-)

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