Convert this C macro kroundup32 to D mixin?

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Apr 8 14:34:30 PDT 2017


On 04/08/2017 03:11 AM, biocyberman wrote:
 > On Saturday, 8 April 2017 at 10:02:01 UTC, Mike Parker wrote:
 >>
 >> I would expect if you implement it as a function the compiler will
 >> inline it. You can always use the pragma(inline, true) [1] with
 >> -inline to verify.
 >>
 >> [1] https://dlang.org/spec/pragma.html#inline
 >
 > Thanks for mentioning pragma. However, anyway to do it with mixin? It's
 > so cool so I want to do more stuffs with it :)

You can mixin declarations with a template but I don't see how it can 
help here. A string mixin would work but it's really ugly at the use site:

string roundUp(alias x)()
if (is (typeof(x) == uint)) {

     import std.string : format;
     return format(q{
         --%1$s;
         %1$s |= %1$s >>  1;
         %1$s |= %1$s >>  2;
         %1$s |= %1$s >>  4;
         %1$s |= %1$s >>  8;
         %1$s |= %1$s >> 16;
         ++%1$s;
         }, x.stringof);
}

void main() {
     uint i = 42;
     mixin (roundUp!i);    // <-- Ugly

     assert(i == 64);
}

Compare that to the following natural syntax that a function provides:

void roundUp(ref uint x) {
     // ...
}

void main() {
     uint i = 42;
     i.roundUp();    // <-- Natural
}

Ali



More information about the Digitalmars-d-learn mailing list