#include #include #include #include #include enum class C : uint32_t { X = 2, Y, }; inline std::ostream& operator<<(std::ostream& stream, const C& instance) { switch (instance) { case C::X: stream << "X"; break; case C::Y: stream << "Y"; break; } return stream; } struct A { int32_t _0; friend std::ostream& operator<<(std::ostream& stream, const A& instance) { return stream << "{ " << "_0=" << instance._0 << " }"; } }; struct B { int32_t x; float y; friend std::ostream& operator<<(std::ostream& stream, const B& instance) { return stream << "{ " << "x=" << instance.x << ", " << "y=" << instance.y << " }"; } }; struct D { uint8_t List; uintptr_t Of; B Things; friend std::ostream& operator<<(std::ostream& stream, const D& instance) { return stream << "{ " << "List=" << instance.List << ", " << "Of=" << instance.Of << ", " << "Things=" << instance.Things << " }"; } }; union F { enum class Tag : uint8_t { Foo, Bar, Baz, }; friend std::ostream& operator<<(std::ostream& stream, const Tag& instance) { using Tag = F::Tag; switch (instance) { case Tag::Foo: stream << "Foo"; break; case Tag::Bar: stream << "Bar"; break; case Tag::Baz: stream << "Baz"; break; } return stream; } friend std::ostream& operator<<(std::ostream& stream, const F& instance) { using Tag = F::Tag; switch (instance.tag) { case Tag::Foo: stream << instance.foo; break; case Tag::Bar: stream << instance.bar; break; case Tag::Baz: stream << "Baz"; break; } return stream; } struct Foo_Body { Tag tag; int16_t _0; friend std::ostream& operator<<(std::ostream& stream, const Foo_Body& instance) { return stream << "{ " << "tag=" << instance.tag << ", " << "_0=" << instance._0 << " }"; } }; struct Bar_Body { Tag tag; uint8_t x; int16_t y; friend std::ostream& operator<<(std::ostream& stream, const Bar_Body& instance) { return stream << "{ " << "tag=" << instance.tag << ", " << "x=" << instance.x << ", " << "y=" << instance.y << " }"; } }; struct { Tag tag; }; Foo_Body foo; Bar_Body bar; }; struct H { enum class Tag : uint8_t { Hello, There, Everyone, }; friend std::ostream& operator<<(std::ostream& stream, const Tag& instance) { using Tag = H::Tag; switch (instance) { case Tag::Hello: stream << "Hello"; break; case Tag::There: stream << "There"; break; case Tag::Everyone: stream << "Everyone"; break; } return stream; } friend std::ostream& operator<<(std::ostream& stream, const H& instance) { using Tag = H::Tag; switch (instance.tag) { case Tag::Hello: stream << "Hello" << instance.hello; break; case Tag::There: stream << "There" << instance.there; break; case Tag::Everyone: stream << "Everyone"; break; } return stream; } struct Hello_Body { int16_t _0; friend std::ostream& operator<<(std::ostream& stream, const Hello_Body& instance) { return stream << "{ " << "_0=" << instance._0 << " }"; } }; struct There_Body { uint8_t x; int16_t y; friend std::ostream& operator<<(std::ostream& stream, const There_Body& instance) { return stream << "{ " << "x=" << instance.x << ", " << "y=" << instance.y << " }"; } }; Tag tag; union { Hello_Body hello; There_Body there; }; }; struct I { enum class Tag : uint8_t { ThereAgain, SomethingElse, }; struct ThereAgain_Body { uint8_t x; int16_t y; friend std::ostream& operator<<(std::ostream& stream, const ThereAgain_Body& instance) { return stream << "{ " << "x=" << instance.x << ", " << "y=" << instance.y << " }"; } }; Tag tag; union { ThereAgain_Body there_again; }; }; extern "C" { void root(A a, B b, C c, D d, F f, H h, I i); } // extern "C"