2022-12-06 19:16:13 +03:00
|
|
|
|
|
|
|
{% macro decl_units(meta) %}
|
|
|
|
|
|
|
|
{%- for u in meta.getunits ~%}
|
|
|
|
{%- if u.object is instanceof('\\mtgMetaStruct') -%}
|
|
|
|
{{ _self.decl_struct(u.object) }}
|
|
|
|
{%- elseif u.object is instanceof('\\mtgMetaEnum') -%}
|
|
|
|
{{ _self.decl_enum(u.object) }}
|
2022-12-07 12:54:56 +03:00
|
|
|
{%- elseif u.object is instanceof('\\mtgMetaRPC') -%}
|
|
|
|
{{ _self.decl_rpc(u.object) }}
|
2022-12-06 19:16:13 +03:00
|
|
|
{%- endif ~%}
|
|
|
|
{%- endfor ~%}
|
|
|
|
|
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{% macro decl_struct(o, extra = '') %}
|
2022-12-07 11:49:34 +03:00
|
|
|
{%- if o.parent and has_token(o, 'POD') -%}
|
|
|
|
{{Error("@POD structs can't have a parent: " ~ o.name)}}
|
|
|
|
{%- endif -%}
|
2022-12-06 19:16:13 +03:00
|
|
|
{%- if o.parent and has_token(o, 'bitfields') -%}
|
|
|
|
{{Error("@bitfields structs can't have a parent: " ~ o.name)}}
|
|
|
|
{%- endif -%}
|
|
|
|
|
|
|
|
{{_self.attributes(o)}}
|
|
|
|
public {{_self.struct_type(o)}} {{o.name}} {{_self.base_class(o)}}
|
|
|
|
{
|
|
|
|
{{_self.decl_struct_fields(o)}}
|
|
|
|
|
|
|
|
public {{o.parent ? 'new'}} const uint STATIC_CLASS_ID = {{o.classid}};
|
|
|
|
|
|
|
|
public {{_self.override(o)}} uint CLASS_ID()
|
|
|
|
{
|
|
|
|
return {{o.classid}};
|
|
|
|
}
|
|
|
|
|
|
|
|
{{_self.comment_POD_begin(o)}}
|
|
|
|
public {{o.name}}()
|
|
|
|
{
|
|
|
|
reset();
|
|
|
|
}
|
|
|
|
{{_self.comment_POD_end(o)}}
|
|
|
|
|
|
|
|
public {{_self.override(o)}} void reset()
|
|
|
|
{
|
|
|
|
{{_self.struct_fields_reset(o)}}
|
|
|
|
}
|
|
|
|
|
|
|
|
{{_self.comment_non_cloneable_begin(o)}}
|
|
|
|
public {{_self.virtual_clone(o)}} void copy(IMetaStruct other)
|
|
|
|
{
|
|
|
|
copyFrom(({{o.name}})other);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void copyFrom({{o.name}} other)
|
|
|
|
{
|
|
|
|
var ctx = Meta.PrepareForClone(ref other);
|
|
|
|
ctx.factory = AutogenBundle.createById;
|
|
|
|
ctx.reader.BeginContainer();
|
|
|
|
reset();
|
|
|
|
syncFields(ctx);
|
|
|
|
ctx.reader.EndContainer();
|
2022-12-07 11:49:34 +03:00
|
|
|
|
2022-12-06 19:16:13 +03:00
|
|
|
{{_self.copy_fields(o)}}
|
|
|
|
}
|
|
|
|
|
|
|
|
public {{_self.virtual_clone(o)}} IMetaStruct clone()
|
|
|
|
{
|
|
|
|
var copy = new {{o.name}}();
|
|
|
|
copy.copy(this);
|
|
|
|
return copy;
|
|
|
|
}
|
|
|
|
{{_self.comment_non_cloneable_end(o)}}
|
|
|
|
|
|
|
|
public {{_self.override(o)}} void syncFields(MetaSyncContext ctx)
|
|
|
|
{
|
2022-12-07 11:49:34 +03:00
|
|
|
{{_self.sync_fields(o)}}
|
2022-12-06 19:16:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public {{_self.override(o)}} int getFieldsCount()
|
|
|
|
{
|
2022-12-07 11:49:34 +03:00
|
|
|
return {{fields_count(o)}};
|
2022-12-06 19:16:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public {{_self.override(o)}} int getWritableFieldsCount()
|
|
|
|
{
|
2022-12-07 12:54:56 +03:00
|
|
|
{%~ if has_token(o, 'bitfields') ~%}
|
2022-12-07 11:49:34 +03:00
|
|
|
return Meta.GetDirtyFieldsCount(fields_mask, fields_count: {{fields_count(o)}})
|
|
|
|
+ Meta.MASK_HEADER_FIELDS_COUNT;
|
2022-12-07 12:54:56 +03:00
|
|
|
{% else %}
|
2022-12-07 11:49:34 +03:00
|
|
|
return {{fields_count(o)}};
|
|
|
|
{%- endif ~%}
|
2022-12-06 19:16:13 +03:00
|
|
|
}
|
2022-12-07 11:49:34 +03:00
|
|
|
|
|
|
|
{%- if has_token(o, 'bitfields') ~%}
|
|
|
|
{{_self.bitmask_helpers(o)}}
|
|
|
|
{%- endif -%}
|
2022-12-06 19:16:13 +03:00
|
|
|
|
|
|
|
{{extra}}
|
|
|
|
}
|
|
|
|
|
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{%- macro decl_struct_fields(o) -%}
|
|
|
|
{%- if has_token(o, 'bitfields') ~%}
|
|
|
|
public long fields_mask;
|
|
|
|
{%- endif -%}
|
|
|
|
{%- for f in o.fields ~%}
|
|
|
|
{{_self.decl_struct_field(o, f)}}
|
|
|
|
{%- endfor -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro decl_struct_field(o, f) -%}
|
|
|
|
{{_self.attributes(f)}}
|
|
|
|
public {{f.type|cs_type}} {{f.name}} {% if not has_token(f, 'POD') -%} {{_self.decl_init_value(f.type)}} {%- endif -%};
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{% macro decl_init_value(type) %}
|
|
|
|
{%- if type is instanceof('\\mtgBuiltinType') -%}
|
|
|
|
{%- if type.isstring -%} = ""{%- endif -%}
|
|
|
|
{%- else -%}
|
|
|
|
= new {{type|cs_type}}()
|
|
|
|
{%- endif -%}
|
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{% macro struct_fields_reset(o) %}
|
|
|
|
{%- if o.parent ~%}
|
|
|
|
base.reset();
|
|
|
|
{%- endif -%}
|
|
|
|
{%- for f in o.fields ~%}
|
|
|
|
{{var_reset(f.name, f.type, token_or(f, 'default', null))}}
|
|
|
|
{%- endfor -%}
|
|
|
|
{%- if has_token(o, 'bitfields') ~%}
|
|
|
|
fields_mask = 0L;
|
|
|
|
{%- endif -%}
|
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{%- macro attributes(o) %}
|
|
|
|
{%- if has_token(o, 'cs_attributes') -%}
|
|
|
|
{%- for attr in token(o, 'cs_attributes')|split(',') -%}
|
|
|
|
[{{attr}}]
|
|
|
|
{%- endfor -%}
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro %}
|
|
|
|
|
|
|
|
{%- macro struct_type(o) -%}
|
|
|
|
{{has_token(o, 'POD') ? 'struct' : 'class'}}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro base_class(o) -%}
|
|
|
|
{%- if not has_token(o, 'POD') -%}
|
|
|
|
: {{o.parent ? o.parent.name : 'BaseMetaStruct'}} {{has_token(o, 'cloneable')?',IMetaCloneable'}}
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro override(o) -%}
|
|
|
|
{%- if not has_token(o, 'POD') -%}
|
|
|
|
override
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro comment_POD_begin(o) -%}
|
|
|
|
{%- if has_token(o, 'POD') -%}
|
2022-12-07 11:49:34 +03:00
|
|
|
/* commented in POD
|
2022-12-06 19:16:13 +03:00
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro comment_POD_end(o) -%}
|
|
|
|
{%- if has_token(o, 'POD') -%}
|
|
|
|
*/
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro comment_non_cloneable_begin(o) -%}
|
|
|
|
{%- if not has_token(o, 'cloneable') -%}
|
2022-12-07 11:49:34 +03:00
|
|
|
/* commented in non-cloneable
|
2022-12-06 19:16:13 +03:00
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro comment_non_cloneable_end(o) -%}
|
|
|
|
{%- if not has_token(o, 'cloneable') -%}
|
|
|
|
*/
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro virtual_clone(o) -%}
|
|
|
|
{%- if not has_token(o, 'POD') -%}
|
|
|
|
{%- if o.parent and has_token_in_parent(o.parent, 'cloneable') -%}
|
|
|
|
override
|
|
|
|
{%- else -%}
|
|
|
|
virtual
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro copy_fields(o) -%}
|
|
|
|
{%- if has_token(o, 'POD') ~%}
|
|
|
|
fields_mask = other.fields_mask;
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
2022-12-07 11:49:34 +03:00
|
|
|
{%- macro sync_fields(o) -%}
|
|
|
|
{%- if has_token(o, 'bitfields') ~%}
|
|
|
|
var bitctx = new Meta.BitfieldsContext(ctx, fields_mask);
|
|
|
|
bitctx.SyncMaskHeader();
|
|
|
|
{%- endif -%}
|
|
|
|
{%- if o.parent ~%}
|
|
|
|
base.syncFields(ctx);
|
|
|
|
{%- endif -%}
|
|
|
|
{%- for f in o.fields ~%}
|
|
|
|
{{var_sync(f.name, f.type, 'ctx', f.tokens, get_sync_opts(o, 'bitctx'))}}
|
|
|
|
{%- endfor -%}
|
|
|
|
{%- endmacro -%}
|
|
|
|
|
|
|
|
{%- macro bitmask_helpers(o) ~%}
|
|
|
|
|
|
|
|
public void ResetFieldMask()
|
|
|
|
{
|
|
|
|
fields_mask = 0L;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetPrimaryFieldsChanged()
|
|
|
|
{
|
|
|
|
{%- for f in o.fields ~%}
|
|
|
|
{%- if is_primary_field(o, f) ~%}
|
|
|
|
Meta.SetFieldDirty(ref fields_mask, {{loop.index0}});
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endfor ~%}
|
|
|
|
}
|
|
|
|
|
2022-12-07 12:54:56 +03:00
|
|
|
public void SetDirtyMask()
|
|
|
|
{
|
|
|
|
fields_mask = ~0L;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetDirtyMaskDeep()
|
|
|
|
{
|
|
|
|
SetDirtyMask();
|
|
|
|
{%- for f in o.fields ~%}
|
|
|
|
{%- if f.type is instanceof('\\mtgMetaStruct') and has_token(f.type, 'bitfields') ~%}
|
|
|
|
{{f.name}}.SetDirtyMaskDeep();
|
|
|
|
{%- elseif f.type is instanceof('\\mtgArrType') and f.type.value is instanceof('\\mtgMetaStruct') and has_token(f.type.value, "bitfields") ~%}
|
|
|
|
{
|
|
|
|
for(int i=0;i<{{f.name}}.Count;++i)
|
|
|
|
{
|
|
|
|
var __tmp = {{f.name}}[i];
|
|
|
|
__tmp.SetDirtyMaskDeep();
|
|
|
|
{{f.name}}[i] = __tmp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{%- endif -%}
|
|
|
|
{%- endfor ~%}
|
|
|
|
}
|
|
|
|
|
2022-12-07 11:49:34 +03:00
|
|
|
{%- endmacro -%}
|
|
|
|
|
2022-12-06 19:16:13 +03:00
|
|
|
{% macro decl_enum(o) %}
|
2022-12-07 12:54:56 +03:00
|
|
|
{{_self.attributes(o)}}
|
|
|
|
public enum {{o.name}}
|
|
|
|
{
|
|
|
|
{%- for n,v in o.values ~%}
|
|
|
|
{{n}} = {{v}},
|
|
|
|
{%- endfor ~%}
|
|
|
|
}
|
2022-12-06 19:16:13 +03:00
|
|
|
{% endmacro %}
|
|
|
|
|
2022-12-07 12:54:56 +03:00
|
|
|
{% macro decl_rpc(o) %}
|
|
|
|
|
|
|
|
{{_self.decl_struct(o.req)}}
|
|
|
|
{{_self.decl_struct(o.rsp)}}
|
|
|
|
|
|
|
|
public class {{o.name}} : IRpc
|
|
|
|
{
|
|
|
|
public IRpcError error = null;
|
|
|
|
public {{o.req.name}} req = new {{o.req.name}}();
|
|
|
|
public {{o.rsp.name}} rsp = new {{o.rsp.name}}();
|
|
|
|
|
|
|
|
public int getCode()
|
|
|
|
{
|
|
|
|
return {{o.code}};
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setError(IRpcError error)
|
|
|
|
{
|
|
|
|
this.error = error;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IRpcError getError()
|
|
|
|
{
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IMetaStruct getRequest()
|
|
|
|
{
|
|
|
|
return req as IMetaStruct;
|
|
|
|
}
|
|
|
|
|
|
|
|
public IMetaStruct getResponse()
|
|
|
|
{
|
|
|
|
return rsp as IMetaStruct;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{% endmacro %}
|