size_t GetSerializedSize_(const {{struct.name}}Ptr& input) { if (!input) return 0; size_t size = sizeof(internal::{{struct.name}}_Data); {%- for pf in struct.packed.packed_fields if pf.field.kind|is_object_kind %} size += GetSerializedSize_(input->{{pf.field.name}}); {%- endfor %} return size; } void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buf, internal::{{struct.name}}_Data** output) { if (input) { internal::{{struct.name}}_Data* result = internal::{{struct.name}}_Data::New(buf); {%- for pf in struct.packed.packed_fields %} {%- if pf.field.kind|is_object_kind %} Serialize_(mojo::internal::Forward(input->{{pf.field.name}}), buf, &result->{{pf.field.name}}.ptr); {%- elif pf.field.kind|is_interface_kind %} result->{{pf.field.name}} = input->{{pf.field.name}}.PassMessagePipe().release(); {%- elif pf.field.kind|is_any_handle_kind %} result->{{pf.field.name}} = input->{{pf.field.name}}.release(); {%- else %} result->{{pf.field.name}} = input->{{pf.field.name}}; {%- endif %} {%- endfor %} *output = result; } else { *output = NULL; } } void Deserialize_(internal::{{struct.name}}_Data* input, {{struct.name}}Ptr* output) { if (input) { {{struct.name}}Ptr result({{struct.name}}::New()); {%- for pf in struct.packed.packed_fields %} {%- if pf.field.kind|is_object_kind %} Deserialize_(input->{{pf.field.name}}.ptr, &result->{{pf.field.name}}); {%- elif pf.field.kind|is_interface_kind %} if (input->{{pf.field.name}}.is_valid()) result->{{pf.field.name}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&input->{{pf.field.name}}))); {%- elif pf.field.kind|is_any_handle_kind %} result->{{pf.field.name}}.reset(mojo::internal::FetchAndReset(&input->{{pf.field.name}})); {%- elif pf.field.kind|is_enum_kind %} result->{{pf.field.name}} = static_cast<{{pf.field.kind|cpp_wrapper_type}}>( input->{{pf.field.name}}); {%- else %} result->{{pf.field.name}} = input->{{pf.field.name}}; {%- endif %} {%- endfor %} *output = result.Pass(); } else { output->reset(); } }