delimiters "$", "$" // Everything related to loading a pointer with a count that can be larger than 1 LoadArrayPointer_Loading(context, structure, member, reference) ::= << $if(member.Computations.IsTempBlock)$ $member.Member.VariableType.Type.FullName$* ptr = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$; $endif$$\\$ $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$)); $\\$ // $member.Member.VariableType.Type.Alignment$$\\$ $\\$ $\\$ $if(member.Computations.IsTempBlock)$ $member.Member.VariableType.Type.FullName$** toInsert = nullptr; if(ptr == PTR_INSERT) toInsert = m_stream->InsertPointer<$member.Member.VariableType.Type.FullName$>(); $endif$$\\$ $\\$ $\\$ $if(member.StructureType && !member.StructureType.IsLeaf && !member.Computations.IsRuntimeBlock)$ $TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$; LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$);$\\$ $else$ m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$);$\\$ $endif$$\\$ $\\$ $if(member.Computations.IsTempBlock)$ if(toInsert != nullptr) *toInsert = $TypeVarName(structure.Type)$->$member.Member.Name$;$\\$ $endif$ >> LoadArrayPointer_ScriptString(context, structure, member, reference) ::= <% $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$)); // $member.Member.VariableType.Type.Alignment$ $\n$ varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$ LoadScriptStringArray(true, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$); %> LoadArrayPointer_TypeCheck(context, structure, member, reference) ::= <% $if(member.IsScriptString)$ $LoadArrayPointer_ScriptString(context, structure, member, reference)$ $else$ $LoadArrayPointer_Loading(context, structure, member, reference)$ $endif$ %> LoadArrayPointer_Reuse(context, structure, member, reference) ::= << $if(member.Computations.IsTempBlock)$ if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING || $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_INSERT) { $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ } else { $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToAlias($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); }$\\$ $else$ if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING) { $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ } else { $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); }$\\$ $endif$ >> LoadArrayPointer_PointerCheck(context, structure, member, reference) ::= << if ($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$) { $if(member.IsReusable)$ $LoadArrayPointer_Reuse(context, structure, member, reference)$ $else$ $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ $endif$ } >> LoadArrayPointer_Block(context, structure, member, reference) ::= <% $if(member.Computations.IsNotDefaultNormalBlock)$ m_stream->PushBlock($member.Block.Name$);$\n$ $endif$ $LoadArrayPointer_PointerCheck(context, structure, member, reference)$ $if(member.Computations.IsNotDefaultNormalBlock)$ $\n$m_stream->PopBlock(); $endif$ %> LoadArrayPointer(context, structure, member, reference) ::= <% $LoadArrayPointer_Block(context, structure, member, reference)$ %> LoadPointerArrayMethod_Loading(context, type, structure) ::= <% *$TypePtrVarName(type)$ = m_stream->Alloc<$type.FullName$>(alignof($type.FullName$)); // $type.Alignment$ $\n$ $if(structure && !structure.IsLeaf)$ $TypeVarName(structure.Type)$ = *$TypePtrVarName(type)$;$\n$ Load_$type.Name$(true); $else$ m_stream->Load<$type.FullName$>(*$TypePtrVarName(type)$); $endif$ %> LoadPointerArrayMethod_Asset(context, type, structure) ::= << $LoaderClassName(structure)$ loader(m_script_string_provider, m_zone, m_stream); AddDependency(loader.Load($TypePtrVarName(type)$)); >> LoadPointerArrayMethod_PointerCheck(context, type, structure, reusable) ::= << if (*$TypePtrVarName(type)$) { $if(structure && structure.IsAsset)$ $LoadPointerArrayMethod_Asset(context, type, structure)$ $else$ $if(reusable)$ if(*$TypePtrVarName(type)$ == PTR_FOLLOWING) { $LoadPointerArrayMethod_Loading(context, type, structure)$ } else { *$TypePtrVarName(type)$ = m_stream->ConvertOffsetToPointer(*$TypePtrVarName(type)$); } $else$ $LoadPointerArrayMethod_Loading(context, type, structure)$ $endif$ $endif$ } >> LoadPointerArrayMethod(context, type, structure, reusable) ::= << void $LoaderClassName(context.Asset)$::LoadPtrArray_$SafeTypeName(type)$(const bool atStreamStart, const size_t count) { assert($TypePtrVarName(type)$ != nullptr); if(atStreamStart) m_stream->Load<$type.FullName$*>($TypePtrVarName(type)$, count); $type.FullName$** var = $TypePtrVarName(type)$; for(size_t index = 0; index < count; index++) { $TypePtrVarName(type)$ = var; $LoadPointerArrayMethod_PointerCheck(context, type, structure, reusable)$ var++; } } >>