Cheaper compile-time tests
bearophile
bearophileHUGS at lycos.com
Mon Apr 16 05:20:24 PDT 2012
> you end instantiating many times the same template, inflating
> the binary with little purpose (because you are not very
> interested in the optimizations performed on the
> compile-time-known values).
I know you want a simple example:
import std.stdio, std.string, std.conv, std.numeric,
std.array, std.algorithm, std.traits;
template TMMul(M1, M2) { // helper
alias Unqual!(typeof(M1[0][0]))[M2[0].length][M1.length]
TMMul;
}
void matrixMul(T, T2, size_t k, size_t m, size_t n)
(const ref T[m][k] A, const ref T[n][m] B,
/*out*/ ref T2[n][k] result) pure nothrow
if (is(T2 == Unqual!T)) {
T2[m] aux;
foreach (j; 0 .. n) {
foreach (k, row; B)
aux[k] = row[j];
foreach (i, ai; A)
result[i][j] = dotProduct(ai, aux);
}
}
void main() {
immutable int[2][3] a = [[1, 2], [3, 4], [3, 6]];
immutable int[3][2] b = [[-3, -8, 3,], [-2, 1, 4]];
enum form = "[%([%(%d, %)],\n %)]]";
writefln("A = \n" ~ form ~ "\n", a);
writefln("B = \n" ~ form ~ "\n", b);
TMMul!(typeof(a), typeof(b)) result = void;
matrixMul(a, b, result);
writefln("A * B = \n" ~ form, result);
}
Here a new matrixMul is instantiated for each size of the input
matrices, but this avoids that:
void matrixMul(T, T2, @generic size_t k, @generic size_t m,
@generic size_t n)
(const ref T[m][k] A, const ref T[n][m] B,
/*out*/ ref T2[n][k] result) pure nothrow
Bye,
bearophile
More information about the Digitalmars-d
mailing list