// Generate the C structure for a value type, such as an enum or struct private (CppComplexType valueType, CppComplexType boxedType) GenerateValueFieldStruct(TypeInfo ti) { CppComplexType valueType, boxedType; string name = TypeNamer.GetName(ti); if (ti.IsEnum) { // Enums should be represented using enum syntax // They otherwise behave like value types var underlyingType = AsCType(ti.GetEnumUnderlyingType()); valueType = types.Enum(underlyingType, name); foreach (var field in ti.DeclaredFields) { if (field.Name != "value__") { ((CppEnumType)valueType).AddField(EnumNamer.GetName(field), field.DefaultValue); } } boxedType = GenerateObjectStruct(name + "__Boxed", ti); boxedType.AddField("value", AsCType(ti)); } else { // This structure is passed by value, so it doesn't include Il2CppObject fields. valueType = types.Struct(name); GenerateFieldList(valueType, CreateNamespace(), ti); // Also generate the boxed form of the structure which includes the Il2CppObject header. boxedType = GenerateObjectStruct(name + "__Boxed", ti); boxedType.AddField("fields", AsCType(ti)); } return(valueType, boxedType); }
// Generate the C structure for a value type, such as an enum or struct private void GenerateValueFieldStruct(StringBuilder csrc, TypeInfo ti) { string name = TypeNamer.GetName(ti); if (ti.IsEnum) { // Enums should be represented using enum syntax // They otherwise behave like value types csrc.Append($"enum {name} : {AsCType(ti.GetEnumUnderlyingType())} {{\n"); foreach (var field in ti.DeclaredFields) { if (field.Name != "value__") { csrc.Append($" {EnumNamer.GetName(field)} = {field.DefaultValue},\n"); } } csrc.Append($"}};\n"); // Use System.Enum base type as klass csrc.Append($"struct {name}__Boxed {{\n"); GenerateObjectFields(csrc, ti.BaseType); csrc.Append($" {AsCType(ti)} value;\n"); csrc.Append($"}};\n"); } else { // This structure is passed by value, so it doesn't include Il2CppObject fields. csrc.Append($"struct {name} {{\n"); GenerateFieldList(csrc, CreateNamespace(), ti); csrc.Append($"}};\n"); // Also generate the boxed form of the structure which includes the Il2CppObject header. csrc.Append($"struct {name}__Boxed {{\n"); GenerateObjectFields(csrc, ti); csrc.Append($" {AsCType(ti)} fields;\n"); csrc.Append($"}};\n"); } }