#include #include #include #include #include struct Foo { bool a; int32_t b; bool operator==(const Foo& aOther) const { return a == aOther.a && b == aOther.b; } bool operator!=(const Foo& aOther) const { return a != aOther.a || b != aOther.b; } }; union Bar { enum class Tag : uint8_t { Baz, Bazz, FooNamed, FooParen, }; struct Bazz_Body { Tag tag; Foo named; bool operator==(const Bazz_Body& aOther) const { return named == aOther.named; } bool operator!=(const Bazz_Body& aOther) const { return named != aOther.named; } }; struct FooNamed_Body { Tag tag; int32_t different; uint32_t fields; bool operator==(const FooNamed_Body& aOther) const { return different == aOther.different && fields == aOther.fields; } bool operator!=(const FooNamed_Body& aOther) const { return different != aOther.different || fields != aOther.fields; } }; struct FooParen_Body { Tag tag; int32_t _0; Foo _1; bool operator==(const FooParen_Body& aOther) const { return _0 == aOther._0 && _1 == aOther._1; } bool operator!=(const FooParen_Body& aOther) const { return _0 != aOther._0 || _1 != aOther._1; } }; struct { Tag tag; }; Bazz_Body bazz; FooNamed_Body foo_named; FooParen_Body foo_paren; bool operator==(const Bar& aOther) const { if (tag != aOther.tag) { return false; } switch (tag) { case Tag::Bazz: return bazz == aOther.bazz; case Tag::FooNamed: return foo_named == aOther.foo_named; case Tag::FooParen: return foo_paren == aOther.foo_paren; default: break; } return true; } bool operator!=(const Bar& aOther) const { return !(*this == aOther); } }; extern "C" { Foo root(Bar aBar); } // extern "C"