On 10/1/20 10:34 PM, James Blachly wrote:
Suppose I have a data structure encoding sequence lengths:

seq1: 0 1 2 ... N
seq2: 0 1 2 3 4 ... M
seq3: 0 1 ... P

I would like to write opIndex and opDollar to support the notation obj[seq, x .. $] to retrieve sequences.

However, given that opDollar is templated on dimension (always 1 in this example) and has no information calling function's context/dimension 0 parameter, this seems impossible.

Am I missing an easy solution?

This seems like an oversight. But it's not impossible.

Just curry the information to the receiver. opDollar doesn't have to return a size_t.

Something like:

struct FromEnd
{
  ptrdiff_t offset;
  FromEnd opBinary(string s, T)(T val)
  {
      mixin("return FromEnd(offset " ~ s ~ " val);");
  }
}

struct MyStructure
{
   FromEnd opDollar(size_t col)() if(col == 1) { return FromEnd.init; }
}

And then inside your opIndex, you have to handle that type specially according to context.

The saving grace here is that opDollar doesn't exist except in an indexing operation, so you don't need to worry about it except in that context. opDollar is really kind of a hacky way to do this. It was added back when multi-dimensional indexing was not yet solid.

-Steve

Reply via email to