diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp index 1c427d38..783f0a54 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp @@ -63,8 +63,10 @@ std::string BaseTemplate::SafeTypeName(const DataDefinition* def) void BaseTemplate::TypeDecl(const TypeDeclaration* decl) const { if (decl->m_is_const) - m_out << "const "; - m_out << decl->m_type->GetFullName(); + { + LINE_MIDDLE("const ") + } + LINE_MIDDLE(decl->m_type->GetFullName()) } void BaseTemplate::PrintFollowingReferences(const std::vector>& modifiers) const @@ -74,17 +76,21 @@ void BaseTemplate::PrintFollowingReferences(const std::vectorGetType() == DeclarationModifierType::ARRAY) { const auto* array = dynamic_cast(modifier.get()); - m_out << "[" << array->m_size << "]"; + LINE_MIDDLE("["<< array->m_size <<"]") } else - m_out << '*'; + { + LINE_MIDDLE("*") + } } } void BaseTemplate::PrintArrayIndices(const DeclarationModifierComputations& modifierComputations) const { for (auto index : modifierComputations.GetArrayIndices()) - m_out << "[" << index << "]"; + { + LINE_MIDDLE("["<m_enum_member != nullptr) - m_out << op->m_enum_member->m_name; + { + LINE_MIDDLE(op->m_enum_member->m_name) + } else - m_out << op->m_value; + { + LINE_MIDDLE(op->m_value) + } } void BaseTemplate::PrintOperandDynamic(const OperandDynamic* op) const { - m_out << TypeVarName(op->m_structure->m_definition); + LINE_MIDDLE(TypeVarName(op->m_structure->m_definition)) auto first = true; for (const auto* chainMember : op->m_referenced_member_chain) @@ -127,17 +137,19 @@ void BaseTemplate::PrintOperandDynamic(const OperandDynamic* op) const if (first) { first = false; - m_out << "->" << chainMember->m_member->m_name; + LINE_MIDDLE("->"<< chainMember->m_member->m_name) } else - m_out << '.' << chainMember->m_member->m_name; + { + LINE_MIDDLE("." << chainMember->m_member->m_name) + } } for (const auto& arrayIndex : op->m_array_indices) { - m_out << "["; + LINE_MIDDLE("[") PrintEvaluation(arrayIndex.get()); - m_out << "]"; + LINE_MIDDLE("]") } } @@ -145,20 +157,20 @@ void BaseTemplate::PrintOperation(const Operation* operation) const { if (operation->Operand1NeedsParenthesis()) { - m_out << "("; + LINE_MIDDLE("(") PrintEvaluation(operation->m_operand1.get()); - m_out << ")"; + LINE_MIDDLE(")") } else PrintEvaluation(operation->m_operand1.get()); - m_out << " " << operation->m_operation_type->m_syntax << " "; + LINE_MIDDLE(" "<m_operation_type->m_syntax<<" ") if (operation->Operand2NeedsParenthesis()) { - m_out << "("; + LINE_MIDDLE("(") PrintEvaluation(operation->m_operand2.get()); - m_out << ")"; + LINE_MIDDLE(")") } else PrintEvaluation(operation->m_operand2.get()); diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index 02110b65..f55eaaec 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -4,6 +4,7 @@ #include +#include "Domain/Computations/MemberComputations.h" #include "Domain/Computations/StructureComputations.h" #include "Internal/BaseTemplate.h" @@ -120,9 +121,61 @@ class ZoneLoadTemplate::Internal final : BaseTemplate LINE("}") } - void PrintLoadPtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, bool reusable) + void PrintLoadPtrArrayMethod_Loading(const DataDefinition* def, StructureInformation* info) const { - // TODO + LINE("*"<Alloc<"<GetFullName()<<">(alignof("<GetFullName()<<")); // "<GetAlignment()) + + if (info && info->m_is_leaf) + { + LINE(TypeVarName(info->m_definition)<<" = *"<Load<"<GetFullName()<<">(*"<ConvertOffsetToPointer(*"<m_member->m_name) + } + + void LoadSinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadSinglePointer: " << member->m_member->m_name) + } + + void LoadArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadArrayPointer: " << member->m_member->m_name) + } + + void LoadPointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadPointerArray: " << member->m_member->m_name) + } + + void LoadEmbeddedArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadEmbeddedArray: " << member->m_member->m_name) + } + + void LoadEmbedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadEmbedded: " << member->m_member->m_name) + } + + void LoadMember_ReferenceArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE("// LoadMember_ReferenceArray: " << member->m_member->m_name) + } + + void LoadMember_Reference(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + if (modifier.IsDynamicArray()) + { + LoadDynamicArray(info, member, modifier); + } + else if (modifier.IsSinglePointer()) + { + LoadSinglePointer(info, member, modifier); + } + else if (modifier.IsArrayPointer()) + { + LoadArrayPointer(info, member, modifier); + } + else if (modifier.IsPointerArray()) + { + LoadPointerArray(info, member, modifier); + } + else if (modifier.IsArray() && modifier.GetNextDeclarationModifier() == nullptr) + { + LoadEmbeddedArray(info, member, modifier); + } + else if (modifier.GetDeclarationModifier() == nullptr) + { + LoadEmbedded(info, member, modifier); + } + else if (modifier.IsArray()) + { + LoadMember_ReferenceArray(info, member, modifier); + } + else + { + LINE("#error LoadMemberReference failed @ "<m_member->m_name) + } + } + + void LoadMember_Condition_Struct(StructureInformation* info, MemberInformation* member) + { + LINE("") + if (member->m_condition) + { + LINE_START("if(") + PrintEvaluation(member->m_condition.get()); + LINE_END(")") + 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()) + { + LINE("") + if (member->m_condition) + { + LINE_START("if(") + PrintEvaluation(member->m_condition.get()); + LINE_END(")") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + } + } + else if (computations.IsLastMember()) + { + if (member->m_condition) + { + LINE_START("else if(") + PrintEvaluation(member->m_condition.get()); + LINE_END(")") + 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("}") + } + } + else + { + if (member->m_condition) + { + LINE_START("else if(") + PrintEvaluation(member->m_condition.get()); + LINE_END(")") + LINE("{") + m_intendation++; + + LoadMember_Reference(info, member, DeclarationModifierComputations(member)); + + m_intendation--; + LINE("}") + } + else + { + LINE("#error Middle member of union must have condition ("<m_member->m_name<<")") + } + } + } + + void PrintLoadMemberIfNeedsTreatment(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) + LoadMember_Condition_Union(info, member); + else + LoadMember_Condition_Struct(info, member); + } + } + void PrintLoadMethod(StructureInformation* info) { const StructureComputations computations(info); @@ -240,8 +479,7 @@ class ZoneLoadTemplate::Internal final : BaseTemplate for (const auto& member : info->m_ordered_members) { - // TODO - LINE("// "<m_member->m_name) + PrintLoadMemberIfNeedsTreatment(info, member.get()); } if (info->m_block || computations.IsAsset())