xxxxxxxxxx
import std.stdio;
import std.range;
struct Matrix(T)
{
private T[][] elements;
size_t length;
T* ptr;
this(size_t length)
{
this.length = length * length;
size_t m = T.sizeof * this.length;
ubyte[] arr = new ubyte[](m);
ptr = cast(T*)arr.ptr;
m /= length;
foreach(i; 0 .. length)
{
size_t n = i * m;
elements ~= cast(T[])arr[n .. n + m];
}
}
ref T opIndex(size_t i)
in(i < length)
=> ptr[i];
auto opDollar() => length;
auto opSliceAssign(T value, size_t a, size_t b)
in(a <= length && b <= length)
=> ptr[a..b] = value;
auto opIndex() => elements;
auto opIndexAssign(T value)
{
foreach(i; 0 .. length)
{
ptr[i] = value;
}
}
}
void main()
{
auto arr = Matrix!double(3);
size_t n;
foreach(value; iota(0.1, 1, 0.1))
arr[n++] = value;
arr[].writefln!"%-(%-(%s %)\n%)\n";
arr[0..$/2] = 0; // reset a slice
arr[].writefln!"%-(%-(%s %)\n%)\n";
arr[] = 0; // reset all
arr[].writefln!"%-(%-(%s %)\n%)\n";
arr[6..9] = 1; // set a slice
arr[].writefln!"%-(%-(%s %)\n%)\n";
}