Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl

Issue 2694843003: Add field-initializing factory static methods to generated mojo unions. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698