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

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

Issue 923033003: Implement unions as members of structs. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 10 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 size_t GetSerializedSize_(const {{union.name}}Ptr& input) { 1 size_t GetSerializedSize_(const {{union.name}}Ptr& input) {
2 if (!input) 2 if (!input)
3 return 0; 3 return 0;
4 4
5 size_t size = sizeof(internal::{{union.name}}_Data); 5 size_t size = sizeof(internal::{{union.name}}_Data);
6 switch (input->which()) { 6 switch (input->which()) {
7 {% for field in union.fields %} 7 {% for field in union.fields %}
8 {% if field.kind|is_string_kind %} 8 {% if field.kind|is_string_kind %}
9 case {{union.name}}::Tag::{{field.name|upper}}: 9 case {{union.name}}::Tag::{{field.name|upper}}:
10 size += GetSerializedSize_(input->get_{{field.name}}()); 10 size += GetSerializedSize_(input->get_{{field.name}}());
11 break; 11 break;
12 {%- endif %} 12 {%- endif %}
13 {%- endfor %} 13 {%- endfor %}
14 default: 14 default:
15 break; 15 break;
16 } 16 }
17 return size; 17 return size;
18 } 18 }
19 19
20 20
21 void Serialize_({{union.name}}Ptr input, mojo::internal::Buffer* buf, 21 void Serialize_({{union.name}}Ptr input, mojo::internal::Buffer* buf,
22 internal::{{union.name}}_Data** output) { 22 internal::{{union.name}}_Data** output) {
23 if (input) { 23 if (input) {
24 internal::{{union.name}}_Data* result = nullptr;
25 if (*output) {
yzshen1 2015/02/17 19:34:35 Unfortunately, we don't initialize |*output|. (For
azani 2015/02/18 00:27:58 The problem I'm trying to solve is again related t
26 result = *output;
27 } else {
28 result = internal::{{union.name}}_Data::New(buf);
29 }
24 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 30 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
25 internal::{{union.name}}_Data* result =
26 internal::{{union.name}}_Data::New(buf);
27 // TODO(azani): Handle unknown and objects. 31 // TODO(azani): Handle unknown and objects.
32 // Set the not-null flag.
33 result->flags = 0x1;
yzshen1 2015/02/17 19:34:35 This is the size for the non-inlined case.
28 result->tag = input->which(); 34 result->tag = input->which();
29 switch (input->which()) { 35 switch (input->which()) {
30 {% for field in union.fields %} 36 {% for field in union.fields %}
31 case {{union.name}}::Tag::{{field.name|upper}}: 37 case {{union.name}}::Tag::{{field.name|upper}}:
32 {% if field.kind|is_string_kind %} 38 {% if field.kind|is_string_kind %}
33 {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{f ield.kind|cpp_field_type}}*>(&result->data.f_{{field.name}}); 39 {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{f ield.kind|cpp_field_type}}*>(&result->data.f_{{field.name}});
34 Serialize_(*(input_acc.data()->{{field.name}}), buf, &{{field.name}}_ptr ->ptr); 40 Serialize_(*(input_acc.data()->{{field.name}}), buf, &{{field.name}}_ptr ->ptr);
35 {% else %} 41 {% else %}
36 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; 42 result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
37 {%- endif %} 43 {%- endif %}
(...skipping 22 matching lines...) Expand all
60 result->set_{{field.name}}(input->data.f_{{field.name}}); 66 result->set_{{field.name}}(input->data.f_{{field.name}});
61 {%- endif %} 67 {%- endif %}
62 break; 68 break;
63 {%- endfor %} 69 {%- endfor %}
64 } 70 }
65 *output = result.Pass(); 71 *output = result.Pass();
66 } else { 72 } else {
67 output->reset(); 73 output->reset();
68 } 74 }
69 } 75 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698