module runnable;
import std.stdio;
bool deeplyEqual(T)(auto ref T value1, auto ref T value2)
{
static if (is(T==struct) || is(T==class))
{
foreach(member; __traits(allMembers, T))
{
enum getMember1 = "__traits(getMember, value1, member)";
enum getMember2 = "__traits(getMember, value2, member)";
alias MT = typeof(mixin(getMember1));
static if (is(MT==struct) || is(MT==class) && MT.tupleof.length)
{
if (!deeplyEqual(mixin(getMember1), mixin(getMember2)))
return false;
}
else if (mixin(getMember1) != mixin(getMember2))
return false;
}
return true;
}
else return value1 == value2;
}
struct Foo{uint a; int b;}
struct Bar{float c = 0; Foo foo;}
void main()
{
Bar x, y;
writeln(deeplyEqual(x, y));
x.foo.b = 8;
writeln(deeplyEqual(x, y));
}