From 29b962e949fb7024fcaec401c16b1e5b269415da Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 4 Mar 2021 09:04:25 +0100 Subject: [PATCH] Add offset of members to assetstructtests --- .../Domain/Definition/Variable.cpp | 1 + .../Domain/Definition/Variable.h | 6 ++++-- .../Templates/AssetStructTestsTemplate.cpp | 14 +++++++++++++- .../CalculateSizeAndAlignPostProcessor.cpp | 6 ++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp index 7798142b..526bba32 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.cpp @@ -4,6 +4,7 @@ Variable::Variable(std::string name, std::unique_ptr typeDeclar : m_name(std::move(name)), m_has_alignment_override(false), m_alignment_override(0), + m_offset(0), m_type_declaration(std::move(typeDeclaration)) { } diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h index f36e6aa8..77af2df3 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h @@ -3,6 +3,7 @@ #include #include +#include "Utils/ClassUtils.h" #include "TypeDeclaration.h" class Variable @@ -11,10 +12,11 @@ public: std::string m_name; bool m_has_alignment_override; unsigned m_alignment_override; + unsigned m_offset; std::unique_ptr m_type_declaration; Variable(std::string name, std::unique_ptr typeDeclaration); - unsigned GetAlignment() const; - bool GetForceAlignment() const; + _NODISCARD unsigned GetAlignment() const; + _NODISCARD bool GetForceAlignment() const; }; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp index 9eb80b88..58ef3e5f 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp @@ -13,8 +13,19 @@ class AssetStructTestsTemplate::Internal final : BaseTemplate LINE("TEST_CASE(\""<m_definition->GetFullName()<<": Tests for "<m_definition->GetFullName()<<"\", \"[assetstruct]\")") LINE("{") m_intendation++; + + for(const auto& member : structure->m_ordered_members) + { + if(!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size) + { + LINE("REQUIRE(offsetof(" << structure->m_definition->GetFullName() << ", " << member->m_member->m_name << ") == " << member->m_member->m_offset << ");") + } + } + + LINE("") + LINE("REQUIRE("<m_definition->GetSize()<<"u == sizeof("<m_definition->GetFullName()<<"));") - LINE("// REQUIRE("<m_definition->GetAlignment()<<"u == alignof("<m_definition->GetFullName()<<"));") + LINE("REQUIRE("<m_definition->GetAlignment()<<"u == alignof("<m_definition->GetFullName()<<"));") m_intendation--; LINE("}") } @@ -34,6 +45,7 @@ public: LINE("// ====================================================================") LINE("") LINE("#include ") + LINE("#include ") LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") LINE("") LINE("using namespace " << m_env.m_game << ";") diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp index af0e984b..d686ab3a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp @@ -129,6 +129,7 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito if (member->m_type_declaration->m_has_custom_bit_size) { + member->m_offset = definition->m_size + currentBitOffset / 8; currentBitOffset += member->m_type_declaration->m_custom_bit_size; } else @@ -141,6 +142,9 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito } definition->m_size = AlignmentUtils::Align(definition->m_size, member->GetForceAlignment() ? member->GetAlignment() : std::min(member->GetAlignment(), definition->m_pack)); + + member->m_offset = definition->m_size; + definition->m_size += member->m_type_declaration->GetSize(); } } @@ -165,6 +169,8 @@ bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* reposito if (!CalculateFields(repository, member->m_type_declaration.get())) return false; + member->m_offset = 0; + const auto memberSize = member->m_type_declaration->GetSize(); if (memberSize > definition->m_size) definition->m_size = memberSize;