Optional type - how to correctly reset a wrapped immutable T

aliak something at something.com
Thu Mar 29 09:56:07 UTC 2018


On Tuesday, 27 March 2018 at 15:37:11 UTC, SimonN wrote:
> On Tuesday, 27 March 2018 at 15:28:40 UTC, jmh530 wrote:
>>         static if (isMutable!T)
>>             bag[0] = rhs;
>>         else
>>             bag = [rhs];
>
> I like this idea. I'd even take it a step futher:
>
> When T is a pointer or class reference, then we can put the 
> reference on the stack (instead of into the array) and handle 
> assignments like Rebindable handles assignments -- provided 
> that Rebindable really is 100 % safe to the outside, see my 
> concerns from 2 posts above. In this case (static if), we won't 
> even declare the array T[] bag, and instead implement as T 
> value, bool isPresent.
>
> When T is a mutable value type, it goes on the stack, too. 
> Again no array.
>
> When T is a const/immutable/inout value type, we declare the 
> array as before and rebind on assignment with bag = [rhs], as 
> you proposed here.
>
> -- Simon

I think this all sounds good. I found the "magic" as well in 
Seb's Rebindable PR link for value types so might be able to have 
stack storage for const value types as well [1]. Not sure how 
safe it is.

Inout poses a problem in all cases though and I'm unsure how to 
solve it without stripping the qualifiers completely from the 
payload. Basically:

struct S(T) {
     T t;
}

auto make(T)(T t) {
     return S!(T)(t);
}

class C {
     int i;
     auto f() inout {
         make(i);
     }
}

Will not compile.

I can make T an Unqual!T, but then we are open to type breakage 
in cases where users should have access to member t.


[1] 
https://github.com/dlang/phobos/pull/6136/files#diff-4e008aedb3026d4a84f58323e53bf017R2223


More information about the Digitalmars-d-learn mailing list