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