| {%- set class_name = struct.name -%} |
| {%- set dtor_name = [] %} |
| {%- if struct|is_struct_with_handles %} |
| {%- set _ = dtor_name.append("&internal::%s_Data_Destructor"|format(struct.name)) %} |
| {%- else %} |
| {%- set _ = dtor_name.append("NULL") %} |
| {%- endif %} |
| |
| {%- macro set_default(kind, value, depth) -%} |
| {#--- Strings ---#} |
| {%- if kind|is_string_kind -%} |
| {{caller("mojo::String(" ~ value|expression_to_text(module) ~ ")")}} |
| {#--- Arrays ---#} |
| {%- elif kind|is_array_kind %} |
| {%- set _ = value|verify_token_type("ARRAY") %} |
| { |
| {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}({{value[1]|length}}); |
| {%- for element in value[1] %} |
| {%- filter indent(2) %} |
| {%- call(result) set_default(kind.kind, element, depth+1) %} |
| tmp{{depth}}[{{loop.index0}}] = {{result}}; |
| {%- endcall %} |
| {%- endfilter %} |
| {%- endfor -%} |
| {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}} |
| } |
| {#--- Objects ---#} |
| {%- elif kind|is_object_kind %} |
| {%- set _ = value|verify_token_type("OBJECT") %} |
| { |
| {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}; |
| {%- set struct = kinds[kind.spec] %} |
| {%- for element in value[1] %} |
| {#- Use struct.packed_fields to order struct values by ordinal number #} |
| {%- set subfield = struct.fields[loop.index0] %} |
| {%- filter indent(2) %} |
| {%- call(result) set_default(subfield.kind, element, depth+1) %} |
| tmp{{depth}}.set_{{subfield.name}}({{result}}); |
| {%- endcall %} |
| {%- endfilter %} |
| {%- endfor -%} |
| {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}} |
| } |
| {#--- POD types ---#} |
| {%- else -%} |
| {{caller(value|expression_to_text(module))}} |
| {%- endif %} |
| {%- endmacro %} |
| |
| {{class_name}}::Builder::Builder(mojo::Buffer* buf) |
| : data_(Data::New(buf, {{dtor_name[0]}})) { |
| {%- for pf in struct.packed.packed_fields if pf.field.default %} |
| {%- filter indent(2) %} |
| {%- call(result) set_default(pf.field.kind, pf.field.default, 0) %} |
| set_{{pf.field.name}}({{result}}); |
| {%- endcall %} |
| {%- endfilter %} |
| {%- endfor %} |
| } |
| |
| {{class_name}} {{class_name}}::Builder::Finish() { |
| Data* data = NULL; |
| std::swap(data, data_); |
| return mojo::internal::Wrap(data); |
| } |