recursive equal, and firstDifference functions
Dan
dbdavidson at yahoo.com
Tue Mar 19 14:43:10 PDT 2013
On Tuesday, 19 March 2013 at 21:11:12 UTC, Jonathan M Davis wrote:
> Lots of stuff uses ==, toHash, etc. That's the way the language
> is designed.
Agreed
> Defining your types without defining those properly just isn't
> going to work for
> a _lot_ of stuff. Creating an external function to compare
> objects or generate
> hashes or anything like that is just going to cause problems,
> because only
> your stuff would use it.
Ok - you are making strong statement and I don't see why it is
the case.
Here is an example that does work for hashing.
Note: R implements its own hash and just prints to show nothing
up the sleeve.
Other classes (S,T) have no toHash implemented directly at all -
yet you can see u1 and u3 resolve to the same hash and u2 a
different, as you would expect.
-------------------------
import std.stdio;
import opmix.mix;
import pprint.pp;
struct R {
string r;
hash_t toHash() const nothrow {
try {
writeln("toHash called on r");
} catch(Exception) {
}
return typeid(string).getHash(&r);
}
}
struct S {
R r;
string s;
string[int] si;
}
struct T {
S s;
}
struct U {
mixin ToHash;
T t;
}
void main() {
U u1 = U(T(S(R("a"), "foo", [1:"goo"])));
U u2 = U(T(S(R("a"), "foo".idup)));
U u3 = U(T(S(R("a"), "foo".idup, [1:"goo".idup])));
writeln(deepHash(u1));
writeln(deepHash(u2));
writeln(deepHash(u3));
writeln(pp(u1));
int[U] aa;
aa[u1] = 100;
writeln("Is u1 in aa ", u1 in aa);
writeln("Is u2 in aa ", u2 in aa);
aa[u2] = 100;
writeln("Is u2 in now aa ", u2 in aa);
}
----------------------- OUTPUT --------------------------
toHash called on r
614624
toHash called on r
582446
toHash called on r
614624
{
(U).t = {
(T).s = {
(S).r = {
(R).r = "a"
}
(S).s = "foo"
(S).si = {
(K(1)[0] =>
V("goo")),
}
}
}
}
toHash called on r
toHash called on r
Is u1 in aa 7F2C7E556FC0
toHash called on r
Is u2 in aa null
toHash called on r
toHash called on r
Is u2 in now aa 7F2C7E556F40
----------------------------------------------------------------------
> The built-in stuff wouldn't, and the standard library
> wouldn't. For instance, AAs require that opEquals and toHash be
> defined, and no
> matter how clever your external functions for comparing objects
> or generating
> hashes are, they're not going to work with the built-in AAs.
> Any type which is
> going to work with the built-in AAs must define opEquals and
> toHash.
>
The above works with the built-in AAs.
Please offer an example.
Thanks
Dan
More information about the Digitalmars-d-learn
mailing list