On 03/25/2016 12:00 AM, data pulverizer wrote:
> On Thursday, 24 March 2016 at 18:46:14 UTC, Ali Çehreli wrote:
>> On 03/24/2016 10:24 AM, data pulverizer wrote:
>> > I have been playing with the matrix example given at the end
>> of chapter
>> > 78 of Ali Çehreli's
>>
>> For reference, it's "Multi-dimensional operator overloading example"
>> here:
>>
>>   http://ddili.org/ders/d.en/templates_more.html
>>
>> >having problems with overloading the opAssign operator.

> Thank you. Let me try to ask the question again. The problem I am
> experiencing is to do with opIndexAssign().
>
> I added the following public operators:
>
>      Matrix opAssign(int[][] arr)
>      {
>          writeln(__FUNCTION__);
>          this.rows = arr;
>          return this;
>      }

The problem is due to the aliasing of 'rows' members of Matrix objects. subMatrix is supposed to be a reference into some elements of an existing Matrix. As soon as we do the above assignment, this Matrix (which may be a subMatrix in a specific context) breaks lose from its actual Matrix elements.

We need to implement the function above "in place":

    Matrix opAssign(int[][] arr)
    {
        writeln(__FUNCTION__);

        if (rows.length < arr.length) {
            rows.length = arr.length;
        }

        foreach (i, row; arr) {
            const newLength = row.length;

            if (rows[i].length < newLength) {
                rows[i].length = newLength;
            }
            rows[i][0..newLength] = row[];
        }

        return this;
    }

(There must be an existing function that does that.)

>      Matrix opAssign(Matrix mat)
>      {
>          writeln(__FUNCTION__);
>          this.rows = mat.rows;

Same thing applies above: We need to assign to this.rows in place (which is easier by taking advantage of the previous function):

        this = mat.rows;

>          return this;
>      }

No changes needed for the other two functions but I would 'return this' instead of 'return subMatrix' for them as well.

Ali

Reply via email to