OLD | NEW |
1 {%- set class_name = struct.name -%} | 1 {%- set class_name = struct.name -%} |
2 {%- set dtor_name = [] %} | 2 {%- set dtor_name = [] %} |
3 {%- if struct|is_struct_with_handles %} | 3 {%- if struct|is_struct_with_handles %} |
4 {%- set _ = dtor_name.append("&internal::%s_Data_Destructor"|format(struct.nam
e)) %} | 4 {%- set _ = dtor_name.append("&internal::%s_Data_Destructor"|format(struct.nam
e)) %} |
5 {%- else %} | 5 {%- else %} |
6 {%- set _ = dtor_name.append("NULL") %} | 6 {%- set _ = dtor_name.append("NULL") %} |
7 {%- endif %} | 7 {%- endif %} |
8 | 8 |
9 {%- macro set_default(field) -%} | 9 {%- macro set_default(kind, value, depth) -%} |
10 {%- if field.kind|is_string_kind -%} | 10 {#--- Strings ---#} |
11 set_{{field.name}}(mojo::String({{field.default}})); | 11 {%- if kind|is_string_kind -%} |
12 {%- elif field.kind|is_array_kind -%} | 12 {{caller("mojo::String(" ~ value ~ ")")}} |
| 13 {#--- Arrays ---#} |
| 14 {%- elif kind|is_array_kind %} |
| 15 {%- set _ = value|verify_token_type("ARRAY") %} |
13 { | 16 { |
14 {{field.kind|cpp_wrapper_type}}::Builder tmp({{field.default|length}}); | 17 {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}({{value[1]|length}}); |
15 {%- for element in field.default %} | 18 {%- for element in value[1] %} |
16 tmp[{{loop.index0}}] = {{element}}; | 19 {%- filter indent(2) %} |
17 {%- endfor %} | 20 {%- call(result) set_default(kind.kind, element, depth+1) %} |
18 set_{{field.name}}(tmp.Finish()); | 21 tmp{{depth}}[{{loop.index0}}] = {{result}}; |
| 22 {%- endcall %} |
| 23 {%- endfilter %} |
| 24 {%- endfor -%} |
| 25 {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}} |
19 } | 26 } |
20 {%- elif field.kind|is_object_kind -%} | 27 {#--- Objects ---#} |
| 28 {%- elif kind|is_object_kind %} |
| 29 {%- set _ = value|verify_token_type("OBJECT") %} |
21 { | 30 { |
22 {{field.kind|cpp_wrapper_type}}::Builder tmp; | 31 {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}; |
23 // TODO | 32 {%- set struct = structs|struct_by_name(kind.name) %} |
24 set_{{field.name}}(tmp.Finish()); | 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)}} |
25 } | 43 } |
| 44 {#--- POD types ---#} |
26 {%- else -%} | 45 {%- else -%} |
27 set_{{field.name}}({{field.default}}); | 46 {{caller(value)}} |
28 {%- endif %} | 47 {%- endif %} |
29 {%- endmacro %} | 48 {%- endmacro %} |
30 | 49 |
31 {{class_name}}::Builder::Builder(mojo::Buffer* buf) | 50 {{class_name}}::Builder::Builder(mojo::Buffer* buf) |
32 : data_(Data::New(buf, {{dtor_name[0]}})) { | 51 : data_(Data::New(buf, {{dtor_name[0]}})) { |
33 {%- for pf in struct.packed.packed_fields if pf.field.default %} | 52 {%- for pf in struct.packed.packed_fields if pf.field.default %} |
34 {{set_default(pf.field)|indent(2)}} | 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 %} |
35 {%- endfor %} | 58 {%- endfor %} |
36 } | 59 } |
37 | 60 |
38 {{class_name}} {{class_name}}::Builder::Finish() { | 61 {{class_name}} {{class_name}}::Builder::Finish() { |
39 Data* data = NULL; | 62 Data* data = NULL; |
40 std::swap(data, data_); | 63 std::swap(data, data_); |
41 return mojo::internal::Wrap(data); | 64 return mojo::internal::Wrap(data); |
42 } | 65 } |
OLD | NEW |