On Saturday, 8 April 2017 at 21:34:30 UTC, Ali Çehreli wrote:
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

You made the point, it looks really ugly :). However, sometimes if this ugliness offer better performance, I would - in a desperate mood - use it. That's only 'if'. I put two other variant to a test, and this ugly version does worst as well. You can check out here: https://gist.github.com/biocyberman/0ad27721780e66546cbb6a39c0770d99

Maybe it is because string formating cost. Moving the import statement out of the function does not speed things up.

Reply via email to