On Tue, Mar 19, 2013 at 01:48:43PM -0400, Jonathan M Davis wrote: > On Tuesday, March 19, 2013 18:26:16 timotheecour wrote: > > > somewhere else, but I don't see a relevant package. Maybe a new > > > std.algorithm2 for non-ranges? > > > > > > Also, the OT's firstDifference would go there too, and I have a > > > recursive (to specified level) toStringRecurse that would > > > belong there too. > > > > Also, I'd add to that list copyRecurse and some more, that > > operate on arbitrary types, not just ranges, so we have: > > > > equalRecurse > > copyRecurse (deep copy) > > toStringRecurse > > firstDifference (see OT) > > toHashRecurse (should compare equal with a data structure > > serialized and then deserialized via a serialization function, eg > > std.orange) > > > > I'm sure there's more. > > > > that seems a starting point for a new package that operates on any > > type recursively (not just ranges), no? std.deep?std.recurse? Some > > of those could have a depth level compile time parameter that stops > > recursion at that level, which would be infinity by default. > > And how do you even have the concept of recursion without some sort of > range or container to recursively iterate through? [...]
One can iterate over every member of a struct/class and recursively invoke equalRecurse on them. Something like this: bool recursiveEqual(T)(T a, T b) { static if (isAtomic!T) { return a == b; } else { foreach (attr; __traits(getAllMembers, T)) { // TBD: need to skip stuff like member // functions or internal stuff like // compiler-generated attributes, hidden // context ptrs, etc. alias attr1 = __traits(getMember, a, attr); alias attr2 = __traits(getMember, b, attr); if (!recursiveEqual(attr, attr2)) return false; } } return true; } T -- The best way to destroy a cause is to defend it poorly.