| ... | @@ -170,6 +170,7 @@ pub fn MultiArrayList(comptime T: type) type { | ... | @@ -170,6 +170,7 @@ pub fn MultiArrayList(comptime T: type) type { |
| 170 | return lhs.alignment > rhs.alignment; | 170 | return lhs.alignment > rhs.alignment; |
| 171 | } | 171 | } |
| 172 | }; | 172 | }; |
| | 173 | @setEvalBranchQuota(3 * fields.len * std.math.log2(fields.len)); |
| 173 | mem.sort(Data, &data, {}, Sort.lessThan); | 174 | mem.sort(Data, &data, {}, Sort.lessThan); |
| 174 | var sizes_bytes: [fields.len]usize = undefined; | 175 | var sizes_bytes: [fields.len]usize = undefined; |
| 175 | var field_indexes: [fields.len]usize = undefined; | 176 | var field_indexes: [fields.len]usize = undefined; |
| ... | @@ -978,3 +979,40 @@ test "0 sized struct" { | ... | @@ -978,3 +979,40 @@ test "0 sized struct" { |
| 978 | list.swapRemove(list.len - 1); | 979 | list.swapRemove(list.len - 1); |
| 979 | try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a)); | 980 | try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a)); |
| 980 | } | 981 | } |
| | 982 | |
| | 983 | test "struct with many fields" { |
| | 984 | const ManyFields = struct { |
| | 985 | fn Type(count: comptime_int) type { |
| | 986 | var fields: [count]std.builtin.Type.StructField = undefined; |
| | 987 | for (0..count) |i| { |
| | 988 | fields[i] = .{ |
| | 989 | .name = std.fmt.comptimePrint("a{}", .{i}), |
| | 990 | .type = u32, |
| | 991 | .default_value_ptr = null, |
| | 992 | .is_comptime = false, |
| | 993 | .alignment = @alignOf(u32), |
| | 994 | }; |
| | 995 | } |
| | 996 | const info: std.builtin.Type = .{ .@"struct" = .{ |
| | 997 | .layout = .auto, |
| | 998 | .fields = &fields, |
| | 999 | .decls = &.{}, |
| | 1000 | .is_tuple = false, |
| | 1001 | } }; |
| | 1002 | return @Type(info); |
| | 1003 | } |
| | 1004 | |
| | 1005 | fn doTest(ally: std.mem.Allocator, count: comptime_int) !void { |
| | 1006 | var list: MultiArrayList(Type(count)) = .empty; |
| | 1007 | defer list.deinit(ally); |
| | 1008 | |
| | 1009 | try list.resize(ally, 1); |
| | 1010 | list.items(.a0)[0] = 42; |
| | 1011 | } |
| | 1012 | }; |
| | 1013 | |
| | 1014 | try ManyFields.doTest(testing.allocator, 25); |
| | 1015 | try ManyFields.doTest(testing.allocator, 50); |
| | 1016 | try ManyFields.doTest(testing.allocator, 100); |
| | 1017 | try ManyFields.doTest(testing.allocator, 200); |
| | 1018 | } |