mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
std: Make met.alignment work on more types
Make it return the correct value for function types and optional pointers.
This commit is contained in:
parent
50a8124f45
commit
19cec0db1e
@ -117,10 +117,21 @@ test "std.meta.bitCount" {
|
||||
testing.expect(bitCount(f32) == 32);
|
||||
}
|
||||
|
||||
/// Returns the alignment of type T.
|
||||
/// Note that if T is a pointer or function type the result is different than
|
||||
/// the one returned by @alignOf(T).
|
||||
/// If T is a pointer type the alignment of the type it points to is returned.
|
||||
/// If T is a function type the alignment a target-dependent value is returned.
|
||||
pub fn alignment(comptime T: type) comptime_int {
|
||||
//@alignOf works on non-pointer types
|
||||
const P = if (comptime trait.is(.Pointer)(T)) T else *T;
|
||||
return @typeInfo(P).Pointer.alignment;
|
||||
return switch (@typeInfo(T)) {
|
||||
.Optional => |info| switch (@typeInfo(info.child)) {
|
||||
.Pointer, .Fn => alignment(info.child),
|
||||
else => @alignOf(T),
|
||||
},
|
||||
.Pointer => |info| info.alignment,
|
||||
.Fn => |info| info.alignment,
|
||||
else => @alignOf(T),
|
||||
};
|
||||
}
|
||||
|
||||
test "std.meta.alignment" {
|
||||
@ -129,6 +140,8 @@ test "std.meta.alignment" {
|
||||
testing.expect(alignment(*align(2) u8) == 2);
|
||||
testing.expect(alignment([]align(1) u8) == 1);
|
||||
testing.expect(alignment([]align(2) u8) == 2);
|
||||
testing.expect(alignment(fn () void) > 0);
|
||||
testing.expect(alignment(fn () align(128) void) == 128);
|
||||
}
|
||||
|
||||
pub fn Child(comptime T: type) type {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user