fork download
  1. module runnable;
  2. import std.stdio;
  3.  
  4. bool deeplyEqual(T)(auto ref T value1, auto ref T value2)
  5. {
  6. static if (is(T==struct) || is(T==class))
  7. {
  8. foreach(member; __traits(allMembers, T))
  9. {
  10. enum getMember1 = "__traits(getMember, value1, member)";
  11. enum getMember2 = "__traits(getMember, value2, member)";
  12. alias MT = typeof(mixin(getMember1));
  13. static if (is(MT==struct) || is(MT==class) && MT.tupleof.length)
  14. {
  15. if (!deeplyEqual(mixin(getMember1), mixin(getMember2)))
  16. return false;
  17. }
  18. else if (mixin(getMember1) != mixin(getMember2))
  19. return false;
  20. }
  21. return true;
  22. }
  23. else return value1 == value2;
  24. }
  25.  
  26. struct Foo{uint a; int b;}
  27. struct Bar{float c = 0; Foo foo;}
  28.  
  29. void main()
  30. {
  31. Bar x, y;
  32. writeln(deeplyEqual(x, y));
  33. x.foo.b = 8;
  34. writeln(deeplyEqual(x, y));
  35. }
Success #stdin #stdout 0s 2676KB
stdin
Standard input is empty
stdout
true
false