Operator overloading - operations on slices

abad via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 21 03:30:32 PST 2016


On Thursday, 21 January 2016 at 11:15:22 UTC, abad wrote:
> I am trying to create a generic interface to arrays. Most 
> operations except those on elements of slices.
>
> Code:
>
> class Table(T) {
>         T[] data;
>
>         this(T[] data) {
>                 this.data = data;
>         }
>
>         auto ref opSlice(size_t x, size_t y) {
>                 return new Table!(T)(data[x .. y]);
>         }
>
>         void opIndexAssign(T value) {
>                 data[] = value;
>         }
>
>         void opIndexAssign(T value, size_t idx) {
>                 data[idx] = value;
>         }
>
>         void opAssign(T value) {
>                 opIndexAssign(value);
>         }
>
>         auto ref opIndexOpAssign(string op)(T value, size_t 
> idx) {
>                 return mixin("data[idx] " ~ op ~ "= value");
>         }
> }
>
> int main(string[] args) {
>         int[] data = new int[256];
>         auto t = new Table!int(data);
>         t[] = -1; // OK
>         t[1 .. 3] = 5; // OK
>         t[0] = 6; // OK
>         t[4] += 7; // OK
>         t[4..6] += 7; // FAIL, does not compile
> }
>
> Am I missing some specific overload or is this just not 
> possible?

I got it to work by adding this:

auto ref opSliceOpAssign(string op, this X, V, B, E)(auto ref V 
v, auto ref B b, auto ref E e) { return mixin("data[b..e] "~op~"= 
v"); }

What could perhaps be improved are compiler error messages. DMD 
output:

Error: t.opSlice(4LU, 6LU) is not an lvalue

This does not really tell clearly what is going on.


More information about the Digitalmars-d-learn mailing list