blob: 9f6f02f0d8a525d480effd45bccce100619bfbfc [file]
{%- import "validation_macros.tmpl" as validation_macros %}
{%- set class_name = union.name ~ "_Data" %}
{%- set enum_name = union.name ~ "_Tag" -%}
// static
{{class_name}}* {{class_name}}::New(mojo::internal::Buffer* buf) {
return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}();
}
// static
bool {{class_name}}::Validate(const void* data,
mojo::internal::BoundsChecker* bounds_checker) {
if (!data) {
return true;
}
if (!mojo::internal::IsAligned(data)) {
ReportValidationError(mojo::internal::VALIDATION_ERROR_MISALIGNED_OBJECT);
return false;
}
if (!bounds_checker->ClaimMemory(data, sizeof({{class_name}}))) {
ReportValidationError(
mojo::internal::VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
return false;
}
const {{class_name}}* object = static_cast<const {{class_name}}*>(data);
MOJO_ALLOW_UNUSED_LOCAL(object);
switch (object->tag) {
{% for field in union.fields %}
case {{enum_name}}::{{field.name|upper}}:
{{ validation_macros.validate_union_field(field, union)|indent(6) }}
{%- endfor %}
default:
ReportValidationError(
mojo::internal::VALIDATION_ERROR_UNKOWN_UNION_TAG,
"unknown tag in {{union.name}}");
return false;
}
}
{{class_name}}::{{class_name}}() {
}
void {{class_name}}::EncodePointersAndHandles(
std::vector<mojo::Handle>* handles) {
// TODO(azani): Implement pointers and handles.
}
void {{class_name}}::DecodePointersAndHandles(
std::vector<mojo::Handle>* handles) {
// TODO(azani): Implement pointers and handles.
}