Index: mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl |
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl |
index cde3f95669369fad483f82f05dd8142acc45fef1..f4021424601c02581543743f34196f6958ea7ac4 100644 |
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl |
+++ b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl |
@@ -4,38 +4,38 @@ |
bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read( |
{{mojom_type}}::DataView input, |
{{mojom_type}}Ptr* output) { |
- *output = {{mojom_type}}::New(); |
- {{mojom_type}}Ptr& result = *output; |
+ using UnionType = {{mojom_type}}; |
+ using Tag = UnionType::Tag; |
- internal::UnionAccessor<{{mojom_type}}> result_acc(result.get()); |
switch (input.tag()) { |
{%- for field in union.fields %} |
- case {{mojom_type}}::Tag::{{field.name|upper}}: { |
+ case Tag::{{field.name|upper}}: { |
{%- set name = field.name %} |
{%- set kind = field.kind %} |
{%- set serializer_type = kind|unmapped_type_for_serializer %} |
{%- if kind|is_object_kind %} |
- result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}}); |
- if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}})) |
+ {{kind|cpp_wrapper_type(True)}} result_{{name}}; |
+ if (!input.Read{{name|under_to_camel}}(&result_{{name}})) |
return false; |
+ *output = UnionType::New{{field.name|under_to_camel}}( |
+ std::move(result_{{name}})); |
{%- elif kind|is_any_handle_kind %} |
- auto result_{{name}} = input.Take{{name|under_to_camel}}(); |
- result->set_{{name}}(std::move(result_{{name}})); |
+ *output = UnionType::New{{field.name|under_to_camel}}( |
+ input.Take{{name|under_to_camel}}()); |
{%- elif kind|is_any_interface_kind %} |
- auto result_{{name}} = |
- input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype(result->get_{{name}}())>::type>(); |
- result->set_{{name}}(std::move(result_{{name}})); |
+ *output = UnionType::New{{field.name|under_to_camel}}( |
+ input.Take{{name|under_to_camel}}<{{kind|cpp_wrapper_type(True)}}>()); |
{%- elif kind|is_enum_kind %} |
- decltype(result->get_{{name}}()) result_{{name}}; |
+ {{kind|cpp_wrapper_type(True)}} result_{{name}}; |
if (!input.Read{{name|under_to_camel}}(&result_{{name}})) |
return false; |
- result->set_{{name}}(result_{{name}}); |
+ *output = UnionType::New{{field.name|under_to_camel}}(result_{{name}}); |
{%- else %} |
- result->set_{{name}}(input.{{name}}()); |
+ *output = UnionType::New{{field.name|under_to_camel}}(input.{{name}}()); |
{%- endif %} |
break; |
} |