diff --git a/src/ZoneCodeGeneratorLib/Domain/Computations/MemberComputations.h b/src/ZoneCodeGeneratorLib/Domain/Computations/MemberComputations.h index 8a9fd8a1..5ced8c26 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Computations/MemberComputations.h +++ b/src/ZoneCodeGeneratorLib/Domain/Computations/MemberComputations.h @@ -2,32 +2,35 @@ #include "Domain/Information/MemberInformation.h" +#include + class MemberComputations { - const MemberInformation* const m_info; - public: explicit MemberComputations(const MemberInformation* member); - _NODISCARD bool ShouldIgnore() const; - _NODISCARD bool ContainsNonEmbeddedReference() const; - _NODISCARD bool ContainsSinglePointerReference() const; - _NODISCARD bool ContainsArrayPointerReference() const; - _NODISCARD bool ContainsPointerArrayReference() const; - _NODISCARD bool ContainsArrayReference() const; - _NODISCARD const IEvaluation* GetArrayPointerCountEvaluation() const; - _NODISCARD bool IsArray() const; - _NODISCARD std::vector GetArraySizes() const; - _NODISCARD int GetArrayDimension() const; - _NODISCARD bool IsPointerToArray() const; - _NODISCARD std::vector GetPointerToArraySizes() const; - _NODISCARD int GetPointerDepth() const; - _NODISCARD bool IsNotInDefaultNormalBlock() const; - _NODISCARD bool IsInTempBlock() const; - _NODISCARD bool IsInRuntimeBlock() const; - _NODISCARD bool IsFirstMember() const; - _NODISCARD bool IsLastMember() const; - _NODISCARD bool HasDynamicArraySize() const; - _NODISCARD bool IsDynamicMember() const; - _NODISCARD bool IsAfterPartialLoad() const; + [[nodiscard]] bool ShouldIgnore() const; + [[nodiscard]] bool ContainsNonEmbeddedReference() const; + [[nodiscard]] bool ContainsSinglePointerReference() const; + [[nodiscard]] bool ContainsArrayPointerReference() const; + [[nodiscard]] bool ContainsPointerArrayReference() const; + [[nodiscard]] bool ContainsArrayReference() const; + [[nodiscard]] const IEvaluation* GetArrayPointerCountEvaluation() const; + [[nodiscard]] bool IsArray() const; + [[nodiscard]] std::vector GetArraySizes() const; + [[nodiscard]] int GetArrayDimension() const; + [[nodiscard]] bool IsPointerToArray() const; + [[nodiscard]] std::vector GetPointerToArraySizes() const; + [[nodiscard]] int GetPointerDepth() const; + [[nodiscard]] bool IsNotInDefaultNormalBlock() const; + [[nodiscard]] bool IsInTempBlock() const; + [[nodiscard]] bool IsInRuntimeBlock() const; + [[nodiscard]] bool IsFirstMember() const; + [[nodiscard]] bool IsLastMember() const; + [[nodiscard]] bool HasDynamicArraySize() const; + [[nodiscard]] bool IsDynamicMember() const; + [[nodiscard]] bool IsAfterPartialLoad() const; + +private: + const MemberInformation* const m_info; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Computations/MemberDeclarationModifierComputations.h b/src/ZoneCodeGeneratorLib/Domain/Computations/MemberDeclarationModifierComputations.h index 17e15532..f01bd2e1 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Computations/MemberDeclarationModifierComputations.h +++ b/src/ZoneCodeGeneratorLib/Domain/Computations/MemberDeclarationModifierComputations.h @@ -2,34 +2,36 @@ #include "Domain/Evaluation/IEvaluation.h" #include "Domain/Information/MemberInformation.h" -#include "Utils/ClassUtils.h" + +#include class DeclarationModifierComputations { - const MemberInformation* const m_information; - std::vector m_modifier_indices; - int m_combined_index; - - DeclarationModifierComputations(const MemberInformation* member, std::vector modifierIndices); - public: explicit DeclarationModifierComputations(const MemberInformation* member); - _NODISCARD DeclarationModifier* GetDeclarationModifier() const; - _NODISCARD DeclarationModifier* GetNextDeclarationModifier() const; - _NODISCARD std::vector GetFollowingDeclarationModifiers() const; - _NODISCARD std::vector GetArrayIndices() const; - _NODISCARD bool IsArray() const; - _NODISCARD int GetArraySize() const; - _NODISCARD bool HasDynamicArrayCount() const; - _NODISCARD const IEvaluation* GetDynamicArrayCountEvaluation() const; - _NODISCARD std::vector GetArrayEntries() const; - _NODISCARD bool IsSinglePointer() const; - _NODISCARD bool IsArrayPointer() const; - _NODISCARD const IEvaluation* GetArrayPointerCountEvaluation() const; - _NODISCARD bool IsPointerArray() const; - _NODISCARD const IEvaluation* GetPointerArrayCountEvaluation() const; - _NODISCARD bool IsDynamicArray() const; - _NODISCARD const IEvaluation* GetDynamicArraySizeEvaluation() const; - _NODISCARD unsigned GetAlignment() const; + [[nodiscard]] DeclarationModifier* GetDeclarationModifier() const; + [[nodiscard]] DeclarationModifier* GetNextDeclarationModifier() const; + [[nodiscard]] std::vector GetFollowingDeclarationModifiers() const; + [[nodiscard]] std::vector GetArrayIndices() const; + [[nodiscard]] bool IsArray() const; + [[nodiscard]] int GetArraySize() const; + [[nodiscard]] bool HasDynamicArrayCount() const; + [[nodiscard]] const IEvaluation* GetDynamicArrayCountEvaluation() const; + [[nodiscard]] std::vector GetArrayEntries() const; + [[nodiscard]] bool IsSinglePointer() const; + [[nodiscard]] bool IsArrayPointer() const; + [[nodiscard]] const IEvaluation* GetArrayPointerCountEvaluation() const; + [[nodiscard]] bool IsPointerArray() const; + [[nodiscard]] const IEvaluation* GetPointerArrayCountEvaluation() const; + [[nodiscard]] bool IsDynamicArray() const; + [[nodiscard]] const IEvaluation* GetDynamicArraySizeEvaluation() const; + [[nodiscard]] unsigned GetAlignment() const; + +private: + DeclarationModifierComputations(const MemberInformation* member, std::vector modifierIndices); + + const MemberInformation* const m_information; + std::vector m_modifier_indices; + int m_combined_index; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Computations/StructureComputations.h b/src/ZoneCodeGeneratorLib/Domain/Computations/StructureComputations.h index d1bbe7d6..3c1009e5 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Computations/StructureComputations.h +++ b/src/ZoneCodeGeneratorLib/Domain/Computations/StructureComputations.h @@ -4,12 +4,13 @@ class StructureComputations { - const StructureInformation* const m_info; - public: explicit StructureComputations(const StructureInformation* structure); - _NODISCARD bool IsAsset() const; - _NODISCARD MemberInformation* GetDynamicMember() const; - _NODISCARD std::vector GetUsedMembers() const; + [[nodiscard]] bool IsAsset() const; + [[nodiscard]] MemberInformation* GetDynamicMember() const; + [[nodiscard]] std::vector GetUsedMembers() const; + +private: + const StructureInformation* m_info; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ArrayDeclarationModifier.h b/src/ZoneCodeGeneratorLib/Domain/Definition/ArrayDeclarationModifier.h index 152ffc87..93af220a 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ArrayDeclarationModifier.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ArrayDeclarationModifier.h @@ -2,13 +2,16 @@ #include "DeclarationModifier.h" #include "Domain/Evaluation/IEvaluation.h" -#include "Utils/ClassUtils.h" #include class ArrayDeclarationModifier final : public DeclarationModifier { public: + explicit ArrayDeclarationModifier(int size); + + [[nodiscard]] DeclarationModifierType GetType() const override; + int m_size; /** @@ -20,8 +23,4 @@ public: * \brief The array has a size that is given by \c m_size but only a certain dynamic amount is handled by generated count. */ std::unique_ptr m_dynamic_count_evaluation; - - explicit ArrayDeclarationModifier(int size); - - _NODISCARD DeclarationModifierType GetType() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h index 7a10733f..9eb7a2b9 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h @@ -4,17 +4,6 @@ class BaseTypeDefinition final : public DataDefinition { public: - const unsigned m_size; - -private: - BaseTypeDefinition(std::string name, unsigned size); - -public: - _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() const override; - _NODISCARD bool GetForceAlignment() const override; - _NODISCARD unsigned GetSize() const override; - static const BaseTypeDefinition* const FLOAT; static const BaseTypeDefinition* const DOUBLE; static const BaseTypeDefinition* const BOOL; @@ -32,4 +21,14 @@ public: static const BaseTypeDefinition* const ALL_BASE_TYPES[]; static const size_t ALL_BASE_TYPES_COUNT; + + [[nodiscard]] DataDefinitionType GetType() const override; + [[nodiscard]] unsigned GetAlignment() const override; + [[nodiscard]] bool GetForceAlignment() const override; + [[nodiscard]] unsigned GetSize() const override; + + const unsigned m_size; + +private: + BaseTypeDefinition(std::string name, unsigned size); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h index 3b613414..b696e9b7 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h @@ -25,13 +25,13 @@ public: DataDefinition& operator=(const DataDefinition& other) = default; DataDefinition& operator=(DataDefinition&& other) noexcept = default; + [[nodiscard]] virtual DataDefinitionType GetType() const = 0; + [[nodiscard]] virtual unsigned GetAlignment() const = 0; + [[nodiscard]] virtual bool GetForceAlignment() const = 0; + [[nodiscard]] virtual unsigned GetSize() const = 0; + + [[nodiscard]] std::string GetFullName() const; + std::string m_namespace; std::string m_name; - - _NODISCARD virtual DataDefinitionType GetType() const = 0; - _NODISCARD virtual unsigned GetAlignment() const = 0; - _NODISCARD virtual bool GetForceAlignment() const = 0; - _NODISCARD virtual unsigned GetSize() const = 0; - - _NODISCARD std::string GetFullName() const; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DeclarationModifier.h b/src/ZoneCodeGeneratorLib/Domain/Definition/DeclarationModifier.h index 13abdb35..86ea7049 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DeclarationModifier.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DeclarationModifier.h @@ -18,5 +18,5 @@ public: DeclarationModifier& operator=(const DeclarationModifier& other) = default; DeclarationModifier& operator=(DeclarationModifier&& other) noexcept = default; - _NODISCARD virtual DeclarationModifierType GetType() const = 0; + [[nodiscard]] virtual DeclarationModifierType GetType() const = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp index 9a1f1041..ea716b06 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp @@ -14,26 +14,6 @@ DefinitionWithMembers::DefinitionWithMembers(std::string _namespace, std::string { } -// void DefinitionWithMembers::CalculateAlignment() -//{ -// if (m_has_alignment_override) -// { -// m_flags |= FLAG_ALIGNMENT_FORCED; -// m_alignment = m_alignment_override; -// } -// else -// { -// m_alignment = 0; -// for (const auto& member : m_members) -// { -// const auto memberAlignment = member->GetAlignment(); -// if (memberAlignment > m_alignment) -// m_alignment = memberAlignment; -// } -// } -// m_flags |= FLAG_ALIGNMENT_CALCULATED; -// } - unsigned DefinitionWithMembers::GetAlignment() const { assert(m_flags & FLAG_FIELDS_CALCULATED); diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h index 8e2e5837..56ae9c0a 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h @@ -13,6 +13,12 @@ public: static constexpr int FLAG_FIELDS_CALCULATING = 1 << 1; static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 2; + DefinitionWithMembers(std::string _namespace, std::string name, unsigned pack); + + [[nodiscard]] unsigned GetAlignment() const override; + [[nodiscard]] bool GetForceAlignment() const override; + [[nodiscard]] unsigned GetSize() const override; + unsigned m_flags; unsigned m_size; unsigned m_alignment; @@ -24,10 +30,4 @@ public: unsigned m_alignment_override; std::vector> m_members; - - DefinitionWithMembers(std::string _namespace, std::string name, unsigned pack); - - _NODISCARD unsigned GetAlignment() const override; - _NODISCARD bool GetForceAlignment() const override; - _NODISCARD unsigned GetSize() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h index 6dbb0803..df45f951 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h @@ -10,15 +10,15 @@ class EnumDefinition final : public DataDefinition { public: - const BaseTypeDefinition* m_parent_type; - std::vector> m_members; - EnumDefinition(std::string _namespace, std::string name, const BaseTypeDefinition* parentType); - _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() const override; - _NODISCARD bool GetForceAlignment() const override; - _NODISCARD unsigned GetSize() const override; + [[nodiscard]] DataDefinitionType GetType() const override; + [[nodiscard]] unsigned GetAlignment() const override; + [[nodiscard]] bool GetForceAlignment() const override; + [[nodiscard]] unsigned GetSize() const override; void AddEnumMember(EnumMember enumMember); + + const BaseTypeDefinition* m_parent_type; + std::vector> m_members; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumMember.h b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumMember.h index a11ea392..ec2ca561 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumMember.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumMember.h @@ -5,9 +5,9 @@ class EnumMember { public: - std::string m_name; - int m_value; - EnumMember(); EnumMember(std::string name, int value); + + std::string m_name; + int m_value; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h index 89283ae7..c0c2a0f0 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h @@ -5,13 +5,13 @@ class ForwardDeclaration final : public DataDefinition { public: - const DataDefinitionType m_forwarded_type; - const DataDefinition* m_definition; - ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type); - _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() const override; - _NODISCARD bool GetForceAlignment() const override; - _NODISCARD unsigned GetSize() const override; + [[nodiscard]] DataDefinitionType GetType() const override; + [[nodiscard]] unsigned GetAlignment() const override; + [[nodiscard]] bool GetForceAlignment() const override; + [[nodiscard]] unsigned GetSize() const override; + + const DataDefinitionType m_forwarded_type; + const DataDefinition* m_definition; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/PointerDeclarationModifier.h b/src/ZoneCodeGeneratorLib/Domain/Definition/PointerDeclarationModifier.h index b2dc8905..36dd5261 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/PointerDeclarationModifier.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/PointerDeclarationModifier.h @@ -8,19 +8,19 @@ class PointerDeclarationModifier final : public DeclarationModifier { - static const IEvaluation* const DEFAULT_COUNT; - - static bool EvaluationIsArray(const IEvaluation* evaluation); - public: + [[nodiscard]] DeclarationModifierType GetType() const override; + [[nodiscard]] const IEvaluation* GetCountEvaluation() const; + [[nodiscard]] const IEvaluation* GetCountEvaluationForArrayIndex(int index); + + [[nodiscard]] bool CountEvaluationIsArray() const; + [[nodiscard]] bool CountEvaluationIsArray(int index) const; + [[nodiscard]] bool AnyCountEvaluationIsArray() const; + std::unique_ptr m_count_evaluation; std::vector> m_count_evaluation_by_array_index; - _NODISCARD DeclarationModifierType GetType() const override; - _NODISCARD const IEvaluation* GetCountEvaluation() const; - _NODISCARD const IEvaluation* GetCountEvaluationForArrayIndex(int index); - - _NODISCARD bool CountEvaluationIsArray() const; - _NODISCARD bool CountEvaluationIsArray(int index) const; - _NODISCARD bool AnyCountEvaluationIsArray() const; +private: + static const IEvaluation* const DEFAULT_COUNT; + static bool EvaluationIsArray(const IEvaluation* evaluation); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h index 41d89c61..8b90f4b5 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h @@ -7,5 +7,5 @@ class StructDefinition final : public DefinitionWithMembers public: StructDefinition(std::string _namespace, std::string name, int pack); - _NODISCARD DataDefinitionType GetType() const override; + [[nodiscard]] DataDefinitionType GetType() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/TypeDeclaration.h b/src/ZoneCodeGeneratorLib/Domain/Definition/TypeDeclaration.h index 157ae164..e1a77eeb 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/TypeDeclaration.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/TypeDeclaration.h @@ -13,21 +13,21 @@ public: static constexpr int FLAG_FIELDS_CALCULATED = 1 << 0; static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 1; - unsigned m_flags; - unsigned m_size; - unsigned m_alignment; - explicit TypeDeclaration(const DataDefinition* type); + [[nodiscard]] unsigned GetSize() const; + [[nodiscard]] unsigned GetAlignment() const; + [[nodiscard]] bool GetForceAlignment() const; + + std::vector> m_declaration_modifiers; + bool m_is_const; bool m_has_custom_bit_size; const DataDefinition* m_type; unsigned m_custom_bit_size; - std::vector> m_declaration_modifiers; - - _NODISCARD unsigned GetSize() const; - _NODISCARD unsigned GetAlignment() const; - _NODISCARD bool GetForceAlignment() const; + unsigned m_flags; + unsigned m_size; + unsigned m_alignment; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h index 036fbd02..55e62def 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h @@ -6,14 +6,14 @@ class TypedefDefinition final : public DataDefinition { public: + TypedefDefinition(std::string _namespace, std::string name, std::unique_ptr typeDeclaration); + + [[nodiscard]] DataDefinitionType GetType() const override; + [[nodiscard]] unsigned GetAlignment() const override; + [[nodiscard]] bool GetForceAlignment() const override; + [[nodiscard]] unsigned GetSize() const override; + bool m_has_alignment_override; unsigned m_alignment_override; std::unique_ptr m_type_declaration; - - TypedefDefinition(std::string _namespace, std::string name, std::unique_ptr typeDeclaration); - - _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() const override; - _NODISCARD bool GetForceAlignment() const override; - _NODISCARD unsigned GetSize() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h index a3181c44..bf5e2cb3 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h @@ -4,11 +4,8 @@ class UnionDefinition final : public DefinitionWithMembers { - // protected: - // void CalculateSize() override; - public: UnionDefinition(std::string _namespace, std::string name, int pack); - _NODISCARD DataDefinitionType GetType() const override; + [[nodiscard]] DataDefinitionType GetType() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h index 853b06a6..82611685 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/Variable.h @@ -9,14 +9,14 @@ class Variable { public: + Variable(std::string name, std::unique_ptr typeDeclaration); + + [[nodiscard]] unsigned GetAlignment() const; + [[nodiscard]] bool GetForceAlignment() const; + 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); - - _NODISCARD unsigned GetAlignment() const; - _NODISCARD bool GetForceAlignment() const; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Evaluation/IEvaluation.h b/src/ZoneCodeGeneratorLib/Domain/Evaluation/IEvaluation.h index cd394730..e68fed86 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Evaluation/IEvaluation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Evaluation/IEvaluation.h @@ -1,7 +1,5 @@ #pragma once -#include "Utils/ClassUtils.h" - enum class EvaluationType { OPERAND_DYNAMIC, @@ -20,7 +18,7 @@ public: IEvaluation& operator=(const IEvaluation& other) = default; IEvaluation& operator=(IEvaluation&& other) noexcept = default; - _NODISCARD virtual EvaluationType GetType() const = 0; - _NODISCARD virtual bool IsStatic() const = 0; - _NODISCARD virtual int EvaluateNumeric() const = 0; + [[nodiscard]] virtual EvaluationType GetType() const = 0; + [[nodiscard]] virtual bool IsStatic() const = 0; + [[nodiscard]] virtual int EvaluateNumeric() const = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandDynamic.h b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandDynamic.h index 96bd8c4a..1a4d19f4 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandDynamic.h +++ b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandDynamic.h @@ -9,16 +9,16 @@ class OperandDynamic final : public IEvaluation { public: - StructureInformation* const m_structure; - std::vector m_referenced_member_chain; - std::vector> m_array_indices; - explicit OperandDynamic(StructureInformation* structure); OperandDynamic(StructureInformation* structure, std::vector referencedMemberChain, std::vector> arrayIndices); - _NODISCARD EvaluationType GetType() const override; - _NODISCARD bool IsStatic() const override; - _NODISCARD int EvaluateNumeric() const override; + [[nodiscard]] EvaluationType GetType() const override; + [[nodiscard]] bool IsStatic() const override; + [[nodiscard]] int EvaluateNumeric() const override; + + StructureInformation* const m_structure; + std::vector m_referenced_member_chain; + std::vector> m_array_indices; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandStatic.h b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandStatic.h index 9d1b6770..94d2dbd4 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandStatic.h +++ b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperandStatic.h @@ -6,13 +6,13 @@ class OperandStatic final : public IEvaluation { public: - const int m_value; - EnumMember* const m_enum_member; - explicit OperandStatic(int value); explicit OperandStatic(EnumMember* enumMember); - _NODISCARD EvaluationType GetType() const override; - _NODISCARD bool IsStatic() const override; - _NODISCARD int EvaluateNumeric() const override; + [[nodiscard]] EvaluationType GetType() const override; + [[nodiscard]] bool IsStatic() const override; + [[nodiscard]] int EvaluateNumeric() const override; + + const int m_value; + EnumMember* const m_enum_member; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Evaluation/Operation.h b/src/ZoneCodeGeneratorLib/Domain/Evaluation/Operation.h index c428517d..5cc43245 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Evaluation/Operation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Evaluation/Operation.h @@ -9,17 +9,17 @@ class Operation final : public IEvaluation { public: - const OperationType* const m_operation_type; - std::unique_ptr m_operand1; - std::unique_ptr m_operand2; - explicit Operation(const OperationType* type); Operation(const OperationType* type, std::unique_ptr operand1, std::unique_ptr operand2); - _NODISCARD EvaluationType GetType() const override; - _NODISCARD bool IsStatic() const override; - _NODISCARD int EvaluateNumeric() const override; + [[nodiscard]] EvaluationType GetType() const override; + [[nodiscard]] bool IsStatic() const override; + [[nodiscard]] int EvaluateNumeric() const override; - _NODISCARD bool Operand1NeedsParenthesis() const; - _NODISCARD bool Operand2NeedsParenthesis() const; + [[nodiscard]] bool Operand1NeedsParenthesis() const; + [[nodiscard]] bool Operand2NeedsParenthesis() const; + + const OperationType* const m_operation_type; + std::unique_ptr m_operand1; + std::unique_ptr m_operand2; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperationType.h b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperationType.h index 30a2b33e..f30a89dc 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperationType.h +++ b/src/ZoneCodeGeneratorLib/Domain/Evaluation/OperationType.h @@ -20,14 +20,6 @@ enum class OperationPrecedence class OperationType { -public: - std::string m_syntax; - OperationPrecedence m_precedence; - std::function m_evaluation_function; - -private: - OperationType(std::string syntax, OperationPrecedence precedence, std::function evaluationFunction); - public: static const OperationType* const OPERATION_ADD; static const OperationType* const OPERATION_SUBTRACT; @@ -49,4 +41,11 @@ public: static const OperationType* const OPERATION_OR; static const OperationType* const ALL_OPERATION_TYPES[]; + + std::string m_syntax; + OperationPrecedence m_precedence; + std::function m_evaluation_function; + +private: + OperationType(std::string syntax, OperationPrecedence precedence, std::function evaluationFunction); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Extension/CustomAction.h b/src/ZoneCodeGeneratorLib/Domain/Extension/CustomAction.h index 5710eb6e..0632c419 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Extension/CustomAction.h +++ b/src/ZoneCodeGeneratorLib/Domain/Extension/CustomAction.h @@ -8,8 +8,8 @@ class CustomAction { public: + CustomAction(std::string actionName, std::vector parameterTypes); + std::string m_action_name; std::vector m_parameter_types; - - CustomAction(std::string actionName, std::vector parameterTypes); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/FastFile/FastFileBlock.h b/src/ZoneCodeGeneratorLib/Domain/FastFile/FastFileBlock.h index 10005f70..f0b95cd1 100644 --- a/src/ZoneCodeGeneratorLib/Domain/FastFile/FastFileBlock.h +++ b/src/ZoneCodeGeneratorLib/Domain/FastFile/FastFileBlock.h @@ -13,10 +13,10 @@ enum class FastFileBlockType class FastFileBlock { public: + FastFileBlock(std::string name, unsigned index, FastFileBlockType type, bool isDefault); + std::string m_name; unsigned m_index; FastFileBlockType m_type; bool m_is_default; - - FastFileBlock(std::string name, unsigned index, FastFileBlockType type, bool isDefault); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h index d0b94ea7..fb5699e3 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h @@ -12,6 +12,8 @@ class StructureInformation; class MemberInformation { public: + MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member); + StructureInformation* m_parent; StructureInformation* m_type; Variable* m_member; @@ -24,6 +26,4 @@ public: std::unique_ptr m_post_load_action; const FastFileBlock* m_fast_file_block; const EnumMember* m_asset_ref; - - MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h index 64f448f5..301c9098 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -5,13 +5,17 @@ #include "Domain/Extension/CustomAction.h" #include "Domain/FastFile/FastFileBlock.h" #include "MemberInformation.h" -#include "Utils/ClassUtils.h" + +#include +#include class MemberInformation; class StructureInformation { public: + explicit StructureInformation(DefinitionWithMembers* definition); + DefinitionWithMembers* const m_definition; EnumMember* m_asset_enum_entry; @@ -31,6 +35,4 @@ public: std::unique_ptr m_post_load_action; const FastFileBlock* m_block; std::vector m_name_chain; - - explicit StructureInformation(DefinitionWithMembers* definition); }; diff --git a/src/ZoneCodeGeneratorLib/Generating/CodeGenerator.h b/src/ZoneCodeGeneratorLib/Generating/CodeGenerator.h index 5630725b..8c24f10f 100644 --- a/src/ZoneCodeGeneratorLib/Generating/CodeGenerator.h +++ b/src/ZoneCodeGeneratorLib/Generating/CodeGenerator.h @@ -3,21 +3,24 @@ #include "ICodeTemplate.h" #include "ZoneCodeGeneratorArguments.h" +#include +#include #include class CodeGenerator { - const ZoneCodeGeneratorArguments* m_args; +public: + explicit CodeGenerator(const ZoneCodeGeneratorArguments* args); - std::unordered_map> m_template_mapping; + bool GenerateCode(IDataRepository* repository); +private: void SetupTemplates(); bool GenerateCodeForTemplate(RenderingContext* context, ICodeTemplate* codeTemplate) const; static bool GetAssetWithName(IDataRepository* repository, const std::string& name, StructureInformation*& asset); -public: - explicit CodeGenerator(const ZoneCodeGeneratorArguments* args); + const ZoneCodeGeneratorArguments* m_args; - bool GenerateCode(IDataRepository* repository); + std::unordered_map> m_template_mapping; }; diff --git a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h index 01a28483..06ba68cb 100644 --- a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h +++ b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h @@ -10,6 +10,8 @@ class RenderingUsedType { public: + RenderingUsedType(const DataDefinition* type, StructureInformation* info); + bool m_members_loaded; const DataDefinition* m_type; StructureInformation* m_info; @@ -20,25 +22,13 @@ public: bool m_array_reference_exists; bool m_pointer_array_reference_exists; bool m_pointer_array_reference_is_reusable; - - RenderingUsedType(const DataDefinition* type, StructureInformation* info); }; class RenderingContext { - std::unordered_map> m_used_types_lookup; - - RenderingContext(std::string game, std::vector fastFileBlocks); - - RenderingUsedType* AddUsedType(std::unique_ptr usedType); - RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); - void AddMembersToContext(const IDataRepository* repository, StructureInformation* info); - void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); - void MakeAsset(const IDataRepository* repository, StructureInformation* asset); - void CreateUsedTypeCollections(); - bool UsedTypeHasActions(const RenderingUsedType* usedType) const; - public: + static std::unique_ptr BuildContext(const IDataRepository* repository, StructureInformation* asset); + std::string m_game; std::vector m_blocks; @@ -52,5 +42,16 @@ public: const FastFileBlock* m_default_normal_block; const FastFileBlock* m_default_temp_block; - static std::unique_ptr BuildContext(const IDataRepository* repository, StructureInformation* asset); +private: + RenderingContext(std::string game, std::vector fastFileBlocks); + + RenderingUsedType* AddUsedType(std::unique_ptr usedType); + RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); + void AddMembersToContext(const IDataRepository* repository, StructureInformation* info); + void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); + void MakeAsset(const IDataRepository* repository, StructureInformation* asset); + void CreateUsedTypeCollections(); + bool UsedTypeHasActions(const RenderingUsedType* usedType) const; + + std::unordered_map> m_used_types_lookup; }; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp index d3e57b0c..bb2bb11e 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp @@ -6,69 +6,75 @@ #include #include -class AssetStructTestsTemplate::Internal final : BaseTemplate +namespace { - void TestMethod(StructureInformation* structure) - { - LINE("TEST_CASE(\"" << m_env.m_game << "::" << m_env.m_asset->m_definition->GetFullName() << ": Tests for " << structure->m_definition->GetFullName() - << "\", \"[assetstruct]\")") - LINE("{") - m_intendation++; + static constexpr int TAG_SOURCE = 1; - for (const auto& member : structure->m_ordered_members) + class Template final : BaseTemplate + { + public: + Template(std::ostream& stream, RenderingContext* context) + : BaseTemplate(stream, context) { - if (!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size) + } + + void Source() + { + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify.") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#include ") + LINE("#include ") + LINE("#include ") + LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") + LINE("") + LINE("using namespace " << m_env.m_game << ";") + LINE("") + LINE("namespace game::" << m_env.m_game << "::xassets::asset_" << Lower(m_env.m_asset->m_definition->m_name)) + LINE("{") + m_intendation++; + + TestMethod(m_env.m_asset); + for (auto* structure : m_env.m_used_structures) { - LINE("REQUIRE(offsetof(" << structure->m_definition->GetFullName() << ", " << member->m_member->m_name << ") == " << member->m_member->m_offset - << ");") + StructureComputations computations(structure->m_info); + if (!structure->m_info->m_definition->m_anonymous && !computations.IsAsset()) + TestMethod(structure->m_info); } + + m_intendation--; + LINE("}") } - LINE("") - - LINE("REQUIRE(" << structure->m_definition->GetSize() << "u == sizeof(" << structure->m_definition->GetFullName() << "));") - LINE("REQUIRE(" << structure->m_definition->GetAlignment() << "u == alignof(" << structure->m_definition->GetFullName() << "));") - m_intendation--; - LINE("}") - } - -public: - Internal(std::ostream& stream, RenderingContext* context) - : BaseTemplate(stream, context) - { - } - - void Source() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify.") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#include ") - LINE("#include ") - LINE("#include ") - LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") - LINE("") - LINE("using namespace " << m_env.m_game << ";") - LINE("") - LINE("namespace game::" << m_env.m_game << "::xassets::asset_" << Lower(m_env.m_asset->m_definition->m_name)) - LINE("{") - m_intendation++; - - TestMethod(m_env.m_asset); - for (auto* structure : m_env.m_used_structures) + private: + void TestMethod(StructureInformation* structure) { - StructureComputations computations(structure->m_info); - if (!structure->m_info->m_definition->m_anonymous && !computations.IsAsset()) - TestMethod(structure->m_info); - } + LINE("TEST_CASE(\"" << m_env.m_game << "::" << m_env.m_asset->m_definition->GetFullName() << ": Tests for " + << structure->m_definition->GetFullName() << "\", \"[assetstruct]\")") + LINE("{") + m_intendation++; - m_intendation--; - LINE("}") - } -}; + 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(" << structure->m_definition->GetSize() << "u == sizeof(" << structure->m_definition->GetFullName() << "));") + LINE("REQUIRE(" << structure->m_definition->GetAlignment() << "u == alignof(" << structure->m_definition->GetFullName() << "));") + m_intendation--; + LINE("}") + } + }; +} // namespace std::vector AssetStructTestsTemplate::GetFilesToRender(RenderingContext* context) { @@ -89,10 +95,10 @@ std::vector AssetStructTestsTemplate::GetFilesToRender(Renderi void AssetStructTestsTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) { - Internal internal(stream, context); + Template t(stream, context); if (fileTag == TAG_SOURCE) - internal.Source(); + t.Source(); else std::cout << "Invalid tag in AssetStructTestsTemplate\n"; } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.h index d5d9ba84..3a0f1879 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.h @@ -3,10 +3,6 @@ class AssetStructTestsTemplate final : public ICodeTemplate { - static constexpr int TAG_SOURCE = 1; - - class Internal; - public: std::vector GetFilesToRender(RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h index 446c9423..74296029 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h @@ -15,27 +15,10 @@ class BaseTemplate protected: static constexpr const char* INTENDATION = " "; - std::ostream& m_out; - RenderingContext& m_env; - unsigned m_intendation; - BaseTemplate(std::ostream& stream, RenderingContext* context); void DoIntendation() const; -private: - static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str); - static void MakeTypeVarNameInternal(const DataDefinition* def, std::ostringstream& str); - static void MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str); - static void MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); - static void MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); - static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str); - static void MakeOperandStatic(const OperandStatic* op, std::ostringstream& str); - static void MakeOperandDynamic(const OperandDynamic* op, std::ostringstream& str); - static void MakeOperation(const Operation* operation, std::ostringstream& str); - static void MakeEvaluationInternal(const IEvaluation* evaluation, std::ostringstream& str); - -protected: static std::string Upper(std::string str); static std::string Lower(std::string str); static std::string MakeTypeVarName(const DataDefinition* def); @@ -55,6 +38,22 @@ protected: static std::string MakeCustomActionCall(CustomAction* action); static std::string MakeArrayCount(const ArrayDeclarationModifier* arrayModifier); static std::string MakeEvaluation(const IEvaluation* evaluation); + + std::ostream& m_out; + RenderingContext& m_env; + unsigned m_intendation; + +private: + static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypeVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str); + static void MakeOperandStatic(const OperandStatic* op, std::ostringstream& str); + static void MakeOperandDynamic(const OperandDynamic* op, std::ostringstream& str); + static void MakeOperation(const Operation* operation, std::ostringstream& str); + static void MakeEvaluationInternal(const IEvaluation* evaluation, std::ostringstream& str); }; #define LINE(x) \ diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index b627cf5b..53064960 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -8,171 +8,816 @@ #include #include -class ZoneLoadTemplate::Internal final : BaseTemplate +namespace { - enum class MemberLoadType - { - ARRAY_POINTER, - DYNAMIC_ARRAY, - EMBEDDED, - EMBEDDED_ARRAY, - POINTER_ARRAY, - SINGLE_POINTER - }; + static constexpr int TAG_HEADER = 1; + static constexpr int TAG_SOURCE = 2; - static std::string LoaderClassName(StructureInformation* asset) + class Template final : BaseTemplate { - std::ostringstream str; - str << "Loader_" << asset->m_definition->m_name; - return str.str(); - } - - static std::string MarkerClassName(StructureInformation* asset) - { - std::ostringstream str; - str << "Marker_" << asset->m_definition->m_name; - return str.str(); - } - - static std::string VariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; - return str.str(); - } - - static std::string PointerVariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; - return str.str(); - } - - void PrintHeaderPtrArrayLoadMethodDeclaration(const DataDefinition* def) const - { - LINE("void LoadPtrArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") - } - - void PrintHeaderArrayLoadMethodDeclaration(const DataDefinition* def) const - { - LINE("void LoadArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") - } - - void PrintHeaderLoadMethodDeclaration(const StructureInformation* info) const - { - LINE("void Load_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") - } - - void PrintHeaderTempPtrLoadMethodDeclaration(const StructureInformation* info) const - { - LINE("void LoadPtr_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") - } - - void PrintHeaderAssetLoadMethodDeclaration(const StructureInformation* info) const - { - LINE("void LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << info->m_definition->GetFullName() << "** pAsset);") - } - - void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const - { - LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") - } - - void PrintHeaderMainLoadMethodDeclaration(const StructureInformation* info) const - { - LINE("XAssetInfo<" << info->m_definition->GetFullName() << ">* Load(" << info->m_definition->GetFullName() << "** pAsset);") - } - - void PrintHeaderConstructor() const - { - LINE(LoaderClassName(m_env.m_asset) << "(Zone* zone, IZoneInputStream* stream);") - } - - void PrintVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << " = nullptr;") - } - - void PrintPointerVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << "Ptr = nullptr;") - } - - void PrintConstructorMethod() - { - LINE(LoaderClassName(m_env.m_asset) << "::" << LoaderClassName(m_env.m_asset) << "(Zone* zone, IZoneInputStream* stream)") - - m_intendation++; - LINE_START(": AssetLoader(" << m_env.m_asset->m_asset_enum_entry->m_name << ", zone, stream)") - if (m_env.m_has_actions) + public: + Template(std::ostream& stream, RenderingContext* context) + : BaseTemplate(stream, context) { - LINE_MIDDLE(", m_actions(zone)") } - LINE_END("") - m_intendation--; - LINE("{") - m_intendation++; - - LINE("m_asset_info = nullptr;") - PrintVariableInitialization(m_env.m_asset->m_definition); - PrintPointerVariableInitialization(m_env.m_asset->m_definition); - LINE("") - - for (auto* type : m_env.m_used_types) + void Header() { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#pragma once") + LINE("") + LINE("#include \"Loading/AssetLoader.h\"") + LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") + if (m_env.m_has_actions) { - PrintVariableInitialization(type->m_type); + LINE("#include \"Game/" << m_env.m_game << "/XAssets/" << Lower(m_env.m_asset->m_definition->m_name) << "/" + << Lower(m_env.m_asset->m_definition->m_name) << "_actions.h\"") } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + LINE("#include ") + LINE("") + LINE("namespace " << m_env.m_game) + LINE("{") + m_intendation++; + LINE("class " << LoaderClassName(m_env.m_asset) << " final : public AssetLoader") + LINE("{") + m_intendation++; + + LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* m_asset_info;") + if (m_env.m_has_actions) { - PrintPointerVariableInitialization(type->m_type); + LINE("Actions_" << m_env.m_asset->m_definition->m_name << " m_actions;") + } + LINE(VariableDecl(m_env.m_asset->m_definition)) + LINE(PointerVariableDecl(m_env.m_asset->m_definition)) + LINE("") + + // Variable Declarations: type varType; + for (auto* type : m_env.m_used_types) + { + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + LINE(VariableDecl(type->m_type)) + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + LINE(PointerVariableDecl(type->m_type)) + } + } + + LINE("") + + // Method Declarations + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists) + { + PrintHeaderPtrArrayLoadMethodDeclaration(type->m_type); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + { + PrintHeaderArrayLoadMethodDeclaration(type->m_type); + } + } + for (auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + PrintHeaderLoadMethodDeclaration(type->m_info); + } + } + PrintHeaderLoadMethodDeclaration(m_env.m_asset); + PrintHeaderTempPtrLoadMethodDeclaration(m_env.m_asset); + PrintHeaderAssetLoadMethodDeclaration(m_env.m_asset); + LINE("") + m_intendation--; + LINE("public:") + m_intendation++; + PrintHeaderConstructor(); + PrintHeaderMainLoadMethodDeclaration(m_env.m_asset); + PrintHeaderGetNameMethodDeclaration(m_env.m_asset); + + m_intendation--; + LINE("};") + m_intendation--; + LINE("}") + } + + void Source() + { + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_load_db.h\"") + LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"") + LINE("#include ") + LINE("#include ") + LINE("") + + if (!m_env.m_referenced_assets.empty()) + { + LINE("// Referenced Assets:") + for (auto* type : m_env.m_referenced_assets) + { + LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_load_db.h\"") + } + LINE("") + } + LINE("using namespace " << m_env.m_game << ";") + LINE("") + PrintConstructorMethod(); + + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists) + { + LINE("") + PrintLoadPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + { + LINE("") + PrintLoadArrayMethod(type->m_type, type->m_info); + } + } + for (auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + LINE("") + PrintLoadMethod(type->m_info); + } + } + LINE("") + PrintLoadMethod(m_env.m_asset); + LINE("") + PrintLoadPtrMethod(m_env.m_asset); + LINE("") + PrintLoadAssetMethod(m_env.m_asset); + LINE("") + PrintMainLoadMethod(); + LINE("") + PrintGetNameMethod(); + } + + private: + enum class MemberLoadType + { + ARRAY_POINTER, + DYNAMIC_ARRAY, + EMBEDDED, + EMBEDDED_ARRAY, + POINTER_ARRAY, + SINGLE_POINTER + }; + + static std::string LoaderClassName(StructureInformation* asset) + { + std::ostringstream str; + str << "Loader_" << asset->m_definition->m_name; + return str.str(); + } + + static std::string MarkerClassName(StructureInformation* asset) + { + std::ostringstream str; + str << "Marker_" << asset->m_definition->m_name; + return str.str(); + } + + static std::string VariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; + return str.str(); + } + + static std::string PointerVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; + return str.str(); + } + + void PrintHeaderPtrArrayLoadMethodDeclaration(const DataDefinition* def) const + { + LINE("void LoadPtrArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") + } + + void PrintHeaderArrayLoadMethodDeclaration(const DataDefinition* def) const + { + LINE("void LoadArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") + } + + void PrintHeaderLoadMethodDeclaration(const StructureInformation* info) const + { + LINE("void Load_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") + } + + void PrintHeaderTempPtrLoadMethodDeclaration(const StructureInformation* info) const + { + LINE("void LoadPtr_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") + } + + void PrintHeaderAssetLoadMethodDeclaration(const StructureInformation* info) const + { + LINE("void LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << info->m_definition->GetFullName() << "** pAsset);") + } + + void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const + { + LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") + } + + void PrintHeaderMainLoadMethodDeclaration(const StructureInformation* info) const + { + LINE("XAssetInfo<" << info->m_definition->GetFullName() << ">* Load(" << info->m_definition->GetFullName() << "** pAsset);") + } + + void PrintHeaderConstructor() const + { + LINE(LoaderClassName(m_env.m_asset) << "(Zone* zone, IZoneInputStream* stream);") + } + + void PrintVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << " = nullptr;") + } + + void PrintPointerVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "Ptr = nullptr;") + } + + void PrintConstructorMethod() + { + LINE(LoaderClassName(m_env.m_asset) << "::" << LoaderClassName(m_env.m_asset) << "(Zone* zone, IZoneInputStream* stream)") + + m_intendation++; + LINE_START(": AssetLoader(" << m_env.m_asset->m_asset_enum_entry->m_name << ", zone, stream)") + if (m_env.m_has_actions) + { + LINE_MIDDLE(", m_actions(zone)") + } + LINE_END("") + m_intendation--; + + LINE("{") + m_intendation++; + + LINE("m_asset_info = nullptr;") + PrintVariableInitialization(m_env.m_asset->m_definition); + PrintPointerVariableInitialization(m_env.m_asset->m_definition); + LINE("") + + for (auto* type : m_env.m_used_types) + { + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + PrintVariableInitialization(type->m_type); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + PrintPointerVariableInitialization(type->m_type); + } + } + + m_intendation--; + LINE("}") + } + + void PrintLoadPtrArrayMethod_Loading(const DataDefinition* def, StructureInformation* info) const + { + LINE("*" << MakeTypePtrVarName(def) << " = m_stream->Alloc<" << def->GetFullName() << ">(" << def->GetAlignment() << ");") + + if (info && !info->m_is_leaf) + { + LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") + LINE("Load_" << MakeSafeTypeName(def) << "(true);") + } + else + { + LINE("m_stream->Load<" << def->GetFullName() << ">(*" << MakeTypePtrVarName(def) << ");") } } - m_intendation--; - LINE("}") - } - - void PrintLoadPtrArrayMethod_Loading(const DataDefinition* def, StructureInformation* info) const - { - LINE("*" << MakeTypePtrVarName(def) << " = m_stream->Alloc<" << def->GetFullName() << ">(" << def->GetAlignment() << ");") - - if (info && !info->m_is_leaf) + void PrintLoadPtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) { - LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") - LINE("Load_" << MakeSafeTypeName(def) << "(true);") - } - else - { - LINE("m_stream->Load<" << def->GetFullName() << ">(*" << MakeTypePtrVarName(def) << ");") - } - } + LINE("if (*" << MakeTypePtrVarName(def) << ")") + LINE("{") + m_intendation++; - void PrintLoadPtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("if (*" << MakeTypePtrVarName(def) << ")") - LINE("{") - m_intendation++; - - if (info && StructureComputations(info).IsAsset()) - { - LINE(LoaderClassName(info) << " loader(m_zone, m_stream);") - LINE("loader.Load(" << MakeTypePtrVarName(def) << ");") - } - else - { - if (reusable) + if (info && StructureComputations(info).IsAsset()) { - LINE("if(*" << MakeTypePtrVarName(def) << " == PTR_FOLLOWING)") + LINE(LoaderClassName(info) << " loader(m_zone, m_stream);") + LINE("loader.Load(" << MakeTypePtrVarName(def) << ");") + } + else + { + if (reusable) + { + LINE("if(*" << MakeTypePtrVarName(def) << " == PTR_FOLLOWING)") + LINE("{") + m_intendation++; + + PrintLoadPtrArrayMethod_Loading(def, info); + + m_intendation--; + LINE("}") + LINE("else") + LINE("{") + m_intendation++; + + LINE("*" << MakeTypePtrVarName(def) << " = m_stream->ConvertOffsetToPointer(*" << MakeTypePtrVarName(def) << ");") + + m_intendation--; + LINE("}") + } + else + { + PrintLoadPtrArrayMethod_Loading(def, info); + } + } + + m_intendation--; + LINE("}") + } + + void PrintLoadPtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) + { + LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadPtrArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") + LINE("") + + LINE("if(atStreamStart)") + m_intendation++; + LINE("m_stream->Load<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") + m_intendation--; + + LINE("") + LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; + + LINE(MakeTypePtrVarName(def) << " = var;") + PrintLoadPtrArrayMethod_PointerCheck(def, info, reusable); + LINE("") + LINE("var++;") + + m_intendation--; + LINE("}") + m_intendation--; + LINE("}") + } + + void PrintLoadArrayMethod(const DataDefinition* def, StructureInformation* info) + { + LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") + LINE("") + LINE("if(atStreamStart)") + m_intendation++; + LINE("m_stream->Load<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") + m_intendation--; + + LINE("") + LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; + + LINE(MakeTypeVarName(info->m_definition) << " = var;") + LINE("Load_" << info->m_definition->m_name << "(false);") + LINE("var++;") + + m_intendation--; + LINE("}") + + m_intendation--; + LINE("}") + } + + void LoadMember_Asset(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) const + { + if (loadType == MemberLoadType::SINGLE_POINTER) + { + LINE(LoaderClassName(member->m_type) << " loader(m_zone, m_stream);") + LINE("loader.Load(&" << MakeMemberAccess(info, member, modifier) << ");") + } + else if (loadType == MemberLoadType::POINTER_ARRAY) + { + LoadMember_PointerArray(info, member, modifier); + } + else + { + assert(false); + LINE("#error unsupported loadType " << static_cast(loadType) << " for asset") + } + } + + void LoadMember_String(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) const + { + if (loadType == MemberLoadType::SINGLE_POINTER) + { + if (member->m_member->m_type_declaration->m_is_const) + { + LINE("varXString = &" << MakeMemberAccess(info, member, modifier) << ";") + } + else + { + LINE("varXString = const_cast(&" << MakeMemberAccess(info, member, modifier) << ");") + } + LINE("LoadXString(false);") + } + else if (loadType == MemberLoadType::POINTER_ARRAY) + { + LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") + if (modifier.IsArray()) + { + LINE("LoadXStringArray(false, " << modifier.GetArraySize() << ");") + } + else + { + LINE("LoadXStringArray(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + } + else + { + assert(false); + LINE("#error unsupported loadType " << static_cast(loadType) << " for string") + } + } + + void LoadMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") + + if (member->m_type->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) + } + + if (member->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_post_load_action.get())) + } + } + else + { + LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") + } + } + + void LoadMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + if (modifier.IsArray()) + { + LINE("LoadPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << modifier.GetArraySize() << ");") + } + else + { + LINE("LoadPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + } + + void LoadMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + std::string arraySizeStr; + + if (modifier.HasDynamicArrayCount()) + arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); + else + arraySizeStr = std::to_string(modifier.GetArraySize()); + + if (!member->m_is_leaf) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + + if (computations.IsAfterPartialLoad()) + { + LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << arraySizeStr << ");") + } + else + { + LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") + } + + if (member->m_type->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) + } + + if (member->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_post_load_action.get())) + } + } + else if (computations.IsAfterPartialLoad()) + { + LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << arraySizeStr << ");") + } + } + + void LoadMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + if (member->m_type && !member->m_type->m_is_leaf) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + } + else + { + LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + } + } + + void LoadMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + if (!member->m_is_leaf) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") + + if (computations.IsAfterPartialLoad()) + { + LINE("Load_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true);") + } + else + { + LINE("Load_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") + } + + if (member->m_type->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) + } + + if (member->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_post_load_action.get())) + } + } + else if (computations.IsAfterPartialLoad()) + { + LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" + << MakeMemberAccess(info, member, modifier) << ");") + } + } + + void LoadMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("Load_" << MakeSafeTypeName(member->m_type->m_definition) << "(true);") + + if (member->m_type->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) + } + + if (member->m_post_load_action) + { + LINE("") + LINE(MakeCustomActionCall(member->m_post_load_action.get())) + } + } + else + { + LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ");") + } + } + + void LoadMember_TypeCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) const + { + if (member->m_is_string) + { + LoadMember_String(info, member, modifier, loadType); + } + else if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + LoadMember_Asset(info, member, modifier, loadType); + } + else + { + switch (loadType) + { + case MemberLoadType::ARRAY_POINTER: + LoadMember_ArrayPointer(info, member, modifier); + break; + + case MemberLoadType::SINGLE_POINTER: + LoadMember_SinglePointer(info, member, modifier); + break; + + case MemberLoadType::EMBEDDED: + LoadMember_Embedded(info, member, modifier); + break; + + case MemberLoadType::POINTER_ARRAY: + LoadMember_PointerArray(info, member, modifier); + break; + + case MemberLoadType::DYNAMIC_ARRAY: + LoadMember_DynamicArray(info, member, modifier); + break; + + case MemberLoadType::EMBEDDED_ARRAY: + LoadMember_EmbeddedArray(info, member, modifier); + break; + + default: + LINE("// t=" << static_cast(loadType)) + break; + } + } + } + + static bool LoadMember_ShouldMakeAlloc(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) + { + if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) + { + return false; + } + + if (loadType == MemberLoadType::POINTER_ARRAY) + { + return !modifier.IsArray(); + } + + if (member->m_is_string) + { + return false; + } + + if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + return false; + } + + return true; + } + + void LoadMember_Alloc(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) + { + if (!LoadMember_ShouldMakeAlloc(info, member, modifier, loadType)) + { + LoadMember_TypeCheck(info, member, modifier, loadType); + return; + } + + const MemberComputations computations(member); + if (computations.IsInTempBlock()) + { + LINE(member->m_member->m_type_declaration->m_type->GetFullName() << "* ptr = " << MakeMemberAccess(info, member, modifier) << ";") + } + + const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get()); + const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + + // This used to use `alignof()` to calculate alignment but due to inconsistencies between compilers and bugs discovered in MSVC + // (Alignment specified via `__declspec(align())` showing as correct via intellisense but is incorrect when compiled for types that have a larger + // alignment than the specified value) this was changed to make ZoneCodeGenerator calculate what is supposed to be used as alignment when + // allocating. This is more reliable when being used with different compilers and the value used can be seen in the source code directly + if (member->m_alloc_alignment) + { + LINE(MakeMemberAccess(info, member, modifier) + << " = m_stream->Alloc<" << typeDecl << followingReferences << ">(" << MakeEvaluation(member->m_alloc_alignment.get()) << ");") + } + else + { + LINE(MakeMemberAccess(info, member, modifier) + << " = m_stream->Alloc<" << typeDecl << followingReferences << ">(" << modifier.GetAlignment() << ");") + } + + if (computations.IsInTempBlock()) + { + LINE("") + LINE(member->m_member->m_type_declaration->m_type->GetFullName() << "** toInsert = nullptr;") + LINE("if(ptr == PTR_INSERT)") + m_intendation++; + LINE("toInsert = m_stream->InsertPointer<" << member->m_member->m_type_declaration->m_type->GetFullName() << ">();") + m_intendation--; + LINE("") + } + + LoadMember_TypeCheck(info, member, modifier, loadType); + + if (computations.IsInTempBlock()) + { + LINE("") + LINE("if(toInsert != nullptr)") + m_intendation++; + LINE("*toInsert = " << MakeTypeVarName(info->m_definition) << "->" << member->m_member->m_name << ";") + m_intendation--; + } + } + + static bool LoadMember_ShouldMakeReuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) + { + if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::SINGLE_POINTER && loadType != MemberLoadType::POINTER_ARRAY) + { + return false; + } + + if (loadType == MemberLoadType::POINTER_ARRAY && modifier.IsArray()) + { + return false; + } + + return true; + } + + void LoadMember_Reuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) + { + if (!LoadMember_ShouldMakeReuse(info, member, modifier, loadType) || !member->m_is_reusable) + { + LoadMember_Alloc(info, member, modifier, loadType); + return; + } + + const MemberComputations computations(member); + if (computations.IsInTempBlock()) + { + LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING || " << MakeMemberAccess(info, member, modifier) + << " == PTR_INSERT)") LINE("{") m_intendation++; - PrintLoadPtrArrayMethod_Loading(def, info); + LoadMember_Alloc(info, member, modifier, loadType); m_intendation--; LINE("}") @@ -180,646 +825,151 @@ class ZoneLoadTemplate::Internal final : BaseTemplate LINE("{") m_intendation++; - LINE("*" << MakeTypePtrVarName(def) << " = m_stream->ConvertOffsetToPointer(*" << MakeTypePtrVarName(def) << ");") + LINE(MakeMemberAccess(info, member, modifier) << " = m_stream->ConvertOffsetToAlias(" << MakeMemberAccess(info, member, modifier) << ");") m_intendation--; LINE("}") } else { - PrintLoadPtrArrayMethod_Loading(def, info); + LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING)") + LINE("{") + m_intendation++; + + LoadMember_Alloc(info, member, modifier, loadType); + + m_intendation--; + LINE("}") + LINE("else") + LINE("{") + m_intendation++; + + LINE(MakeMemberAccess(info, member, modifier) << " = m_stream->ConvertOffsetToPointer(" << MakeMemberAccess(info, member, modifier) << ");") + + m_intendation--; + LINE("}") } } - m_intendation--; - LINE("}") - } - - void PrintLoadPtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadPtrArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") - LINE("") - - LINE("if(atStreamStart)") - m_intendation++; - LINE("m_stream->Load<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") - m_intendation--; - - LINE("") - LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; - - LINE(MakeTypePtrVarName(def) << " = var;") - PrintLoadPtrArrayMethod_PointerCheck(def, info, reusable); - LINE("") - LINE("var++;") - - m_intendation--; - LINE("}") - m_intendation--; - LINE("}") - } - - void PrintLoadArrayMethod(const DataDefinition* def, StructureInformation* info) - { - LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") - LINE("") - LINE("if(atStreamStart)") - m_intendation++; - LINE("m_stream->Load<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") - m_intendation--; - - LINE("") - LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; - - LINE(MakeTypeVarName(info->m_definition) << " = var;") - LINE("Load_" << info->m_definition->m_name << "(false);") - LINE("var++;") - - m_intendation--; - LINE("}") - - m_intendation--; - LINE("}") - } - - void LoadMember_Asset(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) const - { - if (loadType == MemberLoadType::SINGLE_POINTER) + static bool LoadMember_ShouldMakePointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + MemberLoadType loadType) { - LINE(LoaderClassName(member->m_type) << " loader(m_zone, m_stream);") - LINE("loader.Load(&" << MakeMemberAccess(info, member, modifier) << ");") - } - else if (loadType == MemberLoadType::POINTER_ARRAY) - { - LoadMember_PointerArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error unsupported loadType " << static_cast(loadType) << " for asset") - } - } - - void LoadMember_String(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) const - { - if (loadType == MemberLoadType::SINGLE_POINTER) - { - if (member->m_member->m_type_declaration->m_is_const) + if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) { - LINE("varXString = &" << MakeMemberAccess(info, member, modifier) << ";") + return false; + } + + if (loadType == MemberLoadType::POINTER_ARRAY) + { + return !modifier.IsArray(); + } + + if (member->m_is_string) + { + return false; + } + + return true; + } + + void LoadMember_PointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) + { + if (LoadMember_ShouldMakePointerCheck(info, member, modifier, loadType)) + { + LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") + LINE("{") + m_intendation++; + + LoadMember_Reuse(info, member, modifier, loadType); + + m_intendation--; + LINE("}") } else { - LINE("varXString = const_cast(&" << MakeMemberAccess(info, member, modifier) << ");") + LoadMember_Reuse(info, member, modifier, loadType); } - LINE("LoadXString(false);") } - else if (loadType == MemberLoadType::POINTER_ARRAY) + + void LoadMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberLoadType loadType) { - LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") - if (modifier.IsArray()) + const MemberComputations computations(member); + + const auto notInDefaultNormalBlock = computations.IsNotInDefaultNormalBlock(); + if (notInDefaultNormalBlock) { - LINE("LoadXStringArray(false, " << modifier.GetArraySize() << ");") + LINE("m_stream->PushBlock(" << member->m_fast_file_block->m_name << ");") + } + + LoadMember_PointerCheck(info, member, modifier, loadType); + + if (notInDefaultNormalBlock) + { + LINE("m_stream->PopBlock();") + } + } + + void LoadMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + auto first = true; + for (const auto& entry : modifier.GetArrayEntries()) + { + if (first) + { + first = false; + } + else + { + LINE("") + } + + LoadMember_Reference(info, member, entry); + } + } + + void LoadMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + if (modifier.IsDynamicArray()) + { + LoadMember_Block(info, member, modifier, MemberLoadType::DYNAMIC_ARRAY); + } + else if (modifier.IsSinglePointer()) + { + LoadMember_Block(info, member, modifier, MemberLoadType::SINGLE_POINTER); + } + else if (modifier.IsArrayPointer()) + { + LoadMember_Block(info, member, modifier, MemberLoadType::ARRAY_POINTER); + } + else if (modifier.IsPointerArray()) + { + LoadMember_Block(info, member, modifier, MemberLoadType::POINTER_ARRAY); + } + else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) + { + LoadMember_Block(info, member, modifier, MemberLoadType::EMBEDDED_ARRAY); + } + else if (modifier.GetDeclarationModifier() == nullptr) + { + LoadMember_Block(info, member, modifier, MemberLoadType::EMBEDDED); + } + else if (modifier.IsArray()) + { + LoadMember_ReferenceArray(info, member, modifier); } else { - LINE("LoadXStringArray(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + assert(false); + LINE("#error LoadMemberReference failed @ " << member->m_member->m_name) } } - else - { - assert(false); - LINE("#error unsupported loadType " << static_cast(loadType) << " for string") - } - } - void LoadMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - - if (member->m_type->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) - } - - if (member->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_post_load_action.get())) - } - } - else - { - LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - } - } - - void LoadMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - if (modifier.IsArray()) - { - LINE("LoadPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << modifier.GetArraySize() << ");") - } - else - { - LINE("LoadPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") - } - } - - void LoadMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - std::string arraySizeStr; - - if (modifier.HasDynamicArrayCount()) - arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); - else - arraySizeStr = std::to_string(modifier.GetArraySize()); - - if (!member->m_is_leaf) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - - if (computations.IsAfterPartialLoad()) - { - LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << arraySizeStr << ");") - } - else - { - LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") - } - - if (member->m_type->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) - } - - if (member->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_post_load_action.get())) - } - } - else if (computations.IsAfterPartialLoad()) - { - LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << arraySizeStr << ");") - } - } - - void LoadMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - if (member->m_type && !member->m_type->m_is_leaf) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("LoadArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") - } - else - { - LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") - } - } - - void LoadMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - if (!member->m_is_leaf) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") - - if (computations.IsAfterPartialLoad()) - { - LINE("Load_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true);") - } - else - { - LINE("Load_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") - } - - if (member->m_type->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) - } - - if (member->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_post_load_action.get())) - } - } - else if (computations.IsAfterPartialLoad()) - { - LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeMemberAccess(info, member, modifier) - << ");") - } - } - - void LoadMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("Load_" << MakeSafeTypeName(member->m_type->m_definition) << "(true);") - - if (member->m_type->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_type->m_post_load_action.get())) - } - - if (member->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(member->m_post_load_action.get())) - } - } - else - { - LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ");") - } - } - - void LoadMember_TypeCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) const - { - if (member->m_is_string) - { - LoadMember_String(info, member, modifier, loadType); - } - else if (member->m_type && StructureComputations(member->m_type).IsAsset()) - { - LoadMember_Asset(info, member, modifier, loadType); - } - else - { - switch (loadType) - { - case MemberLoadType::ARRAY_POINTER: - LoadMember_ArrayPointer(info, member, modifier); - break; - - case MemberLoadType::SINGLE_POINTER: - LoadMember_SinglePointer(info, member, modifier); - break; - - case MemberLoadType::EMBEDDED: - LoadMember_Embedded(info, member, modifier); - break; - - case MemberLoadType::POINTER_ARRAY: - LoadMember_PointerArray(info, member, modifier); - break; - - case MemberLoadType::DYNAMIC_ARRAY: - LoadMember_DynamicArray(info, member, modifier); - break; - - case MemberLoadType::EMBEDDED_ARRAY: - LoadMember_EmbeddedArray(info, member, modifier); - break; - - default: - LINE("// t=" << static_cast(loadType)) - break; - } - } - } - - static bool LoadMember_ShouldMakeAlloc(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) - { - if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) - { - return false; - } - - if (loadType == MemberLoadType::POINTER_ARRAY) - { - return !modifier.IsArray(); - } - - if (member->m_is_string) - { - return false; - } - - if (member->m_type && StructureComputations(member->m_type).IsAsset()) - { - return false; - } - - return true; - } - - void LoadMember_Alloc(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType) - { - if (!LoadMember_ShouldMakeAlloc(info, member, modifier, loadType)) - { - LoadMember_TypeCheck(info, member, modifier, loadType); - return; - } - - const MemberComputations computations(member); - if (computations.IsInTempBlock()) - { - LINE(member->m_member->m_type_declaration->m_type->GetFullName() << "* ptr = " << MakeMemberAccess(info, member, modifier) << ";") - } - - const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get()); - const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); - - // This used to use `alignof()` to calculate alignment but due to inconsistencies between compilers and bugs discovered in MSVC - // (Alignment specified via `__declspec(align())` showing as correct via intellisense but is incorrect when compiled for types that have a larger - // alignment than the specified value) this was changed to make ZoneCodeGenerator calculate what is supposed to be used as alignment when allocating. - // This is more reliable when being used with different compilers and the value used can be seen in the source code directly - if (member->m_alloc_alignment) - { - LINE(MakeMemberAccess(info, member, modifier) - << " = m_stream->Alloc<" << typeDecl << followingReferences << ">(" << MakeEvaluation(member->m_alloc_alignment.get()) << ");") - } - else - { - LINE(MakeMemberAccess(info, member, modifier) - << " = m_stream->Alloc<" << typeDecl << followingReferences << ">(" << modifier.GetAlignment() << ");") - } - - if (computations.IsInTempBlock()) - { - LINE("") - LINE(member->m_member->m_type_declaration->m_type->GetFullName() << "** toInsert = nullptr;") - LINE("if(ptr == PTR_INSERT)") - m_intendation++; - LINE("toInsert = m_stream->InsertPointer<" << member->m_member->m_type_declaration->m_type->GetFullName() << ">();") - m_intendation--; - LINE("") - } - - LoadMember_TypeCheck(info, member, modifier, loadType); - - if (computations.IsInTempBlock()) - { - LINE("") - LINE("if(toInsert != nullptr)") - m_intendation++; - LINE("*toInsert = " << MakeTypeVarName(info->m_definition) << "->" << member->m_member->m_name << ";") - m_intendation--; - } - } - - static bool LoadMember_ShouldMakeReuse(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) - { - if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::SINGLE_POINTER && loadType != MemberLoadType::POINTER_ARRAY) - { - return false; - } - - if (loadType == MemberLoadType::POINTER_ARRAY && modifier.IsArray()) - { - return false; - } - - return true; - } - - void LoadMember_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType) - { - if (!LoadMember_ShouldMakeReuse(info, member, modifier, loadType) || !member->m_is_reusable) - { - LoadMember_Alloc(info, member, modifier, loadType); - return; - } - - const MemberComputations computations(member); - if (computations.IsInTempBlock()) - { - LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING || " << MakeMemberAccess(info, member, modifier) << " == PTR_INSERT)") - LINE("{") - m_intendation++; - - LoadMember_Alloc(info, member, modifier, loadType); - - m_intendation--; - LINE("}") - LINE("else") - LINE("{") - m_intendation++; - - LINE(MakeMemberAccess(info, member, modifier) << " = m_stream->ConvertOffsetToAlias(" << MakeMemberAccess(info, member, modifier) << ");") - - m_intendation--; - LINE("}") - } - else - { - LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING)") - LINE("{") - m_intendation++; - - LoadMember_Alloc(info, member, modifier, loadType); - - m_intendation--; - LINE("}") - LINE("else") - LINE("{") - m_intendation++; - - LINE(MakeMemberAccess(info, member, modifier) << " = m_stream->ConvertOffsetToPointer(" << MakeMemberAccess(info, member, modifier) << ");") - - m_intendation--; - LINE("}") - } - } - - static bool LoadMember_ShouldMakePointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - MemberLoadType loadType) - { - if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) - { - return false; - } - - if (loadType == MemberLoadType::POINTER_ARRAY) - { - return !modifier.IsArray(); - } - - if (member->m_is_string) - { - return false; - } - - return true; - } - - void LoadMember_PointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) - { - if (LoadMember_ShouldMakePointerCheck(info, member, modifier, loadType)) - { - LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") - LINE("{") - m_intendation++; - - LoadMember_Reuse(info, member, modifier, loadType); - - m_intendation--; - LINE("}") - } - else - { - LoadMember_Reuse(info, member, modifier, loadType); - } - } - - void LoadMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberLoadType loadType) - { - const MemberComputations computations(member); - - const auto notInDefaultNormalBlock = computations.IsNotInDefaultNormalBlock(); - if (notInDefaultNormalBlock) - { - LINE("m_stream->PushBlock(" << member->m_fast_file_block->m_name << ");") - } - - LoadMember_PointerCheck(info, member, modifier, loadType); - - if (notInDefaultNormalBlock) - { - LINE("m_stream->PopBlock();") - } - } - - void LoadMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - auto first = true; - for (const auto& entry : modifier.GetArrayEntries()) - { - if (first) - { - first = false; - } - else - { - LINE("") - } - - LoadMember_Reference(info, member, entry); - } - } - - void LoadMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - if (modifier.IsDynamicArray()) - { - LoadMember_Block(info, member, modifier, MemberLoadType::DYNAMIC_ARRAY); - } - else if (modifier.IsSinglePointer()) - { - LoadMember_Block(info, member, modifier, MemberLoadType::SINGLE_POINTER); - } - else if (modifier.IsArrayPointer()) - { - LoadMember_Block(info, member, modifier, MemberLoadType::ARRAY_POINTER); - } - else if (modifier.IsPointerArray()) - { - LoadMember_Block(info, member, modifier, MemberLoadType::POINTER_ARRAY); - } - else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) - { - LoadMember_Block(info, member, modifier, MemberLoadType::EMBEDDED_ARRAY); - } - else if (modifier.GetDeclarationModifier() == nullptr) - { - LoadMember_Block(info, member, modifier, MemberLoadType::EMBEDDED); - } - else if (modifier.IsArray()) - { - LoadMember_ReferenceArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error LoadMemberReference failed @ " << member->m_member->m_name) - } - } - - void LoadMember_Condition_Struct(StructureInformation* info, MemberInformation* member) - { - LINE("") - if (member->m_condition) - { - LINE("if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - LoadMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LoadMember_Reference(info, member, DeclarationModifierComputations(member)); - } - } - - void LoadMember_Condition_Union(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); - - if (computations.IsFirstMember()) + void LoadMember_Condition_Struct(StructureInformation* info, MemberInformation* member) { LINE("") if (member->m_condition) @@ -838,498 +988,363 @@ class ZoneLoadTemplate::Internal final : BaseTemplate LoadMember_Reference(info, member, DeclarationModifierComputations(member)); } } - else if (computations.IsLastMember()) + + void LoadMember_Condition_Union(StructureInformation* info, MemberInformation* member) { - if (member->m_condition) - { - LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; + const MemberComputations computations(member); - LoadMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("else") - LINE("{") - m_intendation++; - - LoadMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - } - else - { - if (member->m_condition) - { - LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - LoadMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") - } - } - } - - void PrintLoadMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); - if (computations.ShouldIgnore()) - return; - - if (member->m_is_string || computations.ContainsNonEmbeddedReference() || member->m_type && !member->m_type->m_is_leaf - || computations.IsAfterPartialLoad()) - { - if (info->m_definition->GetType() == DataDefinitionType::UNION) - LoadMember_Condition_Union(info, member); - else - LoadMember_Condition_Struct(info, member); - } - } - - void PrintLoadMethod(StructureInformation* info) - { - const StructureComputations computations(info); - LINE("void " << LoaderClassName(m_env.m_asset) << "::Load_" << info->m_definition->m_name << "(const bool atStreamStart)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") - - auto* dynamicMember = computations.GetDynamicMember(); - if (!(info->m_definition->GetType() == DataDefinitionType::UNION && dynamicMember)) - { - LINE("") - LINE("if(atStreamStart)") - m_intendation++; - - if (dynamicMember == nullptr) - { - LINE("m_stream->Load<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) - << "); // Size: " << info->m_definition->GetSize()) - } - else - { - LINE("m_stream->LoadPartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" - << info->m_definition->GetFullName() << ", " << dynamicMember->m_member->m_name << "));") - } - - m_intendation--; - } - else - { - LINE("assert(atStreamStart);") - } - - if (computations.IsAsset()) - { - LINE("") - LINE("m_stream->PushBlock(" << m_env.m_default_normal_block->m_name << ");") - } - else if (info->m_block) - { - LINE("") - LINE("m_stream->PushBlock(" << info->m_block->m_name << ");") - } - - for (const auto& member : info->m_ordered_members) - { - PrintLoadMemberIfNeedsTreatment(info, member.get()); - } - - if (info->m_block || computations.IsAsset()) - { - LINE("") - LINE("m_stream->PopBlock();") - } - - m_intendation--; - LINE("}") - } - - void PrintLoadPtrMethod(StructureInformation* info) - { - const bool inTemp = info->m_block && info->m_block->m_type == FastFileBlockType::TEMP; - LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadPtr_" << MakeSafeTypeName(info->m_definition) << "(const bool atStreamStart)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypePtrVarName(info->m_definition) << " != nullptr);") - LINE("") - - LINE("if(atStreamStart)") - m_intendation++; - LINE("m_stream->Load<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") - m_intendation--; - - LINE("") - if (inTemp) - { - LINE("m_stream->PushBlock(" << m_env.m_default_temp_block->m_name << ");") - LINE("") - } - - LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " != nullptr)") - LINE("{") - m_intendation++; - - if (inTemp) - { - LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING || *" << MakeTypePtrVarName(info->m_definition) << " == PTR_INSERT)") - } - else - { - LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING)") - } - LINE("{") - m_intendation++; - - if (inTemp) - { - LINE(info->m_definition->GetFullName() << "* ptr = *" << MakeTypePtrVarName(info->m_definition) << ";") - } - LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->Alloc<" << info->m_definition->GetFullName() << ">(" - << info->m_definition->GetAlignment() << ");") - - if (inTemp) - { - LINE("") - LINE(info->m_definition->GetFullName() << "** toInsert = nullptr;") - LINE("if(ptr == PTR_INSERT)") - m_intendation++; - LINE("toInsert = m_stream->InsertPointer<" << info->m_definition->GetFullName() << ">();") - m_intendation--; - } - - auto startLoadSection = true; - - if (!info->m_is_leaf) - { - if (startLoadSection) - { - startLoadSection = false; - LINE("") - } - LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(info->m_definition) << ";") - LINE("Load_" << MakeSafeTypeName(info->m_definition) << "(true);") - } - else - { - LINE("#error Ptr method cannot have leaf type") - } - - if (info->m_post_load_action) - { - LINE("") - LINE(MakeCustomActionCall(info->m_post_load_action.get())) - } - - if (StructureComputations(info).IsAsset()) - { - LINE("") - LINE("LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << MakeTypePtrVarName(info->m_definition) << ");") - } - - if (inTemp) - { - if (!startLoadSection) + if (computations.IsFirstMember()) { LINE("") - } - - LINE("if(toInsert != nullptr)") - m_intendation++; - LINE("*toInsert = *" << MakeTypePtrVarName(info->m_definition) << ";") - m_intendation--; - } - - m_intendation--; - LINE("}") - LINE("else") - LINE("{") - m_intendation++; - - if (inTemp) - { - LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->ConvertOffsetToAlias(*" << MakeTypePtrVarName(info->m_definition) << ");") - } - else - { - LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->ConvertOffsetToPointer(*" << MakeTypePtrVarName(info->m_definition) << ");") - } - - m_intendation--; - LINE("}") - - m_intendation--; - LINE("}") - - if (inTemp) - { - LINE("") - LINE("m_stream->PopBlock();") - } - - m_intendation--; - LINE("}") - } - - void PrintLoadAssetMethod(StructureInformation* info) - { - LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << info->m_definition->GetFullName() - << "** pAsset)") - LINE("{") - m_intendation++; - - LINE("assert(pAsset != nullptr);") - LINE("") - LINE(MarkerClassName(m_env.m_asset) << " marker(m_zone);") - LINE("marker.Mark(*pAsset);") - LINE("") - LINE("auto* reallocatedAsset = m_zone->GetMemory()->Alloc<" << info->m_definition->GetFullName() << ">();") - LINE("std::memcpy(reallocatedAsset, *pAsset, sizeof(" << info->m_definition->GetFullName() << "));") - LINE("") - LINE("m_asset_info = reinterpret_castm_definition->GetFullName() - << ">*>(LinkAsset(GetAssetName(*pAsset), reallocatedAsset, marker.GetDependencies(), " - "marker.GetUsedScriptStrings(), marker.GetIndirectAssetReferences()));") - LINE("*pAsset = m_asset_info->Asset();") - - m_intendation--; - LINE("}") - } - - void PrintMainLoadMethod() - { - LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* " << LoaderClassName(m_env.m_asset) << "::Load(" - << m_env.m_asset->m_definition->GetFullName() << "** pAsset)") - LINE("{") - m_intendation++; - - LINE("assert(pAsset != nullptr);") - LINE("") - LINE("m_asset_info = nullptr;") - LINE("") - LINE(MakeTypePtrVarName(m_env.m_asset->m_definition) << " = pAsset;") - LINE("LoadPtr_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "(false);") - LINE("") - LINE("if(m_asset_info == nullptr && *pAsset != nullptr)") - m_intendation++; - LINE("m_asset_info = reinterpret_castm_definition->GetFullName() << ">*>(GetAssetInfo(GetAssetName(*pAsset)));") - m_intendation--; - LINE("") - LINE("return m_asset_info;") - - m_intendation--; - LINE("}") - } - - void PrintGetNameMethod() - { - LINE("std::string " << LoaderClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") - LINE("{") - m_intendation++; - - if (!m_env.m_asset->m_name_chain.empty()) - { - LINE_START("return pAsset") - - auto first = true; - for (auto* member : m_env.m_asset->m_name_chain) - { - if (first) + if (member->m_condition) { - first = false; - LINE_MIDDLE("->" << member->m_member->m_name) + LINE("if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") } else { - LINE_MIDDLE("." << member->m_member->m_name) + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); } } - LINE_END(";") - } - else - { - LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") - } - - m_intendation--; - LINE("}") - } - -public: - Internal(std::ostream& stream, RenderingContext* context) - : BaseTemplate(stream, context) - { - } - - void Header() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#pragma once") - LINE("") - LINE("#include \"Loading/AssetLoader.h\"") - LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") - if (m_env.m_has_actions) - { - LINE("#include \"Game/" << m_env.m_game << "/XAssets/" << Lower(m_env.m_asset->m_definition->m_name) << "/" - << Lower(m_env.m_asset->m_definition->m_name) << "_actions.h\"") - } - LINE("#include ") - LINE("") - LINE("namespace " << m_env.m_game) - LINE("{") - m_intendation++; - LINE("class " << LoaderClassName(m_env.m_asset) << " final : public AssetLoader") - LINE("{") - m_intendation++; - - LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* m_asset_info;") - if (m_env.m_has_actions) - { - LINE("Actions_" << m_env.m_asset->m_definition->m_name << " m_actions;") - } - LINE(VariableDecl(m_env.m_asset->m_definition)) - LINE(PointerVariableDecl(m_env.m_asset->m_definition)) - LINE("") - - // Variable Declarations: type varType; - for (auto* type : m_env.m_used_types) - { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + else if (computations.IsLastMember()) { - LINE(VariableDecl(type->m_type)) + if (member->m_condition) + { + LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("else") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) + else { - LINE(PointerVariableDecl(type->m_type)) + if (member->m_condition) + { + LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") + } } } - LINE("") - - // Method Declarations - for (auto* type : m_env.m_used_types) + void PrintLoadMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) { - if (type->m_pointer_array_reference_exists) + const MemberComputations computations(member); + if (computations.ShouldIgnore()) + return; + + if (member->m_is_string || computations.ContainsNonEmbeddedReference() || member->m_type && !member->m_type->m_is_leaf + || computations.IsAfterPartialLoad()) { - PrintHeaderPtrArrayLoadMethodDeclaration(type->m_type); + if (info->m_definition->GetType() == DataDefinitionType::UNION) + LoadMember_Condition_Union(info, member); + else + LoadMember_Condition_Struct(info, member); } } - for (auto* type : m_env.m_used_types) + + void PrintLoadMethod(StructureInformation* info) { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + const StructureComputations computations(info); + LINE("void " << LoaderClassName(m_env.m_asset) << "::Load_" << info->m_definition->m_name << "(const bool atStreamStart)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") + + auto* dynamicMember = computations.GetDynamicMember(); + if (!(info->m_definition->GetType() == DataDefinitionType::UNION && dynamicMember)) { - PrintHeaderArrayLoadMethodDeclaration(type->m_type); + LINE("") + LINE("if(atStreamStart)") + m_intendation++; + + if (dynamicMember == nullptr) + { + LINE("m_stream->Load<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) + << "); // Size: " << info->m_definition->GetSize()) + } + else + { + LINE("m_stream->LoadPartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" + << info->m_definition->GetFullName() << ", " << dynamicMember->m_member->m_name << "));") + } + + m_intendation--; } + else + { + LINE("assert(atStreamStart);") + } + + if (computations.IsAsset()) + { + LINE("") + LINE("m_stream->PushBlock(" << m_env.m_default_normal_block->m_name << ");") + } + else if (info->m_block) + { + LINE("") + LINE("m_stream->PushBlock(" << info->m_block->m_name << ");") + } + + for (const auto& member : info->m_ordered_members) + { + PrintLoadMemberIfNeedsTreatment(info, member.get()); + } + + if (info->m_block || computations.IsAsset()) + { + LINE("") + LINE("m_stream->PopBlock();") + } + + m_intendation--; + LINE("}") } - for (auto* type : m_env.m_used_structures) + + void PrintLoadPtrMethod(StructureInformation* info) { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) - { - PrintHeaderLoadMethodDeclaration(type->m_info); - } - } - PrintHeaderLoadMethodDeclaration(m_env.m_asset); - PrintHeaderTempPtrLoadMethodDeclaration(m_env.m_asset); - PrintHeaderAssetLoadMethodDeclaration(m_env.m_asset); - LINE("") - m_intendation--; - LINE("public:") - m_intendation++; - PrintHeaderConstructor(); - PrintHeaderMainLoadMethodDeclaration(m_env.m_asset); - PrintHeaderGetNameMethodDeclaration(m_env.m_asset); + const bool inTemp = info->m_block && info->m_block->m_type == FastFileBlockType::TEMP; + LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadPtr_" << MakeSafeTypeName(info->m_definition) << "(const bool atStreamStart)") + LINE("{") + m_intendation++; - m_intendation--; - LINE("};") - m_intendation--; - LINE("}") - } - - void Source() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_load_db.h\"") - LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"") - LINE("#include ") - LINE("#include ") - LINE("") - - if (!m_env.m_referenced_assets.empty()) - { - LINE("// Referenced Assets:") - for (auto* type : m_env.m_referenced_assets) - { - LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_load_db.h\"") - } + LINE("assert(" << MakeTypePtrVarName(info->m_definition) << " != nullptr);") LINE("") - } - LINE("using namespace " << m_env.m_game << ";") - LINE("") - PrintConstructorMethod(); - for (auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists) + LINE("if(atStreamStart)") + m_intendation++; + LINE("m_stream->Load<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") + m_intendation--; + + LINE("") + if (inTemp) + { + LINE("m_stream->PushBlock(" << m_env.m_default_temp_block->m_name << ");") + LINE("") + } + + LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " != nullptr)") + LINE("{") + m_intendation++; + + if (inTemp) + { + LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING || *" << MakeTypePtrVarName(info->m_definition) + << " == PTR_INSERT)") + } + else + { + LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING)") + } + LINE("{") + m_intendation++; + + if (inTemp) + { + LINE(info->m_definition->GetFullName() << "* ptr = *" << MakeTypePtrVarName(info->m_definition) << ";") + } + LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->Alloc<" << info->m_definition->GetFullName() << ">(" + << info->m_definition->GetAlignment() << ");") + + if (inTemp) { LINE("") - PrintLoadPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); + LINE(info->m_definition->GetFullName() << "** toInsert = nullptr;") + LINE("if(ptr == PTR_INSERT)") + m_intendation++; + LINE("toInsert = m_stream->InsertPointer<" << info->m_definition->GetFullName() << ">();") + m_intendation--; } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + + auto startLoadSection = true; + + if (!info->m_is_leaf) + { + if (startLoadSection) + { + startLoadSection = false; + LINE("") + } + LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(info->m_definition) << ";") + LINE("Load_" << MakeSafeTypeName(info->m_definition) << "(true);") + } + else + { + LINE("#error Ptr method cannot have leaf type") + } + + if (info->m_post_load_action) { LINE("") - PrintLoadArrayMethod(type->m_type, type->m_info); + LINE(MakeCustomActionCall(info->m_post_load_action.get())) } - } - for (auto* type : m_env.m_used_structures) - { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + + if (StructureComputations(info).IsAsset()) { LINE("") - PrintLoadMethod(type->m_info); + LINE("LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << MakeTypePtrVarName(info->m_definition) << ");") } + + if (inTemp) + { + if (!startLoadSection) + { + LINE("") + } + + LINE("if(toInsert != nullptr)") + m_intendation++; + LINE("*toInsert = *" << MakeTypePtrVarName(info->m_definition) << ";") + m_intendation--; + } + + m_intendation--; + LINE("}") + LINE("else") + LINE("{") + m_intendation++; + + if (inTemp) + { + LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->ConvertOffsetToAlias(*" << MakeTypePtrVarName(info->m_definition) << ");") + } + else + { + LINE("*" << MakeTypePtrVarName(info->m_definition) << " = m_stream->ConvertOffsetToPointer(*" << MakeTypePtrVarName(info->m_definition) << ");") + } + + m_intendation--; + LINE("}") + + m_intendation--; + LINE("}") + + if (inTemp) + { + LINE("") + LINE("m_stream->PopBlock();") + } + + m_intendation--; + LINE("}") } - LINE("") - PrintLoadMethod(m_env.m_asset); - LINE("") - PrintLoadPtrMethod(m_env.m_asset); - LINE("") - PrintLoadAssetMethod(m_env.m_asset); - LINE("") - PrintMainLoadMethod(); - LINE("") - PrintGetNameMethod(); - } -}; + + void PrintLoadAssetMethod(StructureInformation* info) + { + LINE("void " << LoaderClassName(m_env.m_asset) << "::LoadAsset_" << MakeSafeTypeName(info->m_definition) << "(" << info->m_definition->GetFullName() + << "** pAsset)") + LINE("{") + m_intendation++; + + LINE("assert(pAsset != nullptr);") + LINE("") + LINE(MarkerClassName(m_env.m_asset) << " marker(m_zone);") + LINE("marker.Mark(*pAsset);") + LINE("") + LINE("auto* reallocatedAsset = m_zone->GetMemory()->Alloc<" << info->m_definition->GetFullName() << ">();") + LINE("std::memcpy(reallocatedAsset, *pAsset, sizeof(" << info->m_definition->GetFullName() << "));") + LINE("") + LINE("m_asset_info = reinterpret_castm_definition->GetFullName() + << ">*>(LinkAsset(GetAssetName(*pAsset), reallocatedAsset, marker.GetDependencies(), " + "marker.GetUsedScriptStrings(), marker.GetIndirectAssetReferences()));") + LINE("*pAsset = m_asset_info->Asset();") + + m_intendation--; + LINE("}") + } + + void PrintMainLoadMethod() + { + LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* " << LoaderClassName(m_env.m_asset) << "::Load(" + << m_env.m_asset->m_definition->GetFullName() << "** pAsset)") + LINE("{") + m_intendation++; + + LINE("assert(pAsset != nullptr);") + LINE("") + LINE("m_asset_info = nullptr;") + LINE("") + LINE(MakeTypePtrVarName(m_env.m_asset->m_definition) << " = pAsset;") + LINE("LoadPtr_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "(false);") + LINE("") + LINE("if(m_asset_info == nullptr && *pAsset != nullptr)") + m_intendation++; + LINE("m_asset_info = reinterpret_castm_definition->GetFullName() << ">*>(GetAssetInfo(GetAssetName(*pAsset)));") + m_intendation--; + LINE("") + LINE("return m_asset_info;") + + m_intendation--; + LINE("}") + } + + void PrintGetNameMethod() + { + LINE("std::string " << LoaderClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") + LINE("{") + m_intendation++; + + if (!m_env.m_asset->m_name_chain.empty()) + { + LINE_START("return pAsset") + + auto first = true; + for (auto* member : m_env.m_asset->m_name_chain) + { + if (first) + { + first = false; + LINE_MIDDLE("->" << member->m_member->m_name) + } + else + { + LINE_MIDDLE("." << member->m_member->m_name) + } + } + LINE_END(";") + } + else + { + LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") + } + + m_intendation--; + LINE("}") + } + }; +} // namespace std::vector ZoneLoadTemplate::GetFilesToRender(RenderingContext* context) { @@ -1356,18 +1371,15 @@ std::vector ZoneLoadTemplate::GetFilesToRender(RenderingContex void ZoneLoadTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) { - Internal internal(stream, context); + Template t(stream, context); if (fileTag == TAG_HEADER) { - internal.Header(); - } - else if (fileTag == TAG_SOURCE) - { - internal.Source(); + t.Header(); } else { - std::cout << "Unknown tag for ZoneLoadTemplate: " << fileTag << "\n"; + assert(fileTag == TAG_SOURCE); + t.Source(); } } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.h index b4c743a7..c205f328 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.h @@ -3,11 +3,6 @@ class ZoneLoadTemplate final : public ICodeTemplate { - static constexpr int TAG_HEADER = 1; - static constexpr int TAG_SOURCE = 2; - - class Internal; - public: std::vector GetFilesToRender(RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp index ae5b8c39..e6d60d0d 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.cpp @@ -9,502 +9,635 @@ #include #include -class ZoneMarkTemplate::Internal final : BaseTemplate +namespace { - enum class MemberLoadType + static constexpr int TAG_HEADER = 1; + static constexpr int TAG_SOURCE = 2; + + class Template final : BaseTemplate { - ARRAY_POINTER, - DYNAMIC_ARRAY, - EMBEDDED, - EMBEDDED_ARRAY, - POINTER_ARRAY, - SINGLE_POINTER - }; - - static std::string MarkerClassName(StructureInformation* asset) - { - std::ostringstream str; - str << "Marker_" << asset->m_definition->m_name; - return str.str(); - } - - static std::string VariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; - return str.str(); - } - - static std::string PointerVariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; - return str.str(); - } - - void PrintHeaderPtrArrayMarkMethodDeclaration(const DataDefinition* def) const - { - LINE("void MarkPtrArray_" << MakeSafeTypeName(def) << "(size_t count);") - } - - void PrintHeaderArrayMarkMethodDeclaration(const DataDefinition* def) const - { - LINE("void MarkArray_" << MakeSafeTypeName(def) << "(size_t count);") - } - - void PrintHeaderMarkMethodDeclaration(const StructureInformation* info) const - { - LINE("void Mark_" << MakeSafeTypeName(info->m_definition) << "();") - } - - void PrintHeaderGetAssetInfoMethodDeclaration(const StructureInformation* info) const - { - LINE("XAssetInfo<" << info->m_definition->GetFullName() << ">* GetAssetInfo(" << info->m_definition->GetFullName() << "* pAsset) const;") - } - - void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const - { - LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") - } - - void PrintHeaderConstructor() const - { - LINE(MarkerClassName(m_env.m_asset) << "(Zone* zone);") - } - - void PrintHeaderMainMarkMethodDeclaration(const StructureInformation* info) const - { - LINE("void Mark(" << info->m_definition->GetFullName() << "* pAsset);") - } - - void PrintVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << " = nullptr;") - } - - void PrintPointerVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << "Ptr = nullptr;") - } - - void PrintConstructorMethod() - { - LINE(MarkerClassName(m_env.m_asset) << "::" << MarkerClassName(m_env.m_asset) << "(Zone* zone)") - - m_intendation++; - LINE(": AssetMarker(" << m_env.m_asset->m_asset_enum_entry->m_name << ", zone)") - m_intendation--; - - LINE("{") - m_intendation++; - - PrintVariableInitialization(m_env.m_asset->m_definition); - PrintPointerVariableInitialization(m_env.m_asset->m_definition); - LINE("") - - for (const auto* type : m_env.m_used_types) + public: + Template(std::ostream& stream, RenderingContext* context) + : BaseTemplate(stream, context) { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) - { - PrintVariableInitialization(type->m_type); - } } - for (const auto* type : m_env.m_used_types) + + void Header() { - if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#pragma once") + LINE("") + LINE("#include \"Loading/AssetMarker.h\"") + LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") + LINE("#include ") + LINE("") + LINE("namespace " << m_env.m_game) + LINE("{") + m_intendation++; + LINE("class " << MarkerClassName(m_env.m_asset) << " final : public AssetMarker") + LINE("{") + m_intendation++; + + LINE(VariableDecl(m_env.m_asset->m_definition)) + LINE(PointerVariableDecl(m_env.m_asset->m_definition)) + LINE("") + + m_intendation--; + LINE("public:") + m_intendation++; + + // Variable Declarations: type varType; + for (auto* type : m_env.m_used_types) { - PrintPointerVariableInitialization(type->m_type); + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + LINE(VariableDecl(type->m_type)) + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + LINE(PointerVariableDecl(type->m_type)) + } + } + + LINE("") + + // Method Declarations + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking) + { + PrintHeaderPtrArrayMarkMethodDeclaration(type->m_type); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking + && type->m_non_runtime_reference_exists) + { + PrintHeaderArrayMarkMethodDeclaration(type->m_type); + } + } + for (const auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking + && !StructureComputations(type->m_info).IsAsset()) + { + PrintHeaderMarkMethodDeclaration(type->m_info); + } + } + PrintHeaderMarkMethodDeclaration(m_env.m_asset); + LINE("") + PrintHeaderGetNameMethodDeclaration(m_env.m_asset); + PrintHeaderGetAssetInfoMethodDeclaration(m_env.m_asset); + LINE("") + PrintHeaderConstructor(); + PrintHeaderMainMarkMethodDeclaration(m_env.m_asset); + + m_intendation--; + LINE("};") + m_intendation--; + LINE("}") + } + + void Source() + { + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"") + LINE("#include ") + LINE("") + + if (!m_env.m_referenced_assets.empty()) + { + LINE("// Referenced Assets:") + for (const auto* type : m_env.m_referenced_assets) + { + LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_mark_db.h\"") + } + LINE("") + } + LINE("using namespace " << m_env.m_game << ";") + LINE("") + PrintConstructorMethod(); + + for (const auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking) + { + LINE("") + PrintMarkPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); + } + } + for (const auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking + && type->m_non_runtime_reference_exists) + { + LINE("") + PrintMarkArrayMethod(type->m_type, type->m_info); + } + } + for (const auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking + && !StructureComputations(type->m_info).IsAsset()) + { + LINE("") + PrintMarkMethod(type->m_info); + } + } + LINE("") + PrintMarkMethod(m_env.m_asset); + LINE("") + PrintMainMarkMethod(); + LINE("") + PrintGetNameMethod(); + PrintGetAssetInfoMethod(); + } + + private: + enum class MemberLoadType + { + ARRAY_POINTER, + DYNAMIC_ARRAY, + EMBEDDED, + EMBEDDED_ARRAY, + POINTER_ARRAY, + SINGLE_POINTER + }; + + static std::string MarkerClassName(StructureInformation* asset) + { + std::ostringstream str; + str << "Marker_" << asset->m_definition->m_name; + return str.str(); + } + + static std::string VariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; + return str.str(); + } + + static std::string PointerVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; + return str.str(); + } + + void PrintHeaderPtrArrayMarkMethodDeclaration(const DataDefinition* def) const + { + LINE("void MarkPtrArray_" << MakeSafeTypeName(def) << "(size_t count);") + } + + void PrintHeaderArrayMarkMethodDeclaration(const DataDefinition* def) const + { + LINE("void MarkArray_" << MakeSafeTypeName(def) << "(size_t count);") + } + + void PrintHeaderMarkMethodDeclaration(const StructureInformation* info) const + { + LINE("void Mark_" << MakeSafeTypeName(info->m_definition) << "();") + } + + void PrintHeaderGetAssetInfoMethodDeclaration(const StructureInformation* info) const + { + LINE("XAssetInfo<" << info->m_definition->GetFullName() << ">* GetAssetInfo(" << info->m_definition->GetFullName() << "* pAsset) const;") + } + + void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const + { + LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") + } + + void PrintHeaderConstructor() const + { + LINE(MarkerClassName(m_env.m_asset) << "(Zone* zone);") + } + + void PrintHeaderMainMarkMethodDeclaration(const StructureInformation* info) const + { + LINE("void Mark(" << info->m_definition->GetFullName() << "* pAsset);") + } + + void PrintVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << " = nullptr;") + } + + void PrintPointerVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "Ptr = nullptr;") + } + + void PrintConstructorMethod() + { + LINE(MarkerClassName(m_env.m_asset) << "::" << MarkerClassName(m_env.m_asset) << "(Zone* zone)") + + m_intendation++; + LINE(": AssetMarker(" << m_env.m_asset->m_asset_enum_entry->m_name << ", zone)") + m_intendation--; + + LINE("{") + m_intendation++; + + PrintVariableInitialization(m_env.m_asset->m_definition); + PrintPointerVariableInitialization(m_env.m_asset->m_definition); + LINE("") + + for (const auto* type : m_env.m_used_types) + { + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + PrintVariableInitialization(type->m_type); + } + } + for (const auto* type : m_env.m_used_types) + { + if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + PrintPointerVariableInitialization(type->m_type); + } + } + + m_intendation--; + LINE("}") + } + + void PrintMarkPtrArrayMethod_Loading(const DataDefinition* def, const StructureInformation* info) const + { + if (info && !info->m_is_leaf) + { + LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") + LINE("Mark_" << MakeSafeTypeName(def) << "();") } } - m_intendation--; - LINE("}") - } - - void PrintMarkPtrArrayMethod_Loading(const DataDefinition* def, const StructureInformation* info) const - { - if (info && !info->m_is_leaf) + void PrintMarkPtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) { - LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") - LINE("Mark_" << MakeSafeTypeName(def) << "();") - } - } + LINE("if (*" << MakeTypePtrVarName(def) << ")") + LINE("{") + m_intendation++; - void PrintMarkPtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("if (*" << MakeTypePtrVarName(def) << ")") - LINE("{") - m_intendation++; + if (info && StructureComputations(info).IsAsset()) + { + LINE("AddDependency(" << MarkerClassName(info) << "(m_zone).GetAssetInfo(*" << MakeTypePtrVarName(def) << "));") + } + else + { + PrintMarkPtrArrayMethod_Loading(def, info); + } - if (info && StructureComputations(info).IsAsset()) - { - LINE("AddDependency(" << MarkerClassName(info) << "(m_zone).GetAssetInfo(*" << MakeTypePtrVarName(def) << "));") - } - else - { - PrintMarkPtrArrayMethod_Loading(def, info); + m_intendation--; + LINE("}") } - m_intendation--; - LINE("}") - } + void PrintMarkPtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) + { + LINE("void " << MarkerClassName(m_env.m_asset) << "::MarkPtrArray_" << MakeSafeTypeName(def) << "(const size_t count)") + LINE("{") + m_intendation++; - void PrintMarkPtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("void " << MarkerClassName(m_env.m_asset) << "::MarkPtrArray_" << MakeSafeTypeName(def) << "(const size_t count)") - LINE("{") - m_intendation++; + LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") + LINE("") - LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") - LINE("") + LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; - LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; + LINE(MakeTypePtrVarName(def) << " = var;") + PrintMarkPtrArrayMethod_PointerCheck(def, info, reusable); + LINE("") + LINE("var++;") - LINE(MakeTypePtrVarName(def) << " = var;") - PrintMarkPtrArrayMethod_PointerCheck(def, info, reusable); - LINE("") - LINE("var++;") + m_intendation--; + LINE("}") + m_intendation--; + LINE("}") + } - m_intendation--; - LINE("}") - m_intendation--; - LINE("}") - } + void PrintMarkArrayMethod(const DataDefinition* def, const StructureInformation* info) + { + LINE("void " << MarkerClassName(m_env.m_asset) << "::MarkArray_" << MakeSafeTypeName(def) << "(const size_t count)") + LINE("{") + m_intendation++; - void PrintMarkArrayMethod(const DataDefinition* def, const StructureInformation* info) - { - LINE("void " << MarkerClassName(m_env.m_asset) << "::MarkArray_" << MakeSafeTypeName(def) << "(const size_t count)") - LINE("{") - m_intendation++; + LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") + LINE("") - LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") - LINE("") + LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; - LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; + LINE(MakeTypeVarName(info->m_definition) << " = var;") + LINE("Mark_" << info->m_definition->m_name << "();") + LINE("var++;") - LINE(MakeTypeVarName(info->m_definition) << " = var;") - LINE("Mark_" << info->m_definition->m_name << "();") - LINE("var++;") + m_intendation--; + LINE("}") - m_intendation--; - LINE("}") + m_intendation--; + LINE("}") + } - m_intendation--; - LINE("}") - } + void MarkMember_ScriptString(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) const + { + if (loadType == MemberLoadType::ARRAY_POINTER) + { + LINE("MarkArray_ScriptString(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) + << ");") + } + else if (loadType == MemberLoadType::EMBEDDED_ARRAY) + { + LINE("MarkArray_ScriptString(" << MakeMemberAccess(info, member, modifier) << ", " + << MakeArrayCount(dynamic_cast(modifier.GetDeclarationModifier())) << ");") + } + else if (loadType == MemberLoadType::EMBEDDED) + { + LINE("Mark_ScriptString(" << MakeMemberAccess(info, member, modifier) << ");") + } + else + { + assert(false); + LINE("#error unsupported loadType " << static_cast(loadType) << " for scriptstring") + } + } - void MarkMember_ScriptString(StructureInformation* info, + void MarkMember_AssetRef(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType) const - { - if (loadType == MemberLoadType::ARRAY_POINTER) { - LINE("MarkArray_ScriptString(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) - << ");") - } - else if (loadType == MemberLoadType::EMBEDDED_ARRAY) - { - LINE("MarkArray_ScriptString(" << MakeMemberAccess(info, member, modifier) << ", " - << MakeArrayCount(dynamic_cast(modifier.GetDeclarationModifier())) << ");") - } - else if (loadType == MemberLoadType::EMBEDDED) - { - LINE("Mark_ScriptString(" << MakeMemberAccess(info, member, modifier) << ");") - } - else - { - assert(false); - LINE("#error unsupported loadType " << static_cast(loadType) << " for scriptstring") - } - } - - void MarkMember_AssetRef(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) const - { - if (loadType == MemberLoadType::POINTER_ARRAY) - { - if (modifier.IsArray()) + if (loadType == MemberLoadType::POINTER_ARRAY) { - LINE("MarkArray_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ", " - << modifier.GetArraySize() << ");") + if (modifier.IsArray()) + { + LINE("MarkArray_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ", " + << modifier.GetArraySize() << ");") + } + else + { + LINE("MarkArray_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ", " + << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + } + else if (loadType == MemberLoadType::SINGLE_POINTER) + { + LINE("Mark_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ");") } else { - LINE("MarkArray_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ", " - << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + assert(false); + LINE("#error unsupported loadType " << static_cast(loadType) << " for scriptstring") } } - else if (loadType == MemberLoadType::SINGLE_POINTER) - { - LINE("Mark_IndirectAssetRef(" << member->m_asset_ref->m_name << ", " << MakeMemberAccess(info, member, modifier) << ");") - } - else - { - assert(false); - LINE("#error unsupported loadType " << static_cast(loadType) << " for scriptstring") - } - } - void MarkMember_Asset(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) const - { - if (loadType == MemberLoadType::SINGLE_POINTER) - { - LINE("AddDependency(" << MarkerClassName(member->m_type) << "(m_zone).GetAssetInfo(" << MakeMemberAccess(info, member, modifier) << "));") - } - else if (loadType == MemberLoadType::POINTER_ARRAY) - { - MarkMember_PointerArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error unsupported loadType " << static_cast(loadType) << " for asset") - } - } - - void MarkMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) - << ");") - } - - void MarkMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - if (modifier.IsArray()) - { - LINE("MarkPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << modifier.GetArraySize() << ");") - } - else - { - LINE("MarkPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" - << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") - } - } - - void MarkMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - std::string arraySizeStr; - - if (modifier.HasDynamicArrayCount()) - arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); - else - arraySizeStr = std::to_string(modifier.GetArraySize()); - - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << arraySizeStr << ");") - } - - void MarkMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) - << ");") - } - - void MarkMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") - LINE("Mark_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "();") - } - - void MarkMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("Mark_" << MakeSafeTypeName(member->m_type->m_definition) << "();") - } - - void MarkMember_TypeCheck(StructureInformation* info, + void MarkMember_Asset(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType) const - { - if (member->m_is_script_string) { - MarkMember_ScriptString(info, member, modifier, loadType); - } - else if (member->m_asset_ref) - { - MarkMember_AssetRef(info, member, modifier, loadType); - } - else if (member->m_type && StructureComputations(member->m_type).IsAsset()) - { - MarkMember_Asset(info, member, modifier, loadType); - } - else - { - switch (loadType) + if (loadType == MemberLoadType::SINGLE_POINTER) { - case MemberLoadType::ARRAY_POINTER: - MarkMember_ArrayPointer(info, member, modifier); - break; - - case MemberLoadType::SINGLE_POINTER: - MarkMember_SinglePointer(info, member, modifier); - break; - - case MemberLoadType::EMBEDDED: - MarkMember_Embedded(info, member, modifier); - break; - - case MemberLoadType::POINTER_ARRAY: - MarkMember_PointerArray(info, member, modifier); - break; - - case MemberLoadType::DYNAMIC_ARRAY: - MarkMember_DynamicArray(info, member, modifier); - break; - - case MemberLoadType::EMBEDDED_ARRAY: - MarkMember_EmbeddedArray(info, member, modifier); - break; - - default: - LINE("// t=" << static_cast(loadType)) - break; + LINE("AddDependency(" << MarkerClassName(member->m_type) << "(m_zone).GetAssetInfo(" << MakeMemberAccess(info, member, modifier) << "));") } - } - } - - static bool MarkMember_ShouldMakePointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - MemberLoadType loadType) - { - if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) - { - return false; - } - - if (loadType == MemberLoadType::POINTER_ARRAY) - { - return !modifier.IsArray(); - } - - if (member->m_is_string) - { - return false; - } - - return true; - } - - void MarkMember_PointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberLoadType loadType) - { - if (MarkMember_ShouldMakePointerCheck(info, member, modifier, loadType)) - { - LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") - LINE("{") - m_intendation++; - - MarkMember_TypeCheck(info, member, modifier, loadType); - - m_intendation--; - LINE("}") - } - else - { - MarkMember_TypeCheck(info, member, modifier, loadType); - } - } - - void MarkMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - auto first = true; - for (const auto& entry : modifier.GetArrayEntries()) - { - if (first) + else if (loadType == MemberLoadType::POINTER_ARRAY) { - first = false; + MarkMember_PointerArray(info, member, modifier); } else { - LINE("") + assert(false); + LINE("#error unsupported loadType " << static_cast(loadType) << " for asset") + } + } + + void MarkMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" + << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") + } + + void MarkMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + if (modifier.IsArray()) + { + LINE("MarkPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << modifier.GetArraySize() << ");") + } + else + { + LINE("MarkPtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" + << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + } + + void MarkMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + std::string arraySizeStr; + + if (modifier.HasDynamicArrayCount()) + arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); + else + arraySizeStr = std::to_string(modifier.GetArraySize()); + + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << arraySizeStr << ");") + } + + void MarkMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" + << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + } + + void MarkMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") + LINE("Mark_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "();") + } + + void MarkMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("Mark_" << MakeSafeTypeName(member->m_type->m_definition) << "();") + } + + void MarkMember_TypeCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) const + { + if (member->m_is_script_string) + { + MarkMember_ScriptString(info, member, modifier, loadType); + } + else if (member->m_asset_ref) + { + MarkMember_AssetRef(info, member, modifier, loadType); + } + else if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + MarkMember_Asset(info, member, modifier, loadType); + } + else + { + switch (loadType) + { + case MemberLoadType::ARRAY_POINTER: + MarkMember_ArrayPointer(info, member, modifier); + break; + + case MemberLoadType::SINGLE_POINTER: + MarkMember_SinglePointer(info, member, modifier); + break; + + case MemberLoadType::EMBEDDED: + MarkMember_Embedded(info, member, modifier); + break; + + case MemberLoadType::POINTER_ARRAY: + MarkMember_PointerArray(info, member, modifier); + break; + + case MemberLoadType::DYNAMIC_ARRAY: + MarkMember_DynamicArray(info, member, modifier); + break; + + case MemberLoadType::EMBEDDED_ARRAY: + MarkMember_EmbeddedArray(info, member, modifier); + break; + + default: + LINE("// t=" << static_cast(loadType)) + break; + } + } + } + + static bool MarkMember_ShouldMakePointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + MemberLoadType loadType) + { + if (loadType != MemberLoadType::ARRAY_POINTER && loadType != MemberLoadType::POINTER_ARRAY && loadType != MemberLoadType::SINGLE_POINTER) + { + return false; } - MarkMember_Reference(info, member, entry); - } - } + if (loadType == MemberLoadType::POINTER_ARRAY) + { + return !modifier.IsArray(); + } - void MarkMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - if (modifier.IsDynamicArray()) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::DYNAMIC_ARRAY); - } - else if (modifier.IsSinglePointer()) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::SINGLE_POINTER); - } - else if (modifier.IsArrayPointer()) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::ARRAY_POINTER); - } - else if (modifier.IsPointerArray()) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::POINTER_ARRAY); - } - else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::EMBEDDED_ARRAY); - } - else if (modifier.GetDeclarationModifier() == nullptr) - { - MarkMember_PointerCheck(info, member, modifier, MemberLoadType::EMBEDDED); - } - else if (modifier.IsArray()) - { - MarkMember_ReferenceArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error MarkMemberReference failed @ " << member->m_member->m_name) - } - } + if (member->m_is_string) + { + return false; + } - void MarkMember_Condition_Struct(StructureInformation* info, MemberInformation* member) - { - LINE("") - if (member->m_condition) - { - LINE("if (" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - MarkMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") + return true; } - else + + void MarkMember_PointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberLoadType loadType) { - MarkMember_Reference(info, member, DeclarationModifierComputations(member)); + if (MarkMember_ShouldMakePointerCheck(info, member, modifier, loadType)) + { + LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") + LINE("{") + m_intendation++; + + MarkMember_TypeCheck(info, member, modifier, loadType); + + m_intendation--; + LINE("}") + } + else + { + MarkMember_TypeCheck(info, member, modifier, loadType); + } } - } - void MarkMember_Condition_Union(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); + void MarkMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + auto first = true; + for (const auto& entry : modifier.GetArrayEntries()) + { + if (first) + { + first = false; + } + else + { + LINE("") + } - if (computations.IsFirstMember()) + MarkMember_Reference(info, member, entry); + } + } + + void MarkMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + if (modifier.IsDynamicArray()) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::DYNAMIC_ARRAY); + } + else if (modifier.IsSinglePointer()) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::SINGLE_POINTER); + } + else if (modifier.IsArrayPointer()) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::ARRAY_POINTER); + } + else if (modifier.IsPointerArray()) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::POINTER_ARRAY); + } + else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::EMBEDDED_ARRAY); + } + else if (modifier.GetDeclarationModifier() == nullptr) + { + MarkMember_PointerCheck(info, member, modifier, MemberLoadType::EMBEDDED); + } + else if (modifier.IsArray()) + { + MarkMember_ReferenceArray(info, member, modifier); + } + else + { + assert(false); + LINE("#error MarkMemberReference failed @ " << member->m_member->m_name) + } + } + + void MarkMember_Condition_Struct(StructureInformation* info, MemberInformation* member) { LINE("") if (member->m_condition) @@ -523,298 +656,172 @@ class ZoneMarkTemplate::Internal final : BaseTemplate MarkMember_Reference(info, member, DeclarationModifierComputations(member)); } } - else if (computations.IsLastMember()) + + void MarkMember_Condition_Union(StructureInformation* info, MemberInformation* member) { - if (member->m_condition) + const MemberComputations computations(member); + + if (computations.IsFirstMember()) { - LINE("else if (" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - MarkMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("else") - LINE("{") - m_intendation++; - - MarkMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - } - else - { - if (member->m_condition) - { - LINE("else if (" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - MarkMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") - } - } - } - - void PrintMarkMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); - if (computations.ShouldIgnore() || computations.IsInRuntimeBlock()) - return; - - if (member->m_is_script_string || member->m_asset_ref - || member->m_type && (member->m_type->m_requires_marking || StructureComputations(member->m_type).IsAsset())) - { - if (info->m_definition->GetType() == DataDefinitionType::UNION) - MarkMember_Condition_Union(info, member); - else - MarkMember_Condition_Struct(info, member); - } - } - - void PrintMarkMethod(StructureInformation* info) - { - const StructureComputations computations(info); - LINE("void " << MarkerClassName(m_env.m_asset) << "::Mark_" << info->m_definition->m_name << "()") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") - - for (const auto& member : info->m_ordered_members) - { - PrintMarkMemberIfNeedsTreatment(info, member.get()); - } - - m_intendation--; - LINE("}") - } - - void PrintGetNameMethod() - { - LINE("std::string " << MarkerClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") - LINE("{") - m_intendation++; - - if (!m_env.m_asset->m_name_chain.empty()) - { - LINE_START("return pAsset") - - auto first = true; - for (auto* member : m_env.m_asset->m_name_chain) - { - if (first) + LINE("") + if (member->m_condition) { - first = false; - LINE_MIDDLE("->" << member->m_member->m_name) + LINE("if (" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + MarkMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") } else { - LINE_MIDDLE("." << member->m_member->m_name) + MarkMember_Reference(info, member, DeclarationModifierComputations(member)); } } - LINE_END(";") - } - else - { - LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") - } - - m_intendation--; - LINE("}") - } - - void PrintGetAssetInfoMethod() - { - LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* " << MarkerClassName(m_env.m_asset) << "::GetAssetInfo(" - << m_env.m_asset->m_definition->GetFullName() << "* pAsset) const") - LINE("{") - m_intendation++; - - LINE("return reinterpret_castm_definition->GetFullName() << ">*>(GetAssetInfoByName(GetAssetName(pAsset)));") - - m_intendation--; - LINE("}") - } - - void PrintMainMarkMethod() - { - LINE("void " << MarkerClassName(m_env.m_asset) << "::Mark(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") - LINE("{") - m_intendation++; - - LINE("assert(pAsset != nullptr);") - LINE("") - LINE(MakeTypeVarName(m_env.m_asset->m_definition) << " = pAsset;") - LINE("Mark_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "();") - - m_intendation--; - LINE("}") - } - -public: - Internal(std::ostream& stream, RenderingContext* context) - : BaseTemplate(stream, context) - { - } - - void Header() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#pragma once") - LINE("") - LINE("#include \"Loading/AssetMarker.h\"") - LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") - LINE("#include ") - LINE("") - LINE("namespace " << m_env.m_game) - LINE("{") - m_intendation++; - LINE("class " << MarkerClassName(m_env.m_asset) << " final : public AssetMarker") - LINE("{") - m_intendation++; - - LINE(VariableDecl(m_env.m_asset->m_definition)) - LINE(PointerVariableDecl(m_env.m_asset->m_definition)) - LINE("") - - m_intendation--; - LINE("public:") - m_intendation++; - - // Variable Declarations: type varType; - for (auto* type : m_env.m_used_types) - { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + else if (computations.IsLastMember()) { - LINE(VariableDecl(type->m_type)) + if (member->m_condition) + { + LINE("else if (" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + MarkMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("else") + LINE("{") + m_intendation++; + + MarkMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) + else { - LINE(PointerVariableDecl(type->m_type)) + if (member->m_condition) + { + LINE("else if (" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + MarkMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") + } } } - LINE("") - - // Method Declarations - for (auto* type : m_env.m_used_types) + void PrintMarkMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) { - if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking) + const MemberComputations computations(member); + if (computations.ShouldIgnore() || computations.IsInRuntimeBlock()) + return; + + if (member->m_is_script_string || member->m_asset_ref + || member->m_type && (member->m_type->m_requires_marking || StructureComputations(member->m_type).IsAsset())) { - PrintHeaderPtrArrayMarkMethodDeclaration(type->m_type); + if (info->m_definition->GetType() == DataDefinitionType::UNION) + MarkMember_Condition_Union(info, member); + else + MarkMember_Condition_Struct(info, member); } } - for (auto* type : m_env.m_used_types) + + void PrintMarkMethod(StructureInformation* info) { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking - && type->m_non_runtime_reference_exists) + const StructureComputations computations(info); + LINE("void " << MarkerClassName(m_env.m_asset) << "::Mark_" << info->m_definition->m_name << "()") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") + + for (const auto& member : info->m_ordered_members) { - PrintHeaderArrayMarkMethodDeclaration(type->m_type); + PrintMarkMemberIfNeedsTreatment(info, member.get()); } + + m_intendation--; + LINE("}") } - for (const auto* type : m_env.m_used_structures) + + void PrintGetNameMethod() { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking - && !StructureComputations(type->m_info).IsAsset()) + LINE("std::string " << MarkerClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") + LINE("{") + m_intendation++; + + if (!m_env.m_asset->m_name_chain.empty()) { - PrintHeaderMarkMethodDeclaration(type->m_info); + LINE_START("return pAsset") + + auto first = true; + for (auto* member : m_env.m_asset->m_name_chain) + { + if (first) + { + first = false; + LINE_MIDDLE("->" << member->m_member->m_name) + } + else + { + LINE_MIDDLE("." << member->m_member->m_name) + } + } + LINE_END(";") } + else + { + LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") + } + + m_intendation--; + LINE("}") } - PrintHeaderMarkMethodDeclaration(m_env.m_asset); - LINE("") - PrintHeaderGetNameMethodDeclaration(m_env.m_asset); - PrintHeaderGetAssetInfoMethodDeclaration(m_env.m_asset); - LINE("") - PrintHeaderConstructor(); - PrintHeaderMainMarkMethodDeclaration(m_env.m_asset); - m_intendation--; - LINE("};") - m_intendation--; - LINE("}") - } - - void Source() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"") - LINE("#include ") - LINE("") - - if (!m_env.m_referenced_assets.empty()) + void PrintGetAssetInfoMethod() { - LINE("// Referenced Assets:") - for (const auto* type : m_env.m_referenced_assets) - { - LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_mark_db.h\"") - } + LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* " << MarkerClassName(m_env.m_asset) << "::GetAssetInfo(" + << m_env.m_asset->m_definition->GetFullName() << "* pAsset) const") + LINE("{") + m_intendation++; + + LINE("return reinterpret_castm_definition->GetFullName() << ">*>(GetAssetInfoByName(GetAssetName(pAsset)));") + + m_intendation--; + LINE("}") + } + + void PrintMainMarkMethod() + { + LINE("void " << MarkerClassName(m_env.m_asset) << "::Mark(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") + LINE("{") + m_intendation++; + + LINE("assert(pAsset != nullptr);") LINE("") - } - LINE("using namespace " << m_env.m_game << ";") - LINE("") - PrintConstructorMethod(); + LINE(MakeTypeVarName(m_env.m_asset->m_definition) << " = pAsset;") + LINE("Mark_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "();") - for (const auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking) - { - LINE("") - PrintMarkPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); - } + m_intendation--; + LINE("}") } - for (const auto* type : m_env.m_used_types) - { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking - && type->m_non_runtime_reference_exists) - { - LINE("") - PrintMarkArrayMethod(type->m_type, type->m_info); - } - } - for (const auto* type : m_env.m_used_structures) - { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking - && !StructureComputations(type->m_info).IsAsset()) - { - LINE("") - PrintMarkMethod(type->m_info); - } - } - LINE("") - PrintMarkMethod(m_env.m_asset); - LINE("") - PrintMainMarkMethod(); - LINE("") - PrintGetNameMethod(); - PrintGetAssetInfoMethod(); - } -}; + }; +} // namespace std::vector ZoneMarkTemplate::GetFilesToRender(RenderingContext* context) { @@ -840,18 +847,15 @@ std::vector ZoneMarkTemplate::GetFilesToRender(RenderingContex void ZoneMarkTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) { - Internal internal(stream, context); + Template t(stream, context); if (fileTag == TAG_HEADER) { - internal.Header(); - } - else if (fileTag == TAG_SOURCE) - { - internal.Source(); + t.Header(); } else { - std::cout << "Unknown tag for ZoneMarkTemplate: " << fileTag << "\n"; + assert(fileTag == TAG_SOURCE); + t.Source(); } } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.h index 95513e07..5583b54e 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneMarkTemplate.h @@ -3,11 +3,6 @@ class ZoneMarkTemplate final : public ICodeTemplate { - static constexpr int TAG_HEADER = 1; - static constexpr int TAG_SOURCE = 2; - - class Internal; - public: std::vector GetFilesToRender(RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index 4f84d1c9..d0e7ec9f 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -8,720 +8,857 @@ #include #include -class ZoneWriteTemplate::Internal final : BaseTemplate +namespace { - enum class MemberWriteType : std::uint8_t + static constexpr int TAG_HEADER = 1; + static constexpr int TAG_SOURCE = 2; + + class Template final : BaseTemplate { - ARRAY_POINTER, - DYNAMIC_ARRAY, - EMBEDDED, - EMBEDDED_ARRAY, - POINTER_ARRAY, - SINGLE_POINTER - }; - - static std::string WriterClassName(StructureInformation* asset) - { - std::ostringstream str; - str << "Writer_" << asset->m_definition->m_name; - return str.str(); - } - - static std::string VariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; - return str.str(); - } - - static std::string WrittenVariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << "Written;"; - return str.str(); - } - - static std::string PointerVariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; - return str.str(); - } - - static std::string WrittenPointerVariableDecl(const DataDefinition* def) - { - std::ostringstream str; - str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "PtrWritten;"; - return str.str(); - } - - void PrintHeaderPtrArrayWriteMethodDeclaration(const DataDefinition* def) const - { - LINE("void WritePtrArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") - } - - void PrintHeaderArrayWriteMethodDeclaration(const DataDefinition* def) const - { - LINE("void WriteArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") - } - - void PrintHeaderWriteMethodDeclaration(const StructureInformation* info) const - { - LINE("void Write_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") - } - - void PrintHeaderTempPtrWriteMethodDeclaration(const StructureInformation* info) const - { - LINE("void WritePtr_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") - } - - void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const - { - LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") - } - - void PrintHeaderMainWriteMethodDeclaration(const StructureInformation* info) const - { - LINE("void Write(" << info->m_definition->GetFullName() << "** pAsset);") - } - - void PrintHeaderConstructor() const - { - LINE(WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() << "* asset, const Zone& zone, IZoneOutputStream& stream);") - } - - void PrintVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << " = nullptr;") - } - - void PrintWrittenVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << "Written = nullptr;") - } - - void PrintPointerVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << "Ptr = nullptr;") - } - - void PrintWrittenPointerVariableInitialization(const DataDefinition* def) const - { - LINE("var" << def->m_name << "PtrWritten = nullptr;") - } - - void PrintConstructorMethod() - { - LINE(WriterClassName(m_env.m_asset) << "::" << WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() - << "* asset, const Zone& zone, IZoneOutputStream& stream)") - - m_intendation++; - LINE_START(": AssetWriter(zone.m_pools->GetAssetOrAssetReference(" << m_env.m_asset->m_asset_enum_entry->m_name << ", GetAssetName(asset))" - << ", zone, stream)") - LINE_END("") - m_intendation--; - - LINE("{") - m_intendation++; - - PrintVariableInitialization(m_env.m_asset->m_definition); - PrintWrittenVariableInitialization(m_env.m_asset->m_definition); - PrintPointerVariableInitialization(m_env.m_asset->m_definition); - PrintWrittenPointerVariableInitialization(m_env.m_asset->m_definition); - LINE("") - - for (auto* type : m_env.m_used_types) + public: + Template(std::ostream& stream, RenderingContext* context) + : BaseTemplate(stream, context) { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + } + + void Header() + { + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#pragma once") + LINE("") + LINE("#include \"Writing/AssetWriter.h\"") + LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") + LINE("#include ") + LINE("") + LINE("namespace " << m_env.m_game) + LINE("{") + m_intendation++; + LINE("class " << WriterClassName(m_env.m_asset) << " final : public AssetWriter") + LINE("{") + m_intendation++; + + LINE(VariableDecl(m_env.m_asset->m_definition)) + LINE(WrittenVariableDecl(m_env.m_asset->m_definition)) + LINE(PointerVariableDecl(m_env.m_asset->m_definition)) + LINE(WrittenPointerVariableDecl(m_env.m_asset->m_definition)) + LINE("") + + // Variable Declarations: type varType; + for (auto* type : m_env.m_used_types) { - PrintVariableInitialization(type->m_type); - PrintWrittenVariableInitialization(type->m_type); + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + LINE(VariableDecl(type->m_type)) + LINE(WrittenVariableDecl(type->m_type)) + } } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + for (auto* type : m_env.m_used_types) { - PrintPointerVariableInitialization(type->m_type); - PrintWrittenPointerVariableInitialization(type->m_type); + if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + LINE(PointerVariableDecl(type->m_type)) + LINE(WrittenPointerVariableDecl(type->m_type)) + } } + + LINE("") + + // Method Declarations + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists) + { + PrintHeaderPtrArrayWriteMethodDeclaration(type->m_type); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + { + PrintHeaderArrayWriteMethodDeclaration(type->m_type); + } + } + for (auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + PrintHeaderWriteMethodDeclaration(type->m_info); + } + } + PrintHeaderWriteMethodDeclaration(m_env.m_asset); + PrintHeaderTempPtrWriteMethodDeclaration(m_env.m_asset); + LINE("") + m_intendation--; + LINE("public:") + m_intendation++; + PrintHeaderConstructor(); + PrintHeaderMainWriteMethodDeclaration(m_env.m_asset); + PrintHeaderGetNameMethodDeclaration(m_env.m_asset); + + m_intendation--; + LINE("};") + m_intendation--; + LINE("}") } - m_intendation--; - LINE("}") - } + void Source() + { + LINE("// ====================================================================") + LINE("// This file has been generated by ZoneCodeGenerator.") + LINE("// Do not modify. ") + LINE("// Any changes will be discarded when regenerating.") + LINE("// ====================================================================") + LINE("") + LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_write_db.h\"") + LINE("#include ") + LINE("") - void WriteMember_ScriptString(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) const - { - if (writeType == MemberWriteType::ARRAY_POINTER) - { - LINE("varScriptString = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") - LINE("WriteScriptStringArray(true, " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - } - else if (writeType == MemberWriteType::EMBEDDED_ARRAY) - { - LINE("varScriptStringWritten = " << MakeWrittenMemberAccess(info, member, modifier) << ";") - LINE("WriteScriptStringArray(false, " << MakeArrayCount(dynamic_cast(modifier.GetDeclarationModifier())) << ");") - } - else if (writeType == MemberWriteType::EMBEDDED) - { - LINE(MakeWrittenMemberAccess(info, member, modifier) << " = UseScriptString(" << MakeMemberAccess(info, member, modifier) << ");") - } - else - { - assert(false); - LINE("#error unsupported writeType " << static_cast(writeType) << " for scripstring") - } - } + if (!m_env.m_referenced_assets.empty()) + { + LINE("// Referenced Assets:") + for (auto* type : m_env.m_referenced_assets) + { + LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_write_db.h\"") + } + LINE("") + } + LINE("using namespace " << m_env.m_game << ";") + LINE("") + PrintConstructorMethod(); - void WriteMember_Asset(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) const - { - if (writeType == MemberWriteType::SINGLE_POINTER) - { - LINE(WriterClassName(member->m_type) << " writer(" << MakeMemberAccess(info, member, modifier) << ", m_zone, *m_stream);") - LINE("writer.Write(&" << MakeWrittenMemberAccess(info, member, modifier) << ");") + for (auto* type : m_env.m_used_types) + { + if (type->m_pointer_array_reference_exists) + { + LINE("") + PrintWritePtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); + } + } + for (auto* type : m_env.m_used_types) + { + if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + { + LINE("") + PrintWriteArrayMethod(type->m_type, type->m_info); + } + } + for (auto* type : m_env.m_used_structures) + { + if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + LINE("") + PrintWriteMethod(type->m_info); + } + } + LINE("") + PrintWriteMethod(m_env.m_asset); + LINE("") + PrintWritePtrMethod(m_env.m_asset); + LINE("") + PrintMainWriteMethod(); + LINE("") + PrintGetNameMethod(); } - else if (writeType == MemberWriteType::POINTER_ARRAY) - { - WriteMember_PointerArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error unsupported writeType " << static_cast(writeType) << " for asset") - } - } - void WriteMember_String(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) const - { - if (writeType == MemberWriteType::SINGLE_POINTER) + private: + enum class MemberWriteType : std::uint8_t { - if (member->m_member->m_type_declaration->m_is_const) - { - LINE("varXStringWritten = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") - } - else - { - LINE("varXStringWritten = const_cast(&" << MakeWrittenMemberAccess(info, member, modifier) << ");") - } - LINE("WriteXString(false);") + ARRAY_POINTER, + DYNAMIC_ARRAY, + EMBEDDED, + EMBEDDED_ARRAY, + POINTER_ARRAY, + SINGLE_POINTER + }; + + static std::string WriterClassName(StructureInformation* asset) + { + std::ostringstream str; + str << "Writer_" << asset->m_definition->m_name; + return str.str(); } - else if (writeType == MemberWriteType::POINTER_ARRAY) + + static std::string VariableDecl(const DataDefinition* def) { - if (modifier.IsArray()) + std::ostringstream str; + str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << ";"; + return str.str(); + } + + static std::string WrittenVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << "Written;"; + return str.str(); + } + + static std::string PointerVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "Ptr;"; + return str.str(); + } + + static std::string WrittenPointerVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "PtrWritten;"; + return str.str(); + } + + void PrintHeaderPtrArrayWriteMethodDeclaration(const DataDefinition* def) const + { + LINE("void WritePtrArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") + } + + void PrintHeaderArrayWriteMethodDeclaration(const DataDefinition* def) const + { + LINE("void WriteArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") + } + + void PrintHeaderWriteMethodDeclaration(const StructureInformation* info) const + { + LINE("void Write_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") + } + + void PrintHeaderTempPtrWriteMethodDeclaration(const StructureInformation* info) const + { + LINE("void WritePtr_" << MakeSafeTypeName(info->m_definition) << "(bool atStreamStart);") + } + + void PrintHeaderGetNameMethodDeclaration(const StructureInformation* info) const + { + LINE("static std::string GetAssetName(" << info->m_definition->GetFullName() << "* pAsset);") + } + + void PrintHeaderMainWriteMethodDeclaration(const StructureInformation* info) const + { + LINE("void Write(" << info->m_definition->GetFullName() << "** pAsset);") + } + + void PrintHeaderConstructor() const + { + LINE(WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() + << "* asset, const Zone& zone, IZoneOutputStream& stream);") + } + + void PrintVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << " = nullptr;") + } + + void PrintWrittenVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "Written = nullptr;") + } + + void PrintPointerVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "Ptr = nullptr;") + } + + void PrintWrittenPointerVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "PtrWritten = nullptr;") + } + + void PrintConstructorMethod() + { + LINE(WriterClassName(m_env.m_asset) << "::" << WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() + << "* asset, const Zone& zone, IZoneOutputStream& stream)") + + m_intendation++; + LINE_START(": AssetWriter(zone.m_pools->GetAssetOrAssetReference(" << m_env.m_asset->m_asset_enum_entry->m_name << ", GetAssetName(asset))" + << ", zone, stream)") + LINE_END("") + m_intendation--; + + LINE("{") + m_intendation++; + + PrintVariableInitialization(m_env.m_asset->m_definition); + PrintWrittenVariableInitialization(m_env.m_asset->m_definition); + PrintPointerVariableInitialization(m_env.m_asset->m_definition); + PrintWrittenPointerVariableInitialization(m_env.m_asset->m_definition); + LINE("") + + for (auto* type : m_env.m_used_types) { - LINE("varXStringWritten = " << MakeWrittenMemberAccess(info, member, modifier) << ";") - LINE("WriteXStringArray(false, " << modifier.GetArraySize() << ");") + if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + { + PrintVariableInitialization(type->m_type); + PrintWrittenVariableInitialization(type->m_type); + } } - else + for (auto* type : m_env.m_used_types) { - LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") + if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) + { + PrintPointerVariableInitialization(type->m_type); + PrintWrittenPointerVariableInitialization(type->m_type); + } + } + + m_intendation--; + LINE("}") + } + + void WriteMember_ScriptString(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) const + { + if (writeType == MemberWriteType::ARRAY_POINTER) + { + LINE("varScriptString = " << MakeMemberAccess(info, member, modifier) << ";") LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") - LINE("WriteXStringArray(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + LINE("WriteScriptStringArray(true, " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") } - } - else - { - assert(false); - LINE("#error unsupported writeType " << static_cast(writeType) << " for string") - } - } - - void WriteMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") - if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - } - else - { - LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - } - } - - void WriteMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - if (modifier.IsArray()) - { - LINE(MakeTypeWrittenPtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") - LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << modifier.GetArraySize() << ");") - } - else - { - LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") - LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") - } - } - - void WriteMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - std::string arraySizeStr; - - if (modifier.HasDynamicArrayCount()) - arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); - else - arraySizeStr = std::to_string(modifier.GetArraySize()); - - if (!member->m_is_leaf) - { - if (computations.IsAfterPartialLoad()) + else if (writeType == MemberWriteType::EMBEDDED_ARRAY) { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << arraySizeStr << ");") + LINE("varScriptStringWritten = " << MakeWrittenMemberAccess(info, member, modifier) << ";") + LINE("WriteScriptStringArray(false, " << MakeArrayCount(dynamic_cast(modifier.GetDeclarationModifier())) << ");") + } + else if (writeType == MemberWriteType::EMBEDDED) + { + LINE(MakeWrittenMemberAccess(info, member, modifier) << " = UseScriptString(" << MakeMemberAccess(info, member, modifier) << ");") } else { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") - LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") + assert(false); + LINE("#error unsupported writeType " << static_cast(writeType) << " for scripstring") } } - else if (computations.IsAfterPartialLoad()) - { - LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << arraySizeStr << ");") - } - } - void WriteMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - if (member->m_type && !member->m_type->m_is_leaf) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " - << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") - } - else - { - LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") - } - } - - void WriteMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - - if (!member->m_is_leaf) - { - if (computations.IsAfterPartialLoad()) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") - LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true);") - } - else - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") - LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") - LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") - } - } - else if (computations.IsAfterPartialLoad()) - { - LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeMemberAccess(info, member, modifier) - << ");") - } - } - - void WriteMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const - { - const MemberComputations computations(member); - LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") - if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) - { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") - LINE("Write_" << MakeSafeTypeName(member->m_type->m_definition) << "(true);") - } - else - { - LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) - << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) - << ");") - } - } - - void WriteMember_TypeCheck(StructureInformation* info, + void WriteMember_Asset(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) const - { - if (member->m_is_string) { - WriteMember_String(info, member, modifier, writeType); - } - else if (member->m_is_script_string) - { - WriteMember_ScriptString(info, member, modifier, writeType); - } - else if (member->m_type && StructureComputations(member->m_type).IsAsset()) - { - WriteMember_Asset(info, member, modifier, writeType); - } - else - { - switch (writeType) + if (writeType == MemberWriteType::SINGLE_POINTER) + { + LINE(WriterClassName(member->m_type) << " writer(" << MakeMemberAccess(info, member, modifier) << ", m_zone, *m_stream);") + LINE("writer.Write(&" << MakeWrittenMemberAccess(info, member, modifier) << ");") + } + else if (writeType == MemberWriteType::POINTER_ARRAY) { - case MemberWriteType::ARRAY_POINTER: - WriteMember_ArrayPointer(info, member, modifier); - break; - - case MemberWriteType::SINGLE_POINTER: - WriteMember_SinglePointer(info, member, modifier); - break; - - case MemberWriteType::EMBEDDED: - WriteMember_Embedded(info, member, modifier); - break; - - case MemberWriteType::POINTER_ARRAY: WriteMember_PointerArray(info, member, modifier); - break; - - case MemberWriteType::DYNAMIC_ARRAY: - WriteMember_DynamicArray(info, member, modifier); - break; - - case MemberWriteType::EMBEDDED_ARRAY: - WriteMember_EmbeddedArray(info, member, modifier); - break; - - default: - LINE("// t=" << static_cast(writeType)) - break; + } + else + { + assert(false); + LINE("#error unsupported writeType " << static_cast(writeType) << " for asset") } } - } - static bool WriteMember_ShouldMakeInsertReuse(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::POINTER_ARRAY) + void WriteMember_String(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) const { - return false; + if (writeType == MemberWriteType::SINGLE_POINTER) + { + if (member->m_member->m_type_declaration->m_is_const) + { + LINE("varXStringWritten = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") + } + else + { + LINE("varXStringWritten = const_cast(&" << MakeWrittenMemberAccess(info, member, modifier) << ");") + } + LINE("WriteXString(false);") + } + else if (writeType == MemberWriteType::POINTER_ARRAY) + { + if (modifier.IsArray()) + { + LINE("varXStringWritten = " << MakeWrittenMemberAccess(info, member, modifier) << ";") + LINE("WriteXStringArray(false, " << modifier.GetArraySize() << ");") + } + else + { + LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") + LINE("WriteXStringArray(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + } + else + { + assert(false); + LINE("#error unsupported writeType " << static_cast(writeType) << " for string") + } } - if (writeType == MemberWriteType::POINTER_ARRAY && modifier.IsArray()) + void WriteMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const { - return false; + const MemberComputations computations(member); + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") + if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") + } + else + { + LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) + << ");") + } } - if (member->m_is_string) + void WriteMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const { - return false; + LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + if (modifier.IsArray()) + { + LINE(MakeTypeWrittenPtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") + LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << modifier.GetArraySize() << ");") + } + else + { + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") + LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } } - if (member->m_type && StructureComputations(member->m_type).IsAsset()) + void WriteMember_EmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const { - return false; + const MemberComputations computations(member); + std::string arraySizeStr; + + if (modifier.HasDynamicArrayCount()) + arraySizeStr = MakeEvaluation(modifier.GetDynamicArrayCountEvaluation()); + else + arraySizeStr = std::to_string(modifier.GetArraySize()); + + if (!member->m_is_leaf) + { + if (computations.IsAfterPartialLoad()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << arraySizeStr << ");") + } + else + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) + << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") + LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") + } + } + else if (computations.IsAfterPartialLoad()) + { + LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << arraySizeStr << ");") + } } - if (member->m_is_reusable) + void WriteMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + if (member->m_type && !member->m_type->m_is_leaf) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " + << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + } + else + { + LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + } + } + + void WriteMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + + if (!member->m_is_leaf) + { + if (computations.IsAfterPartialLoad()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") + LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true);") + } + else + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") + LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) + << " = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") + LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") + } + } + else if (computations.IsAfterPartialLoad()) + { + LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" + << MakeMemberAccess(info, member, modifier) << ");") + } + } + + void WriteMember_SinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + const MemberComputations computations(member); + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") + if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) + { + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE("Write_" << MakeSafeTypeName(member->m_type->m_definition) << "(true);") + } + else + { + LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) + << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" + << MakeMemberAccess(info, member, modifier) << ");") + } + } + + void WriteMember_TypeCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) const + { + if (member->m_is_string) + { + WriteMember_String(info, member, modifier, writeType); + } + else if (member->m_is_script_string) + { + WriteMember_ScriptString(info, member, modifier, writeType); + } + else if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + WriteMember_Asset(info, member, modifier, writeType); + } + else + { + switch (writeType) + { + case MemberWriteType::ARRAY_POINTER: + WriteMember_ArrayPointer(info, member, modifier); + break; + + case MemberWriteType::SINGLE_POINTER: + WriteMember_SinglePointer(info, member, modifier); + break; + + case MemberWriteType::EMBEDDED: + WriteMember_Embedded(info, member, modifier); + break; + + case MemberWriteType::POINTER_ARRAY: + WriteMember_PointerArray(info, member, modifier); + break; + + case MemberWriteType::DYNAMIC_ARRAY: + WriteMember_DynamicArray(info, member, modifier); + break; + + case MemberWriteType::EMBEDDED_ARRAY: + WriteMember_EmbeddedArray(info, member, modifier); + break; + + default: + LINE("// t=" << static_cast(writeType)) + break; + } + } + } + + static bool WriteMember_ShouldMakeInsertReuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) + { + if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::POINTER_ARRAY) + { + return false; + } + + if (writeType == MemberWriteType::POINTER_ARRAY && modifier.IsArray()) + { + return false; + } + + if (member->m_is_string) + { + return false; + } + + if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + return false; + } + + if (member->m_is_reusable) + return true; + + if (member->m_type == nullptr || !member->m_type->m_reusable_reference_exists) + return false; + return true; - - if (member->m_type == nullptr || !member->m_type->m_reusable_reference_exists) - return false; - - return true; - } - - void WriteMember_InsertReuse(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType)) - { - WriteMember_TypeCheck(info, member, modifier, writeType); - return; } - if (writeType == MemberWriteType::ARRAY_POINTER) + void WriteMember_InsertReuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) { - LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) - << ");") - } - else if (writeType == MemberWriteType::POINTER_ARRAY) - { - const auto* evaluation = modifier.GetPointerArrayCountEvaluation(); + if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType)) + { + WriteMember_TypeCheck(info, member, modifier, writeType); + return; + } - if (evaluation) + if (writeType == MemberWriteType::ARRAY_POINTER) { LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " - << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") + } + else if (writeType == MemberWriteType::POINTER_ARRAY) + { + const auto* evaluation = modifier.GetPointerArrayCountEvaluation(); + + if (evaluation) + { + LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " + << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") + } + else + { + LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " << modifier.GetArraySize() << ");") + } } else { - LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " << modifier.GetArraySize() << ");") + LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ");") } - } - else - { - LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ");") + + WriteMember_TypeCheck(info, member, modifier, writeType); } - WriteMember_TypeCheck(info, member, modifier, writeType); - } - - static bool WriteMember_ShouldMakeAlign(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::POINTER_ARRAY && writeType != MemberWriteType::SINGLE_POINTER) + static bool WriteMember_ShouldMakeAlign(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) { - return false; + if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::POINTER_ARRAY && writeType != MemberWriteType::SINGLE_POINTER) + { + return false; + } + + if (writeType == MemberWriteType::POINTER_ARRAY) + { + return !modifier.IsArray(); + } + + if (member->m_is_string) + { + return false; + } + + if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + return false; + } + + return true; } - if (writeType == MemberWriteType::POINTER_ARRAY) + void WriteMember_Align(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) { - return !modifier.IsArray(); - } + if (!WriteMember_ShouldMakeAlign(info, member, modifier, writeType)) + { + WriteMember_InsertReuse(info, member, modifier, writeType); + return; + } - if (member->m_is_string) - { - return false; - } + const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get()); + const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); - if (member->m_type && StructureComputations(member->m_type).IsAsset()) - { - return false; - } + if (member->m_alloc_alignment) + { + LINE("m_stream->Align(" << MakeEvaluation(member->m_alloc_alignment.get()) << ");") + } + else + { + LINE("m_stream->Align(" << modifier.GetAlignment() << ");") + } - return true; - } - - void WriteMember_Align(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (!WriteMember_ShouldMakeAlign(info, member, modifier, writeType)) - { WriteMember_InsertReuse(info, member, modifier, writeType); - return; } - const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get()); - const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + static bool WriteMember_ShouldMakeReuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) + { + if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::POINTER_ARRAY) + { + return false; + } - if (member->m_alloc_alignment) - { - LINE("m_stream->Align(" << MakeEvaluation(member->m_alloc_alignment.get()) << ");") - } - else - { - LINE("m_stream->Align(" << modifier.GetAlignment() << ");") + if (writeType == MemberWriteType::POINTER_ARRAY && modifier.IsArray()) + { + return false; + } + + return member->m_is_reusable; } - WriteMember_InsertReuse(info, member, modifier, writeType); - } - - static bool WriteMember_ShouldMakeReuse(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::POINTER_ARRAY) + void WriteMember_Reuse(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) { - return false; - } + if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType)) + { + WriteMember_Align(info, member, modifier, writeType); + return; + } - if (writeType == MemberWriteType::POINTER_ARRAY && modifier.IsArray()) - { - return false; - } - - return member->m_is_reusable; - } - - void WriteMember_Reuse(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType)) - { - WriteMember_Align(info, member, modifier, writeType); - return; - } - - LINE("if(m_stream->ReusableShouldWrite(&" << MakeWrittenMemberAccess(info, member, modifier) << "))") - LINE("{") - m_intendation++; - - WriteMember_Align(info, member, modifier, writeType); - - m_intendation--; - LINE("}") - } - - static bool WriteMember_ShouldMakePointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::POINTER_ARRAY && writeType != MemberWriteType::SINGLE_POINTER) - { - return false; - } - - if (writeType == MemberWriteType::POINTER_ARRAY) - { - return !modifier.IsArray(); - } - - if (member->m_is_string) - { - return false; - } - - return true; - } - - void WriteMember_PointerCheck(StructureInformation* info, - MemberInformation* member, - const DeclarationModifierComputations& modifier, - const MemberWriteType writeType) - { - if (WriteMember_ShouldMakePointerCheck(info, member, modifier, writeType)) - { - LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") + LINE("if(m_stream->ReusableShouldWrite(&" << MakeWrittenMemberAccess(info, member, modifier) << "))") LINE("{") m_intendation++; - WriteMember_Reuse(info, member, modifier, writeType); + WriteMember_Align(info, member, modifier, writeType); m_intendation--; LINE("}") } - else + + static bool WriteMember_ShouldMakePointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) { - WriteMember_Reuse(info, member, modifier, writeType); - } - } - - void WriteMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberWriteType writeType) - { - const MemberComputations computations(member); - - const auto notInDefaultNormalBlock = computations.IsNotInDefaultNormalBlock(); - if (notInDefaultNormalBlock) - { - LINE("m_stream->PushBlock(" << member->m_fast_file_block->m_name << ");") - } - - WriteMember_PointerCheck(info, member, modifier, writeType); - - if (notInDefaultNormalBlock) - { - LINE("m_stream->PopBlock();") - } - } - - void WriteMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - auto first = true; - for (const auto& entry : modifier.GetArrayEntries()) - { - if (first) + if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::POINTER_ARRAY && writeType != MemberWriteType::SINGLE_POINTER) { - first = false; + return false; + } + + if (writeType == MemberWriteType::POINTER_ARRAY) + { + return !modifier.IsArray(); + } + + if (member->m_is_string) + { + return false; + } + + return true; + } + + void WriteMember_PointerCheck(StructureInformation* info, + MemberInformation* member, + const DeclarationModifierComputations& modifier, + const MemberWriteType writeType) + { + if (WriteMember_ShouldMakePointerCheck(info, member, modifier, writeType)) + { + LINE("if (" << MakeMemberAccess(info, member, modifier) << ")") + LINE("{") + m_intendation++; + + WriteMember_Reuse(info, member, modifier, writeType); + + m_intendation--; + LINE("}") } else { - LINE("") + WriteMember_Reuse(info, member, modifier, writeType); + } + } + + void + WriteMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberWriteType writeType) + { + const MemberComputations computations(member); + + const auto notInDefaultNormalBlock = computations.IsNotInDefaultNormalBlock(); + if (notInDefaultNormalBlock) + { + LINE("m_stream->PushBlock(" << member->m_fast_file_block->m_name << ");") } - WriteMember_Reference(info, member, entry); - } - } + WriteMember_PointerCheck(info, member, modifier, writeType); - void WriteMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) - { - if (modifier.IsDynamicArray()) - { - WriteMember_Block(info, member, modifier, MemberWriteType::DYNAMIC_ARRAY); + if (notInDefaultNormalBlock) + { + LINE("m_stream->PopBlock();") + } } - else if (modifier.IsSinglePointer()) - { - WriteMember_Block(info, member, modifier, MemberWriteType::SINGLE_POINTER); - } - else if (modifier.IsArrayPointer()) - { - WriteMember_Block(info, member, modifier, MemberWriteType::ARRAY_POINTER); - } - else if (modifier.IsPointerArray()) - { - WriteMember_Block(info, member, modifier, MemberWriteType::POINTER_ARRAY); - } - else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) - { - WriteMember_Block(info, member, modifier, MemberWriteType::EMBEDDED_ARRAY); - } - else if (modifier.GetDeclarationModifier() == nullptr) - { - WriteMember_Block(info, member, modifier, MemberWriteType::EMBEDDED); - } - else if (modifier.IsArray()) - { - WriteMember_ReferenceArray(info, member, modifier); - } - else - { - assert(false); - LINE("#error WriteMemberReference failed @ " << member->m_member->m_name) - } - } - void WriteMember_Condition_Struct(StructureInformation* info, MemberInformation* member) - { - LINE("") - if (member->m_condition) + void WriteMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) { - LINE("if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; + auto first = true; + for (const auto& entry : modifier.GetArrayEntries()) + { + if (first) + { + first = false; + } + else + { + LINE("") + } - WriteMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") + WriteMember_Reference(info, member, entry); + } } - else + + void WriteMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) { - WriteMember_Reference(info, member, DeclarationModifierComputations(member)); + if (modifier.IsDynamicArray()) + { + WriteMember_Block(info, member, modifier, MemberWriteType::DYNAMIC_ARRAY); + } + else if (modifier.IsSinglePointer()) + { + WriteMember_Block(info, member, modifier, MemberWriteType::SINGLE_POINTER); + } + else if (modifier.IsArrayPointer()) + { + WriteMember_Block(info, member, modifier, MemberWriteType::ARRAY_POINTER); + } + else if (modifier.IsPointerArray()) + { + WriteMember_Block(info, member, modifier, MemberWriteType::POINTER_ARRAY); + } + else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) + { + WriteMember_Block(info, member, modifier, MemberWriteType::EMBEDDED_ARRAY); + } + else if (modifier.GetDeclarationModifier() == nullptr) + { + WriteMember_Block(info, member, modifier, MemberWriteType::EMBEDDED); + } + else if (modifier.IsArray()) + { + WriteMember_ReferenceArray(info, member, modifier); + } + else + { + assert(false); + LINE("#error WriteMemberReference failed @ " << member->m_member->m_name) + } } - } - void WriteMember_Condition_Union(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); - - if (computations.IsFirstMember()) + void WriteMember_Condition_Struct(StructureInformation* info, MemberInformation* member) { LINE("") if (member->m_condition) @@ -740,521 +877,396 @@ class ZoneWriteTemplate::Internal final : BaseTemplate WriteMember_Reference(info, member, DeclarationModifierComputations(member)); } } - else if (computations.IsLastMember()) + + void WriteMember_Condition_Union(StructureInformation* info, MemberInformation* member) { - if (member->m_condition) + const MemberComputations computations(member); + + if (computations.IsFirstMember()) { - LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - WriteMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("else") - LINE("{") - m_intendation++; - - WriteMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - } - else - { - if (member->m_condition) - { - LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") - LINE("{") - m_intendation++; - - WriteMember_Reference(info, member, DeclarationModifierComputations(member)); - - m_intendation--; - LINE("}") - } - else - { - LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") - } - } - } - - void PrintWriteMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) - { - const MemberComputations computations(member); - if (computations.ShouldIgnore()) - return; - - if (member->m_is_string || member->m_is_script_string || computations.ContainsNonEmbeddedReference() || member->m_type && !member->m_type->m_is_leaf - || computations.IsAfterPartialLoad()) - { - if (info->m_definition->GetType() == DataDefinitionType::UNION) - WriteMember_Condition_Union(info, member); - else - WriteMember_Condition_Struct(info, member); - } - } - - void PrintWriteMethod(StructureInformation* info) - { - const StructureComputations computations(info); - LINE("void " << WriterClassName(m_env.m_asset) << "::Write_" << info->m_definition->m_name << "(const bool atStreamStart)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") - LINE("") - - auto* dynamicMember = computations.GetDynamicMember(); - if (!(info->m_definition->GetType() == DataDefinitionType::UNION && dynamicMember)) - { - LINE("if(atStreamStart)") - m_intendation++; - - if (dynamicMember == nullptr) - { - LINE(MakeTypeWrittenVarName(info->m_definition) << " = m_stream->Write<" << info->m_definition->GetFullName() << ">(" - << MakeTypeVarName(info->m_definition) << "); // Size: " << info->m_definition->GetSize()) - } - else - { - LINE(MakeTypeWrittenVarName(info->m_definition) - << " = m_stream->WritePartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" - << info->m_definition->GetFullName() << ", " << dynamicMember->m_member->m_name << "));") - } - - m_intendation--; - - LINE("") - LINE("assert(" << MakeTypeWrittenVarName(info->m_definition) << " != nullptr);") - } - else - { - LINE("assert(atStreamStart);") - } - - if (computations.IsAsset()) - { - LINE("") - LINE("m_stream->PushBlock(" << m_env.m_default_normal_block->m_name << ");") - } - else if (info->m_block) - { - LINE("") - LINE("m_stream->PushBlock(" << info->m_block->m_name << ");") - } - - for (const auto& member : info->m_ordered_members) - { - PrintWriteMemberIfNeedsTreatment(info, member.get()); - } - - if (info->m_block || computations.IsAsset()) - { - LINE("") - LINE("m_stream->PopBlock();") - } - - m_intendation--; - LINE("}") - } - - void PrintWritePtrMethod(StructureInformation* info) - { - const bool inTemp = info->m_block && info->m_block->m_type == FastFileBlockType::TEMP; - LINE("void " << WriterClassName(m_env.m_asset) << "::WritePtr_" << MakeSafeTypeName(info->m_definition) << "(const bool atStreamStart)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypePtrVarName(info->m_definition) << " != nullptr);") - LINE("") - - LINE("if(atStreamStart)") - m_intendation++; - LINE(MakeTypeWrittenPtrVarName(info->m_definition) - << " = m_stream->Write<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") - m_intendation--; - - LINE("") - LINE("assert(" << MakeTypeWrittenPtrVarName(info->m_definition) << " != nullptr);") - - LINE("") - if (inTemp) - { - LINE("m_stream->PushBlock(" << m_env.m_default_temp_block->m_name << ");") - LINE("") - } - LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(info->m_definition) << "))") - LINE("{") - m_intendation++; - - LINE("m_stream->Align(" << info->m_definition->GetAlignment() << ");") - LINE("m_stream->ReusableAddOffset(*" << MakeTypePtrVarName(info->m_definition) << ");") - LINE("") - if (!info->m_is_leaf) - { - LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(info->m_definition) << ";") - LINE("Write_" << MakeSafeTypeName(info->m_definition) << "(true);") - } - else - { - LINE("#error Ptr method cannot have leaf type") - } - - LINE("") - LINE("m_stream->MarkFollowing(*" << MakeTypeWrittenPtrVarName(info->m_definition) << ");") - - m_intendation--; - LINE("}") - - if (inTemp) - { - LINE("") - LINE("m_stream->PopBlock();") - } - - m_intendation--; - LINE("}") - } - - void PrintMainWriteMethod() - { - LINE("void " << WriterClassName(m_env.m_asset) << "::Write(" << m_env.m_asset->m_definition->GetFullName() << "** pAsset)") - LINE("{") - m_intendation++; - - LINE("assert(pAsset != nullptr);") - LINE("assert(m_asset != nullptr);") - LINE("assert(m_asset->m_ptr != nullptr);") - LINE("") - LINE("auto* zoneAsset = static_cast<" << m_env.m_asset->m_definition->GetFullName() << "*>(m_asset->m_ptr);") - LINE(MakeTypePtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") - LINE(MakeTypeWrittenPtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") - LINE("WritePtr_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "(false);") - LINE("*pAsset = zoneAsset;") - - m_intendation--; - LINE("}") - } - - void PrintGetNameMethod() - { - LINE("std::string " << WriterClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") - LINE("{") - m_intendation++; - - if (!m_env.m_asset->m_name_chain.empty()) - { - LINE_START("return pAsset") - - auto first = true; - for (auto* member : m_env.m_asset->m_name_chain) - { - if (first) + LINE("") + if (member->m_condition) { - first = false; - LINE_MIDDLE("->" << member->m_member->m_name) + LINE("if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + WriteMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") } else { - LINE_MIDDLE("." << member->m_member->m_name) + WriteMember_Reference(info, member, DeclarationModifierComputations(member)); } } - LINE_END(";") - } - else - { - LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") - } - - m_intendation--; - LINE("}") - } - - void PrintWritePtrArrayMethod_Loading(const DataDefinition* def, StructureInformation* info, const bool reusable) const - { - LINE("m_stream->Align(" << def->GetAlignment() << ");") - - if (reusable) - { - LINE("m_stream->ReusableAddOffset(*" << MakeTypePtrVarName(def) << ");") - } - - if (info && !info->m_is_leaf) - { - LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") - LINE("Write_" << MakeSafeTypeName(def) << "(true);") - } - else - { - LINE("m_stream->Write<" << def->GetFullName() << ">(*" << MakeTypePtrVarName(def) << ");") - } - LINE("m_stream->MarkFollowing(*" << MakeTypeWrittenPtrVarName(def) << ");") - } - - void PrintWritePtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("if (*" << MakeTypePtrVarName(def) << ")") - LINE("{") - m_intendation++; - - if (info && StructureComputations(info).IsAsset()) - { - LINE(WriterClassName(info) << " writer(*" << MakeTypePtrVarName(def) << ", m_zone, *m_stream);") - LINE("writer.Write(" << MakeTypeWrittenPtrVarName(def) << ");") - } - else - { - if (reusable) + else if (computations.IsLastMember()) { - LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(def) << "))") - LINE("{") - m_intendation++; + if (member->m_condition) + { + LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; - PrintWritePtrArrayMethod_Loading(def, info, reusable); + WriteMember_Reference(info, member, DeclarationModifierComputations(member)); - m_intendation--; - LINE("}") + m_intendation--; + LINE("}") + } + else + { + LINE("else") + LINE("{") + m_intendation++; + + WriteMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } } else { - PrintWritePtrArrayMethod_Loading(def, info, reusable); + if (member->m_condition) + { + LINE("else if(" << MakeEvaluation(member->m_condition.get()) << ")") + LINE("{") + m_intendation++; + + WriteMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("#error Middle member of union must have condition (" << member->m_member->m_name << ")") + } } } - m_intendation--; - LINE("}") - } - - void PrintWritePtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) - { - LINE("void " << WriterClassName(m_env.m_asset) << "::WritePtrArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") - LINE("") - - LINE("if(atStreamStart)") - m_intendation++; - LINE(MakeTypeWrittenPtrVarName(def) << " = m_stream->Write<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") - m_intendation--; - - LINE("") - LINE("assert(" << MakeTypeWrittenPtrVarName(def) << " != nullptr);") - - LINE("") - LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") - LINE(def->GetFullName() << "** varWritten = " << MakeTypeWrittenPtrVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; - - LINE(MakeTypePtrVarName(def) << " = var;") - LINE(MakeTypeWrittenPtrVarName(def) << " = varWritten;") - PrintWritePtrArrayMethod_PointerCheck(def, info, reusable); - LINE("") - LINE("var++;") - LINE("varWritten++;") - - m_intendation--; - LINE("}") - m_intendation--; - LINE("}") - } - - void PrintWriteArrayMethod(const DataDefinition* def, StructureInformation* info) - { - LINE("void " << WriterClassName(m_env.m_asset) << "::WriteArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") - LINE("{") - m_intendation++; - - LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") - LINE("") - LINE("if(atStreamStart)") - m_intendation++; - LINE(MakeTypeWrittenVarName(def) << " = m_stream->Write<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") - m_intendation--; - - LINE("") - LINE("assert(" << MakeTypeWrittenVarName(def) << " != nullptr);") - - LINE("") - LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") - LINE(def->GetFullName() << "* varWritten = " << MakeTypeWrittenVarName(def) << ";") - LINE("for(size_t index = 0; index < count; index++)") - LINE("{") - m_intendation++; - - LINE(MakeTypeVarName(info->m_definition) << " = var;") - LINE(MakeTypeWrittenVarName(info->m_definition) << " = varWritten;") - LINE("Write_" << info->m_definition->m_name << "(false);") - LINE("var++;") - LINE("varWritten++;") - - m_intendation--; - LINE("}") - - m_intendation--; - LINE("}") - } - -public: - Internal(std::ostream& stream, RenderingContext* context) - : BaseTemplate(stream, context) - { - } - - void Header() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#pragma once") - LINE("") - LINE("#include \"Writing/AssetWriter.h\"") - LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"") - LINE("#include ") - LINE("") - LINE("namespace " << m_env.m_game) - LINE("{") - m_intendation++; - LINE("class " << WriterClassName(m_env.m_asset) << " final : public AssetWriter") - LINE("{") - m_intendation++; - - LINE(VariableDecl(m_env.m_asset->m_definition)) - LINE(WrittenVariableDecl(m_env.m_asset->m_definition)) - LINE(PointerVariableDecl(m_env.m_asset->m_definition)) - LINE(WrittenPointerVariableDecl(m_env.m_asset->m_definition)) - LINE("") - - // Variable Declarations: type varType; - for (auto* type : m_env.m_used_types) + void PrintWriteMemberIfNeedsTreatment(StructureInformation* info, MemberInformation* member) { - if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + const MemberComputations computations(member); + if (computations.ShouldIgnore()) + return; + + if (member->m_is_string || member->m_is_script_string || computations.ContainsNonEmbeddedReference() || member->m_type && !member->m_type->m_is_leaf + || computations.IsAfterPartialLoad()) { - LINE(VariableDecl(type->m_type)) - LINE(WrittenVariableDecl(type->m_type)) - } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) - { - LINE(PointerVariableDecl(type->m_type)) - LINE(WrittenPointerVariableDecl(type->m_type)) + if (info->m_definition->GetType() == DataDefinitionType::UNION) + WriteMember_Condition_Union(info, member); + else + WriteMember_Condition_Struct(info, member); } } - LINE("") - - // Method Declarations - for (auto* type : m_env.m_used_types) + void PrintWriteMethod(StructureInformation* info) { - if (type->m_pointer_array_reference_exists) - { - PrintHeaderPtrArrayWriteMethodDeclaration(type->m_type); - } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) - { - PrintHeaderArrayWriteMethodDeclaration(type->m_type); - } - } - for (auto* type : m_env.m_used_structures) - { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) - { - PrintHeaderWriteMethodDeclaration(type->m_info); - } - } - PrintHeaderWriteMethodDeclaration(m_env.m_asset); - PrintHeaderTempPtrWriteMethodDeclaration(m_env.m_asset); - LINE("") - m_intendation--; - LINE("public:") - m_intendation++; - PrintHeaderConstructor(); - PrintHeaderMainWriteMethodDeclaration(m_env.m_asset); - PrintHeaderGetNameMethodDeclaration(m_env.m_asset); + const StructureComputations computations(info); + LINE("void " << WriterClassName(m_env.m_asset) << "::Write_" << info->m_definition->m_name << "(const bool atStreamStart)") + LINE("{") + m_intendation++; - m_intendation--; - LINE("};") - m_intendation--; - LINE("}") - } - - void Source() - { - LINE("// ====================================================================") - LINE("// This file has been generated by ZoneCodeGenerator.") - LINE("// Do not modify. ") - LINE("// Any changes will be discarded when regenerating.") - LINE("// ====================================================================") - LINE("") - LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_write_db.h\"") - LINE("#include ") - LINE("") - - if (!m_env.m_referenced_assets.empty()) - { - LINE("// Referenced Assets:") - for (auto* type : m_env.m_referenced_assets) - { - LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_write_db.h\"") - } + LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") LINE("") - } - LINE("using namespace " << m_env.m_game << ";") - LINE("") - PrintConstructorMethod(); - for (auto* type : m_env.m_used_types) - { - if (type->m_pointer_array_reference_exists) + auto* dynamicMember = computations.GetDynamicMember(); + if (!(info->m_definition->GetType() == DataDefinitionType::UNION && dynamicMember)) + { + LINE("if(atStreamStart)") + m_intendation++; + + if (dynamicMember == nullptr) + { + LINE(MakeTypeWrittenVarName(info->m_definition) << " = m_stream->Write<" << info->m_definition->GetFullName() << ">(" + << MakeTypeVarName(info->m_definition) << "); // Size: " << info->m_definition->GetSize()) + } + else + { + LINE(MakeTypeWrittenVarName(info->m_definition) + << " = m_stream->WritePartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" + << info->m_definition->GetFullName() << ", " << dynamicMember->m_member->m_name << "));") + } + + m_intendation--; + + LINE("") + LINE("assert(" << MakeTypeWrittenVarName(info->m_definition) << " != nullptr);") + } + else + { + LINE("assert(atStreamStart);") + } + + if (computations.IsAsset()) { LINE("") - PrintWritePtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable); + LINE("m_stream->PushBlock(" << m_env.m_default_normal_block->m_name << ");") } - } - for (auto* type : m_env.m_used_types) - { - if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists) + else if (info->m_block) { LINE("") - PrintWriteArrayMethod(type->m_type, type->m_info); + LINE("m_stream->PushBlock(" << info->m_block->m_name << ");") } - } - for (auto* type : m_env.m_used_structures) - { - if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) + + for (const auto& member : info->m_ordered_members) + { + PrintWriteMemberIfNeedsTreatment(info, member.get()); + } + + if (info->m_block || computations.IsAsset()) { LINE("") - PrintWriteMethod(type->m_info); + LINE("m_stream->PopBlock();") } + + m_intendation--; + LINE("}") } - LINE("") - PrintWriteMethod(m_env.m_asset); - LINE("") - PrintWritePtrMethod(m_env.m_asset); - LINE("") - PrintMainWriteMethod(); - LINE("") - PrintGetNameMethod(); - } -}; + + void PrintWritePtrMethod(StructureInformation* info) + { + const bool inTemp = info->m_block && info->m_block->m_type == FastFileBlockType::TEMP; + LINE("void " << WriterClassName(m_env.m_asset) << "::WritePtr_" << MakeSafeTypeName(info->m_definition) << "(const bool atStreamStart)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypePtrVarName(info->m_definition) << " != nullptr);") + LINE("") + + LINE("if(atStreamStart)") + m_intendation++; + LINE(MakeTypeWrittenPtrVarName(info->m_definition) + << " = m_stream->Write<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") + m_intendation--; + + LINE("") + LINE("assert(" << MakeTypeWrittenPtrVarName(info->m_definition) << " != nullptr);") + + LINE("") + if (inTemp) + { + LINE("m_stream->PushBlock(" << m_env.m_default_temp_block->m_name << ");") + LINE("") + } + LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(info->m_definition) << "))") + LINE("{") + m_intendation++; + + LINE("m_stream->Align(" << info->m_definition->GetAlignment() << ");") + LINE("m_stream->ReusableAddOffset(*" << MakeTypePtrVarName(info->m_definition) << ");") + LINE("") + if (!info->m_is_leaf) + { + LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(info->m_definition) << ";") + LINE("Write_" << MakeSafeTypeName(info->m_definition) << "(true);") + } + else + { + LINE("#error Ptr method cannot have leaf type") + } + + LINE("") + LINE("m_stream->MarkFollowing(*" << MakeTypeWrittenPtrVarName(info->m_definition) << ");") + + m_intendation--; + LINE("}") + + if (inTemp) + { + LINE("") + LINE("m_stream->PopBlock();") + } + + m_intendation--; + LINE("}") + } + + void PrintMainWriteMethod() + { + LINE("void " << WriterClassName(m_env.m_asset) << "::Write(" << m_env.m_asset->m_definition->GetFullName() << "** pAsset)") + LINE("{") + m_intendation++; + + LINE("assert(pAsset != nullptr);") + LINE("assert(m_asset != nullptr);") + LINE("assert(m_asset->m_ptr != nullptr);") + LINE("") + LINE("auto* zoneAsset = static_cast<" << m_env.m_asset->m_definition->GetFullName() << "*>(m_asset->m_ptr);") + LINE(MakeTypePtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") + LINE(MakeTypeWrittenPtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") + LINE("WritePtr_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "(false);") + LINE("*pAsset = zoneAsset;") + + m_intendation--; + LINE("}") + } + + void PrintGetNameMethod() + { + LINE("std::string " << WriterClassName(m_env.m_asset) << "::GetAssetName(" << m_env.m_asset->m_definition->GetFullName() << "* pAsset)") + LINE("{") + m_intendation++; + + if (!m_env.m_asset->m_name_chain.empty()) + { + LINE_START("return pAsset") + + auto first = true; + for (auto* member : m_env.m_asset->m_name_chain) + { + if (first) + { + first = false; + LINE_MIDDLE("->" << member->m_member->m_name) + } + else + { + LINE_MIDDLE("." << member->m_member->m_name) + } + } + LINE_END(";") + } + else + { + LINE("return \"" << m_env.m_asset->m_definition->m_name << "\";") + } + + m_intendation--; + LINE("}") + } + + void PrintWritePtrArrayMethod_Loading(const DataDefinition* def, StructureInformation* info, const bool reusable) const + { + LINE("m_stream->Align(" << def->GetAlignment() << ");") + + if (reusable) + { + LINE("m_stream->ReusableAddOffset(*" << MakeTypePtrVarName(def) << ");") + } + + if (info && !info->m_is_leaf) + { + LINE(MakeTypeVarName(info->m_definition) << " = *" << MakeTypePtrVarName(def) << ";") + LINE("Write_" << MakeSafeTypeName(def) << "(true);") + } + else + { + LINE("m_stream->Write<" << def->GetFullName() << ">(*" << MakeTypePtrVarName(def) << ");") + } + LINE("m_stream->MarkFollowing(*" << MakeTypeWrittenPtrVarName(def) << ");") + } + + void PrintWritePtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) + { + LINE("if (*" << MakeTypePtrVarName(def) << ")") + LINE("{") + m_intendation++; + + if (info && StructureComputations(info).IsAsset()) + { + LINE(WriterClassName(info) << " writer(*" << MakeTypePtrVarName(def) << ", m_zone, *m_stream);") + LINE("writer.Write(" << MakeTypeWrittenPtrVarName(def) << ");") + } + else + { + if (reusable) + { + LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(def) << "))") + LINE("{") + m_intendation++; + + PrintWritePtrArrayMethod_Loading(def, info, reusable); + + m_intendation--; + LINE("}") + } + else + { + PrintWritePtrArrayMethod_Loading(def, info, reusable); + } + } + + m_intendation--; + LINE("}") + } + + void PrintWritePtrArrayMethod(const DataDefinition* def, StructureInformation* info, const bool reusable) + { + LINE("void " << WriterClassName(m_env.m_asset) << "::WritePtrArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypePtrVarName(def) << " != nullptr);") + LINE("") + + LINE("if(atStreamStart)") + m_intendation++; + LINE(MakeTypeWrittenPtrVarName(def) << " = m_stream->Write<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") + m_intendation--; + + LINE("") + LINE("assert(" << MakeTypeWrittenPtrVarName(def) << " != nullptr);") + + LINE("") + LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") + LINE(def->GetFullName() << "** varWritten = " << MakeTypeWrittenPtrVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; + + LINE(MakeTypePtrVarName(def) << " = var;") + LINE(MakeTypeWrittenPtrVarName(def) << " = varWritten;") + PrintWritePtrArrayMethod_PointerCheck(def, info, reusable); + LINE("") + LINE("var++;") + LINE("varWritten++;") + + m_intendation--; + LINE("}") + m_intendation--; + LINE("}") + } + + void PrintWriteArrayMethod(const DataDefinition* def, StructureInformation* info) + { + LINE("void " << WriterClassName(m_env.m_asset) << "::WriteArray_" << MakeSafeTypeName(def) << "(const bool atStreamStart, const size_t count)") + LINE("{") + m_intendation++; + + LINE("assert(" << MakeTypeVarName(def) << " != nullptr);") + LINE("") + LINE("if(atStreamStart)") + m_intendation++; + LINE(MakeTypeWrittenVarName(def) << " = m_stream->Write<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") + m_intendation--; + + LINE("") + LINE("assert(" << MakeTypeWrittenVarName(def) << " != nullptr);") + + LINE("") + LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") + LINE(def->GetFullName() << "* varWritten = " << MakeTypeWrittenVarName(def) << ";") + LINE("for(size_t index = 0; index < count; index++)") + LINE("{") + m_intendation++; + + LINE(MakeTypeVarName(info->m_definition) << " = var;") + LINE(MakeTypeWrittenVarName(info->m_definition) << " = varWritten;") + LINE("Write_" << info->m_definition->m_name << "(false);") + LINE("var++;") + LINE("varWritten++;") + + m_intendation--; + LINE("}") + + m_intendation--; + LINE("}") + } + }; +} // namespace std::vector ZoneWriteTemplate::GetFilesToRender(RenderingContext* context) { @@ -1281,18 +1293,15 @@ std::vector ZoneWriteTemplate::GetFilesToRender(RenderingConte void ZoneWriteTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) { - Internal internal(stream, context); + Template t(stream, context); if (fileTag == TAG_HEADER) { - internal.Header(); - } - else if (fileTag == TAG_SOURCE) - { - internal.Source(); + t.Header(); } else { - std::cout << "Unknown tag for ZoneWriteTemplate: " << fileTag << "\n"; + assert(fileTag == TAG_SOURCE); + t.Source(); } } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.h index afbbe2f1..df072484 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.h @@ -3,11 +3,6 @@ class ZoneWriteTemplate final : public ICodeTemplate { - static constexpr int TAG_HEADER = 1; - static constexpr int TAG_SOURCE = 2; - - class Internal; - public: std::vector GetFilesToRender(RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp index a596c6c5..18527df9 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.cpp @@ -17,6 +17,12 @@ #include #include +namespace +{ + static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; + static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; +} // namespace + CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename) : m_args(args), m_filename(std::move(filename)), @@ -30,7 +36,7 @@ bool CommandsFileReader::OpenBaseStream() auto stream = std::make_unique(m_filename); if (!stream->IsOpen()) { - std::cout << "Could not open commands file\n"; + std::cerr << "Could not open commands file\n"; return false; } @@ -68,7 +74,7 @@ bool CommandsFileReader::ReadCommandsFile(IDataRepository* repository) { if (m_args->m_verbose) { - std::cout << "Reading commands file: " << m_filename << "\n"; + std::cout << std::format("Reading commands file: {}\n", m_filename); } if (!OpenBaseStream()) @@ -84,9 +90,7 @@ bool CommandsFileReader::ReadCommandsFile(IDataRepository* repository) const auto end = std::chrono::steady_clock::now(); if (m_args->m_verbose) - { - std::cout << "Processing commands took " << std::chrono::duration_cast(end - start).count() << "ms\n"; - } + std::cout << std::format("Processing commands took {}ms\n", std::chrono::duration_cast(end - start).count()); if (!result) return false; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.h index dafae456..24c9825c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/CommandsFileReader.h @@ -9,8 +9,15 @@ class CommandsFileReader { - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; +public: + CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename); + + bool ReadCommandsFile(IDataRepository* repository); + +private: + bool OpenBaseStream(); + void SetupStreamProxies(); + void SetupPostProcessors(); const ZoneCodeGeneratorArguments* m_args; std::string m_filename; @@ -19,13 +26,4 @@ class CommandsFileReader IParserLineStream* m_stream; std::vector> m_post_processors; - - bool OpenBaseStream(); - void SetupStreamProxies(); - void SetupPostProcessors(); - -public: - explicit CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename); - - bool ReadCommandsFile(IDataRepository* repository); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsLexer.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsLexer.h index 19c0b700..cafa19b8 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsLexer.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsLexer.h @@ -5,9 +5,9 @@ class CommandsLexer final : public AbstractLexer { -protected: - CommandsParserValue GetNextToken() override; - public: explicit CommandsLexer(IParserLineStream* stream); + +protected: + CommandsParserValue GetNextToken() override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParser.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParser.h index b77c5e84..3021cdaa 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParser.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParser.h @@ -8,11 +8,12 @@ class CommandsParser final : public AbstractParser { - IDataRepository* m_repository; +public: + CommandsParser(CommandsLexer* lexer, IDataRepository* targetRepository); protected: const std::vector& GetTestsForState() override; -public: - CommandsParser(CommandsLexer* lexer, IDataRepository* targetRepository); +private: + IDataRepository* m_repository; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserState.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserState.h index 3453b5f4..be50ef18 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserState.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserState.h @@ -1,16 +1,28 @@ #pragma once #include "Persistence/IDataRepository.h" -#include "Utils/ClassUtils.h" #include #include class CommandsParserState { - IDataRepository* m_repository; - StructureInformation* m_in_use; +public: + explicit CommandsParserState(IDataRepository* repository); + [[nodiscard]] const IDataRepository* GetRepository() const; + + void AddBlock(std::unique_ptr block) const; + void SetArchitecture(Architecture architecture) const; + void SetGame(std::string gameName) const; + + [[nodiscard]] StructureInformation* GetInUse() const; + void SetInUse(StructureInformation* structure); + + bool GetMembersFromTypename(const std::string& typeNameValue, StructureInformation* baseType, std::vector& members) const; + bool GetTypenameAndMembersFromTypename(const std::string& typeNameValue, StructureInformation*& structure, std::vector& members) const; + +private: static MemberInformation* GetMemberWithName(const std::string& memberName, StructureInformation* type); static bool GetNextTypenameSeparatorPos(const std::string& typeNameValue, unsigned startPos, unsigned& separatorPos); static bool ExtractMembersFromTypenameInternal(const std::string& typeNameValue, @@ -18,18 +30,6 @@ class CommandsParserState StructureInformation* type, std::vector& members); -public: - explicit CommandsParserState(IDataRepository* repository); - - _NODISCARD const IDataRepository* GetRepository() const; - - void AddBlock(std::unique_ptr block) const; - void SetArchitecture(Architecture architecture) const; - void SetGame(std::string gameName) const; - - _NODISCARD StructureInformation* GetInUse() const; - void SetInUse(StructureInformation* structure); - - bool GetMembersFromTypename(const std::string& typeNameValue, StructureInformation* baseType, std::vector& members) const; - bool GetTypenameAndMembersFromTypename(const std::string& typeNameValue, StructureInformation*& structure, std::vector& members) const; + IDataRepository* m_repository; + StructureInformation* m_in_use; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserValue.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserValue.h index a53392d2..41b0477f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserValue.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Impl/CommandsParserValue.h @@ -52,10 +52,6 @@ enum class CommandsParserValueType class CommandsParserValue final : public IParserValue { public: - TokenPos m_pos; - CommandsParserValueType m_type; - size_t m_hash; - union ValueType { char char_value; @@ -83,25 +79,28 @@ public: static CommandsParserValue TypeName(TokenPos pos, std::string* typeName); static CommandsParserValue OpType(TokenPos pos, const OperationType* operationType); -private: - CommandsParserValue(TokenPos pos, CommandsParserValueType type); - -public: - ~CommandsParserValue() override; CommandsParserValue(const CommandsParserValue& other) = delete; + ~CommandsParserValue() override; CommandsParserValue(CommandsParserValue&& other) noexcept; CommandsParserValue& operator=(const CommandsParserValue& other) = delete; CommandsParserValue& operator=(CommandsParserValue&& other) noexcept; - _NODISCARD bool IsEof() const override; - _NODISCARD const TokenPos& GetPos() const override; + [[nodiscard]] bool IsEof() const override; + [[nodiscard]] const TokenPos& GetPos() const override; - _NODISCARD char CharacterValue() const; - _NODISCARD int IntegerValue() const; - _NODISCARD double FloatingPointValue() const; - _NODISCARD std::string& StringValue() const; - _NODISCARD std::string& IdentifierValue() const; - _NODISCARD size_t IdentifierHash() const; - _NODISCARD std::string& TypeNameValue() const; - _NODISCARD const OperationType* OpTypeValue() const; + [[nodiscard]] char CharacterValue() const; + [[nodiscard]] int IntegerValue() const; + [[nodiscard]] double FloatingPointValue() const; + [[nodiscard]] std::string& StringValue() const; + [[nodiscard]] std::string& IdentifierValue() const; + [[nodiscard]] size_t IdentifierHash() const; + [[nodiscard]] std::string& TypeNameValue() const; + [[nodiscard]] const OperationType* OpTypeValue() const; + + TokenPos m_pos; + CommandsParserValueType m_type; + size_t m_hash; + +private: + CommandsParserValue(TokenPos pos, CommandsParserValueType type); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherCharacter.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherCharacter.h index 794c372b..2b46b734 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherCharacter.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherCharacter.h @@ -5,11 +5,12 @@ class CommandsMatcherCharacter final : public AbstractMatcher { - char m_char; +public: + explicit CommandsMatcherCharacter(char c); protected: MatcherResult CanMatch(ILexer* lexer, unsigned tokenOffset) override; -public: - explicit CommandsMatcherCharacter(char c); +private: + char m_char; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherFactory.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherFactory.h index cd80546f..0c2af6cb 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherFactory.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherFactory.h @@ -10,10 +10,10 @@ class CommandsMatcherFactory final : public AbstractMatcherFactory* labelSupplier); - _NODISCARD MatcherFactoryWrapper Type(CommandsParserValueType type) const; - _NODISCARD MatcherFactoryWrapper Keyword(std::string value) const; - _NODISCARD MatcherFactoryWrapper Identifier() const; - _NODISCARD MatcherFactoryWrapper Integer() const; - _NODISCARD MatcherFactoryWrapper FloatingPoint() const; - _NODISCARD MatcherFactoryWrapper Char(char c) const; + [[nodiscard]] MatcherFactoryWrapper Type(CommandsParserValueType type) const; + [[nodiscard]] MatcherFactoryWrapper Keyword(std::string value) const; + [[nodiscard]] MatcherFactoryWrapper Identifier() const; + [[nodiscard]] MatcherFactoryWrapper Integer() const; + [[nodiscard]] MatcherFactoryWrapper FloatingPoint() const; + [[nodiscard]] MatcherFactoryWrapper Char(char c) const; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherKeyword.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherKeyword.h index 9fd63682..f503c6f9 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherKeyword.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherKeyword.h @@ -7,12 +7,13 @@ class CommandsMatcherKeyword final : public AbstractMatcher { - size_t m_hash; - std::string m_value; +public: + explicit CommandsMatcherKeyword(std::string value); protected: MatcherResult CanMatch(ILexer* lexer, unsigned tokenOffset) override; -public: - explicit CommandsMatcherKeyword(std::string value); +private: + size_t m_hash; + std::string m_value; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherValueType.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherValueType.h index 59c806ed..7e4d7e61 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherValueType.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsMatcherValueType.h @@ -5,11 +5,12 @@ class CommandsMatcherValueType final : public AbstractMatcher { - CommandsParserValueType m_type; +public: + explicit CommandsMatcherValueType(CommandsParserValueType type); protected: MatcherResult CanMatch(ILexer* lexer, unsigned tokenOffset) override; -public: - explicit CommandsMatcherValueType(CommandsParserValueType type); +private: + CommandsParserValueType m_type; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.cpp index adb30fb8..9e6a11fe 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.cpp @@ -3,6 +3,15 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_ACTION_NAME = 1; + static constexpr auto CAPTURE_TYPE = 2; + static constexpr auto CAPTURE_ARG_TYPE = 3; + + static constexpr auto LABEL_ACTION_ARGS = 1; +} // namespace + SequenceAction::SequenceAction() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.h index b418ec81..20e82adb 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAction.h @@ -4,15 +4,9 @@ class SequenceAction final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_ACTION_NAME = 1; - static constexpr auto CAPTURE_TYPE = 2; - static constexpr auto CAPTURE_ARG_TYPE = 3; - - static constexpr auto LABEL_ACTION_ARGS = 1; +public: + SequenceAction(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceAction(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.cpp index 9048380a..4047222b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceAllocAlign::SequenceAllocAlign() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.h index d4bc00d8..fc8894ee 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAllocAlign.h @@ -4,11 +4,9 @@ class SequenceAllocAlign final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceAllocAlign(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceAllocAlign(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.cpp index e3cde76a..0e690139 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_ARCHITECTURE = 1; +} + SequenceArchitecture::SequenceArchitecture() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.h index 4dd0b5bd..5b609b6f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArchitecture.h @@ -2,15 +2,16 @@ #include "Parsing/Commands/Impl/CommandsParser.h" +#include + class SequenceArchitecture final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_ARCHITECTURE = 1; - - std::unordered_map m_architecture_mapping; +public: + SequenceArchitecture(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; -public: - SequenceArchitecture(); +private: + std::unordered_map m_architecture_mapping; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.cpp index 50d41bb1..1decc0c8 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.cpp @@ -4,6 +4,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceArrayCount::SequenceArrayCount() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.h index d134304f..96a87cdc 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArrayCount.h @@ -4,11 +4,9 @@ class SequenceArrayCount final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceArrayCount(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceArrayCount(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.cpp index 1a8f5dd1..1cc04ebd 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.cpp @@ -4,6 +4,12 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_EVALUATION = 2; +} // namespace + SequenceArraySize::SequenceArraySize() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.h index 795318bb..159b3457 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceArraySize.h @@ -4,12 +4,9 @@ class SequenceArraySize final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_EVALUATION = 2; +public: + SequenceArraySize(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceArraySize(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp index 559820a9..ae856fca 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.cpp @@ -3,6 +3,12 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_ENUM_ENTRY = 2; +} // namespace + SequenceAsset::SequenceAsset() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.h index b4cae4f3..638c4c94 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAsset.h @@ -4,12 +4,9 @@ class SequenceAsset final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_ENUM_ENTRY = 2; +public: + SequenceAsset(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceAsset(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp index 12ba3291..2a8912e5 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.cpp @@ -5,6 +5,14 @@ #include +namespace +{ + static constexpr auto TAG_DEFAULT = 1; + + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_ASSET_TYPE_ENUM_ENTRY = 2; +} // namespace + SequenceAssetRef::SequenceAssetRef() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.h index 1feeffbf..c9cb3d90 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceAssetRef.h @@ -4,14 +4,9 @@ class SequenceAssetRef final : public CommandsParser::sequence_t { - static constexpr auto TAG_DEFAULT = 1; - - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_ASSET_TYPE_ENUM_ENTRY = 2; +public: + SequenceAssetRef(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceAssetRef(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.cpp index 2bbcfaef..b8710343 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.cpp @@ -3,6 +3,14 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto TAG_DEFAULT = 1; + + static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 1; + static constexpr auto CAPTURE_BLOCK_TYPE = 2; +} // namespace + SequenceBlock::SequenceBlock() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.h index b8596260..64700762 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceBlock.h @@ -7,19 +7,15 @@ class SequenceBlock final : public CommandsParser::sequence_t { - static constexpr auto TAG_DEFAULT = 1; - - static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 1; - static constexpr auto CAPTURE_BLOCK_TYPE = 2; - - std::unordered_map m_type_lookup; - - void AddFastFileBlockToLookup(std::string name, FastFileBlockType type); - _NODISCARD bool GetFastFileBlockNameByType(const std::string& name, FastFileBlockType& type) const; +public: + SequenceBlock(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; -public: - SequenceBlock(); +private: + void AddFastFileBlockToLookup(std::string name, FastFileBlockType type); + [[nodiscard]] bool GetFastFileBlockNameByType(const std::string& name, FastFileBlockType& type) const; + + std::unordered_map m_type_lookup; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.cpp index 98f6f297..65f2b585 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.cpp @@ -4,6 +4,16 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto TAG_ALWAYS = 1; + static constexpr auto TAG_NEVER = 2; + static constexpr auto TAG_EVALUATION = 3; + + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_EVALUATION = 2; +} // namespace + SequenceCondition::SequenceCondition() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.h index b10f4600..d6aa0eba 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCondition.h @@ -4,16 +4,9 @@ class SequenceCondition final : public CommandsParser::sequence_t { - static constexpr auto TAG_ALWAYS = 1; - static constexpr auto TAG_NEVER = 2; - static constexpr auto TAG_EVALUATION = 3; - - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_EVALUATION = 2; +public: + SequenceCondition(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceCondition(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.cpp index b05cc6e9..665493c7 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.cpp @@ -5,6 +5,76 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +#include +#include + +namespace +{ + static constexpr auto TAG_POINTER_RESOLVE = 1; + + static constexpr auto CAPTURE_START = 1; + static constexpr auto CAPTURE_TYPE = 2; + static constexpr auto CAPTURE_ARRAY_INDEX = 3; + + void SetCountByArrayIndex(CommandsParserState* state, + SequenceResult& result, + MemberInformation* member, + PointerDeclarationModifier* pointer, + std::unique_ptr evaluation) + { + std::vector arraySizes; + std::vector depthSize; + for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + { + if (modifier->GetType() == DeclarationModifierType::ARRAY) + arraySizes.push_back(dynamic_cast(modifier.get())->m_size); + } + + depthSize.resize(arraySizes.size()); + auto currentDepthSize = 1u; + for (auto i = arraySizes.size(); i > 0; i--) + { + if (i < arraySizes.size()) + currentDepthSize *= arraySizes[i]; + depthSize[i - 1] = currentDepthSize; + } + + if (pointer->m_count_evaluation_by_array_index.empty()) + { + auto neededCapacity = 0u; + for (auto arraySize : arraySizes) + { + if (neededCapacity == 0) + neededCapacity = arraySize; + else + neededCapacity *= arraySize; + } + pointer->m_count_evaluation_by_array_index.resize(neededCapacity); + } + + auto currentIndex = 0u; + auto currentIndexOffset = 0u; + while (result.HasNextCapture(CAPTURE_ARRAY_INDEX) && currentIndexOffset < depthSize.size()) + { + const auto& arrayIndexToken = result.NextCapture(CAPTURE_ARRAY_INDEX); + if (arrayIndexToken.m_type == CommandsParserValueType::INTEGER) + { + currentIndex += depthSize[currentIndexOffset++] * arrayIndexToken.IntegerValue(); + } + else + { + auto* enumEntry = state->GetRepository()->GetEnumMemberByName(arrayIndexToken.IdentifierValue()); + if (enumEntry == nullptr) + throw ParsingException(arrayIndexToken.GetPos(), "Unknown enum entry"); + + currentIndex += depthSize[currentIndexOffset++] * enumEntry->m_value; + } + } + + pointer->m_count_evaluation_by_array_index[currentIndex] = std::move(evaluation); + } +} // namespace + SequenceCount::SequenceCount() { const CommandsMatcherFactory create(this); @@ -23,64 +93,6 @@ SequenceCount::SequenceCount() }); } -void SequenceCount::SetCountByArrayIndex(CommandsParserState* state, - SequenceResult& result, - MemberInformation* member, - PointerDeclarationModifier* pointer, - std::unique_ptr evaluation) -{ - std::vector arraySizes; - std::vector depthSize; - for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) - { - if (modifier->GetType() == DeclarationModifierType::ARRAY) - arraySizes.push_back(dynamic_cast(modifier.get())->m_size); - } - - depthSize.resize(arraySizes.size()); - auto currentDepthSize = 1u; - for (auto i = arraySizes.size(); i > 0; i--) - { - if (i < arraySizes.size()) - currentDepthSize *= arraySizes[i]; - depthSize[i - 1] = currentDepthSize; - } - - if (pointer->m_count_evaluation_by_array_index.empty()) - { - auto neededCapacity = 0u; - for (auto arraySize : arraySizes) - { - if (neededCapacity == 0) - neededCapacity = arraySize; - else - neededCapacity *= arraySize; - } - pointer->m_count_evaluation_by_array_index.resize(neededCapacity); - } - - auto currentIndex = 0u; - auto currentIndexOffset = 0u; - while (result.HasNextCapture(CAPTURE_ARRAY_INDEX) && currentIndexOffset < depthSize.size()) - { - const auto& arrayIndexToken = result.NextCapture(CAPTURE_ARRAY_INDEX); - if (arrayIndexToken.m_type == CommandsParserValueType::INTEGER) - { - currentIndex += depthSize[currentIndexOffset++] * arrayIndexToken.IntegerValue(); - } - else - { - auto* enumEntry = state->GetRepository()->GetEnumMemberByName(arrayIndexToken.IdentifierValue()); - if (enumEntry == nullptr) - throw ParsingException(arrayIndexToken.GetPos(), "Unknown enum entry"); - - currentIndex += depthSize[currentIndexOffset++] * enumEntry->m_value; - } - } - - pointer->m_count_evaluation_by_array_index[currentIndex] = std::move(evaluation); -} - void SequenceCount::ProcessMatch(CommandsParserState* state, SequenceResult& result) const { const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.h index 848b5f02..d7df95f6 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceCount.h @@ -5,21 +5,9 @@ class SequenceCount final : public CommandsParser::sequence_t { - static constexpr auto TAG_POINTER_RESOLVE = 1; - - static constexpr auto CAPTURE_START = 1; - static constexpr auto CAPTURE_TYPE = 2; - static constexpr auto CAPTURE_ARRAY_INDEX = 3; - - static void SetCountByArrayIndex(CommandsParserState* state, - SequenceResult& result, - MemberInformation* member, - PointerDeclarationModifier* pointer, - std::unique_ptr evaluation); +public: + SequenceCount(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceCount(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.cpp index 56b9718b..9aaa225a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_GAME = 1; +} + SequenceGame::SequenceGame() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.h index 2de63c08..e40f8904 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceGame.h @@ -4,11 +4,9 @@ class SequenceGame final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_GAME = 1; +public: + SequenceGame(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceGame(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.cpp index efeb5b00..f364cd57 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceName::SequenceName() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.h index 56b5da84..d9b86d53 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceName.h @@ -4,11 +4,9 @@ class SequenceName final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceName(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceName(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.cpp index 58365f3d..036735fc 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.cpp @@ -5,6 +5,43 @@ #include +namespace +{ + static constexpr auto TAG_FIND_FIRST = 1; + + static constexpr auto CAPTURE_START = 1; + static constexpr auto CAPTURE_TYPE = 2; + static constexpr auto CAPTURE_ENTRY = 3; + + StructureInformation* GetType(CommandsParserState* state, SequenceResult& result) + { + if (result.HasNextCapture(CAPTURE_TYPE)) + { + const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE); + StructureInformation* information; + std::vector memberChain; + + if (!state->GetTypenameAndMembersFromTypename(typeNameToken.TypeNameValue(), information, memberChain)) + throw ParsingException(typeNameToken.GetPos(), "Unknown type"); + + if (memberChain.empty()) + return information; + + auto* lastMember = memberChain.back(); + + if (lastMember->m_type == nullptr) + throw ParsingException(typeNameToken.GetPos(), "Member type must either be struct or union"); + + return lastMember->m_type; + } + + if (state->GetInUse() != nullptr) + return state->GetInUse(); + + throw ParsingException(result.NextCapture(CAPTURE_START).GetPos(), "No type is used. Therefore one needs to be specified directly."); + } +} // namespace + SequenceReorder::SequenceReorder() { const CommandsMatcherFactory create(this); @@ -26,34 +63,6 @@ SequenceReorder::SequenceReorder() }); } -StructureInformation* SequenceReorder::GetType(CommandsParserState* state, SequenceResult& result) -{ - if (result.HasNextCapture(CAPTURE_TYPE)) - { - const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE); - StructureInformation* information; - std::vector memberChain; - - if (!state->GetTypenameAndMembersFromTypename(typeNameToken.TypeNameValue(), information, memberChain)) - throw ParsingException(typeNameToken.GetPos(), "Unknown type"); - - if (memberChain.empty()) - return information; - - auto* lastMember = memberChain.back(); - - if (lastMember->m_type == nullptr) - throw ParsingException(typeNameToken.GetPos(), "Member type must either be struct or union"); - - return lastMember->m_type; - } - - if (state->GetInUse() != nullptr) - return state->GetInUse(); - - throw ParsingException(result.NextCapture(CAPTURE_START).GetPos(), "No type is used. Therefore one needs to be specified directly."); -} - void SequenceReorder::ProcessMatch(CommandsParserState* state, SequenceResult& result) const { auto* information = GetType(state, result); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.h index c26fd14f..414e686e 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReorder.h @@ -4,17 +4,9 @@ class SequenceReorder final : public CommandsParser::sequence_t { - static constexpr auto TAG_FIND_FIRST = 1; - - static constexpr auto CAPTURE_START = 1; - static constexpr auto CAPTURE_TYPE = 2; - static constexpr auto CAPTURE_ENTRY = 3; - - static StructureInformation* GetType(CommandsParserState* state, SequenceResult& result); +public: + SequenceReorder(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceReorder(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.cpp index 8c1aece9..cabbfc68 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceReusable::SequenceReusable() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.h index 90aaa995..86ae423f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceReusable.h @@ -4,11 +4,9 @@ class SequenceReusable final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceReusable(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceReusable(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.cpp index 54c52aa0..313423a6 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceScriptString::SequenceScriptString() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.h index d6b90306..b949096f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceScriptString.h @@ -4,11 +4,9 @@ class SequenceScriptString final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceScriptString(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceScriptString(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp index 066565f0..3ac4a04c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp @@ -3,6 +3,13 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_START = 1; + static constexpr auto CAPTURE_TYPE = 2; + static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 3; +} // namespace + SequenceSetBlock::SequenceSetBlock() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h index ee06cc88..5bdaf766 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h @@ -4,13 +4,9 @@ class SequenceSetBlock final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_START = 1; - static constexpr auto CAPTURE_TYPE = 2; - static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 3; +public: + SequenceSetBlock(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceSetBlock(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.cpp index e0aedd8a..c95a2823 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.cpp @@ -5,6 +5,11 @@ #include +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceString::SequenceString() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.h index b902c3c6..778867b5 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceString.h @@ -4,11 +4,9 @@ class SequenceString final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceString(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceString(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.cpp index b223ce94..5c6237e1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.cpp @@ -3,6 +3,11 @@ #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_TYPE = 1; +} + SequenceUse::SequenceUse() { const CommandsMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.h index 82aaae15..c2c11a20 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceUse.h @@ -4,11 +4,9 @@ class SequenceUse final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; +public: + SequenceUse(); protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; - -public: - SequenceUse(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h index dd62dbe2..2a68841c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h @@ -7,18 +7,12 @@ #include "IHeaderBlockVariableDefining.h" #include "Utils/ClassUtils.h" +#include +#include +#include + class HeaderBlockEnum final : public IHeaderBlock, public IHeaderBlockNameHolder, public IHeaderBlockVariableDefining { - std::string m_namespace; - std::string m_type_name; - const BaseTypeDefinition* m_parent_type; - bool m_is_typedef; - std::vector> m_members; - int m_next_value; - EnumDefinition* m_enum_definition; - - std::string m_variable_name; - public: HeaderBlockEnum(std::string typeName, const BaseTypeDefinition* parentType, bool isTypeDef); @@ -29,11 +23,22 @@ public: void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; void AddEnumMember(std::unique_ptr enumMember); - _NODISCARD EnumMember* GetEnumMember(const std::string& name) const; - _NODISCARD int GetNextEnumMemberValue() const; + [[nodiscard]] EnumMember* GetEnumMember(const std::string& name) const; + [[nodiscard]] int GetNextEnumMemberValue() const; void SetBlockName(const TokenPos& nameTokenPos, std::string name) override; bool IsDefiningVariable() override; DataDefinition* GetVariableType() override; std::string GetVariableName() override; + +private: + std::string m_namespace; + std::string m_type_name; + const BaseTypeDefinition* m_parent_type; + bool m_is_typedef; + std::vector> m_members; + int m_next_value; + EnumDefinition* m_enum_definition; + + std::string m_variable_name; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h index 6f99ce5d..fb8bc246 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h @@ -2,10 +2,11 @@ #include "IHeaderBlock.h" +#include +#include + class HeaderBlockNamespace final : public IHeaderBlock { - std::string m_namespace_name; - public: explicit HeaderBlockNamespace(std::string namespaceName); @@ -14,4 +15,6 @@ public: void OnOpen(HeaderParserState* state) override; void OnClose(HeaderParserState* state) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; + + std::string m_namespace_name; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h index a5ea42e1..d1916b47 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h @@ -7,23 +7,12 @@ #include "IHeaderBlockVariableDefining.h" #include "IHeaderBlockVariableHolder.h" +#include #include +#include class HeaderBlockStruct final : public IHeaderBlock, public IHeaderBlockNameHolder, public IHeaderBlockVariableDefining, public IHeaderBlockVariableHolder { - std::string m_namespace; - std::string m_type_name; - std::vector> m_members; - StructDefinition* m_struct_definition; - - int m_custom_alignment; - - bool m_is_typedef; - bool m_has_custom_align; - bool m_is_anonymous; - - std::string m_variable_name; - public: HeaderBlockStruct(std::string name, bool isTypedef); @@ -41,4 +30,18 @@ public: bool IsDefiningVariable() override; DataDefinition* GetVariableType() override; std::string GetVariableName() override; + +private: + std::string m_namespace; + std::string m_type_name; + std::vector> m_members; + StructDefinition* m_struct_definition; + + int m_custom_alignment; + + bool m_is_typedef; + bool m_has_custom_align; + bool m_is_anonymous; + + std::string m_variable_name; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h index a926360d..36256441 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h @@ -5,21 +5,12 @@ #include "IHeaderBlockVariableDefining.h" #include "IHeaderBlockVariableHolder.h" +#include +#include +#include + class HeaderBlockUnion final : public IHeaderBlock, public IHeaderBlockNameHolder, public IHeaderBlockVariableDefining, public IHeaderBlockVariableHolder { - std::string m_namespace; - std::string m_type_name; - std::vector> m_members; - UnionDefinition* m_union_definition; - - int m_custom_alignment; - - bool m_is_typedef; - bool m_has_custom_align; - bool m_is_anonymous; - - std::string m_variable_name; - public: HeaderBlockUnion(std::string name, bool isTypedef); @@ -37,4 +28,18 @@ public: bool IsDefiningVariable() override; DataDefinition* GetVariableType() override; std::string GetVariableName() override; + +private: + std::string m_namespace; + std::string m_type_name; + std::vector> m_members; + UnionDefinition* m_union_definition; + + int m_custom_alignment; + + bool m_is_typedef; + bool m_has_custom_align; + bool m_is_anonymous; + + std::string m_variable_name; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index a38e00b0..4913e089 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp @@ -13,8 +13,15 @@ #include #include +#include #include +namespace +{ + static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; + static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; +} // namespace + HeaderFileReader::HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename) : m_args(args), m_filename(std::move(filename)), @@ -29,7 +36,7 @@ bool HeaderFileReader::OpenBaseStream() auto stream = std::make_unique(m_filename); if (!stream->IsOpen()) { - std::cout << "Could not open header file\n"; + std::cerr << "Could not open header file\n"; return false; } @@ -65,9 +72,7 @@ void HeaderFileReader::SetupPostProcessors() bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) { if (m_args->m_verbose) - { - std::cout << "Reading header file: " << m_filename << "\n"; - } + std::cout << std::format("Reading header file: {}\n", m_filename); if (!OpenBaseStream()) return false; @@ -84,9 +89,7 @@ bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) const auto end = std::chrono::steady_clock::now(); if (m_args->m_verbose) - { - std::cout << "Processing header took " << std::chrono::duration_cast(end - start).count() << "ms\n"; - } + std::cout << std::format("Processing header took {}ms\n", std::chrono::duration_cast(end - start).count()); if (!result) return false; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.h b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.h index eb17cabd..fe8cdcf8 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.h @@ -10,8 +10,15 @@ class HeaderFileReader { - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; +public: + HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename); + + bool ReadHeaderFile(IDataRepository* repository); + +private: + bool OpenBaseStream(); + void SetupStreamProxies(); + void SetupPostProcessors(); const ZoneCodeGeneratorArguments* m_args; std::string m_filename; @@ -21,13 +28,4 @@ class HeaderFileReader IParserLineStream* m_stream; std::vector> m_post_processors; - - bool OpenBaseStream(); - void SetupStreamProxies(); - void SetupPostProcessors(); - -public: - HeaderFileReader(const ZoneCodeGeneratorArguments* args, std::string filename); - - bool ReadHeaderFile(IDataRepository* repository); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h index fe0a8626..cade958a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderLexer.h @@ -3,17 +3,19 @@ #include "HeaderParserValue.h" #include "Parsing/Impl/AbstractLexer.h" +#include #include class HeaderLexer final : public AbstractLexer { - std::unordered_map m_keywords; - - void PrepareKeywords(); +public: + explicit HeaderLexer(IParserLineStream* stream); protected: HeaderParserValue GetNextToken() override; -public: - explicit HeaderLexer(IParserLineStream* stream); +private: + void PrepareKeywords(); + + std::unordered_map m_keywords; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h index a52bbaba..b09ee6af 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h @@ -8,11 +8,11 @@ class HeaderParser final : public AbstractParser { -protected: - const std::vector& GetTestsForState() override; - public: HeaderParser(HeaderLexer* lexer, const IPackValueSupplier* packValueSupplier); bool SaveToRepository(IDataRepository* repository) const; + +protected: + const std::vector& GetTestsForState() override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp index a8463fa5..e26d68ad 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp @@ -3,6 +3,7 @@ #include "Domain/Definition/EnumDefinition.h" #include "Parsing/Header/Block/HeaderBlockNone.h" +#include #include HeaderParserState::HeaderParserState(const IPackValueSupplier* packValueSupplier) @@ -96,7 +97,7 @@ bool HeaderParserState::ResolveForwardDeclarations() if (dataDefinition == nullptr) { - std::cout << "Forward declaration \"" << forwardDeclaration->GetFullName() << "\" was not defined\n"; + std::cerr << std::format("Forward declaration \"{}\" was not defined\n", forwardDeclaration->GetFullName()); return false; } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h index 9c1b96c6..ca594be1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h @@ -12,31 +12,15 @@ #include #include +#include #include +#include class IHeaderBlock; class HeaderParserState { - std::vector> m_header_definitions; - - std::stack> m_blocks; - std::unordered_map m_definitions; - std::unordered_map m_enum_members; - std::unordered_map> m_forward_declarations; - - void AddBaseDataType(const BaseTypeDefinition* baseType); - bool ResolveForwardDeclarations(); - static bool ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition); - static bool ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition); - static bool ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition); - bool ReplaceForwardDeclarationsInDefinitions(); - bool MoveDefinitionsToRepository(IDataRepository* repository); - public: - const IPackValueSupplier* const m_pack_value_supplier; - NamespaceBuilder m_namespace; - explicit HeaderParserState(const IPackValueSupplier* packValueSupplier); _NODISCARD IHeaderBlock* GetBlock() const; @@ -50,4 +34,23 @@ public: EnumMember* FindEnumMember(const std::string& enumMemberName); bool SaveToRepository(IDataRepository* repository); + + const IPackValueSupplier* const m_pack_value_supplier; + NamespaceBuilder m_namespace; + +private: + void AddBaseDataType(const BaseTypeDefinition* baseType); + bool ResolveForwardDeclarations(); + static bool ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition); + static bool ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition); + static bool ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition); + bool ReplaceForwardDeclarationsInDefinitions(); + bool MoveDefinitionsToRepository(IDataRepository* repository); + + std::vector> m_header_definitions; + + std::stack> m_blocks; + std::unordered_map m_definitions; + std::unordered_map m_enum_members; + std::unordered_map> m_forward_declarations; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h index fc2e440f..b6fa4ca8 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserValue.h @@ -61,9 +61,6 @@ enum class HeaderParserValueType class HeaderParserValue final : public IParserValue { public: - TokenPos m_pos; - HeaderParserValueType m_type; - union ValueType { char char_value; @@ -90,23 +87,25 @@ public: static HeaderParserValue Keyword(TokenPos pos, HeaderParserValueType type); static HeaderParserValue TypeName(TokenPos pos, std::string* typeName); -private: - HeaderParserValue(TokenPos pos, HeaderParserValueType type); - -public: ~HeaderParserValue() override; HeaderParserValue(const HeaderParserValue& other) = delete; HeaderParserValue(HeaderParserValue&& other) noexcept; HeaderParserValue& operator=(const HeaderParserValue& other) = delete; HeaderParserValue& operator=(HeaderParserValue&& other) noexcept; - _NODISCARD bool IsEof() const override; - _NODISCARD const TokenPos& GetPos() const override; + [[nodiscard]] bool IsEof() const override; + [[nodiscard]] const TokenPos& GetPos() const override; - _NODISCARD char CharacterValue() const; - _NODISCARD int IntegerValue() const; - _NODISCARD double FloatingPointValue() const; - _NODISCARD std::string& StringValue() const; - _NODISCARD std::string& IdentifierValue() const; - _NODISCARD std::string& TypeNameValue() const; + [[nodiscard]] char CharacterValue() const; + [[nodiscard]] int IntegerValue() const; + [[nodiscard]] double FloatingPointValue() const; + [[nodiscard]] std::string& StringValue() const; + [[nodiscard]] std::string& IdentifierValue() const; + [[nodiscard]] std::string& TypeNameValue() const; + + TokenPos m_pos; + HeaderParserValueType m_type; + +private: + HeaderParserValue(TokenPos pos, HeaderParserValueType type); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherCharacter.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherCharacter.h index 7f195e4d..e46e0f1a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherCharacter.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherCharacter.h @@ -5,11 +5,12 @@ class HeaderMatcherCharacter final : public AbstractMatcher { - char m_char; +public: + explicit HeaderMatcherCharacter(char c); protected: MatcherResult CanMatch(ILexer* lexer, unsigned tokenOffset) override; -public: - explicit HeaderMatcherCharacter(char c); +private: + char m_char; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherFactory.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherFactory.h index 82fd8032..2239273b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherFactory.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherFactory.h @@ -8,9 +8,9 @@ class HeaderMatcherFactory final : public AbstractMatcherFactory* labelSupplier); - _NODISCARD MatcherFactoryWrapper Type(HeaderParserValueType type) const; - _NODISCARD MatcherFactoryWrapper Identifier() const; - _NODISCARD MatcherFactoryWrapper Integer() const; - _NODISCARD MatcherFactoryWrapper FloatingPoint() const; - _NODISCARD MatcherFactoryWrapper Char(char c) const; + [[nodiscard]] MatcherFactoryWrapper Type(HeaderParserValueType type) const; + [[nodiscard]] MatcherFactoryWrapper Identifier() const; + [[nodiscard]] MatcherFactoryWrapper Integer() const; + [[nodiscard]] MatcherFactoryWrapper FloatingPoint() const; + [[nodiscard]] MatcherFactoryWrapper Char(char c) const; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherValueType.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherValueType.h index 5b9571f9..05d5e9cc 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherValueType.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderMatcherValueType.h @@ -5,11 +5,12 @@ class HeaderMatcherValueType final : public AbstractMatcher { - HeaderParserValueType m_type; +public: + explicit HeaderMatcherValueType(HeaderParserValueType type); protected: MatcherResult CanMatch(ILexer* lexer, unsigned tokenOffset) override; -public: - explicit HeaderMatcherValueType(HeaderParserValueType type); +private: + HeaderParserValueType m_type; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp index 668e2b26..4fea8d83 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp @@ -4,6 +4,14 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto TAG_SEMICOLON = 1; + + static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_CLOSING_PARENTHESIS = 2; +} // namespace + SequenceCloseBlock::SequenceCloseBlock(const bool semicolonRequired) : m_semicolon_required(semicolonRequired) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.h index 62093b52..c77d40a5 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.h @@ -7,16 +7,12 @@ class SequenceCloseBlock final : public HeaderParser::sequence_t { - static constexpr auto TAG_SEMICOLON = 1; - - static constexpr auto CAPTURE_NAME = 1; - static constexpr auto CAPTURE_CLOSING_PARENTHESIS = 2; +public: + explicit SequenceCloseBlock(bool semicolonRequired); +private: bool m_semicolon_required; protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - explicit SequenceCloseBlock(bool semicolonRequired); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp index b9533081..071159da 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp @@ -4,6 +4,14 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto TAG_TYPEDEF = 1; + + static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_PARENT_TYPE = 2; +} // namespace + SequenceEnum::SequenceEnum() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.h index ab540c6b..418f6b8a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.h @@ -7,14 +7,9 @@ class SequenceEnum final : public HeaderParser::sequence_t { - static constexpr auto TAG_TYPEDEF = 1; - - static constexpr auto CAPTURE_NAME = 1; - static constexpr auto CAPTURE_PARENT_TYPE = 2; +public: + SequenceEnum(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceEnum(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.cpp index 60727616..ca95a19c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.cpp @@ -4,6 +4,12 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_VALUE = 2; +} // namespace + SequenceEnumMember::SequenceEnumMember() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.h index b180dd84..02325afa 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnumMember.h @@ -7,12 +7,9 @@ class SequenceEnumMember final : public HeaderParser::sequence_t { - static constexpr auto CAPTURE_NAME = 1; - static constexpr auto CAPTURE_VALUE = 2; +public: + SequenceEnumMember(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceEnumMember(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp index ed71388a..604af25d 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp @@ -3,6 +3,16 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto TAG_ENUM = 1; + static constexpr auto TAG_STRUCT = 2; + static constexpr auto TAG_UNION = 3; + + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_NAME = 2; +} // namespace + SequenceForwardDecl::SequenceForwardDecl() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h index ebcd6efc..9d2713ec 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h @@ -7,16 +7,9 @@ class SequenceForwardDecl final : public HeaderParser::sequence_t { - static constexpr auto TAG_ENUM = 1; - static constexpr auto TAG_STRUCT = 2; - static constexpr auto TAG_UNION = 3; - - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_NAME = 2; +public: + SequenceForwardDecl(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceForwardDecl(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp index d878a7f5..40f1b6db 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp @@ -3,6 +3,11 @@ #include "Parsing/Header/Block/HeaderBlockNamespace.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr int CAPTURE_NAME = 0; +} + SequenceNamespace::SequenceNamespace() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.h index 5a66a45a..0fde4035 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.h @@ -7,11 +7,9 @@ class SequenceNamespace final : public HeaderParser::sequence_t { - static constexpr int CAPTURE_NAME = 0; +public: + SequenceNamespace(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceNamespace(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp index 60a6a154..b46e5323 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp @@ -4,6 +4,15 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr int TAG_TYPEDEF = 1; + + static constexpr int CAPTURE_NAME = 1; + static constexpr int CAPTURE_ALIGN = 2; + static constexpr int CAPTURE_PARENT_TYPE = 3; +} // namespace + SequenceStruct::SequenceStruct() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.h index 5ea59dec..f34e6e0a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.h @@ -7,15 +7,9 @@ class SequenceStruct final : public HeaderParser::sequence_t { - static constexpr int TAG_TYPEDEF = 1; - - static constexpr int CAPTURE_NAME = 1; - static constexpr int CAPTURE_ALIGN = 2; - static constexpr int CAPTURE_PARENT_TYPE = 3; +public: + SequenceStruct(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceStruct(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.cpp index f56579b1..65282bea 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.cpp @@ -5,6 +5,22 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto TAG_ARRAY_OF_POINTERS = 1; + static constexpr auto TAG_POINTER_TO_ARRAY = 2; + static constexpr auto TAG_CONST = 3; + static constexpr auto TAG_POINTER = 4; + + static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_ALIGN = 2; + static constexpr auto CAPTURE_TYPE = 3; + static constexpr auto CAPTURE_ARRAY = 4; + + static constexpr auto LABEL_ARRAY_OF_POINTERS = 1; + static constexpr auto LABEL_POINTER_TO_ARRAY = 2; +} // namespace + SequenceTypedef::SequenceTypedef() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.h index ed6441a9..07953ac4 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceTypedef.h @@ -7,25 +7,13 @@ class SequenceTypedef final : public HeaderParser::sequence_t { - static constexpr auto TAG_ARRAY_OF_POINTERS = 1; - static constexpr auto TAG_POINTER_TO_ARRAY = 2; - static constexpr auto TAG_CONST = 3; - static constexpr auto TAG_POINTER = 4; - - static constexpr auto CAPTURE_NAME = 1; - static constexpr auto CAPTURE_ALIGN = 2; - static constexpr auto CAPTURE_TYPE = 3; - static constexpr auto CAPTURE_ARRAY = 4; - - static constexpr auto LABEL_ARRAY_OF_POINTERS = 1; - static constexpr auto LABEL_POINTER_TO_ARRAY = 2; - - void AddPointerDeclarationModifiers(SequenceResult& result, TypeDeclaration* typeDeclaration) const; - void AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult& result, TypeDeclaration* typeDeclaration) const; +public: + SequenceTypedef(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; -public: - SequenceTypedef(); +private: + void AddPointerDeclarationModifiers(SequenceResult& result, TypeDeclaration* typeDeclaration) const; + void AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult& result, TypeDeclaration* typeDeclaration) const; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp index ce7c0045..066f1044 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp @@ -4,6 +4,15 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr int TAG_TYPEDEF = 1; + + static constexpr int CAPTURE_NAME = 1; + static constexpr int CAPTURE_ALIGN = 2; + static constexpr int CAPTURE_PARENT_TYPE = 3; +} // namespace + SequenceUnion::SequenceUnion() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.h index e839e879..f9639df1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.h @@ -7,15 +7,9 @@ class SequenceUnion final : public HeaderParser::sequence_t { - static constexpr int TAG_TYPEDEF = 1; - - static constexpr int CAPTURE_NAME = 1; - static constexpr int CAPTURE_ALIGN = 2; - static constexpr int CAPTURE_PARENT_TYPE = 3; +public: + SequenceUnion(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; - -public: - SequenceUnion(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.cpp index ea9c8d9d..b3cea321 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.cpp @@ -6,6 +6,23 @@ #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" +namespace +{ + static constexpr auto TAG_ARRAY_OF_POINTERS = 1; + static constexpr auto TAG_POINTER_TO_ARRAY = 2; + static constexpr auto TAG_CONST = 3; + static constexpr auto TAG_POINTER = 4; + + static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_ALIGN = 2; + static constexpr auto CAPTURE_TYPE = 3; + static constexpr auto CAPTURE_ARRAY = 4; + static constexpr auto CAPTURE_BIT_SIZE = 5; + + static constexpr auto LABEL_ARRAY_OF_POINTERS = 1; + static constexpr auto LABEL_POINTER_TO_ARRAY = 2; +} // namespace + SequenceVariable::SequenceVariable() { const HeaderMatcherFactory create(this); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.h index 7c7b4b0d..5cf18c72 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceVariable.h @@ -7,26 +7,13 @@ class SequenceVariable final : public HeaderParser::sequence_t { - static constexpr auto TAG_ARRAY_OF_POINTERS = 1; - static constexpr auto TAG_POINTER_TO_ARRAY = 2; - static constexpr auto TAG_CONST = 3; - static constexpr auto TAG_POINTER = 4; - - static constexpr auto CAPTURE_NAME = 1; - static constexpr auto CAPTURE_ALIGN = 2; - static constexpr auto CAPTURE_TYPE = 3; - static constexpr auto CAPTURE_ARRAY = 4; - static constexpr auto CAPTURE_BIT_SIZE = 5; - - static constexpr auto LABEL_ARRAY_OF_POINTERS = 1; - static constexpr auto LABEL_POINTER_TO_ARRAY = 2; - - void AddPointerDeclarationModifiers(SequenceResult& result, TypeDeclaration* typeDeclaration) const; - void AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult& result, TypeDeclaration* typeDeclaration) const; +public: + SequenceVariable(); protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override; -public: - SequenceVariable(); +private: + void AddPointerDeclarationModifiers(SequenceResult& result, TypeDeclaration* typeDeclaration) const; + void AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult& result, TypeDeclaration* typeDeclaration) const; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp index e991aa20..a79b262d 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.cpp @@ -7,269 +7,273 @@ #include #include -unsigned CalculateSizeAndAlignPostProcessor::GetPointerSizeForArchitecture(const Architecture architecture) +namespace { - switch (architecture) + bool CalculateFieldsIfNecessary(IDataRepository* repository, const DataDefinition* definition); + bool CalculateFields(IDataRepository* repository, TypeDeclaration* declaration); + + unsigned GetPointerSizeForArchitecture(const Architecture architecture) { - case Architecture::X86: - return sizeof(uint32_t); - - case Architecture::X64: - return sizeof(uint64_t); - - default: - assert(false); - return sizeof(uint32_t); - } -} - -bool CalculateSizeAndAlignPostProcessor::CalculateAlign(IDataRepository* repository, TypeDeclaration* declaration) -{ - auto hasPointerModifier = false; - for (const auto& declarationModifier : declaration->m_declaration_modifiers) - { - if (declarationModifier->GetType() == DeclarationModifierType::POINTER) + switch (architecture) { - hasPointerModifier = true; - break; + case Architecture::X86: + return sizeof(uint32_t); + + case Architecture::X64: + return sizeof(uint64_t); + + default: + assert(false); + return sizeof(uint32_t); } } - if (hasPointerModifier) + bool CalculateAlign(IDataRepository* repository, TypeDeclaration* declaration) { - declaration->m_alignment = GetPointerSizeForArchitecture(repository->GetArchitecture()); - } - else - { - if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) - return false; - declaration->m_alignment = declaration->m_type->GetAlignment(); - if (declaration->m_type->GetForceAlignment()) - declaration->m_flags |= TypeDeclaration::FLAG_ALIGNMENT_FORCED; + auto hasPointerModifier = false; + for (const auto& declarationModifier : declaration->m_declaration_modifiers) + { + if (declarationModifier->GetType() == DeclarationModifierType::POINTER) + { + hasPointerModifier = true; + break; + } + } + + if (hasPointerModifier) + { + declaration->m_alignment = GetPointerSizeForArchitecture(repository->GetArchitecture()); + } + else + { + if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) + return false; + declaration->m_alignment = declaration->m_type->GetAlignment(); + if (declaration->m_type->GetForceAlignment()) + declaration->m_flags |= TypeDeclaration::FLAG_ALIGNMENT_FORCED; + } + + return true; } - return true; -} + bool CalculateAlign(IDataRepository* repository, DefinitionWithMembers* definition) + { + if (definition->m_has_alignment_override) + { + definition->m_flags |= DefinitionWithMembers::FLAG_ALIGNMENT_FORCED; + definition->m_alignment = definition->m_alignment_override; + } + else + { + definition->m_alignment = 0; + for (const auto& member : definition->m_members) + { + if (!CalculateFields(repository, member->m_type_declaration.get())) + return false; -bool CalculateSizeAndAlignPostProcessor::CalculateAlign(IDataRepository* repository, DefinitionWithMembers* definition) -{ - if (definition->m_has_alignment_override) - { - definition->m_flags |= DefinitionWithMembers::FLAG_ALIGNMENT_FORCED; - definition->m_alignment = definition->m_alignment_override; + const auto memberAlignment = member->GetAlignment(); + if (memberAlignment > definition->m_alignment) + definition->m_alignment = memberAlignment; + } + } + + return true; } - else + + bool CalculateSize(IDataRepository* repository, TypeDeclaration* declaration) { - definition->m_alignment = 0; + if (declaration->m_declaration_modifiers.empty()) + { + if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) + return false; + declaration->m_size = declaration->m_type->GetSize(); + } + else + { + auto currentSize = 0u; + + // If the first modifier is a pointer we do not need the actual type size + if (declaration->m_declaration_modifiers.back()->GetType() != DeclarationModifierType::POINTER) + { + if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) + return false; + currentSize = declaration->m_type->GetSize(); + } + + for (auto i = declaration->m_declaration_modifiers.size(); i > 0; i--) + { + const auto& declarationModifier = declaration->m_declaration_modifiers[i - 1]; + + switch (declarationModifier->GetType()) + { + case DeclarationModifierType::POINTER: + currentSize = GetPointerSizeForArchitecture(repository->GetArchitecture()); + break; + + case DeclarationModifierType::ARRAY: + currentSize *= dynamic_cast(declarationModifier.get())->m_size; + break; + } + } + + declaration->m_size = currentSize; + } + + return true; + } + + bool CalculateSize(IDataRepository* repository, StructDefinition* definition) + { + definition->m_size = 0; + auto currentBitOffset = 0u; + for (const auto& member : definition->m_members) { if (!CalculateFields(repository, member->m_type_declaration.get())) return false; - const auto memberAlignment = member->GetAlignment(); - if (memberAlignment > definition->m_alignment) - definition->m_alignment = memberAlignment; + 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 + { + if (currentBitOffset > 0) + { + currentBitOffset = utils::Align(currentBitOffset, 8u); + definition->m_size += currentBitOffset / 8; + currentBitOffset = 0; + } + + definition->m_size = utils::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(); + } } - } - return true; -} - -bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* repository, TypeDeclaration* declaration) -{ - if (declaration->m_declaration_modifiers.empty()) - { - if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) - return false; - declaration->m_size = declaration->m_type->GetSize(); - } - else - { - auto currentSize = 0u; - - // If the first modifier is a pointer we do not need the actual type size - if (declaration->m_declaration_modifiers.back()->GetType() != DeclarationModifierType::POINTER) + if (currentBitOffset > 0) { - if (!CalculateFieldsIfNecessary(repository, declaration->m_type)) + currentBitOffset = utils::Align(currentBitOffset, 8u); + definition->m_size += currentBitOffset / 8; + } + + definition->m_size = utils::Align(definition->m_size, definition->m_alignment); + + return true; + } + + bool CalculateSize(IDataRepository* repository, UnionDefinition* definition) + { + definition->m_size = 0; + + for (const auto& member : definition->m_members) + { + if (!CalculateFields(repository, member->m_type_declaration.get())) return false; - currentSize = declaration->m_type->GetSize(); + + member->m_offset = 0; + + const auto memberSize = member->m_type_declaration->GetSize(); + if (memberSize > definition->m_size) + definition->m_size = memberSize; } - for (auto i = declaration->m_declaration_modifiers.size(); i > 0; i--) - { - const auto& declarationModifier = declaration->m_declaration_modifiers[i - 1]; + definition->m_size = utils::Align(definition->m_size, definition->m_alignment); - switch (declarationModifier->GetType()) - { - case DeclarationModifierType::POINTER: - currentSize = GetPointerSizeForArchitecture(repository->GetArchitecture()); - break; - - case DeclarationModifierType::ARRAY: - currentSize *= dynamic_cast(declarationModifier.get())->m_size; - break; - } - } - - declaration->m_size = currentSize; + return true; } - return true; -} - -bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* repository, StructDefinition* definition) -{ - definition->m_size = 0; - auto currentBitOffset = 0u; - - for (const auto& member : definition->m_members) + bool CalculateFields(IDataRepository* repository, TypeDeclaration* declaration) { - if (!CalculateFields(repository, member->m_type_declaration.get())) + if (declaration->m_flags & TypeDeclaration::FLAG_FIELDS_CALCULATED) + return true; + + if (!CalculateAlign(repository, declaration) || !CalculateSize(repository, declaration)) return false; - 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 - { - if (currentBitOffset > 0) - { - currentBitOffset = utils::Align(currentBitOffset, 8u); - definition->m_size += currentBitOffset / 8; - currentBitOffset = 0; - } - - definition->m_size = - utils::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(); - } + declaration->m_flags |= TypeDeclaration::FLAG_FIELDS_CALCULATED; + return true; } - if (currentBitOffset > 0) + bool CalculateFields(IDataRepository* repository, StructDefinition* structDefinition) { - currentBitOffset = utils::Align(currentBitOffset, 8u); - definition->m_size += currentBitOffset / 8; - } - - definition->m_size = utils::Align(definition->m_size, definition->m_alignment); - - return true; -} - -bool CalculateSizeAndAlignPostProcessor::CalculateSize(IDataRepository* repository, UnionDefinition* definition) -{ - definition->m_size = 0; - - for (const auto& member : definition->m_members) - { - if (!CalculateFields(repository, member->m_type_declaration.get())) + if (structDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATED) + return true; + if (structDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATING) + { + std::cerr << "Detected circular dependency:\n"; return false; + } - member->m_offset = 0; + structDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATING; - const auto memberSize = member->m_type_declaration->GetSize(); - if (memberSize > definition->m_size) - definition->m_size = memberSize; - } + if (!CalculateAlign(repository, structDefinition) || !CalculateSize(repository, structDefinition)) + { + return false; + } - definition->m_size = utils::Align(definition->m_size, definition->m_alignment); + structDefinition->m_flags &= ~DefinitionWithMembers::FLAG_FIELDS_CALCULATING; + structDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATED; - return true; -} - -bool CalculateSizeAndAlignPostProcessor::CalculateFields(IDataRepository* repository, TypeDeclaration* declaration) -{ - if (declaration->m_flags & TypeDeclaration::FLAG_FIELDS_CALCULATED) return true; - - if (!CalculateAlign(repository, declaration) || !CalculateSize(repository, declaration)) - { - return false; } - declaration->m_flags |= TypeDeclaration::FLAG_FIELDS_CALCULATED; - return true; -} + bool CalculateFields(IDataRepository* repository, UnionDefinition* unionDefinition) + { + if (unionDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATED) + return true; + if (unionDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATING) + { + std::cerr << "Detected circular dependency:\n"; + return false; + } + + unionDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATING; + + if (!CalculateAlign(repository, unionDefinition) || !CalculateSize(repository, unionDefinition)) + { + return false; + } + + unionDefinition->m_flags &= ~DefinitionWithMembers::FLAG_FIELDS_CALCULATING; + unionDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATED; -bool CalculateSizeAndAlignPostProcessor::CalculateFields(IDataRepository* repository, StructDefinition* structDefinition) -{ - if (structDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATED) return true; - if (structDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATING) - { - std::cout << "Detected circular dependency:\n"; - return false; } - structDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATING; - - if (!CalculateAlign(repository, structDefinition) || !CalculateSize(repository, structDefinition)) + bool CalculateFieldsIfNecessary(IDataRepository* repository, const DataDefinition* definition) { - return false; - } + if (definition->GetType() == DataDefinitionType::STRUCT) + { + // We can do a const cast here because the only reason that field is const anyway is because it could be a base type + return CalculateFields(repository, dynamic_cast(const_cast(definition))); + } - structDefinition->m_flags &= ~DefinitionWithMembers::FLAG_FIELDS_CALCULATING; - structDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATED; + if (definition->GetType() == DataDefinitionType::UNION) + { + // We can do a const cast here because the only reason that field is const anyway is because it could be a base type + return CalculateFields(repository, dynamic_cast(const_cast(definition))); + } - return true; -} + if (definition->GetType() == DataDefinitionType::TYPEDEF) + { + // We can do a const cast here because the only reason that field is const anyway is because it could be a base type + return CalculateFields(repository, dynamic_cast(const_cast(definition))->m_type_declaration.get()); + } -bool CalculateSizeAndAlignPostProcessor::CalculateFields(IDataRepository* repository, UnionDefinition* unionDefinition) -{ - if (unionDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATED) return true; - if (unionDefinition->m_flags & DefinitionWithMembers::FLAG_FIELDS_CALCULATING) - { - std::cout << "Detected circular dependency:\n"; - return false; } - - unionDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATING; - - if (!CalculateAlign(repository, unionDefinition) || !CalculateSize(repository, unionDefinition)) - { - return false; - } - - unionDefinition->m_flags &= ~DefinitionWithMembers::FLAG_FIELDS_CALCULATING; - unionDefinition->m_flags |= DefinitionWithMembers::FLAG_FIELDS_CALCULATED; - - return true; -} - -bool CalculateSizeAndAlignPostProcessor::CalculateFieldsIfNecessary(IDataRepository* repository, const DataDefinition* definition) -{ - if (definition->GetType() == DataDefinitionType::STRUCT) - { - // We can do a const cast here because the only reason that field is const anyway is because it could be a base type - return CalculateFields(repository, dynamic_cast(const_cast(definition))); - } - - if (definition->GetType() == DataDefinitionType::UNION) - { - // We can do a const cast here because the only reason that field is const anyway is because it could be a base type - return CalculateFields(repository, dynamic_cast(const_cast(definition))); - } - - if (definition->GetType() == DataDefinitionType::TYPEDEF) - { - // We can do a const cast here because the only reason that field is const anyway is because it could be a base type - return CalculateFields(repository, dynamic_cast(const_cast(definition))->m_type_declaration.get()); - } - - return true; -} +} // namespace bool CalculateSizeAndAlignPostProcessor::PostProcess(IDataRepository* repository) { if (repository->GetArchitecture() == Architecture::UNKNOWN) { - std::cout << "You must set an architecture!\n"; + std::cerr << "You must set an architecture!\n"; return false; } diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h index ec5adc59..85d235c1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CalculateSizeAndAlignPostProcessor.h @@ -4,17 +4,6 @@ class CalculateSizeAndAlignPostProcessor final : public IPostProcessor { - static unsigned GetPointerSizeForArchitecture(Architecture architecture); - static bool CalculateAlign(IDataRepository* repository, TypeDeclaration* declaration); - static bool CalculateAlign(IDataRepository* repository, DefinitionWithMembers* definition); - static bool CalculateSize(IDataRepository* repository, TypeDeclaration* declaration); - static bool CalculateSize(IDataRepository* repository, StructDefinition* definition); - static bool CalculateSize(IDataRepository* repository, UnionDefinition* definition); - static bool CalculateFields(IDataRepository* repository, TypeDeclaration* declaration); - static bool CalculateFields(IDataRepository* repository, StructDefinition* structDefinition); - static bool CalculateFields(IDataRepository* repository, UnionDefinition* unionDefinition); - static bool CalculateFieldsIfNecessary(IDataRepository* repository, const DataDefinition* definition); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp index dd645778..4533fb0a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp @@ -2,28 +2,31 @@ #include -bool CreateMemberInformationPostProcessor::CreateMemberInformationForStructure(IDataRepository* repository, StructureInformation* structure) const +namespace { - for (const auto& member : structure->m_definition->m_members) + bool CreateMemberInformationForStructure(IDataRepository* repository, StructureInformation* structure) { - StructureInformation* typeInfo = nullptr; - const auto* currentDefinition = member->m_type_declaration->m_type; - - while (currentDefinition->GetType() == DataDefinitionType::TYPEDEF) + for (const auto& member : structure->m_definition->m_members) { - currentDefinition = dynamic_cast(currentDefinition)->m_type_declaration->m_type; + StructureInformation* typeInfo = nullptr; + const auto* currentDefinition = member->m_type_declaration->m_type; + + while (currentDefinition->GetType() == DataDefinitionType::TYPEDEF) + { + currentDefinition = dynamic_cast(currentDefinition)->m_type_declaration->m_type; + } + + const auto* memberDefinition = dynamic_cast(currentDefinition); + + if (memberDefinition != nullptr) + typeInfo = repository->GetInformationFor(memberDefinition); + + structure->m_ordered_members.emplace_back(std::make_unique(structure, typeInfo, member.get())); } - const auto* memberDefinition = dynamic_cast(currentDefinition); - - if (memberDefinition != nullptr) - typeInfo = repository->GetInformationFor(memberDefinition); - - structure->m_ordered_members.emplace_back(std::make_unique(structure, typeInfo, member.get())); + return true; } - - return true; -} +} // namespace bool CreateMemberInformationPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.h index 31c83c15..8aac4748 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.h @@ -4,8 +4,6 @@ class CreateMemberInformationPostProcessor final : public IPostProcessor { - bool CreateMemberInformationForStructure(IDataRepository* repository, StructureInformation* structure) const; - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.cpp index 62eff71b..cbcb07ac 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.cpp @@ -4,45 +4,48 @@ #include "Domain/Computations/StructureComputations.h" #include "Domain/Definition/PointerDeclarationModifier.h" -bool LeafsPostProcessor::IsLeaf(StructureInformation* info) +namespace { - for (const auto& member : info->m_ordered_members) + bool IsLeaf(StructureInformation* info) { - // If there is a condition to this member and it always evaluates to false: Skip this member - if (member->m_condition && member->m_condition->IsStatic() && member->m_condition->EvaluateNumeric() == 0) - continue; - - // Any ScriptStrings or Strings need to be processed. - if (member->m_is_script_string || member->m_is_string) - return false; - - // If there are any Pointer members that are not always count 0 it needs to be processed. - for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + for (const auto& member : info->m_ordered_members) { - if (modifier->GetType() == DeclarationModifierType::POINTER) - { - auto* pointer = dynamic_cast(modifier.get()); - const auto* countEvaluation = pointer->GetCountEvaluation(); + // If there is a condition to this member and it always evaluates to false: Skip this member + if (member->m_condition && member->m_condition->IsStatic() && member->m_condition->EvaluateNumeric() == 0) + continue; - if (!countEvaluation->IsStatic() || countEvaluation->EvaluateNumeric() != 0) - return false; + // Any ScriptStrings or Strings need to be processed. + if (member->m_is_script_string || member->m_is_string) + return false; + + // If there are any Pointer members that are not always count 0 it needs to be processed. + for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + { + if (modifier->GetType() == DeclarationModifierType::POINTER) + { + auto* pointer = dynamic_cast(modifier.get()); + const auto* countEvaluation = pointer->GetCountEvaluation(); + + if (!countEvaluation->IsStatic() || countEvaluation->EvaluateNumeric() != 0) + return false; + } + } + + MemberComputations computations(member.get()); + + // If the member has an embedded type with dynamic size + if (computations.HasDynamicArraySize()) + return false; + + if (member->m_type != nullptr && member->m_type != info && !IsLeaf(member->m_type)) + { + return false; } } - MemberComputations computations(member.get()); - - // If the member has an embedded type with dynamic size - if (computations.HasDynamicArraySize()) - return false; - - if (member->m_type != nullptr && member->m_type != info && !IsLeaf(member->m_type)) - { - return false; - } + return true; } - - return true; -} +} // namespace bool LeafsPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.h index b19848b4..403ed4d2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/LeafsPostProcessor.h @@ -4,8 +4,6 @@ class LeafsPostProcessor final : public IPostProcessor { - static bool IsLeaf(StructureInformation* info); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp index 1eeb9fbd..1c964928 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.cpp @@ -6,61 +6,64 @@ #include -bool MarkingRequiredPostProcessor::CalculateRequiresMarking(std::unordered_set& visitedStructures, StructureInformation* info) +namespace { - if (visitedStructures.find(info) != visitedStructures.end()) - return info->m_requires_marking; - - visitedStructures.emplace(info); - - if (info->m_asset_enum_entry) + bool CalculateRequiresMarking(std::unordered_set& visitedStructures, StructureInformation* info) { - info->m_requires_marking = true; - return true; - } + if (visitedStructures.find(info) != visitedStructures.end()) + return info->m_requires_marking; - for (const auto& member : info->m_ordered_members) - { - // If there is a condition to this member, and it always evaluates to false: Skip this member - if (member->m_condition && member->m_condition->IsStatic() && member->m_condition->EvaluateNumeric() == 0) - continue; + visitedStructures.emplace(info); - // Skip if it has a pointer evaluation that always resolves to 0 - auto skip = false; - for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + if (info->m_asset_enum_entry) { - if (modifier->GetType() == DeclarationModifierType::POINTER) - { - const auto* pointer = dynamic_cast(modifier.get()); - const auto* countEvaluation = pointer->GetCountEvaluation(); + info->m_requires_marking = true; + return true; + } - if (countEvaluation->IsStatic() && countEvaluation->EvaluateNumeric() == 0) + for (const auto& member : info->m_ordered_members) + { + // If there is a condition to this member, and it always evaluates to false: Skip this member + if (member->m_condition && member->m_condition->IsStatic() && member->m_condition->EvaluateNumeric() == 0) + continue; + + // Skip if it has a pointer evaluation that always resolves to 0 + auto skip = false; + for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + { + if (modifier->GetType() == DeclarationModifierType::POINTER) { - skip = true; - break; + const auto* pointer = dynamic_cast(modifier.get()); + const auto* countEvaluation = pointer->GetCountEvaluation(); + + if (countEvaluation->IsStatic() && countEvaluation->EvaluateNumeric() == 0) + { + skip = true; + break; + } } } - } - if (skip) - continue; + if (skip) + continue; - // Any script strings, asset refs and assets need to be processed. - if (member->m_is_script_string || member->m_asset_ref || member->m_type && member->m_type->m_asset_enum_entry) - { - info->m_requires_marking = true; - return true; + // Any script strings, asset refs and assets need to be processed. + if (member->m_is_script_string || member->m_asset_ref || member->m_type && member->m_type->m_asset_enum_entry) + { + info->m_requires_marking = true; + return true; + } + + if (member->m_type != nullptr && member->m_type != info && CalculateRequiresMarking(visitedStructures, member->m_type)) + { + info->m_requires_marking = true; + return true; + } } - if (member->m_type != nullptr && member->m_type != info && CalculateRequiresMarking(visitedStructures, member->m_type)) - { - info->m_requires_marking = true; - return true; - } + info->m_requires_marking = false; + return false; } - - info->m_requires_marking = false; - return false; -} +} // namespace bool MarkingRequiredPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.h index ad7f8165..baff9090 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MarkingRequiredPostProcessor.h @@ -6,8 +6,6 @@ class MarkingRequiredPostProcessor final : public IPostProcessor { - static bool CalculateRequiresMarking(std::unordered_set& visitedStructures, StructureInformation* info); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.cpp index d3d73089..f9351b8c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.cpp @@ -3,42 +3,45 @@ #include "Domain/Computations/MemberComputations.h" #include "Domain/Definition/PointerDeclarationModifier.h" -bool MemberLeafsPostProcessor::MemberIsLeaf(MemberInformation* member) +namespace { - if (member->m_is_string || member->m_is_script_string) - return false; - - if (member->m_type != nullptr && !member->m_type->m_is_leaf) - return false; - - // If there are any Pointer members that are not always count 0 it needs to be processed. - for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + bool MemberIsLeaf(MemberInformation* member) { - if (modifier->GetType() == DeclarationModifierType::POINTER) - { - auto* pointer = dynamic_cast(modifier.get()); - const auto* countEvaluation = pointer->GetCountEvaluation(); + if (member->m_is_string || member->m_is_script_string) + return false; - if (!countEvaluation->IsStatic() || countEvaluation->EvaluateNumeric() != 0) - return false; + if (member->m_type != nullptr && !member->m_type->m_is_leaf) + return false; + + // If there are any Pointer members that are not always count 0 it needs to be processed. + for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + { + if (modifier->GetType() == DeclarationModifierType::POINTER) + { + auto* pointer = dynamic_cast(modifier.get()); + const auto* countEvaluation = pointer->GetCountEvaluation(); + + if (!countEvaluation->IsStatic() || countEvaluation->EvaluateNumeric() != 0) + return false; + } + } + + const MemberComputations computations(member); + + if (computations.HasDynamicArraySize()) + return false; + + return true; + } + + void ProcessInfo(StructureInformation* info) + { + for (const auto& member : info->m_ordered_members) + { + member->m_is_leaf = MemberIsLeaf(member.get()); } } - - const MemberComputations computations(member); - - if (computations.HasDynamicArraySize()) - return false; - - return true; -} - -void MemberLeafsPostProcessor::ProcessInfo(StructureInformation* info) -{ - for (const auto& member : info->m_ordered_members) - { - member->m_is_leaf = MemberIsLeaf(member.get()); - } -} +} // namespace bool MemberLeafsPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.h index 763e9a79..f459b0ae 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/MemberLeafsPostProcessor.h @@ -4,9 +4,6 @@ class MemberLeafsPostProcessor final : public IPostProcessor { - static bool MemberIsLeaf(MemberInformation* member); - static void ProcessInfo(StructureInformation* info); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.cpp index ec209f35..83283aae 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.cpp @@ -1,40 +1,44 @@ #include "UnionsPostProcessor.h" #include +#include #include -bool UnionsPostProcessor::ProcessUnion(StructureInformation* info) +namespace { - auto index = 0u; - auto lastEntryWithoutCondition = 0u; - auto entriesWithoutConditionCount = 0u; - - for (const auto& member : info->m_ordered_members) + bool ProcessUnion(StructureInformation* info) { - if (!member->m_condition && !member->m_is_leaf) + auto index = 0u; + auto lastEntryWithoutCondition = 0u; + auto entriesWithoutConditionCount = 0u; + + for (const auto& member : info->m_ordered_members) { - entriesWithoutConditionCount++; - lastEntryWithoutCondition = index; + if (!member->m_condition && !member->m_is_leaf) + { + entriesWithoutConditionCount++; + lastEntryWithoutCondition = index; + } + index++; } - index++; - } - if (entriesWithoutConditionCount > 1 && !info->m_usages.empty() && !info->m_is_leaf) - { - std::cout << "Union '" << info->m_definition->GetFullName() << "' has more than one entry without a condition!\n"; - return false; - } + if (entriesWithoutConditionCount > 1 && !info->m_usages.empty() && !info->m_is_leaf) + { + std::cerr << std::format("Union '{}' has more than one entry without a condition!\n", info->m_definition->GetFullName()); + return false; + } - if (entriesWithoutConditionCount == 1) - { - // If there is only one entry without condition make it the last of the ordered members - auto entryWithoutCondition = std::move(info->m_ordered_members.at(lastEntryWithoutCondition)); - info->m_ordered_members.erase(info->m_ordered_members.begin() + lastEntryWithoutCondition); - info->m_ordered_members.emplace_back(std::move(entryWithoutCondition)); - } + if (entriesWithoutConditionCount == 1) + { + // If there is only one entry without condition make it the last of the ordered members + auto entryWithoutCondition = std::move(info->m_ordered_members.at(lastEntryWithoutCondition)); + info->m_ordered_members.erase(info->m_ordered_members.begin() + lastEntryWithoutCondition); + info->m_ordered_members.emplace_back(std::move(entryWithoutCondition)); + } - return true; -} + return true; + } +} // namespace bool UnionsPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.h index 85b9d53c..6c014d54 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UnionsPostProcessor.h @@ -4,8 +4,6 @@ class UnionsPostProcessor final : public IPostProcessor { - static bool ProcessUnion(StructureInformation* info); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp index 031bd695..a8dee352 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp @@ -5,59 +5,62 @@ #include #include -#include +#include -bool UsagesPostProcessor::ProcessAsset(StructureInformation* info) +namespace { - std::set processedInfos; - std::queue processingQueue; - - processingQueue.push(info); - - while (!processingQueue.empty()) + bool ProcessAsset(StructureInformation* info) { - auto* currentStructure = processingQueue.front(); - processingQueue.pop(); + std::unordered_set processedInfos; + std::queue processingQueue; - if (processedInfos.find(currentStructure) != processedInfos.end()) - continue; - processedInfos.emplace(currentStructure); + processingQueue.push(info); - for (const auto& member : currentStructure->m_ordered_members) + while (!processingQueue.empty()) { - if (member->m_type == nullptr) + auto* currentStructure = processingQueue.front(); + processingQueue.pop(); + + if (processedInfos.find(currentStructure) != processedInfos.end()) continue; + processedInfos.emplace(currentStructure); - const MemberComputations computations(member.get()); + for (const auto& member : currentStructure->m_ordered_members) + { + if (member->m_type == nullptr) + continue; - if (computations.ShouldIgnore()) - continue; + const MemberComputations computations(member.get()); - if (computations.ContainsNonEmbeddedReference()) - member->m_type->m_non_embedded_reference_exists = true; + if (computations.ShouldIgnore()) + continue; - if (computations.ContainsSinglePointerReference()) - member->m_type->m_single_pointer_reference_exists = true; + if (computations.ContainsNonEmbeddedReference()) + member->m_type->m_non_embedded_reference_exists = true; - if (computations.ContainsArrayPointerReference()) - member->m_type->m_array_pointer_reference_exists = true; + if (computations.ContainsSinglePointerReference()) + member->m_type->m_single_pointer_reference_exists = true; - if (computations.ContainsArrayReference()) - member->m_type->m_array_reference_exists = true; + if (computations.ContainsArrayPointerReference()) + member->m_type->m_array_pointer_reference_exists = true; - if (computations.IsNotInDefaultNormalBlock()) - member->m_type->m_reference_from_non_default_normal_block_exists = true; + if (computations.ContainsArrayReference()) + member->m_type->m_array_reference_exists = true; - if (member->m_is_reusable) - member->m_type->m_reusable_reference_exists = true; + if (computations.IsNotInDefaultNormalBlock()) + member->m_type->m_reference_from_non_default_normal_block_exists = true; - member->m_type->m_usages.push_back(currentStructure); - processingQueue.push(member->m_type); + if (member->m_is_reusable) + member->m_type->m_reusable_reference_exists = true; + + member->m_type->m_usages.push_back(currentStructure); + processingQueue.push(member->m_type); + } } - } - return true; -} + return true; + } +} // namespace bool UsagesPostProcessor::PostProcess(IDataRepository* repository) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.h index e5b1f778..9b6f1267 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.h +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.h @@ -4,8 +4,6 @@ class UsagesPostProcessor final : public IPostProcessor { - static bool ProcessAsset(StructureInformation* info); - public: bool PostProcess(IDataRepository* repository) override; }; diff --git a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h index 0176aa17..a24f9ba7 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h @@ -28,20 +28,20 @@ public: virtual void Add(std::unique_ptr structureInformation) = 0; virtual void Add(std::unique_ptr fastFileBlock) = 0; - _NODISCARD virtual const std::string& GetGameName() const = 0; + [[nodiscard]] virtual const std::string& GetGameName() const = 0; virtual void SetGame(std::string gameName) = 0; - _NODISCARD virtual Architecture GetArchitecture() const = 0; + [[nodiscard]] virtual Architecture GetArchitecture() const = 0; virtual void SetArchitecture(Architecture architecture) = 0; - _NODISCARD virtual const std::vector& GetAllEnums() const = 0; - _NODISCARD virtual const std::vector& GetAllStructs() const = 0; - _NODISCARD virtual const std::vector& GetAllUnions() const = 0; - _NODISCARD virtual const std::vector& GetAllTypedefs() const = 0; - _NODISCARD virtual const std::vector& GetAllStructureInformation() const = 0; - _NODISCARD virtual const std::vector& GetAllFastFileBlocks() const = 0; + [[nodiscard]] virtual const std::vector& GetAllEnums() const = 0; + [[nodiscard]] virtual const std::vector& GetAllStructs() const = 0; + [[nodiscard]] virtual const std::vector& GetAllUnions() const = 0; + [[nodiscard]] virtual const std::vector& GetAllTypedefs() const = 0; + [[nodiscard]] virtual const std::vector& GetAllStructureInformation() const = 0; + [[nodiscard]] virtual const std::vector& GetAllFastFileBlocks() const = 0; - _NODISCARD virtual DataDefinition* GetDataDefinitionByName(const std::string& name) const = 0; - _NODISCARD virtual StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const = 0; - _NODISCARD virtual EnumMember* GetEnumMemberByName(const std::string& name) const = 0; - _NODISCARD virtual const FastFileBlock* GetFastFileBlockByName(const std::string& name) const = 0; + [[nodiscard]] virtual DataDefinition* GetDataDefinitionByName(const std::string& name) const = 0; + [[nodiscard]] virtual StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const = 0; + [[nodiscard]] virtual EnumMember* GetEnumMemberByName(const std::string& name) const = 0; + [[nodiscard]] virtual const FastFileBlock* GetFastFileBlockByName(const std::string& name) const = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h index 6bac128e..be23e522 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h @@ -6,19 +6,6 @@ class InMemoryRepository final : public IDataRepository { - std::vector m_enums; - std::vector m_structs; - std::vector m_unions; - std::vector m_typedefs; - std::vector m_structures_information; - std::vector m_fast_file_blocks; - std::map m_data_definitions_by_name; - std::map m_enum_members_by_name; - std::map m_fast_file_blocks_by_name; - std::map m_structure_information_by_definition; - std::string m_game_name; - Architecture m_architecture; - public: InMemoryRepository(); ~InMemoryRepository() override; @@ -34,20 +21,34 @@ public: void Add(std::unique_ptr structureInformation) override; void Add(std::unique_ptr fastFileBlock) override; - _NODISCARD const std::string& GetGameName() const override; + [[nodiscard]] const std::string& GetGameName() const override; void SetGame(std::string gameName) override; - _NODISCARD Architecture GetArchitecture() const override; + [[nodiscard]] Architecture GetArchitecture() const override; void SetArchitecture(Architecture architecture) override; - _NODISCARD const std::vector& GetAllEnums() const override; - _NODISCARD const std::vector& GetAllStructs() const override; - _NODISCARD const std::vector& GetAllUnions() const override; - _NODISCARD const std::vector& GetAllTypedefs() const override; - _NODISCARD const std::vector& GetAllStructureInformation() const override; - _NODISCARD const std::vector& GetAllFastFileBlocks() const override; + [[nodiscard]] const std::vector& GetAllEnums() const override; + [[nodiscard]] const std::vector& GetAllStructs() const override; + [[nodiscard]] const std::vector& GetAllUnions() const override; + [[nodiscard]] const std::vector& GetAllTypedefs() const override; + [[nodiscard]] const std::vector& GetAllStructureInformation() const override; + [[nodiscard]] const std::vector& GetAllFastFileBlocks() const override; - _NODISCARD DataDefinition* GetDataDefinitionByName(const std::string& name) const override; - _NODISCARD StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const override; - _NODISCARD EnumMember* GetEnumMemberByName(const std::string& name) const override; - _NODISCARD const FastFileBlock* GetFastFileBlockByName(const std::string& name) const override; + [[nodiscard]] DataDefinition* GetDataDefinitionByName(const std::string& name) const override; + [[nodiscard]] StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const override; + [[nodiscard]] EnumMember* GetEnumMemberByName(const std::string& name) const override; + [[nodiscard]] const FastFileBlock* GetFastFileBlockByName(const std::string& name) const override; + +private: + std::vector m_enums; + std::vector m_structs; + std::vector m_unions; + std::vector m_typedefs; + std::vector m_structures_information; + std::vector m_fast_file_blocks; + std::map m_data_definitions_by_name; + std::map m_enum_members_by_name; + std::map m_fast_file_blocks_by_name; + std::map m_structure_information_by_definition; + std::string m_game_name; + Architecture m_architecture; }; diff --git a/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.cpp b/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.cpp index c8012ba5..0254a588 100644 --- a/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.cpp +++ b/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.cpp @@ -4,6 +4,7 @@ #include "Utils/NamespaceBuilder.h" #include +#include #include PrettyPrinter::PrettyPrinter(std::ostream& stream, const IDataRepository* repository) @@ -43,12 +44,12 @@ void PrettyPrinter::PrintVariablePointerToArray(Variable* variable) const arraySize.push_back(dynamic_cast(modifier.get())->m_size); } - m_stream << " " << variable->m_type_declaration->m_type->GetFullName() << '('; + m_stream << std::format(" {}(", variable->m_type_declaration->m_type->GetFullName()); for (auto p = 0; p < pointerDepth; p++) m_stream << '*'; - m_stream << variable->m_name << ")"; + m_stream << std::format("{})", variable->m_name); for (auto size : arraySize) - m_stream << '[' << size << ']'; + m_stream << std::format("[{}]", size); m_stream << "\n"; } @@ -78,12 +79,12 @@ void PrettyPrinter::PrintVariableArrayOfPointers(Variable* variable) const pointerDepth++; } - m_stream << " " << variable->m_type_declaration->m_type->GetFullName(); + m_stream << std::format(" {}", variable->m_type_declaration->m_type->GetFullName()); for (auto p = 0; p < pointerDepth; p++) m_stream << '*'; - m_stream << " " << variable->m_name; + m_stream << std::format(" {}", variable->m_name); for (auto size : arraySize) - m_stream << '[' << size << ']'; + m_stream << std::format("[{}]", size); m_stream << "\n"; } @@ -92,7 +93,7 @@ void PrettyPrinter::PrintVariable(Variable* variable) const const auto& declarationModifiers = variable->m_type_declaration->m_declaration_modifiers; if (declarationModifiers.empty()) { - std::cout << " " << variable->m_type_declaration->m_type->GetFullName() << " " << variable->m_name << "\n"; + m_stream << std::format(" {} {}\n", variable->m_type_declaration->m_type->GetFullName(), variable->m_name); } else { @@ -138,12 +139,12 @@ void PrettyPrinter::PrintTypedefPointerToArray(TypedefDefinition* typedefDefinit arraySize.push_back(dynamic_cast(modifier.get())->m_size); } - m_stream << " " << typedefDefinition->m_type_declaration->m_type->GetFullName() << '('; + m_stream << std::format(" {}(", typedefDefinition->m_type_declaration->m_type->GetFullName()); for (auto p = 0; p < pointerDepth; p++) m_stream << '*'; - m_stream << typedefDefinition->m_name << ")"; + m_stream << std::format("{})", typedefDefinition->m_name); for (auto size : arraySize) - m_stream << '[' << size << ']'; + m_stream << std::format("[{}]", size); m_stream << "\n"; } @@ -173,29 +174,29 @@ void PrettyPrinter::PrintTypedefArrayOfPointers(TypedefDefinition* typedefDefini pointerDepth++; } - m_stream << " " << typedefDefinition->m_type_declaration->m_type->GetFullName(); + m_stream << std::format(" {}", typedefDefinition->m_type_declaration->m_type->GetFullName()); for (auto p = 0; p < pointerDepth; p++) m_stream << '*'; - m_stream << " " << typedefDefinition->m_name; + m_stream << std::format(" {}", typedefDefinition->m_name); for (auto size : arraySize) - m_stream << '[' << size << ']'; + m_stream << std::format("[{}]", size); m_stream << "\n"; } void PrettyPrinter::PrintEnums() const { const auto& allEnums = m_repository->GetAllEnums(); - m_stream << allEnums.size() << " enums:\n"; + m_stream << std::format("{} enums:\n", allEnums.size()); for (auto* enumDefinition : allEnums) { - m_stream << " Name: " << enumDefinition->GetFullName() << "\n"; - m_stream << " Alignment: " << enumDefinition->GetAlignment() << "\n"; - m_stream << " Size: " << enumDefinition->GetSize() << "\n"; + m_stream << std::format(" Name: {}\n", enumDefinition->GetFullName()); + m_stream << std::format(" Alignment: {}\n", enumDefinition->GetAlignment()); + m_stream << std::format(" Size: {}\n", enumDefinition->GetSize()); for (const auto& enumMember : enumDefinition->m_members) { - m_stream << " " << enumMember->m_name << " = " << enumMember->m_value << "\n"; + m_stream << std::format(" {} = {}\n", enumMember->m_name, enumMember->m_value); } m_stream << "\n"; @@ -205,13 +206,13 @@ void PrettyPrinter::PrintEnums() const void PrettyPrinter::PrintStructs() const { const auto& allStructs = m_repository->GetAllStructs(); - m_stream << allStructs.size() << " structs:\n"; + m_stream << std::format("{} structs:\n", allStructs.size()); for (auto* structDefinition : allStructs) { - m_stream << " Name: " << structDefinition->GetFullName() << "\n"; - m_stream << " Alignment: " << structDefinition->GetAlignment() << "\n"; - m_stream << " Size: " << structDefinition->GetSize() << "\n"; + m_stream << std::format(" Name: {}\n", structDefinition->GetFullName()); + m_stream << std::format(" Alignment: {}\n", structDefinition->GetAlignment()); + m_stream << std::format(" Size: {}\n", structDefinition->GetSize()); for (const auto& variable : structDefinition->m_members) { @@ -225,13 +226,13 @@ void PrettyPrinter::PrintStructs() const void PrettyPrinter::PrintUnions() const { const auto& allUnions = m_repository->GetAllUnions(); - m_stream << allUnions.size() << " unions:\n"; + m_stream << std::format("{} unions:\n", allUnions.size()); for (auto* unionDefinition : allUnions) { - m_stream << " Name: " << unionDefinition->GetFullName() << "\n"; - m_stream << " Alignment: " << unionDefinition->GetAlignment() << "\n"; - m_stream << " Size: " << unionDefinition->GetSize() << "\n"; + m_stream << std::format(" Name: {}\n", unionDefinition->GetFullName()); + m_stream << std::format(" Alignment: {}\n", unionDefinition->GetAlignment()); + m_stream << std::format(" Size: {}\n", unionDefinition->GetSize()); for (const auto& variable : unionDefinition->m_members) { @@ -245,18 +246,18 @@ void PrettyPrinter::PrintUnions() const void PrettyPrinter::PrintTypedefs() const { const auto& allTypedefs = m_repository->GetAllTypedefs(); - m_stream << allTypedefs.size() << " typedefs:\n"; + m_stream << std::format("{} typedefs:\n", allTypedefs.size()); for (auto* typedefDefinition : allTypedefs) { - m_stream << " Name: " << typedefDefinition->GetFullName() << "\n"; - m_stream << " Alignment: " << typedefDefinition->GetAlignment() << "\n"; - m_stream << " Size: " << typedefDefinition->GetSize() << "\n"; + m_stream << std::format(" Name: {}\n", typedefDefinition->GetFullName()); + m_stream << std::format(" Alignment: {}\n", typedefDefinition->GetAlignment()); + m_stream << std::format(" Size: {}\n", typedefDefinition->GetSize()); const auto& declarationModifiers = typedefDefinition->m_type_declaration->m_declaration_modifiers; if (declarationModifiers.empty()) { - std::cout << " " << typedefDefinition->m_type_declaration->m_type->GetFullName() << "\n"; + m_stream << std::format(" {}\n", typedefDefinition->m_type_declaration->m_type->GetFullName()); } else { diff --git a/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.h b/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.h index 6aa5b0db..059db896 100644 --- a/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.h +++ b/src/ZoneCodeGeneratorLib/Printing/PrettyPrinter.h @@ -6,9 +6,12 @@ class PrettyPrinter { - std::ostream& m_stream; - const IDataRepository* const m_repository; +public: + PrettyPrinter(std::ostream& stream, const IDataRepository* repository); + void PrintAll() const; + +private: void PrintSeparator() const; void PrintVariablePointerToArray(Variable* variable) const; void PrintVariableArrayOfPointers(Variable* variable) const; @@ -21,8 +24,6 @@ class PrettyPrinter void PrintUnions() const; void PrintTypedefs() const; -public: - PrettyPrinter(std::ostream& stream, const IDataRepository* repository); - - void PrintAll() const; + std::ostream& m_stream; + const IDataRepository* m_repository; }; diff --git a/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp b/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp index c5b8c1d6..c37e16e1 100644 --- a/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp +++ b/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp @@ -1,5 +1,6 @@ #include "NamespaceBuilder.h" +#include #include std::string NamespaceBuilder::Combine(const std::string& _namespace, const std::string& name) @@ -7,10 +8,7 @@ std::string NamespaceBuilder::Combine(const std::string& _namespace, const std:: if (_namespace.empty()) return name; - std::ostringstream str; - str << _namespace << "::" << name; - - return str.str(); + return std::format("{}::{}", _namespace, name); } bool NamespaceBuilder::IsEmpty() const