On 9/5/21 12:43 PM, james.p.leblanc wrote: > I have constructed a custom array type that works, but is missing > correct functioning on some operator overloads.
With its old, new, and newest styles; and support for multi-dimensional use cases; operator overloading can be difficult to get right. Here is a one-dimensional case that works:
struct MyArray(T) { T[] elements; this(size_t length) { this.elements.length = length; } size_t opDollar() const { return elements.length; } auto opSliceOpAssign(string op)(T value, size_t beg, size_t end) { auto slice = elements[beg .. end]; mixin (format!q{ slice[] %s= value; }(op)); return slice; } // For the entire range of elements auto opSliceOpAssign(string op)(T value) { // Dispatch to the other one return this.opSliceOpAssign!op(value, 0, elements.length); } } import std.stdio; import std.format; void main() { auto m = MyArray!(int)(10); m[2 .. 5] += 42; writeln(m); m[4 .. $] -= 100; writeln(m); m[] *= 2; writeln(m); } Ali