aboutsummaryrefslogtreecommitdiff
path: root/lib/std/multi_array_list.zig
diff options
context:
space:
mode:
authorSimon Brown <si@sjbrown.co.uk>2025-03-30 12:59:48 +0100
committerAlex Rønne Petersen <alex@alexrp.com>2025-03-31 17:47:46 +0200
commit43ad87555e73da6c592b6a63baab7fcb0c5d3ebd (patch)
tree48a65f9c86d2d4064de7e6588df9c11c1eb38f9b /lib/std/multi_array_list.zig
parentacfdad858138de029abcb1c9bf20df0e58738eb3 (diff)
downloadzig-43ad87555e73da6c592b6a63baab7fcb0c5d3ebd.tar.gz
zig-43ad87555e73da6c592b6a63baab7fcb0c5d3ebd.zip
Add quota for comptime sort, add test
Diffstat (limited to 'lib/std/multi_array_list.zig')
-rw-r--r--lib/std/multi_array_list.zig38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/std/multi_array_list.zig b/lib/std/multi_array_list.zig
index 9debe76c3e..9cdc4b9a3d 100644
--- a/lib/std/multi_array_list.zig
+++ b/lib/std/multi_array_list.zig
@@ -170,6 +170,7 @@ pub fn MultiArrayList(comptime T: type) type {
return lhs.alignment > rhs.alignment;
}
};
+ @setEvalBranchQuota(3 * fields.len * std.math.log2(fields.len));
mem.sort(Data, &data, {}, Sort.lessThan);
var sizes_bytes: [fields.len]usize = undefined;
var field_indexes: [fields.len]usize = undefined;
@@ -978,3 +979,40 @@ test "0 sized struct" {
list.swapRemove(list.len - 1);
try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
}
+
+test "struct with many fields" {
+ const ManyFields = struct {
+ fn Type(count: comptime_int) type {
+ var fields: [count]std.builtin.Type.StructField = undefined;
+ for (0..count) |i| {
+ fields[i] = .{
+ .name = std.fmt.comptimePrint("a{}", .{i}),
+ .type = u32,
+ .default_value_ptr = null,
+ .is_comptime = false,
+ .alignment = @alignOf(u32),
+ };
+ }
+ const info: std.builtin.Type = .{ .@"struct" = .{
+ .layout = .auto,
+ .fields = &fields,
+ .decls = &.{},
+ .is_tuple = false,
+ } };
+ return @Type(info);
+ }
+
+ fn doTest(ally: std.mem.Allocator, count: comptime_int) !void {
+ var list: MultiArrayList(Type(count)) = .empty;
+ defer list.deinit(ally);
+
+ try list.resize(ally, 1);
+ list.items(.a0)[0] = 42;
+ }
+ };
+
+ try ManyFields.doTest(testing.allocator, 25);
+ try ManyFields.doTest(testing.allocator, 50);
+ try ManyFields.doTest(testing.allocator, 100);
+ try ManyFields.doTest(testing.allocator, 200);
+}