Lexicographical object comparison by selected members of a struct

Ali Çehreli acehreli at yahoo.com
Sat Aug 21 06:03:33 UTC 2021


On 8/20/21 10:37 PM, Alexandru Ermicioi wrote:
> On Saturday, 21 August 2021 at 05:34:59 UTC, Alexandru Ermicioi wrote:
>> ...
> 
> Also there is no need for mixing string code here. You can get the field 
> using __traits(getMember, this, member).

Cool! Much better. :)

I could not do

   static foreach (member; members) {{
     // ...
   }}

So I am happy with iterating over 0 .. members.length.

// Mixes in opEquals() and opCmp() that perform lexicographical
// comparisons according to the order of 'members'.
mixin template MemberwiseComparison(members...) {
   bool opEquals(const typeof(this) that) const {

     // Comparison code per member, which would potentially return an
     // early 'false' result.
     static foreach (i; 0 .. members.length) {{
       // mixin (makeCode(__traits(identifier, members[i])));
         enum ident = __traits(identifier, members[i]);

         if (__traits(getMember, this, ident) != __traits(getMember, 
that, ident)) {
           return false;
         }
     }}

     // There was no mismatch if we got here.
     return true;
   }

   int opCmp(const typeof(this) that) const {

     // Comparison code per member, which would potentially return an
     // early before or after decision.
     static foreach (i; 0 .. members.length) {{
       enum ident = __traits(identifier, members[i]);

       if (__traits(getMember, this, ident) < __traits(getMember, that, 
ident)) {
         return -1;
       }
       if (__traits(getMember, this, ident) > __traits(getMember, that, 
ident)) {
         return 1;
       }
     }}

     // Neither 'this' nor 'that' was before if we got here.
     return 0;
   }
}

Ali



More information about the Digitalmars-d-learn mailing list