Inline aggregate types

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Fri Dec 2 00:33:17 PST 2016


On 2016-12-01 21:31, Ethan Watson wrote:
> https://github.com/Remedy-Entertainment/binderoo/blob/master/binderoo_client/d/src/binderoo/bitpacking.d
>
>
> So I've been not-all-that-pleased with std.bitmanip.bitfields for a
> while. It's nice that it's there, but I'm binding to C++ objects where
> the meaningful default values require those packed values to have
> initial values. It's rather painful to get that working with the Phobos
> implementation.
>
> I wanted to make a bitfield where you would simply give it a dummy
> struct type, complete with UDAs to tell it how many bits to take as well
> as standard default values. For example:
>
> struct SomeBitField
> {
>   @PackSize( 3 ) int iSomeInt = 3;
>   @PackSize( 1 ) bool bSomeBool = true;
>   @PackSize( 4 ) int iSomeOtherInt;
> }
>
> I also don't want this struct to exist outside of the mixin declaration
> for it. Essentially, I want the code to boil down to:
>
> mixin BitPack!( struct {
>   @PackSize( 3 ) int iSomeInt = 3;
>   @PackSize( 1 ) bool bSomeBool = true;
>   @PackSize( 4 ) int iSomeOtherInt;
> } );
>
> Nice. Readable. Maintainable. You don't even need to read the
> documentation to add new members to the bit field, or change default
> values.
>
> The compiler disagrees though. The second it sees that struct keyword,
> it freaks out. Sigh. Alrighty, what if we just remove the struct
> keyword? Nope. It tells me that I'm actually passing a lambda in to the
> BitPack mixin template.

Seems like a job for AST macros :). But wWhat about an anonymous class 
as ag0aep6g mentioned? This compiles and prints "iSomeInt" as expected:

template Foo(T)
{
     pragma(msg, __traits(identifier, T.tupleof[0]));
}

struct PackSize
{
     int size;
}

void main()
{
     mixin Foo!(
         typeof(
             new class {
                 @PackSize( 3 ) int iSomeInt = 3;
                 @PackSize( 1 ) bool bSomeBool = true;
                 @PackSize( 4 ) int iSomeOtherInt;
             }
         )
     );
}

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list