diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp index 783f0a54..b6b1becf 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp @@ -60,7 +60,13 @@ std::string BaseTemplate::SafeTypeName(const DataDefinition* def) return safeName; } -void BaseTemplate::TypeDecl(const TypeDeclaration* decl) const +void BaseTemplate::PrintAccessMember(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const +{ + LINE_MIDDLE(TypeVarName(info->m_definition) << "->" << member->m_member->m_name) + PrintArrayIndices(modifier); +} + +void BaseTemplate::PrintTypeDecl(const TypeDeclaration* decl) const { if (decl->m_is_const) { @@ -69,13 +75,13 @@ void BaseTemplate::TypeDecl(const TypeDeclaration* decl) const LINE_MIDDLE(decl->m_type->GetFullName()) } -void BaseTemplate::PrintFollowingReferences(const std::vector>& modifiers) const +void BaseTemplate::PrintFollowingReferences(const std::vector& modifiers) const { - for (const auto& modifier : modifiers) + for (const auto* modifier : modifiers) { if (modifier->GetType() == DeclarationModifierType::ARRAY) { - const auto* array = dynamic_cast(modifier.get()); + const auto* array = dynamic_cast(modifier); LINE_MIDDLE("["<< array->m_size <<"]") } else diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h index cb075fdd..227ecfe4 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h @@ -26,8 +26,9 @@ protected: static std::string TypeVarName(const DataDefinition* def); static std::string TypePtrVarName(const DataDefinition* def); static std::string SafeTypeName(const DataDefinition* def); - void TypeDecl(const TypeDeclaration* decl) const; - void PrintFollowingReferences(const std::vector>& modifiers) const; + void PrintAccessMember(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const; + void PrintTypeDecl(const TypeDeclaration* decl) const; + void PrintFollowingReferences(const std::vector& modifiers) const; void PrintArrayIndices(const DeclarationModifierComputations& modifierComputations) const; void PrintCustomAction(CustomAction* action) const; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index f55eaaec..859a4480 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -247,14 +247,229 @@ class ZoneLoadTemplate::Internal final : BaseTemplate LINE("}") } - void LoadDynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + void LoadDynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const { - LINE("// LoadDynamicArray: "<m_member->m_name) + if (member->m_type && !member->m_type->m_is_leaf) + { + LINE_START(TypeVarName(member->m_member->m_type_declaration->m_type) << " = " << TypeVarName(info->m_definition) << "->" << member->m_member->m_name) + PrintArrayIndices(modifier); + LINE_END(";") + LINE_START("LoadArray_" << SafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, ") + PrintEvaluation(modifier.GetDynamicArraySizeEvaluation()); + LINE_END(");") + } + else + { + LINE_START("m_stream->Load<") + PrintTypeDecl(member->m_member->m_type_declaration.get()); + PrintFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + LINE_MIDDLE(">(" << TypeVarName(info->m_definition) << "->" << member->m_member->m_name) + PrintArrayIndices(modifier); + LINE_MIDDLE(", ") + PrintEvaluation(modifier.GetDynamicArraySizeEvaluation()); + LINE_END(");") + } + } + + void LoadSinglePointer_Inner(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + const MemberComputations computations(member); + if (computations.IsInTempBlock()) + { + LINE_START(member->m_member->m_type_declaration->m_type->GetFullName()<<"* ptr = ") + PrintAccessMember(info, member, modifier); + LINE_END(";") + } + + LINE_START("") + PrintAccessMember(info, member, modifier); + LINE_MIDDLE(" = m_stream->Alloc<") + PrintTypeDecl(member->m_member->m_type_declaration.get()); + PrintFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + LINE_MIDDLE(">(alignof(") + PrintTypeDecl(member->m_member->m_type_declaration.get()); + PrintFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + LINE_END(")); // "<m_member->m_type_declaration->m_type->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<"<m_member->m_type_declaration->m_type->GetFullName()<<">();") + m_intendation--; + LINE("") + } + + if (member->m_type && !member->m_type->m_is_leaf && !computations.IsInRuntimeBlock()) + { + LINE_START(TypeVarName(member->m_member->m_type_declaration->m_type) << " = ") + PrintAccessMember(info, member, modifier); + LINE_END(";") + LINE("Load_"<m_member->m_type_declaration->m_type)<<"(true);") + + if (member->m_type->m_post_load_action) + { + PrintCustomAction(member->m_type->m_post_load_action.get()); + } + } + else + { + LINE_START("m_stream->Load<") + PrintTypeDecl(member->m_member->m_type_declaration.get()); + PrintFollowingReferences(modifier.GetFollowingDeclarationModifiers()); + LINE_MIDDLE(">(") + PrintAccessMember(info, member, modifier); + LINE_END(");") + } + + if (computations.IsInTempBlock()) + { + LINE("") + LINE("if(toInsert != nullptr)") + m_intendation++; + LINE("*toInsert = "<m_definition)<<"->"<m_member->m_name<<";") + m_intendation--; + } + } + + void LoadSinglePointer_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + const MemberComputations computations(member); + if (computations.IsInTempBlock()) + { + LINE_START("if(") + PrintAccessMember(info, member, modifier); + LINE_MIDDLE(" == PTR_FOLLOWING || ") + PrintAccessMember(info, member, modifier); + LINE_END(" == PTR_INSERT)") + LINE("{") + m_intendation++; + + LoadSinglePointer_Inner(info, member, modifier); + + m_intendation--; + LINE("}") + LINE("else") + LINE("{") + m_intendation++; + + LINE_START("") + PrintAccessMember(info, member, modifier); + LINE_MIDDLE(" = m_stream->ConvertOffsetToAlias(") + PrintAccessMember(info, member, modifier); + LINE_END(");") + + m_intendation--; + LINE("}") + } + else + { + LINE_START("if(") + PrintAccessMember(info, member, modifier); + LINE_END(" == PTR_FOLLOWING)") + LINE("{") + m_intendation++; + + LoadSinglePointer_Inner(info, member, modifier); + + m_intendation--; + LINE("}") + LINE("else") + LINE("{") + m_intendation++; + + LINE_START("") + PrintAccessMember(info, member, modifier); + LINE_MIDDLE(" = m_stream->ConvertOffsetToPointer(") + PrintAccessMember(info, member, modifier); + LINE_END(");") + + m_intendation--; + LINE("}") + } + } + + void LoadSinglePointer_Asset(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + LINE(LoaderClassName(member->m_type) << " loader(m_zone, m_stream);") + LINE_START("AddDependency(loader.Load(&" << TypeVarName(info->m_definition) << "->" << member->m_member->m_name) + PrintArrayIndices(modifier); + LINE_END("));") + } + + void LoadSinglePointer_PointerCheck(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) + { + LINE_START("if (") + PrintAccessMember(info, member, modifier); + LINE_END(")") + LINE("{") + m_intendation++; + + if (member->m_type && StructureComputations(member->m_type).IsAsset()) + { + LoadSinglePointer_Asset(info, member, modifier); + } + else + { + if (member->m_is_reusable) + { + LoadSinglePointer_Reuse(info, member, modifier); + } + else + { + LoadSinglePointer_Inner(info, member, modifier); + } + } + + m_intendation--; + LINE("}") + } + + void LoadSinglePointer_String(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const + { + if (member->m_member->m_type_declaration->m_is_const) + { + LINE_START("varXString = &") + PrintAccessMember(info, member, modifier); + LINE_END(";") + } + else + { + LINE_START("varXString = const_cast(&") + PrintAccessMember(info, member, modifier); + LINE_END(");") + } + LINE("LoadXString(false);") } void LoadSinglePointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) { - LINE("// LoadSinglePointer: " << member->m_member->m_name) + const MemberComputations computations(member); + + if (computations.IsNotInDefaultNormalBlock()) + { + LINE("m_stream->PushBlock("<m_fast_file_block->m_name<<");") + } + + if (member->m_is_string) + { + LoadSinglePointer_String(info, member, modifier); + } + else if (member->m_is_script_string) + { + LINE("#error Scriptstring "<m_member->m_name) + } + else + { + LoadSinglePointer_PointerCheck(info, member, modifier); + } + + if (computations.IsNotInDefaultNormalBlock()) + { + LINE("m_stream->PopBlock();") + } } void LoadArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier)