It seems reasonable to want to derive it for a variant, but want to provide your own for the containing enum or such, for example.
185 lines
4.1 KiB
C++
185 lines
4.1 KiB
C++
#include <cstdarg>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <ostream>
|
|
#include <new>
|
|
|
|
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"
|