mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Revert "MultiArrayList: Fix error when struct is 0 sized"
This reverts commit 1f10cf4edf.
Re-opens #10618
I want to solve this a different way. `align(S)` where S is a 0-byte
type should work in this context.
This also caused issues such as
https://github.com/Vexu/arocc/issues/221
This commit is contained in:
parent
2e9ce6facd
commit
913d61ebb9
2 changed files with 6 additions and 86 deletions
|
|
@ -2215,35 +2215,6 @@ test "auto store_hash" {
|
|||
try testing.expect(meta.fieldInfo(HasExpensiveEqlUn.Data, .hash).field_type != void);
|
||||
}
|
||||
|
||||
test "0 sized key" {
|
||||
var map = AutoArrayHashMap(u0, i32).init(std.testing.allocator);
|
||||
defer map.deinit();
|
||||
|
||||
try testing.expectEqual(map.get(0), null);
|
||||
|
||||
try map.put(0, 5);
|
||||
try testing.expectEqual(map.get(0), 5);
|
||||
|
||||
try map.put(0, 10);
|
||||
try testing.expectEqual(map.get(0), 10);
|
||||
|
||||
try testing.expectEqual(map.swapRemove(0), true);
|
||||
try testing.expectEqual(map.get(0), null);
|
||||
}
|
||||
|
||||
test "0 sized key and 0 sized value" {
|
||||
var map = AutoArrayHashMap(u0, u0).init(std.testing.allocator);
|
||||
defer map.deinit();
|
||||
|
||||
try testing.expectEqual(map.get(0), null);
|
||||
|
||||
try map.put(0, 0);
|
||||
try testing.expectEqual(map.get(0), 0);
|
||||
|
||||
try testing.expectEqual(map.swapRemove(0), true);
|
||||
try testing.expectEqual(map.get(0), null);
|
||||
}
|
||||
|
||||
pub fn getHashPtrAddrFn(comptime K: type, comptime Context: type) (fn (Context, K) u32) {
|
||||
return struct {
|
||||
fn hash(ctx: Context, key: K) u32 {
|
||||
|
|
|
|||
|
|
@ -16,9 +16,7 @@ const testing = std.testing;
|
|||
/// `.items(.<field_name>)` to obtain a slice of field values.
|
||||
pub fn MultiArrayList(comptime S: type) type {
|
||||
return struct {
|
||||
const alignS = if (@alignOf(S) == 0) 1 else @alignOf(S);
|
||||
|
||||
bytes: [*]align(alignS) u8 = undefined,
|
||||
bytes: [*]align(@alignOf(S)) u8 = undefined,
|
||||
len: usize = 0,
|
||||
capacity: usize = 0,
|
||||
|
||||
|
|
@ -52,8 +50,8 @@ pub fn MultiArrayList(comptime S: type) type {
|
|||
return .{};
|
||||
}
|
||||
const unaligned_ptr = self.ptrs[sizes.fields[0]];
|
||||
const aligned_ptr = @alignCast(alignS, unaligned_ptr);
|
||||
const casted_ptr = @ptrCast([*]align(alignS) u8, aligned_ptr);
|
||||
const aligned_ptr = @alignCast(@alignOf(S), unaligned_ptr);
|
||||
const casted_ptr = @ptrCast([*]align(@alignOf(S)) u8, aligned_ptr);
|
||||
return .{
|
||||
.bytes = casted_ptr,
|
||||
.len = self.len,
|
||||
|
|
@ -263,7 +261,7 @@ pub fn MultiArrayList(comptime S: type) type {
|
|||
|
||||
const other_bytes = gpa.allocAdvanced(
|
||||
u8,
|
||||
alignS,
|
||||
@alignOf(S),
|
||||
capacityInBytes(new_len),
|
||||
.exact,
|
||||
) catch {
|
||||
|
|
@ -341,7 +339,7 @@ pub fn MultiArrayList(comptime S: type) type {
|
|||
assert(new_capacity >= self.len);
|
||||
const new_bytes = try gpa.allocAdvanced(
|
||||
u8,
|
||||
alignS,
|
||||
@alignOf(S),
|
||||
capacityInBytes(new_capacity),
|
||||
.exact,
|
||||
);
|
||||
|
|
@ -400,7 +398,7 @@ pub fn MultiArrayList(comptime S: type) type {
|
|||
return @reduce(.Add, capacity_vector * sizes_vector);
|
||||
}
|
||||
|
||||
fn allocatedBytes(self: Self) []align(alignS) u8 {
|
||||
fn allocatedBytes(self: Self) []align(@alignOf(S)) u8 {
|
||||
return self.bytes[0..capacityInBytes(self.capacity)];
|
||||
}
|
||||
|
||||
|
|
@ -623,52 +621,3 @@ test "insert elements" {
|
|||
try testing.expectEqualSlices(u8, &[_]u8{ 1, 2 }, list.items(.a));
|
||||
try testing.expectEqualSlices(u32, &[_]u32{ 2, 3 }, list.items(.b));
|
||||
}
|
||||
|
||||
test "0 sized struct field" {
|
||||
const ally = testing.allocator;
|
||||
|
||||
const Foo = struct {
|
||||
a: u0,
|
||||
b: f32,
|
||||
};
|
||||
|
||||
var list = MultiArrayList(Foo){};
|
||||
defer list.deinit(ally);
|
||||
|
||||
try testing.expectEqualSlices(u0, &[_]u0{}, list.items(.a));
|
||||
try testing.expectEqualSlices(f32, &[_]f32{}, list.items(.b));
|
||||
|
||||
try list.append(ally, .{ .a = 0, .b = 42.0 });
|
||||
try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
|
||||
try testing.expectEqualSlices(f32, &[_]f32{42.0}, list.items(.b));
|
||||
|
||||
try list.insert(ally, 0, .{ .a = 0, .b = -1.0 });
|
||||
try testing.expectEqualSlices(u0, &[_]u0{ 0, 0 }, list.items(.a));
|
||||
try testing.expectEqualSlices(f32, &[_]f32{ -1.0, 42.0 }, list.items(.b));
|
||||
|
||||
list.swapRemove(list.len - 1);
|
||||
try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
|
||||
try testing.expectEqualSlices(f32, &[_]f32{-1.0}, list.items(.b));
|
||||
}
|
||||
|
||||
test "0 sized struct" {
|
||||
const ally = testing.allocator;
|
||||
|
||||
const Foo = struct {
|
||||
a: u0,
|
||||
};
|
||||
|
||||
var list = MultiArrayList(Foo){};
|
||||
defer list.deinit(ally);
|
||||
|
||||
try testing.expectEqualSlices(u0, &[_]u0{}, list.items(.a));
|
||||
|
||||
try list.append(ally, .{ .a = 0 });
|
||||
try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
|
||||
|
||||
try list.insert(ally, 0, .{ .a = 0 });
|
||||
try testing.expectEqualSlices(u0, &[_]u0{ 0, 0 }, list.items(.a));
|
||||
|
||||
list.swapRemove(list.len - 1);
|
||||
try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue