object states
Henning Pohl
henning at still-hidden.de
Mon Oct 8 04:19:40 PDT 2012
On Monday, 8 October 2012 at 08:53:39 UTC, simendsjo wrote:
> You can create a wrapper struct that includes an invariant:
>
> import std.stdio;
>
> struct Image
> {
> int width;
>
> void doSomething()
> {
> }
>
> void modifiesWidth()
> {
> --width;
> }
> }
>
> void func(Image img)
> {
> struct ImgWrapper
> {
> Image* img;
> this(ref Image img)
> {
> this.img = &img;
> }
>
> invariant()
> {
> assert(img.width == 512);
> }
>
> void opDispatch(string s)()
> {
> mixin("img."~s~"();");
> }
> }
>
> auto wrapper = ImgWrapper(img);
> wrapper.doSomething();
> wrapper.modifiesWidth(); // assertion failure
> }
>
> void main()
> {
> Image img = { 512 };
> func(img);
> }
There is a difference between invariants and what I call states.
States clear things up when you actually need to do a runtime
check and when not. Invariants are always checked, because you
don't care about performance in debug mode. A Number<positive> is
positive already and will stay positive while you can access it.
De facto you cannot change a Number<positive> to a negative
number.
More information about the Digitalmars-d
mailing list