diff options
| author | Simon Brown <si@sjbrown.co.uk> | 2025-03-30 12:59:48 +0100 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2025-03-31 17:47:46 +0200 |
| commit | 43ad87555e73da6c592b6a63baab7fcb0c5d3ebd (patch) | |
| tree | 48a65f9c86d2d4064de7e6588df9c11c1eb38f9b /lib/std/multi_array_list.zig | |
| parent | acfdad858138de029abcb1c9bf20df0e58738eb3 (diff) | |
| download | zig-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.zig | 38 |
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); +} |
