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

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

Issue 1358353002: * Change C++ serialization/deserialization to not be move-only operations (with the except of |Ha… (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Cleanup forward declarations of array/map serialization functions Created 5 years, 2 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, bool inlined) { 1 size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) {
2 size_t size = 0U; 2 size_t size = 0U;
3 if (!inlined) { 3 if (!inlined) {
4 size += sizeof(internal::{{union.name}}_Data); 4 size += sizeof(internal::{{union.name}}_Data);
5 } 5 }
6 6
7 if (!input) 7 if (!input)
8 return size; 8 return size;
9 9
10 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 10 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get());
11 switch (input->which()) { 11 switch (input->which()) {
12 {% for field in union.fields %} 12 {% for field in union.fields %}
13 {% if field.kind|is_object_kind %} 13 {% if field.kind|is_object_kind %}
14 case {{union.name}}::Tag::{{field.name|upper}}: 14 case {{union.name}}::Tag::{{field.name|upper}}:
15 {% if field.kind|is_union_kind %} 15 {% if field.kind|is_union_kind %}
16 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false); 16 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false);
17 {% elif field.kind|is_struct_kind %}
18 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}->get()));
17 {% else %} 19 {% else %}
18 size += GetSerializedSize_(*(input_acc.data()->{{field.name}})); 20 size += GetSerializedSize_(*(input_acc.data()->{{field.name}}));
19 {% endif %} 21 {% endif %}
20 break; 22 break;
21 {%- endif %} 23 {%- endif %}
22 {%- endfor %} 24 {%- endfor %}
23 default: 25 default:
24 break; 26 break;
25 } 27 }
26 return size; 28 return size;
27 } 29 }
28 30
29 void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf, 31 void SerializeUnion_({{union.name}}* input, mojo::internal::Buffer* buf,
30 internal::{{union.name}}_Data** output, bool inlined) { 32 internal::{{union.name}}_Data** output, bool inlined) {
31 internal::{{union.name}}_Data* result = *output; 33 internal::{{union.name}}_Data* result = *output;
32 if (input) { 34 if (input) {
33 if (!inlined) { 35 if (!inlined) {
34 result = internal::{{union.name}}_Data::New(buf); 36 result = internal::{{union.name}}_Data::New(buf);
35 } 37 }
36 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input.get()); 38 mojo::internal::UnionAccessor<{{union.name}}> input_acc(input);
37 // TODO(azani): Handle unknown and objects. 39 // TODO(azani): Handle unknown and objects.
38 // Set the not-null flag. 40 // Set the not-null flag.
39 result->size = 16; 41 result->size = 16;
40 result->tag = input->which(); 42 result->tag = input->which();
41 switch (input->which()) { 43 switch (input->which()) {
42 {% for field in union.fields %} 44 {% for field in union.fields %}
43 case {{union.name}}::Tag::{{field.name|upper}}: { 45 case {{union.name}}::Tag::{{field.name|upper}}: {
44 {% if field.kind|is_object_kind %} 46 {% if field.kind|is_object_kind %}
45 {% if field.kind|is_string_kind %} 47 {% if field.kind|is_string_kind %}
46 Serialize_( 48 SerializeString_(
47 *(input_acc.data()->{{field.name}}), 49 *input_acc.data()->{{field.name}},
48 buf, &result->data.f_{{field.name}}.ptr); 50 buf, &result->data.f_{{field.name}}.ptr);
49 {% elif field.kind|is_struct_kind %} 51 {% elif field.kind|is_struct_kind %}
50 Serialize_( 52 Serialize_(
51 mojo::internal::Forward(*(input_acc.data()->{{field.name}})), 53 input_acc.data()->{{field.name}}->get(),
52 buf, &result->data.f_{{field.name}}.ptr); 54 buf, &result->data.f_{{field.name}}.ptr);
53 {% elif field.kind|is_union_kind %} 55 {% elif field.kind|is_union_kind %}
54 SerializeUnion_( 56 SerializeUnion_(
55 mojo::internal::Forward(*(input_acc.data()->{{field.name}})), 57 input_acc.data()->{{field.name}}->get(),
56 buf, &result->data.f_{{field.name}}.ptr, false); 58 buf, &result->data.f_{{field.name}}.ptr, false);
57 {% elif field.kind|is_array_kind %} 59 {% elif field.kind|is_array_kind %}
58 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params ( 60 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params (
59 {{field.kind|get_array_validate_params_ctor_args|indent(16)}}); 61 {{field.kind|get_array_validate_params_ctor_args|indent(16)}});
60 SerializeArray_( 62 SerializeArray_(
61 mojo::internal::Forward(*(input_acc.data()->{{field.name}})), 63 input_acc.data()->{{field.name}},
62 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams); 64 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams);
63 {% elif field.kind|is_map_kind %} 65 {% elif field.kind|is_map_kind %}
64 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params ( 66 const mojo::internal::ArrayValidateParams {{field.name}}_validate_params (
65 {{field.kind.value_kind|get_map_validate_params_ctor_args|indent(16) }}); 67 {{field.kind.value_kind|get_map_validate_params_ctor_args|indent(16) }});
66 SerializeMap_( 68 SerializeMap_(
67 mojo::internal::Forward(*(input_acc.data()->{{field.name}})), 69 input_acc.data()->{{field.name}},
68 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams); 70 buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_pa rams);
69 {%- endif %} 71 {%- endif %}
70 {% elif field.kind|is_any_handle_kind %} 72 {% elif field.kind|is_any_handle_kind %}
71 result->data.f_{{field.name}} = 73 result->data.f_{{field.name}} =
72 input_acc.data()->{{field.name}}->release().value(); 74 input_acc.data()->{{field.name}}->release().value();
73 {% elif field.kind|is_interface_kind %} 75 {% elif field.kind|is_interface_kind %}
74 mojo::internal::Interface_Data* {{field.name}} = 76 mojo::internal::Interface_Data* {{field.name}} =
75 reinterpret_cast<mojo::internal::Interface_Data*>( 77 reinterpret_cast<mojo::internal::Interface_Data*>(
76 &result->data.f_{{field.name}}); 78 &result->data.f_{{field.name}});
77 mojo::internal::InterfacePointerToData( 79 mojo::internal::InterfacePointerToData(
(...skipping 10 matching lines...) Expand all
88 } 90 }
89 } else if (inlined) { 91 } else if (inlined) {
90 result->set_null(); 92 result->set_null();
91 } else { 93 } else {
92 result = nullptr; 94 result = nullptr;
93 } 95 }
94 *output = result; 96 *output = result;
95 } 97 }
96 98
97 void Deserialize_(internal::{{union.name}}_Data* input, 99 void Deserialize_(internal::{{union.name}}_Data* input,
98 {{union.name}}Ptr* output) { 100 {{union.name}}* output) {
99 if (input && !input->is_null()) { 101 if (input && !input->is_null()) {
100 {{union.name}}Ptr result({{union.name}}::New()); 102 mojo::internal::UnionAccessor<{{union.name}}> result_acc(output);
101 mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get());
102 switch (input->tag) { 103 switch (input->tag) {
104 {#- TODO: There is a lot of overlap with struct_macros.deserialize() here,
viettrungluu 2015/09/23 23:20:24 TODO -> TODO(vardhan) Muahahaha.
vardhan 2015/09/25 19:33:05 Done :(
105 is it possible to merge? (currently looks very hairy) #}
103 {% for field in union.fields %} 106 {% for field in union.fields %}
104 case {{union.name}}::Tag::{{field.name|upper}}: { 107 case {{union.name}}::Tag::{{field.name|upper}}: {
105 {% if field.kind|is_object_kind %} 108 {% if field.kind|is_object_kind %}
106 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}}); 109 result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
110 {% if field.kind|is_struct_kind or field.kind|is_union_kind %}
111 *result_acc.data()->{{field.name}} =
112 {{field.kind|get_name_for_kind}}::New();
113 Deserialize_(input->data.f_{{field.name}}.ptr,
114 result_acc.data()->{{field.name}}->get());
115 {% else %}
107 Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{fiel d.name}}); 116 Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{fiel d.name}});
117 {% endif %}
108 {% elif field.kind|is_any_handle_kind %} 118 {% elif field.kind|is_any_handle_kind %}
109 {{field.kind|cpp_wrapper_type}}* {{field.name}} = 119 {{field.kind|cpp_wrapper_type}}* {{field.name}} =
110 reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{ field.name}}); 120 reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{ field.name}});
111 result->set_{{field.name}}({{field.name}}->Pass()); 121 output->set_{{field.name}}({{field.name}}->Pass());
112 {% elif field.kind|is_interface_kind %} 122 {% elif field.kind|is_interface_kind %}
113 {{field.kind|cpp_wrapper_type}} {{field.name}}_out; 123 {{field.kind|cpp_wrapper_type}} {{field.name}}_out;
114 mojo::internal::Interface_Data* {{field.name}}_in = 124 mojo::internal::Interface_Data* {{field.name}}_in =
115 reinterpret_cast<mojo::internal::Interface_Data*>( 125 reinterpret_cast<mojo::internal::Interface_Data*>(
116 &input->data.f_{{field.name}}); 126 &input->data.f_{{field.name}});
117 mojo::internal::InterfaceDataToPointer( 127 mojo::internal::InterfaceDataToPointer(
118 {{field.name}}_in, &{{field.name}}_out); 128 {{field.name}}_in, &{{field.name}}_out);
119 result->set_{{field.name}}({{field.name}}_out.Pass()); 129 output->set_{{field.name}}({{field.name}}_out.Pass());
120 {% elif field.kind|is_enum_kind %} 130 {% elif field.kind|is_enum_kind %}
121 result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>( input->data.f_{{field.name}})); 131 output->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>( input->data.f_{{field.name}}));
122 {% else %} 132 {% else %}
123 result->set_{{field.name}}(input->data.f_{{field.name}}); 133 output->set_{{field.name}}(input->data.f_{{field.name}});
124 {%- endif %} 134 {%- endif %}
125 break; 135 break;
126 } 136 }
127 {%- endfor %} 137 {%- endfor %}
128 default: 138 default:
129 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!"; 139 MOJO_LOG(WARNING) << "Deserializing {{union.name}} with unknown tag!";
130 // No way to deserialize the data when we encounter an unknown tag. 140 // No way to deserialize the data when we encounter an unknown tag.
131 break; 141 break;
132 } 142 }
133 *output = result.Pass();
134 } else {
135 output->reset();
136 } 143 }
137 } 144 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698