Ideally we'd just do this when we need it, but the ostream derivation will be controlled by both global config and per-structure config, so it's hard to know exactly when we need it and when we don't.
101 lines
1.9 KiB
C++
101 lines
1.9 KiB
C++
#include <cstdarg>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <ostream>
|
|
#include <new>
|
|
|
|
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"
|