blob: 6e6fe95a74c1dc207af7f5d252494a1936fd7e14 [file]
{%- set class_name = union.name ~ "_Data" -%}
{%- set enum_name = union.name ~ "_Tag" -%}
{%- import "struct_macros.tmpl" as struct_macros %}
class {{class_name}} {
public:
static {{class_name}}* New(mojo::internal::Buffer* buf);
static bool Validate(const void* data,
mojo::internal::BoundsChecker* bounds_checker);
enum class {{enum_name}} : uint32_t {
{% for field in union.fields %}
{{field.name|upper}},
{%- endfor %}
};
// A note on layout:
// "Each non-static data member is allocated as if it were the sole member of
// a struct." - Section 9.5.2 ISO/IEC 14882:2011 (The C++ Spec)
union MOJO_ALIGNAS(8) Union_ {
{%- for field in union.fields %}
{%- if field.kind|is_string_kind %}
uint64_t f_{{field.name}};
{%- elif field.kind.spec == 'b' %}
uint8_t f_{{field.name}} : 1;
{%- elif field.kind|is_enum_kind %}
int32_t f_{{field.name}};
{%- else %}
{{field.kind|cpp_pod_type}} f_{{field.name}};
{%- endif %}
{%- endfor %}
uint64_t unknown;
};
uint32_t reserved;
{{enum_name}} tag;
Union_ data;
void EncodePointersAndHandles(std::vector<mojo::Handle>* handles);
void DecodePointersAndHandles(std::vector<mojo::Handle>* handles);
private:
{{class_name}}();
~{{class_name}}() = delete;
};
static_assert(sizeof({{class_name}}) == 16,
"Bad sizeof({{class_name}})");
static_assert(sizeof({{class_name}}::Union_) == 8,
"Bad sizeof({{class_name}}::Union_)");