OLD | NEW |
1 {%- set mojom_type = union|get_qualified_name_for_kind %} | 1 {%- set mojom_type = union|get_qualified_name_for_kind %} |
2 | 2 |
3 // static | 3 // static |
4 bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read( | 4 bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read( |
5 {{mojom_type}}::DataView input, | 5 {{mojom_type}}::DataView input, |
6 {{mojom_type}}Ptr* output) { | 6 {{mojom_type}}Ptr* output) { |
7 *output = {{mojom_type}}::New(); | 7 using UnionType = {{mojom_type}}; |
8 {{mojom_type}}Ptr& result = *output; | 8 using Tag = UnionType::Tag; |
9 | 9 |
10 internal::UnionAccessor<{{mojom_type}}> result_acc(result.get()); | |
11 switch (input.tag()) { | 10 switch (input.tag()) { |
12 {%- for field in union.fields %} | 11 {%- for field in union.fields %} |
13 case {{mojom_type}}::Tag::{{field.name|upper}}: { | 12 case Tag::{{field.name|upper}}: { |
14 {%- set name = field.name %} | 13 {%- set name = field.name %} |
15 {%- set kind = field.kind %} | 14 {%- set kind = field.kind %} |
16 {%- set serializer_type = kind|unmapped_type_for_serializer %} | 15 {%- set serializer_type = kind|unmapped_type_for_serializer %} |
17 {%- if kind|is_object_kind %} | 16 {%- if kind|is_object_kind %} |
18 result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}}); | 17 auto result = UnionType::New(UnionType::{{field.name}}); |
19 if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}})) | 18 if (!input.Read{{name|under_to_camel}}(&result->get_{{name}}())) |
20 return false; | 19 return false; |
21 | 20 |
| 21 *output = std::move(result); |
22 {%- elif kind|is_any_handle_kind %} | 22 {%- elif kind|is_any_handle_kind %} |
23 auto result_{{name}} = input.Take{{name|under_to_camel}}(); | 23 *output = UnionType::New(UnionType::{{field.name}}, input.Take{{name|under
_to_camel}}()); |
24 result->set_{{name}}(std::move(result_{{name}})); | |
25 | 24 |
26 {%- elif kind|is_any_interface_kind %} | 25 {%- elif kind|is_any_interface_kind %} |
27 auto result_{{name}} = | 26 auto result_{{name}} = |
28 input.Take{{name|under_to_camel}}<typename std::remove_reference<declt
ype(result->get_{{name}}())>::type>(); | 27 input.Take{{name|under_to_camel}}<typename std::remove_reference<declt
ype((*output)->get_{{name}}())>::type>(); |
29 result->set_{{name}}(std::move(result_{{name}})); | 28 *output = UnionType::New(UnionType::{{field.name}}, std::move(result_{{nam
e}})); |
30 | 29 |
31 {%- elif kind|is_enum_kind %} | 30 {%- elif kind|is_enum_kind %} |
32 decltype(result->get_{{name}}()) result_{{name}}; | 31 decltype((*output)->get_{{name}}()) result_{{name}}; |
33 if (!input.Read{{name|under_to_camel}}(&result_{{name}})) | 32 if (!input.Read{{name|under_to_camel}}(&result_{{name}})) |
34 return false; | 33 return false; |
35 result->set_{{name}}(result_{{name}}); | 34 *output = UnionType::New(UnionType::{{field.name}}, result_{{name}}); |
36 | 35 |
37 {%- else %} | 36 {%- else %} |
38 result->set_{{name}}(input.{{name}}()); | 37 *output = UnionType::New(UnionType::{{field.name}}, input.{{name}}()); |
39 {%- endif %} | 38 {%- endif %} |
40 break; | 39 break; |
41 } | 40 } |
42 {%- endfor %} | 41 {%- endfor %} |
43 default: | 42 default: |
44 return false; | 43 return false; |
45 } | 44 } |
46 return true; | 45 return true; |
47 } | 46 } |
OLD | NEW |