OLD | NEW |
---|---|
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 Loading... | |
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 } |
OLD | NEW |