private string GenerateNorm2Code() { if (ClassData.ClassId == 0) { return("return " + GMacLanguage.ScalarZero + ";"); } //var macroGen = new GMacMacroCodeGenerator(LibraryComposer, CurrentFrame.Macro(DefaultMacro.MetricUnary.NormSquared)); var macroGen = CreateMacroCodeGenerator(DefaultMacro.MetricUnary.NormSquared); macroGen.ActionSetMacroParametersBindings = macroBinding => { macroBinding.BindToVariables(macroBinding.BaseMacro.OutputParameterValueAccess); macroBinding.BindMultivectorPartToVariables("mv", ClassData.ClassBasisBladeIds); }; macroGen.ActionSetTargetVariablesNames = targetNaming => { //This line is actually not needed because we will override the macro output assignment code //using the ActionBeforeGenerateSingleComputation member delegate targetNaming.SetScalarParameter(targetNaming.BaseMacro.OutputParameterValueAccess, "result"); targetNaming.SetMultivectorParameters("mv", b => b.GradeIndexName); //targetNaming.SetTempVariables(index => "tempVar" + index.ToString("X4") + ""); MvLibraryGenerator.SetTargetTempVariablesNames(targetNaming); }; macroGen.ActionBeforeGenerateSingleComputation = (composer, codeInfo) => { if (!codeInfo.ComputedVariable.IsOutput) { return; } composer .AddEmptyLine() .Add(SyntaxFactory.ReturnValue(codeInfo.RhsExpressionCode)) .AddEmptyLine(); codeInfo.EnableCodeGeneration = false; }; return(macroGen.Generate()); }
protected override void SetTargetVariablesNames(GMacTargetVariablesNaming targetNaming) { //Set names of output parameter components var outputParam = targetNaming.BaseMacro.OutputParameterValueAccess; if (outputParam.GMacType.IsValidMultivectorType) { targetNaming.SetMultivectorParameters(outputParam, b => "result." + b.GradeIndexName); } else { targetNaming.SetScalarParameter(outputParam, "result"); } //Set names for input parameters components targetNaming.SetMultivectorParameters("mv1", b => b.GradeIndexName); targetNaming.SetMultivectorParameters("mv2", b => "mv." + b.GradeIndexName); //Set names for temp variables MvLibraryGenerator.SetTargetTempVariablesNames(targetNaming); }