On Thursday, 4 July 2024 at 12:20:52 UTC, Dom DiSc wrote:
> On Wednesday, 3 July 2024 at 19:02:59 UTC, Dave P. wrote:
> Wouldn’t a more D-like syntax be to have the number of bits following the type instead of following the variable name? This would be more consistent with how D arrays are different than C arrays.
struct Foo {
uint:4 x;
uint:5 y;
}
I like this. As for arrays it's much more readable than the C syntax.
What I dislike about this is that uint:4 and ushort:4 would be different types, but that makes no sense. The only way this would make sense to me is if uint were fixed and not an arbitrary type, but a more natural approach to D would be using a __traits trait or adding new keywords e.g. __bits and __ubits with them producing __bits(4).
To pack those in structs, we could be cheeky and extend the align concept with fractions. Alignment is in bytes, but two __bits(4) can be aligned so that they overlap, and align(0.5) could do that. Of course, the argument to align must be a multiple of 0.125 and be a power of 2. Or we just allow align(0.125) as a special exception to specify that __bits(n) fields of a struct are packed.
struct Foo {
__bits(3) x;
__bits(5) y;
}
There, x and y have different addresses and Foo.sizeof is 2.
struct Foo {
align(0.125) __bits(3) x;
align(0.125) __bits(5) y;
}
Here, x and y are stored in the same byte and Foo.sizeof is 1.