D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 4937 - std.bitmanip: Allow repeated (identical) bitfield declarations
Summary: std.bitmanip: Allow repeated (identical) bitfield declarations
Status: RESOLVED WONTFIX
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All Windows
: P2 enhancement
Assignee: Andrei Alexandrescu
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-09-24 18:06 UTC by Austin Hastings
Modified: 2016-10-14 13:16 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Austin Hastings 2010-09-24 18:06:53 UTC
I'm trying to describe an opcode layout - the arrangement of bits used by a CPU - and the resulting description is generally a union of bitfields:

opcode, displacement
opcode, register, register, register
opcode, constant
...etc
 
In my case, the opcode represents a common prefix, which leaves me declaring something like this in D:

opcode, displacement
    "", register, register, register
    "", constant
 
I would prefer, for reasons of clarity, to be able to repeat the declaration of opcode - the best comment is source code, as it were.
 
So I would like the bitmanip code to permit redeclaration of bitfields that are identical in all respects.
 
That is, obviously the names are the same, but the field width, offset, and type representation has to be the same as well.
Comment 1 bearophile_hugs 2010-09-24 18:46:51 UTC
See also bug 4425
Comment 2 Era Scarecrow 2012-07-31 19:11:09 UTC
> Also, I think I'm going to request that repeated bitfield definitions be
> allowed if they are identical - I'd like to redeclare "opcode" rather than "".

How would you tell them apart? If i know how you may want to call them, i may be able to make something. I can understand with registers, but still need some way to work with them. Perhaps as a set then?


> So I would like the bitmanip code to permit redeclaration of bitfields that
> are identical in all respects.

>That is, obviously the names are the same, but the field width, offset, and
>type representation has to be the same as well.

Maybe....?

struct S {
    mixin(bitfields!(
        uint, "opcode", 4,
        uint, "register", 4,
        uint, "register", 4,
        uint, "register", 4
    ));
}

and using the registers would have function signature like...

struct Register {
  uint register_1;
  uint register_2;
  uint register_3;

}

//setters, likely can't be @propery
void register(uint reg1, uint reg2, uint reg3);
void register(uint[] register ...); //maybe?
void register(Register register);

//getter ??
Register register() const;

Or perhaps...

struct S {
    mixin(bitfields!(
        uint, "opcode", 4,
        uint, "reg1", 4,
        uint, "reg2", 4,
        uint, "reg3", 4
    ));
    mixin(sharedNameSet(
        "nameForGetterAndSetter",
        "struct name for returning/passing",
        "reg1", "reg2", "reg3" //named variables as a set
    ));

    //nameForGetterAndSetter's would be added here, perhaps as above.
}
Comment 3 Andrei Alexandrescu 2013-02-26 08:58:34 UTC
I think we're good as we are. OK to close?