On 1/12/22 00:59, JG wrote:

> I want to make a type which has two fields x and y but can
> also be indexed with [0] and [1] checked at compile time.

std.typecons.Tuple already does that. You can add "member functions" like foo() below by taking advantage of UFCS:

import std.typecons;

alias Point = Tuple!(double, "x", double, "y");

unittest
{
  Point p = Point(1.25,3.5);
  assert(p[0]==1.25);
  assert(p.x==1.25);
  assert(p[1]==3.5);
  assert(p.y==3.5);
  assert(!__traits(compiles,Point.init[3]));
}

void foo(ref Point p) {
  p.x += p.y;
}

unittest {
  auto p = Point(1.5, 2.75);
  p.foo();
  assert(p.x == 4.25);
  assert(p.y == 2.75);
}

void main() {
}

Also note, I changed all the floating point values to ones that can be fully representable by floating point types so that the unit tests would always succeed. (For example, 0.1 and 0.4 etc. cannot be represented fully but 0.5 and 0.25 etc. can be.)

Ali

Reply via email to