Consider the following code to keep track of rectangle positions on the screen; eg: (1,2)(3,2) ie: (left,top)(right,bottom), providing get/set properties for one-based positions but only get properties for zero-based positions:

```d
public struct gudtPosition {

final public void reset() { pintLeft1 = pintTop1 = pintRight1 = pintBottom1 = 0; }

   private ushort pintLeft1 = 0;
   private ushort pintTop1 = 0;
   private ushort pintRight1 = 0;
   private ushort pintBottom1 = 0;

   final public const ushort left1() { return this.pintLeft1; }
   final public const ushort top1() { return this.pintTop1; }
   final public const ushort right1() { return this.pintRight1; }
final public const ushort bottom1() { return this.pintBottom1; }

final public ushort left0() { return this.pintLeft1 = 0 ? 0 : cast(ushort)(this.pintLeft1 - 1); } final public ushort top0() { return this.pintTop1 = 0 ? 0 : cast(ushort)(this.pintTop1 - 1); } final public ushort right0() { return this.pintRight1 = 0 ? 0 : cast(ushort)(this.pintRight1 - 1); } final public ushort bottom0() { return this.pintBottom1 = 0 ? 0 : cast(ushort)(this.pintBottom1 - 1); }

final public void left1(const ushort lintPosition) { this.pintLeft1 = lintPosition; } final public void top1(const ushort lintPosition) { this.pintTop1 = lintPosition; } final public void right1(const ushort lintPosition) { this.pintRight1 = lintPosition; } final public void bottom1(const ushort lintPosition) { this.pintBottom1 = lintPosition; }

final public string caption0() { return /// eg: from (24,24) to (48,48)
      r"from ("c ~
      std.format.format(r"%d"c, this.left0) ~
      r","c ~
      std.format.format(r"%d"c, this.top0) ~
      r") to ("c ~
      std.format.format(r"%d"c, this.right0) ~
      r","c ~
      std.format.format(r"%d"c, this.bottom0) ~
      r")"c;
   }

final public string caption1() { return /// eg: from (24,24) to (48,48)
      r"from ("c ~
      std.format.format(r"%d"c, this.pintLeft1) ~
      r","c ~
      std.format.format(r"%d"c, this.pintTop1) ~
      r") to ("c ~
      std.format.format(r"%d"c, this.pintRight1) ~
      r","c ~
      std.format.format(r"%d"c, this.pintBottom1) ~
      r")"c;
   }

}
```

The code should be, I guess, self-explanatory to read. I do have some things to learn here on the D-specifics:

- is there a way to unambiguously specify short integers values like there is for long ones (eg: 1L means 1 long integer like: long pintSomething = 1L;) ?

- that follows to what seems to be unnecessary castings in my code snippet; if I write: ushort a = 1; ushort b = 2; ushort c; why can't I write c = a + b; ? ... DMD refuses the last one unless I explicitly write: c = cast(ushort) a + b; ... if all the variables I defined are of the same type ... why should I do have to cast() them afterwards ?

Reply via email to