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

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, 8 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, bool inlined) {
2 size_t size = 0U;
3 if (!inlined) {
4 size += sizeof(internal::{{union.name}}_Data);
5 }
6
2 if (!input) 7 if (!input)
3 return 0; 8 return size;
4 9
5 size_t size = sizeof(internal::{{union.name}}_Data);
6 switch (input->which()) { 10 switch (input->which()) {
7 {% for field in union.fields %} 11 {% for field in union.fields %}
8 {% if field.kind|is_string_kind %} 12 {% if field.kind|is_string_kind %}
9 case {{union.name}}::Tag::{{field.name|upper}}: 13 case {{union.name}}::Tag::{{field.name|upper}}:
10 size += GetSerializedSize_(input->get_{{field.name}}()); 14 size += GetSerializedSize_(input->get_{{field.name}}());
11 break; 15 break;
12 {%- endif %} 16 {%- endif %}
13 {%- endfor %} 17 {%- endfor %}
14 default: 18 default:
15 break; 19 break;
16 } 20 }
17 return size; 21 return size;
18 } 22 }
19 23
20 24 void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf,
21 void Serialize_({{union.name}}Ptr input, mojo::internal::Buffer* buf, 25 internal::{{union.name}}_Data** output, bool inlined) {
22 internal::{{union.name}}_Data** output) { 26 internal::{{union.name}}_Data* result = *output;
23 if (input) { 27 if (input) {
28 if (!inlined) {
29 result = internal::{{union.name}}_Data::New(buf);
30 }
24 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 31 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. 32 // TODO(azani): Handle unknown and objects.
33 // Set the not-null flag.
34 result->size = 16;
28 result->tag = input->which(); 35 result->tag = input->which();
29 switch (input->which()) { 36 switch (input->which()) {
30 {% for field in union.fields %} 37 {% for field in union.fields %}
31 case {{union.name}}::Tag::{{field.name|upper}}: 38 case {{union.name}}::Tag::{{field.name|upper}}:
32 {% if field.kind|is_string_kind %} 39 {% 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}}); 40 {{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); 41 Serialize_(*(input_acc.data()->{{field.name}}), buf, &{{field.name}}_ptr ->ptr);
35 {% else %} 42 {% else %}
36 result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; 43 result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
37 {%- endif %} 44 {%- endif %}
38 break; 45 break;
39 {%- endfor %} 46 {%- endfor %}
40 } 47 }
41 *output = result; 48 } else if (inlined) {
49 result->set_null();
42 } else { 50 } else {
43 *output = nullptr; 51 result = nullptr;
44 } 52 }
53 *output = result;
45 } 54 }
46 55
47 void Deserialize_(internal::{{union.name}}_Data* input, 56 void Deserialize_(internal::{{union.name}}_Data* input,
48 {{union.name}}Ptr* output) { 57 {{union.name}}Ptr* output) {
49 if (input) { 58 if (input && !input->is_null()) {
50 {{union.name}}Ptr result({{union.name}}::New()); 59 {{union.name}}Ptr result({{union.name}}::New());
51 mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get()); 60 mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get());
52 switch (input->tag) { 61 switch (input->tag) {
53 {% for field in union.fields %} 62 {% for field in union.fields %}
54 case {{union.name}}::Tag::{{field.name|upper}}: 63 case {{union.name}}::Tag::{{field.name|upper}}:
55 {% if field.kind|is_string_kind %} 64 {% if field.kind|is_string_kind %}
56 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}}); 65 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
57 {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{f ield.kind|cpp_field_type}}*>(&input->data.f_{{field.name}}); 66 {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{f ield.kind|cpp_field_type}}*>(&input->data.f_{{field.name}});
58 Deserialize_({{field.name}}_ptr->ptr, result_acc.data()->{{field.name}}) ; 67 Deserialize_({{field.name}}_ptr->ptr, result_acc.data()->{{field.name}}) ;
59 {% else %} 68 {% else %}
60 result->set_{{field.name}}(input->data.f_{{field.name}}); 69 result->set_{{field.name}}(input->data.f_{{field.name}});
61 {%- endif %} 70 {%- endif %}
62 break; 71 break;
63 {%- endfor %} 72 {%- endfor %}
64 } 73 }
65 *output = result.Pass(); 74 *output = result.Pass();
66 } else { 75 } else {
67 output->reset(); 76 output->reset();
68 } 77 }
69 } 78 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698