How to translate this C macro to D mixin/template mixin?

Dennis dkorpel at gmail.com
Tue Jun 15 12:39:40 UTC 2021


On Tuesday, 15 June 2021 at 12:18:26 UTC, VitaliiY wrote:
> It's simple with STARTDATA as mixin, but STOREBITS and ADDBITS 
> use variables defined in STARTDATA scope, so I can't understand 
> how to do mixin template with it.

If the code duplication isn't too bad, consider just expanding 
the C macros and translating that. I've noticed that some C 
programmers like to use complex macros just to save 10 lines.

Otherwise, to make STOREBITS and ADDBITS access variables from 
STARTDATA, you can define them as inner functions.

```D
void f() {
     size_t ressize=0;
     char* blockstart;
     int numbits;
     ulong bitbuffer=0;

     size_t size;

     void storeBits() {
         while(numbits >= 8) {
             if(!size) return 0;
             *(buffer++) = bitbuffer>>(numbits-8);
             numbits -= 8;
             ++ressize;
             --size;
         }
     }
}
```

For the most literal translation, you can use a string mixin. You 
can't use a template mixin here since those can't insert code, 
only declarations.

```D
enum string ADDBITS(string a, string b) = `
{
     bitbuffer = (bitbuffer<<(`~a~`))|((`~b~`)&((1<<`~a~`)-1));
     numbits += (`~a~`);
     mixin(STOREBITS);
}`;

// on use: ADDBITS(varA, varB) becomes
mixin(ADDBITS!("varA", "varB"));
```




More information about the Digitalmars-d-learn mailing list