diff --git a/src/ZoneCodeGenerator/Domain/DataType.cs b/src/ZoneCodeGenerator/Domain/DataType.cs index 4a93b670..385169fd 100644 --- a/src/ZoneCodeGenerator/Domain/DataType.cs +++ b/src/ZoneCodeGenerator/Domain/DataType.cs @@ -8,6 +8,7 @@ public string FullName => string.IsNullOrEmpty(Namespace) ? Name : $"{Namespace}::{Name}"; public abstract int Alignment { get; } + public abstract bool ForceAlignment { get; } public abstract int Size { get; } protected DataType(string _namespace, string name, DataTypeType type) diff --git a/src/ZoneCodeGenerator/Domain/DataTypeBaseType.cs b/src/ZoneCodeGenerator/Domain/DataTypeBaseType.cs index 0cee2afb..bd229530 100644 --- a/src/ZoneCodeGenerator/Domain/DataTypeBaseType.cs +++ b/src/ZoneCodeGenerator/Domain/DataTypeBaseType.cs @@ -29,6 +29,7 @@ namespace ZoneCodeGenerator.Domain .Cast() .ToList(); + public override bool ForceAlignment => false; public override int Size { get; } public override int Alignment => Size; diff --git a/src/ZoneCodeGenerator/Domain/DataTypeEnum.cs b/src/ZoneCodeGenerator/Domain/DataTypeEnum.cs index bb9efa2c..5729e456 100644 --- a/src/ZoneCodeGenerator/Domain/DataTypeEnum.cs +++ b/src/ZoneCodeGenerator/Domain/DataTypeEnum.cs @@ -7,8 +7,10 @@ namespace ZoneCodeGenerator.Domain public DataTypeBaseType ParentType { get; } public List Members { get; } + public override bool ForceAlignment => ParentType.ForceAlignment; public override int Size => ParentType.Size; public override int Alignment => ParentType.Alignment; + public DataTypeEnum(string _namespace, string name, DataTypeBaseType parentType) : base(_namespace, name, DataTypeType.Enum) { diff --git a/src/ZoneCodeGenerator/Domain/DataTypeStruct.cs b/src/ZoneCodeGenerator/Domain/DataTypeStruct.cs index e5add8a5..60b0329f 100644 --- a/src/ZoneCodeGenerator/Domain/DataTypeStruct.cs +++ b/src/ZoneCodeGenerator/Domain/DataTypeStruct.cs @@ -29,7 +29,7 @@ namespace ZoneCodeGenerator.Domain currentBitOffset = 0; } - currentSize = currentSize.Align(Math.Min(member.Alignment, Pack)); + currentSize = currentSize.Align(member.ForceAlignment ? member.Alignment : Math.Min(member.Alignment, Pack)); currentSize += member.VariableType.Size; } } @@ -39,7 +39,7 @@ namespace ZoneCodeGenerator.Domain currentBitOffset = currentBitOffset.Align(8); currentSize += currentBitOffset / 8; } - + return currentSize.Align(Alignment); } @@ -48,4 +48,4 @@ namespace ZoneCodeGenerator.Domain return $"struct {FullName}"; } } -} +} \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Domain/DataTypeTypedef.cs b/src/ZoneCodeGenerator/Domain/DataTypeTypedef.cs index fc81235c..410a13f4 100644 --- a/src/ZoneCodeGenerator/Domain/DataTypeTypedef.cs +++ b/src/ZoneCodeGenerator/Domain/DataTypeTypedef.cs @@ -11,6 +11,7 @@ public int? AlignmentOverride { get; set; } public override int Alignment => AlignmentOverride ?? TypeDefinition.Alignment; + public override bool ForceAlignment => AlignmentOverride != null || TypeDefinition.ForceAlignment; public override int Size => TypeDefinition.Size; public override string ToString() diff --git a/src/ZoneCodeGenerator/Domain/DataTypeWithMembers.cs b/src/ZoneCodeGenerator/Domain/DataTypeWithMembers.cs index df280160..f1bde70c 100644 --- a/src/ZoneCodeGenerator/Domain/DataTypeWithMembers.cs +++ b/src/ZoneCodeGenerator/Domain/DataTypeWithMembers.cs @@ -8,6 +8,7 @@ namespace ZoneCodeGenerator.Domain public int? AlignmentOverride { get; set; } private int alignment; public override int Alignment => AlignmentOverride ?? alignment; + public override bool ForceAlignment => AlignmentOverride != null; private int size; public override int Size => size; diff --git a/src/ZoneCodeGenerator/Domain/ForwardDeclaration.cs b/src/ZoneCodeGenerator/Domain/ForwardDeclaration.cs index f038c9ec..57711cde 100644 --- a/src/ZoneCodeGenerator/Domain/ForwardDeclaration.cs +++ b/src/ZoneCodeGenerator/Domain/ForwardDeclaration.cs @@ -42,6 +42,8 @@ namespace ZoneCodeGenerator.Domain } public override int Alignment => 0; + public override bool ForceAlignment => false; + public override int Size => 0; } } diff --git a/src/ZoneCodeGenerator/Domain/TypeDeclaration.cs b/src/ZoneCodeGenerator/Domain/TypeDeclaration.cs index 88aece28..1832ec04 100644 --- a/src/ZoneCodeGenerator/Domain/TypeDeclaration.cs +++ b/src/ZoneCodeGenerator/Domain/TypeDeclaration.cs @@ -20,6 +20,7 @@ namespace ZoneCodeGenerator.Domain public IReadOnlyList References => references.AsReadOnly(); public int Alignment => references.OfType().Any() ? PointerSize : Type.Alignment; + public bool ForceAlignment => !references.OfType().Any() && Type.ForceAlignment; public int Size { diff --git a/src/ZoneCodeGenerator/Domain/Variable.cs b/src/ZoneCodeGenerator/Domain/Variable.cs index 5c212c63..30cb2038 100644 --- a/src/ZoneCodeGenerator/Domain/Variable.cs +++ b/src/ZoneCodeGenerator/Domain/Variable.cs @@ -7,6 +7,7 @@ public int? AlignmentOverride { get; set; } public int Alignment => AlignmentOverride ?? VariableType.Alignment; + public bool ForceAlignment => AlignmentOverride != null || VariableType.ForceAlignment; public TypeDeclaration VariableType { get; }