Beispiel #1
0
        // 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);
        }
Beispiel #2
0
        // 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");
            }
        }