private static void WriteConvertingConstructor(StringBuilder SB, Specification S, G25.CG.Shared.CGdata cgd, FloatType FT, G25.fgs fgs, SMV srcSmv, SMV dstSmv) { string srcTypeName = FT.GetMangledName(S, srcSmv.GetName()); string dstTypeName = FT.GetMangledName(S, dstSmv.GetName()); string argName = "x"; Comment comment = new Comment("Converting constructor, from " + srcTypeName + " to " + dstTypeName); comment.Write(SB, S, 1); SB.AppendLine("\tpublic " + dstTypeName + "(" + srcTypeName + " " + argName + ") {"); int nbTabs = 2; bool declareVariable = false; bool cast = false; bool srcPtr = false; bool dstPtr = false; RefGA.Multivector value = Symbolic.SMVtoSymbolicMultivector(S, srcSmv, argName, srcPtr); AssignInstruction AI = new AssignInstruction(nbTabs, dstSmv, FT, cast, value, SmvUtil.THIS, dstPtr, declareVariable); AI.Write(SB, S, cgd); SB.AppendLine("\t}"); }
/// <summary> /// Constructs a new FuncArgInfo class for a specific argument 'argIdx' of function 'F'. /// </summary> /// <param name="S">Used for retrieving the G25.VariableType of 'm_typeName'.</param> /// <param name="F">Function for which this FuncArgInfo describes an argument.</param> /// <param name="argIdx">Index of argument. Use -1 for artificial 'return argument' used for the C language.</param> /// <param name="FT">Floating point type of the type of the argument.</param> /// <param name="defaultTypeName">Name of the type of the argument.</param> /// <param name="computeMultivectorValue">Set to true to convert the type into symbolic code. Uses 'F' to obtain the actual name of the variable to use inside the symbolic multivector.</param> public FuncArgInfo(G25.Specification S, G25.fgs F, int argIdx, G25.FloatType FT, string defaultTypeName, bool computeMultivectorValue) { m_mvInterface = true; m_name = F.GetArgumentName(argIdx); m_typeName = F.GetArgumentTypeName(argIdx, defaultTypeName); m_type = S.GetType(m_typeName); m_varType = m_type.GetVariableType(); if (m_varType != VARIABLE_TYPE.FLOAT) { m_floatType = FT; } else { m_floatType = S.GetFloatType(m_typeName); } // set mangled type name (depends on whether type is scalar or not) if ((m_varType == VARIABLE_TYPE.FLOAT) || (m_varType == VARIABLE_TYPE.ENUM)) { m_mangledTypeName = m_typeName; } else { m_mangledTypeName = FT.GetMangledName(S, m_typeName); // temp (currently disabled) test for C# and Java // if (S.OutputCSharpOrJava() && (m_varType == VARIABLE_TYPE.GMV)) // m_mangledTypeName = m_mangledTypeName + G25.CG.Shared.Main.IF_SUFFIX; } // set pointer / non pointer flag m_pointer = F.GetArgumentPtr(S, argIdx); // set array flag m_array = F.GetArgumentArr(S, argIdx); m_constant = (argIdx >= 0); if (computeMultivectorValue) { if (m_varType == VARIABLE_TYPE.SMV) { m_multivectorValue = new RefGA.Multivector[1] { Symbolic.SMVtoSymbolicMultivector(S, (G25.SMV)m_type, m_name, m_pointer) }; } else if (m_varType == VARIABLE_TYPE.GMV) { m_multivectorValue = Symbolic.GMVtoSymbolicMultivector(S, (G25.GMV)m_type, m_name, m_pointer, -1); // -1 = sym mv for all groups } else if (m_varType == VARIABLE_TYPE.FLOAT) { m_multivectorValue = new RefGA.Multivector[1] { Symbolic.ScalarToSymbolicMultivector(S, (G25.FloatType)m_type, m_name) } } ; else { // OM: do nothing? m_multivectorValue = null; } } }