private ElementArray ProcessTagBlockDefinition(ElementArray parent, MoonfishTagDefinition tagBlock, ref int offset, bool inline = false) { var size = tagBlock.CalculateSizeOfFieldSet(); var blockElementArray = new ElementArray { name = tagBlock.Name, elementSize = size, address = offset, parent = parent, maxElementCount = tagBlock.MaximumElementCount, alignment = tagBlock.Alignment }; var i = 0; var blockOffset = inline ? offset : 0; ProcessFields(tagBlock.Fields, blockElementArray, ref i, ref blockOffset); if (inline) { offset = blockOffset; } return(blockElementArray); }
private ClassInfo BeginProcessTagBlockDefinition(MoonfishTagDefinition block, string className = "") { var size = block.CalculateSizeOfFieldSet(); var alignment = block.Alignment; #if DEBUG System.Diagnostics.Debug.Assert(alignment > 0 && alignment % 2 == 0); #endif var @class = new ClassInfo { AccessModifiers = AccessModifiers.Public, Name = className == string.Empty ? ToTypeName(block.Name) : ToTypeName(className), Attributes = { new AttributeInfo(typeof(LayoutAttribute), StaticReflection.GetMemberName((LayoutAttribute layout) => layout.Size), size, StaticReflection.GetMemberName((LayoutAttribute layout) => layout.Alignment),alignment ) }, Properties = { new PropertyInfo { AccessModifiers = AccessModifiers.Public | AccessModifiers.Override, GetBody = string.Format("return {0};", size), Returns = "int", Name = "SerializedSize" }, new PropertyInfo { AccessModifiers = AccessModifiers.Public | AccessModifiers.Override, GetBody = string.Format("return {0};", alignment), Returns = "int", Name = "Alignment" } }, BaseClass = new ClassInfo("GuerillaBlock") }; ProcessFields(block.Fields, @class); @class.Format(); return(@class); }
private IEnumerable <ElementArray> ProcessTagStructDefinition(ElementArray parent, MoonfishTagDefinition definition, ref int offset) { var size = definition.CalculateSizeOfFieldSet(); var blockElementArray = new ElementArray { name = definition.Name, elementSize = size, address = offset, parent = parent, maxElementCount = definition.MaximumElementCount, alignment = definition.Alignment }; var i = 0; ProcessFields(definition.Fields, blockElementArray, ref i, ref offset); return(blockElementArray.children); }
private ClassInfo ProcessArrayFields(List <MoonfishTagField> fields) { var size = MoonfishTagDefinition.CalculateSizeOfFieldSet(fields.GetRange(1, fields.Count - 2)); var arrayClass = new ClassInfo { Attributes = { new AttributeInfo(typeof(LayoutAttribute), StaticReflection.GetMemberName((LayoutAttribute layout) => layout.Size), size, StaticReflection.GetMemberName((LayoutAttribute layout) => layout.Alignment), 1) }, Name = ToTypeName(fields[0].Strings), AccessModifiers = AccessModifiers.Public, BaseClass = new ClassInfo("GuerillaBlock"), Properties = { new PropertyInfo { AccessModifiers = AccessModifiers.Public | AccessModifiers.Override, GetBody = string.Format("return {0};", size), Returns = "int", Name = "SerializedSize" }, new PropertyInfo { AccessModifiers = AccessModifiers.Public | AccessModifiers.Override, GetBody = string.Format("return {0};", 1), Returns = "int", Name = "Alignment" } } }; fields.RemoveAt(0); ProcessFields(fields, arrayClass); return(arrayClass); }