OLD | NEW |
| (Empty) |
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.nam
e)) %} | |
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 } | |
OLD | NEW |