[Issue 5276] Template compilation uses much more memory than G++ 4.8

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri Jul 4 16:47:54 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=5276

--- Comment #4 from bearophile_hugs at eml.cc ---
Updated D code, a little slower (?) but also nicer:



template State(ulong Cols=0, ulong Diag135=0, ulong Diag45=0, ulong Solution=0)
{
    enum ulong cols = Cols;
    enum ulong diag135 = Diag135;
    enum ulong diag45 = Diag45;
    enum ulong solution = Solution;
}

enum Test(int k, int j, alias state) =
    ((state.cols    & (1UL << j)) +
     (state.diag135 & (1UL << (j + k))) +
     (state.diag45  & (1UL << (32 + j - k)))) == 0;

alias Mark(int k, int j, alias state) =
    State!(state.cols    ^ (1UL << j),
           state.diag135 ^ (1UL << (j + k)),
           state.diag45  ^ (1UL << (32 + j - k)),
           state.solution);

template AccumulateResult(int startValue, int times, alias state) {
    static if (times == 0)
        alias AccumulateResult = state;
    else
        alias AccumulateResult = AccumulateResult!(
            startValue + 1,
            times - 1,
            State!(state.cols,
                   state.diag135,
                   state.diag45,
                   state.solution + Test!(0, startValue, state)));
}

template ResultFromTest(bool condition, alias state, int current, int niv, int
dx) {
    static if (condition == 0)
        alias ResultFromTest = state;
    else
        alias ResultFromTest = Mark!(niv,
                                     current,
                                     Solve!(niv - 1, dx, Mark!(niv, current,
state)));
}

template ProcessQueens(int begin, int times, alias state, int niv, int dx) {
    static if (times == 0)
        alias ProcessQueens = state;
    else
        alias ProcessQueens = ProcessQueens!(
                begin + 1,
                times - 1,
                ResultFromTest!(Test!(niv, begin, state), state, begin, niv,
dx),
                niv,
                dx);
}

template Solve(int niv, int dx, alias state=State!()) {
    static if (niv == 0)
        alias Solve = AccumulateResult!(0, dx, state);
    else
        alias Solve = ProcessQueens!(0, dx, state, niv, dx);
}

enum MetaNQueens(int dx) = Solve!(dx - 1, dx).solution;

void main() {
    import core.stdc.stdio: printf;

    printf("%llu", MetaNQueens!7);
}

--


More information about the Digitalmars-d-bugs mailing list