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

Unified Diff: mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl

Issue 131033002: Mojo: Simplify object serialization (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix indentation error Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl
diff --git a/mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl b/mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl
index bb90897332afe425062612e05b198b445902e8dd..f23ebe95c715f1df3b9aa19787f33a9e291be994 100644
--- a/mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl
+++ b/mojo/public/bindings/generators/cpp_templates/struct_definition.tmpl
@@ -1,3 +1,4 @@
+{%- import "struct_macros.tmpl" as struct_macros %}
{%- set class_name = struct.name ~ "_Data" %}
// static
{{class_name}}* {{class_name}}::New(mojo::Buffer* buf, mojo::Buffer::Destructor dtor) {
@@ -8,3 +9,45 @@
_header_.num_bytes = sizeof(*this);
_header_.num_fields = {{struct.packed.packed_fields|length}};
}
+
+size_t {{class_name}}::ComputeSize() const {
+ size_t result = sizeof(*this);
+{%- for pf in struct.packed.packed_fields if pf.field.kind|is_object_kind %}
+ if ({{pf.field.name}}_.ptr)
+ result += {{pf.field.name}}_.ptr->ComputeSize();
+{%- endfor %}
+ return result;
+}
+
+{{class_name}}* {{class_name}}::Clone(mojo::Buffer* buf) const {
+ {{class_name}}* clone = New(buf);
+ memcpy(clone, this, sizeof(*this));
+{%- for pf in struct.packed.packed_fields if pf.field.kind|is_object_kind %}
+ if ({{pf.field.name}}_.ptr)
+ clone->set_{{pf.field.name}}({{pf.field.name}}_.ptr->Clone(buf));
+{%- endfor %}
+{%- for pf in struct.packed.packed_fields if pf.field.kind|is_handle_kind %}
+ mojo::internal::ResetIfNonNull({{pf.field.name}}());
+{%- endfor %}
+ return clone;
+}
+
+void {{class_name}}::CloseHandles() {
+{%- for pf in struct.packed.packed_fields if pf.field.kind|is_object_kind %}
+ if ({{pf.field.name}}_.ptr)
+ {{pf.field.name}}_.ptr->CloseHandles();
+{%- endfor %}
+{%- if struct|is_struct_with_handles %}
+ {{struct.name}}_Data_Destructor(this);
+{%- endif %}
+}
+
+void {{class_name}}::EncodePointersAndHandles(
+ std::vector<mojo::Handle>* handles) {
+ {{ struct_macros.encodes(struct)|indent(2) }}
+}
+
+bool {{class_name}}::DecodePointersAndHandles(mojo::Message* message) {
+ {{ struct_macros.decodes(struct)|indent(2) }}
+ return true;
+}

Powered by Google App Engine
This is Rietveld 408576698