xxxxxxxxxx
import std.stdio, std.traits, std.meta, std.range, std.algorithm;
struct D(Ds...) {
enum int[Ds.length] dims = [Ds];
}
struct Tensor(T, D) {
}
auto permute(T, int N)(T[N] xs, T[N] ps) {
T[N] result;
foreach (i, p; ps)
result[i] = xs[p];
return result;
}
auto permute(P, T, A)(Tensor!(T, A)) {
assert([7, 3, 5] == permute(A.dims, P.dims));
return Tensor!(T, D!(aliasSeqOf!(permute(A.dims, P.dims))))();
}
unittest {
const x = Tensor!(int, D!(3, 5, 7))();
const y = permute!(D!(2, 0, 1))(x);
assert(is(Unqual!(typeof(y)) == Tensor!(int, D!(7, 3, 5))));
}