On Thu, 03 Apr 2014 06:42:32 -0400, monarch_dodra <monarchdo...@gmail.com> wrote:

On Thursday, 3 April 2014 at 10:15:46 UTC, Jonathan M Davis wrote:
_Any_ type which overloads both opEquals and opCmp and does not make them
match exactly is just plain broken.

I disagree:

If a.opEquals(b) is true, then a.opCmp(b) must be 0.
If a.opCmp(b) is non-zero, then a.opEquals(b) must be false.

Yes.

If a.opEquals(b) is false, then a.opCmp(b) must be non-zero.
If a.opCmp(b) is 0, then a.opEquals(b) must be true.

I disagree.

You could have types with full comparison, but only *partial ordering*, depending on the "norm" you used to define their weight.

Then you shouldn't use opCmp.

A correctly implemented AA would use opCmp to store objects in each bucket in cases of hash collisions, but still use opEqual in case of equivalence.

This can lead to false positives if opCmp(x, y) == 0 is assumed to mean equal.

An example: if you used RBTree to store 2d points, and defined opCmp like you did, then you wouldn't be able to store both (1, 0) and (0, 1) in the same RBTree without duplicates.

-Steve

Reply via email to