예제 #1
0
        /// <inheritdoc />
        public override void BeginVisitType(Type sourceType)
        {
            Type enumUnderlyingType = sourceType.GetEnumUnderlyingType();

            string enumCppUnderlyingType = CppTypeMapper.GetCppFullTypeName(enumUnderlyingType);

            string cppClassName = sourceType.Name;

            WriteLine($"enum class {cppClassName} : {enumCppUnderlyingType}");
            WriteLine("{");

            IndentationLevel++;

            foreach (FieldInfo fieldInfo in sourceType.GetFields())
            {
                if (!fieldInfo.FieldType.IsEnum)
                {
                    // Skip invalid entries.
                    //
                    continue;
                }

                WriteLine($"{fieldInfo.Name} = {fieldInfo.GetRawConstantValue()},");
            }
        }
예제 #2
0
        /// <inheritdoc />
        public override void VisitField(CppField cppField)
        {
            AlignAttribute alignmentAttribute = cppField.FieldInfo.GetCustomAttribute <AlignAttribute>();
            string         fieldCodeString    = alignmentAttribute == null
                ? string.Empty
                : $"alignas({alignmentAttribute.Size}) ";

            if (cppField.FieldInfo.IsFixedSizedArray())
            {
                // Field is a fixed size array.
                //
                string cppElementTypeFullName = CppTypeMapper.GetCppFullTypeName(cppField.FieldInfo.FieldType.GetElementType());

                FixedSizeArrayAttribute arrayAttribute = cppField.FieldInfo.GetCustomAttribute <FixedSizeArrayAttribute>();

                fieldCodeString += $"std::array<{cppElementTypeFullName}, {arrayAttribute.Length}> {cppField.FieldInfo.Name} = {{ }};";
            }
            else
            {
                string cppTypeFullName = CppTypeMapper.GetCppFullTypeName(cppField.FieldInfo.FieldType);
                fieldCodeString += $"{cppTypeFullName} {cppField.FieldInfo.Name};";
            }

            WriteLine(fieldCodeString);
            WriteLine();
        }
예제 #3
0
        /// <inheritdoc />
        public override void VisitConstField(CppConstField cppConstField)
        {
            string cppTypeFullName    = CppTypeMapper.GetCppFullTypeName(cppConstField.FieldInfo.FieldType);
            string constValueAsString = cppConstField.ConstValue.ToString();

            WriteLine($"static const {cppTypeFullName} {cppConstField.FieldInfo.Name} = {constValueAsString};");
            WriteLine();
        }
예제 #4
0
        /// <summary>
        /// For each serializable structure, create an entry with deserialization handler in the dispatch callback table.
        /// </summary>
        /// <param name="sourceType"></param>
        public override void BeginVisitType(Type sourceType)
        {
            string cppTypeFullName      = CppTypeMapper.GetCppFullTypeName(sourceType);
            string cppProxyTypeFullName = CppTypeMapper.GetCppProxyFullTypeName(sourceType);

            WriteBlock(@$ "
                ::Mlos::Core::DispatchEntry
                {{
                    {Constants.TypeMetadataInfoNamespace}::CodegenTypeHash<{cppTypeFullName}>(),
예제 #5
0
        /// <inheritdoc />
        public override void VisitField(CppField cppField)
        {
            string cppDeclaringTypeFullName = CppTypeMapper.GetCppFullTypeName(cppField.FieldInfo.DeclaringType);
            string fieldName             = cppField.FieldInfo.Name;
            string actualOffsetText      = $@"offsetof(struct {cppDeclaringTypeFullName}, {fieldName})";
            string assertionErrorMessage = $@"""Invalid offset""";

            WriteLine($@"static_assert({actualOffsetText} == {cppField.CppStructOffset}, {assertionErrorMessage});");
        }