[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