How to use a class as key type in AAs?

Koroskin Denis 2korden at gmail.com
Sun Jul 6 11:11:55 PDT 2008


On Sun, 06 Jul 2008 22:02:44 +0400, Jarrett Billingsley  
<kb3ctd2 at yahoo.com> 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;
> }
>
>

Slightly offtopic, but shouldn't we have some function (in std.intrinsic,  
perhaps) to do just that:

int compare(int a, int b) {	// + overloads for byte, ubyte, short, ushort,  
uint, long, ulong
	return a < b ? -1 : a > b ? 1 : 0;
}


More information about the Digitalmars-d-learn mailing list