How to use a class as key type in AAs?
Koroskin Denis
2korden at gmail.com
Sun Jul 6 11:36:07 PDT 2008
On Sun, 06 Jul 2008 22:26:46 +0400, JAnderson <ask at me.com> wrote:
> Jarrett Billingsley wrote:
>> "Moritz Warning" <moritzwarning at web.de> wrote in message
>> news:g4r043$28f$1 at digitalmars.com...
>>> I've read the docs and implemented size_t getHash, int opEquals(Object
>>> o)
>>> and int opCmp(Object o); but it still doesn't work.
>>>
>>> The following code prints out: 2 2 1
>>>
>>> Btw.: I tested (new Foo(1)) == (new Foo(1)) and it gives true,
>>> (new Foo(1)) == (new Foo(2)) gives false.
>>>
>>>
>>> void main()
>>> {
>>> class Foo
>>> {
>>> uint i;
>>> this(uint i ) { this.i = i; }
>>>
>>> size_t getHash()
>>> {
>>> return this.i;
>>> }
>>>
>>> int opEquals(Object o)
>>> {
>>> auto t = cast(Foo) o;
>>> if(t is null) return false;
>>> return (this.i == t.i);
>>> }
>>>
>>> int opCmp(Object o)
>>> {
>>> return opEquals(o);
>>> }
>>> }
>> You don't have opCmp implemented correctly. opEquals returns true if
>> they are equal, while opCmp returns 0.
>> It should be
>> int opCmp(Object o)
>> {
>> auto t = cast(Foo)o;
>> if(t is null)
>> return 1;
>> return i < t.i ? -1 : i > t.i ? 1 : 0;
>> }
>
> Or just
>
> int opCmp(Object o)
> {
> auto t = cast(Foo)o;
> if(t is null)
> return 1;
>
> return i - t.i;
> }
>
> -Joel
Be careful, it is fast but gives wrong result when comparing int.min and
int.max!
I personally think that opCmp should return -1, 0 or 1 *only*. That's both
safer and allows more advanced tricks.
More information about the Digitalmars-d-learn
mailing list