On Friday, 14 February 2014 at 16:00:09 UTC, Robin wrote:
this(size_t rows, size_t cols) {
this.dim = Dimension(rows, cols);
this.data = new T[this.dim.size];
enum nil = to!T(0);
foreach(ref T element; this.data) element = nil;
}
Your foreach here is unnecessary. You can zero out an array using
the syntax:
this.data[] = 0; // probably compiles out as memset()
And while I would expect to!T(0) to compile down to something
with no particular logic, it still is a function call not a
macro, so you're better to let the compiler figure out the best
conversion from 0 for type T than to use a library function for
it.
I think and hope that this is getting optimized via inlining. =)
This works similar for opIndexAssign.
From complaints that I have seen, very little gets inlined at the
moment.
Matrix opMul(ref const(Matrix) other) {
if (this.dim.rows != other.dim.cols || this.dim.cols !=
ther.dim.rows) {
// TODO - still have to learn exception handling first ...
}
auto m = new Matrix(this.dim.rows, other.dim.cols);
auto s = new Matrix(other).transposeAssign();
Since you don't return s, it's probably better to not allocate an
instance. I would also be curious to see your constructor which
copies one matrix into a new one.
Besides that I can't find a way how to make a use of move
semantics like in C++. For example a rvalue-move-constructor or
a move-assign would be a very nice thing for many tasks.
Do you mean something like this?
this.data[] = other.data[]; // probably compiles out as memcpy()
this.data = other.data.dup; // different syntax, but should be
the same
Another nice thing to know would be if it is possible to
initialize an array before it is default initialized with
T.init where T is the type of the array's fields.
I believe so, but I would have to scour about to find the syntax.
Hopefully, someone else knows.