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

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl

Issue 1524703002: [mojo] Support native types with mojom wire format (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bindings-5-pickles
Patch Set: doc Created 5 years 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
index 5ded62223c314d37aced79ed2cdd7c1029358d9e..52aafacc0456f17515b206962e3c5f2ccda05923 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
@@ -4,3 +4,80 @@ void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buffer,
bool Deserialize_(internal::{{struct.name}}_Data* input,
{{struct.name}}Ptr* output,
mojo::internal::SerializationContext* context);
+
+{%- if not variant %}
+
+{# NOTE: Generated Reader instances are intentionally cheap to copy and devoid
+ of heap allocations. They should stay this way. #}
+class {{struct.name}}_Reader {
+ public:
+ {{struct.name}}_Reader(internal::{{struct.name}}_Data* data,
+ mojo::internal::SerializationContext* context);
+
+{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
+{%- set kind = pf.field.kind -%}
+{%- set name = pf.field.name -%}
+{%- if kind|is_struct_kind %}
+ {{kind|get_name_for_kind}}::Reader {{name}}() const;
+{%- elif kind|is_union_kind %}
+ // TODO(rockot): Support reading unions. ({{name}}() omitted)
+{%- elif kind|is_object_kind %}
+ // TODO(rockot): Support reading other object kinds. ({{name}}() omitted)
+{%- elif kind|is_any_handle_kind %}
+ // TODO(rockot): Support reading handles. ({{name}}() omitted)
+{%- elif kind|is_interface_kind %}
+ // TODO(rockot): Support reading interfaces. ({{name}}() omitted)
+{%- elif kind|is_interface_request_kind %}
+ // TODO(rockot): Support reading interface requests. ({{name}}() omitted)
+{%- elif kind|is_associated_kind %}
+ // TODO(rockot): Support reading associated kinds. ({{name}}() omitted)
+{%- elif kind|is_enum_kind %}
+ {{kind|cpp_result_type}} {{name}}() const {
+ return static_cast<{{kind|cpp_result_type}}>(data_->{{name}});
+ }
+{%- else %}
+ {{kind|cpp_result_type}} {{name}}() const { return data_->{{name}}; }
+{%- endif %}
+{%- endfor %}
+
+ private:
+ internal::{{struct.name}}_Data* data_;
+ mojo::internal::SerializationContext* context_;
+};
+
+template <typename NativeType>
+struct {{struct.name}}_SerializerTraits_ {
+ static size_t GetSize(const NativeType& input) {
+ size_t size = sizeof(internal::{{struct.name}}_Data);
+{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
+{%- if pf.field.kind|is_object_kind %}
+ NOTREACHED() << "Mojom struct traits only support POD fields at this time. "
+ << "Cannot determine the size of field {{pf.field.name}}";
+{%- endif %}
+{%- endfor %}
+ return size;
+ }
+
+ static void Serialize(const NativeType& input,
+ mojo::internal::Buffer* buffer,
+ internal::{{struct.name}}_Data** output) {
+ internal::{{struct.name}}_Data* result =
+ internal::{{struct.name}}_Data::New(buffer);
+{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
+{%- set name = pf.field.name -%}
+{%- set kind = pf.field.kind %}
+ result->{{name}} = mojo::StructTraits<{{struct.name}}, NativeType>
+ ::{{name}}(input);
+{%- endfor %}
+ *output = result;
+ }
+
+ static bool Deserialize(internal::{{struct.name}}_Data* input,
+ NativeType* output,
+ mojo::internal::SerializationContext* context) {
+ return mojo::StructTraits<{{struct.name}}, NativeType>::Read(
+ {{struct.name}}_Reader(input, context), output);
+ }
+};
+
+{%- endif %} {# not variant #}

Powered by Google App Engine
This is Rietveld 408576698