Struct Comparison
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Oct 22 07:35:39 PDT 2009
dsimcha wrote:
> Regarding recent discussions in Bugzilla: I wonder if we could somehow define
> a super-efficient struct opEquals that performs introspection and only tests
> expensive members if it's necessary. For example, here is a simple case of it:
>
> enum opEqualsMixin = q{
> bool opEquals(typeof(this) rhs) {
> foreach(tupleIndex, elem; this.tupleof) {
> static if(isIntegral!(typeof(elem))) {
> // Compare integers first. They're cheap.
> if(elem != rhs.tupleof[tupleIndex]) {
> return false;
> }
> }
>
> foreach(tupleIndex, elem; this.tupleof) {
> static if(isFloatingPoint!(typeof(elem))) {
> // Compare floats. They're also cheap.
> if(elem != rhs.tupleof[tupleIndex]) {
> return false;
> }
> }
>
> foreach(tupleIndex, elem; this.tupleof) {
> static if(!isIntegral!(typeof(elem)) &&
> !isFloatingPoint!(typeof(elem))) {
>
> // All the cheap elements were equal.
> // Resort to more expensive comparisons.
> if(elem != rhs.tupleof[tupleIndex]) {
> return false;
> }
> }
>
> return true;
> }
> }
Looks cool. I think a first shot would be to make it a standalone function.
> Of course, we could get even fancier. We could recursively introspect struct
> types and use various heuristics to calculate the optimal comparison order at
> compile time. Similar stuff could be done for a generic opCmp that gives a
> struct an arbitrary total ordering as long as all of its members have a total
> ordering.
This can be done if you associate a cost with each operation (e.g.
comparing numbers has cost 1, comparing strings has cost 10, comparing
using a user-defined function has cost 40 etc.) and then optimize for
smallest average cost.
Andrei
More information about the Digitalmars-d
mailing list