From 31ba05d6e93c4d5f7c0bc88f98f4323169a77c16 Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Sat, 27 Apr 2024 21:09:20 -0600 Subject: [PATCH] feat: pre-allocate enough space for accept items --- src/request.zig | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/request.zig b/src/request.zig index c4b9338..a209531 100644 --- a/src/request.zig +++ b/src/request.zig @@ -605,10 +605,12 @@ const AcceptHeaderList = std.ArrayList(AcceptItem); /// Parses `Accept:` http header into `list`, ordered from highest q factor to lowest pub fn parseAcceptHeaders(self: *const Self, allocator: std.mem.Allocator) !AcceptHeaderList { - var list = AcceptHeaderList.init(allocator); - errdefer list.deinit(); + const accept_str = self.getHeaderCommon(.accept) orelse return error.NoAcceptHeader; - const accept_str = self.getHeaderCommon(.accept) orelse return error.NoAccept; + const comma_count = std.mem.count(u8, accept_str, ","); + + var list = try AcceptHeaderList.initCapacity(allocator, comma_count + 1); + errdefer list.deinit(); var tok_iter = std.mem.tokenize(u8, accept_str, ", "); while (tok_iter.next()) |tok| { @@ -637,11 +639,11 @@ pub fn parseAcceptHeaders(self: *const Self, allocator: std.mem.Allocator) !Acce }; for (list.items, 1..) |item, i| { if (AcceptItem.lessThan({}, new_item, item)) { - try list.insert(i, new_item); + list.insertAssumeCapacity(i, new_item); break; } } else { - try list.append(new_item); + list.appendAssumeCapacity(new_item); } } return list;