putting more smarts into a == b

Robert Jacques sandford at jhu.edu
Sat Sep 26 20:45:54 PDT 2009


On Sat, 26 Sep 2009 21:32:13 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> Consider two objects a and b with a of class type. Currently, the  
> expression a == b is blindly rewritten as a.opEquals(b). I argue it  
> should be rewritten into a call to an (imaginary/inlined) function  
> equalObjects(a, b), with the following definition:
>
> bool equalObjects(T, U)(T a, U b) if (is(T == class))
> {
>      static if (is(U == class))
>      {
>          if (b is null) return a is null;
>          if (a is null) return b is null;
>      }
>      else
>      {
>          enforce(a !is null);
>      }
>      return a.opEquals(b);
> }
>
> This hoists the identity test outside the opEquals call and also deals  
> with null references. What do you think?
>
>
> Andrei

I like this. I think optimizing away opEquals for identical objects would  
also be a good idea:

static if (is(U == class))
	if(a is b || a is null || b  is null) return a is b;
else
	enforce(a !is null);



More information about the Digitalmars-d mailing list