/// <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()},"); } }
/// <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(); }
/// <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(); }
/// <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}>(),
/// <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});"); }