On 01/04/2014 03:46 PM, Adam D. Ruppe wrote:
On Saturday, 4 January 2014 at 12:37:34 UTC, ilya-stromberg wrote:
Have you got any plans to impove this situation?
I wrote a NotNull struct for phobos that could catch that situation. I
don't think it got pulled though.
http://arsdnet.net/dcode/notnull.d
With @disable is becomes reasonably possible to restrict built in types
with wrapper structs. It isn't perfect but it isn't awful either.
...
This mechanism would be more useful if moving was specified to occur
whenever provably possible using live variable analysis.
Currently it is impossible to implement even a type analogous to rusts
~T type, a unique reference (without a non-dereferenceable state.)
The big thing people have asked for before is
Object foo;
if(auto obj = checkNull(foo)) {
obj == NotNull!Object
} else {
// foo is null
}
and i haven't figured that out yet...
I think it is impossible to do, because the boolean value tested must be
computable from the result of checkNull, which must be a variable of
type NotNull!Object, which does not have a state for null.
The following is possible:
auto checkNull(alias notnull, alias isnull,T)(T arg) /+if(...)+/{
return arg !is null ? notnull(assumeNotNull(arg)) : isnull();
}
Object foo;
foo.checkNull!(
obj => ... /* is(typeof(obj)==NotNull!Object) */,
() => ... /* foo is null */,
)