putting more smarts into a == b

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Sep 27 06:11:38 PDT 2009


Robert Jacques wrote:
> 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);

This code has an inefficiency, it seems, because it makes a bit more 
checks than necessary (e.g. checks a is b twice). Let's simplify:

bool equalObjects(T, U)(T a, U b) if (is(T == class))
{
      static if (is(U == class))
      {
          if (a is b) return true;
          if (b is null || a is null) return false;
      }
      else
      {
          enforce(a !is null);
      }
      return a.opEquals(b);
}


Andrei



More information about the Digitalmars-d mailing list