Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / mojo / public / tools / bindings / generators / cpp_templates / struct_builder_definition.tmpl
1 {%- set class_name = struct.name -%}
2 {%- set dtor_name = [] %}
3 {%- if struct|is_struct_with_handles %}
4 {%-   set _ = dtor_name.append("&internal::%s_Data_Destructor"|format(struct.name)) %}
5 {%- else %}
6 {%-   set _ = dtor_name.append("NULL") %}
7 {%- endif %}
8
9 {%- macro set_default(kind, value, depth) -%}
10 {#--- Strings ---#}
11 {%-   if kind|is_string_kind -%}
12 {{caller("mojo::String(" ~ value|expression_to_text(module) ~ ")")}}
13 {#--- Arrays ---#}
14 {%-   elif kind|is_array_kind %}
15 {%-     set _ = value|verify_token_type("ARRAY") %}
16 {
17   {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}({{value[1]|length}});
18 {%-     for element in value[1] %}
19 {%-       filter indent(2) %}
20 {%-         call(result) set_default(kind.kind, element, depth+1) %}
21 tmp{{depth}}[{{loop.index0}}] = {{result}};
22 {%-         endcall %}
23 {%-       endfilter %}
24 {%-     endfor -%}
25   {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}}
26 }
27 {#--- Objects ---#}
28 {%-   elif kind|is_object_kind %}
29 {%-     set _ = value|verify_token_type("OBJECT") %}
30 {
31   {{kind|cpp_wrapper_type}}::Builder tmp{{depth}};
32 {%-   set struct = kinds[kind.spec] %}
33 {%-   for element in value[1] %}
34 {#-     Use struct.packed_fields to order struct values by ordinal number #}
35 {%-     set subfield = struct.fields[loop.index0] %}
36 {%-     filter indent(2) %}
37 {%-       call(result) set_default(subfield.kind, element, depth+1) %}
38 tmp{{depth}}.set_{{subfield.name}}({{result}});
39 {%-       endcall %}
40 {%-     endfilter %}
41 {%-   endfor -%}
42   {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}}
43 }
44 {#--- POD types ---#}
45 {%-   else -%}
46 {{caller(value|expression_to_text(module))}}
47 {%-   endif %}
48 {%- endmacro %}
49
50 {{class_name}}::Builder::Builder(mojo::Buffer* buf)
51     : data_(Data::New(buf, {{dtor_name[0]}})) {
52 {%- for pf in struct.packed.packed_fields if pf.field.default %}
53 {%-   filter indent(2) %}
54 {%-     call(result) set_default(pf.field.kind, pf.field.default, 0) %}
55 set_{{pf.field.name}}({{result}});
56 {%-     endcall %}
57 {%-   endfilter %}
58 {%- endfor %}
59 }
60
61 {{class_name}} {{class_name}}::Builder::Finish() {
62   Data* data = NULL;
63   std::swap(data, data_);
64   return mojo::internal::Wrap(data);
65 }