summaryrefslogtreecommitdiffstats
path: root/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
blob: 97c6521a748da3a25917dd0c81a85119b6f77dd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{%- import "struct_macros.tmpl" as struct_macros %}
size_t GetSerializedSize_(const {{struct.name}}Ptr& input,
                          mojo::internal::SerializationContext* context) {
  if (!input)
    return 0;
  {{struct_macros.get_serialized_size(struct, "input->%s", "context")}}
  return size;
}

void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buf,
                internal::{{struct.name}}_Data** output,
                mojo::internal::SerializationContext* context) {
  if (input) {
    {{struct_macros.serialize(struct, struct.name ~ " struct", "input->%s", "result", "buf", "context")|indent(2)}}
    *output = result;
  } else {
    *output = nullptr;
  }
}

bool Deserialize_(internal::{{struct.name}}_Data* input,
                  {{struct.name}}Ptr* output,
                  mojo::internal::SerializationContext* context) {
  bool success = true;
  if (input) {
    {{struct.name}}Ptr result({{struct.name}}::New());
    {{struct_macros.deserialize(struct, "input", "result->%s", "context", "success")|indent(2)}}
    *output = std::move(result);
  } else {
    output->reset();
  }
  return success;
}

{%- if not struct|is_native_only_kind %}

{{struct.name}}_Reader::{{struct.name}}_Reader(
    internal::{{struct.name}}_Data*  data,
    mojo::internal::SerializationContext* context)
    : data_(data), context_(context) { }

{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
{%-   set name = pf.field.name -%}
{%-   set kind = pf.field.kind %}
{%-   if kind|is_nullable_kind %}
bool {{struct.name}}_Reader::has_{{name}}() const {
{%-  if kind|is_union_kind %}
  return !data_->{{name}}.is_null();
{%-  elif kind|is_object_kind %}
  return data_->{{name}}.ptr != nullptr;
{%-  elif kind|is_interface_kind %}
  return data_->{{name}}.handle.is_valid();
{%-  elif kind|is_interface_request_kind %}
  return data_->{{name}}.is_valid();
{%-  elif kind|is_associated_interface_kind %}
  return data_->{{name}}.interface_id == mojo::internal::kInvalidInterfaceId;
{%-  elif kind|is_associated_interface_request_kind %}
  return data_->{{name}} == mojo::internal::kInvalidInterfaceId;
{%-  elif kind|is_any_handle_kind %}
  return data_->{{name}}.is_valid();
{%-  else %}
  return !!data_->{{name}};
{%-   endif %}
}
{%-   endif %}
{%-   if kind|is_struct_kind and not kind|is_native_only_kind %}
{{kind|get_name_for_kind}}_Reader {{struct.name}}_Reader::{{name}}() const {
  return {{kind|get_name_for_kind}}_Reader(data_->{{name}}.ptr, context_);
}
{%-   elif kind|is_string_kind %}
base::StringPiece {{struct.name}}_Reader::{{name}}() const {
  DCHECK(data_->{{name}}.ptr);
  return base::StringPiece(data_->{{name}}.ptr->storage(),
                           data_->{{name}}.ptr->size());
}
{%-   endif %}
{%- endfor %}

{%- endif %}