[article] Language Design Deal Breakers

Diggory diggsey at googlemail.com
Tue May 28 21:55:27 PDT 2013


On Wednesday, 29 May 2013 at 04:15:52 UTC, Walter Bright wrote:
> On 5/28/2013 7:40 PM, Jesse Phillips wrote:
>> On Monday, 27 May 2013 at 07:53:05 UTC, Walter Bright wrote:
>>> In D, right now (and especially with the beta) you can use 
>>> the NotNull template.
>>
>> Where is this NotNull template? If it was in Phobos I would 
>> expect
>> http://dlang.org/phobos/std_typecons.html
>
> It's not in Phobos yet:
>
> struct NotNull(T) {
>     T p;
>
>     alias p this;
>
>     this(T p) {
>         assert(p != null, "pointer is null");
>         this.p = p;
>     }
>
>     @disable this();
>
>     NotNull opAssign(T p) {
>         assert(p != null, "assigning null to NotNull");
>         this.p = p;
>         return this;
>     }
> }

Doing this would help move some of that to compile time:

struct NotNull(T) {
     T ptr;

     alias ptr this;

     this(U : T)(U p) {
         assert(p !is null, "pointer is null");
         this.ptr = p;
     }
     this(U : typeof(null))(U p) {
		static assert(false, "pointer is null");
     }

     NotNull opAssign(U : T)(U p) {
         assert(p !is null, "assigning null to NotNull");
         this.ptr = p;
         return this;
     }
     NotNull opAssign(U : typeof(null))(U p) {
		static assert(false, "assigning null to NotNull");
     }
}

Although I think it would be better still if it didn't 
automatically convert from T as that removes half the benefit of 
a statically checked NotNull.

One thing you could do is overload the OR operator for "T || 
NotNull!T" as it is perfectly safe to construct a NotNull!T from 
that. Plus with shortcut evaluation there is no performance cost.

As a last resort there should be a runtime check available such 
as assertNotNull(T) which does the conversion.


More information about the Digitalmars-d mailing list