On Sunday, 25 March 2018 at 21:26:57 UTC, aliak wrote:
Hi, I have this optional type I'm working on and I've run in to a little snag when it comes to wrapping an immutable. Basically what I want is for an Optional!(immutable T) to still be settable to "some" value or "no" value because the Optional wrapper itself is mutable.

Optional!(immutable int) a = some(3);
a = none;

I used to do this via a dynamic array and opAssign would recreate the array

struct Optional(T) {
  T[] bag;
  opAssign(T t) {
    bag = [t]
  }
}

But then there were problems with inout, namely:

Error: variable `Optional!(inout(A)).Optional.bag` only parameters or stack based variables can be inout

So I changed it to a stack variable (prefer this anyway, it's not only because of the inout error) but now I'm unsure if I'm violating the type system. Basically I'm now storing T as Unqual!T, but what I'm looking for is a Rebindable implementation that's for value types as well. Is this possible?

Now I do this:

struct Optional(T) {
  Unqual!T value;
  opAssign(T t) {
    value = cast(Unqual!T)(t);
  }
}

I put up a PR if anyone wants to see the code. Any pointers, tips would be highly appreciated:

https://github.com/aliak00/optional/pull/13/files#diff-cb543fea6a0b5eeb07b6aac9f068e262

Cheers
- Ali

Have a look at Rebindable: https://dlang.org/phobos/std_typecons.html#rebindable

Reply via email to