Esempio n. 1
0
        } // end of WriteGMVigpFunction

        /// <summary>
        /// Writes any norm function for general multivectors, based on gp parts code.
        /// </summary>
        /// <param name="SB"></param>
        /// <param name="S"></param>
        /// <param name="cgd"></param>
        /// <param name="FT"></param>
        /// <param name="M"></param>
        /// <param name="FAI"></param>
        /// <param name="F"></param>
        /// <param name="comment"></param>
        /// <param name="declOnly"></param>
        /// <param name="squared"></param>
        /// <returns>name of generated function.</returns>
        public static string WriteGMVnormFunction(Specification S, G25.CG.Shared.CGdata cgd, FloatType FT, G25.Metric M,
                                                  G25.CG.Shared.FuncArgInfo[] FAI, G25.fgs F,
                                                  Comment comment, bool squared)
        {
            // setup instructions
            System.Collections.Generic.List <G25.CG.Shared.Instruction> I = new System.Collections.Generic.List <G25.CG.Shared.Instruction>();
            int nbTabs = 1;

            // because of lack of overloading, function names include names of argument types
            G25.fgs CF = G25.CG.Shared.Util.AppendTypenameToFuncName(S, FT, F, FAI);

            string funcName = CF.OutputName;

            // get return info
            G25.SMV returnType     = null;
            string  returnTypeName = null;

            G25.CG.Shared.FuncArgInfo returnArgument = null;
            { // try to get scalar type
                returnType = S.GetScalarSMV();
                if (returnType == null)
                {
                    returnTypeName = FT.type;
                }
                else
                {
                    if (S.OutputC())
                    {
                        returnArgument = new G25.CG.Shared.FuncArgInfo(S, CF, -1, FT, returnType.Name, false); // false = compute value
                    }
                    returnTypeName = FT.GetMangledName(S, returnType.GetName());
                }
            }

            // write this function:
            string code = G25.CG.Shared.GPparts.GetNormCode(S, cgd, FT, M, squared, FAI, returnType, G25.fgs.RETURN_ARG_NAME);

            // add the verbatim code
            I.Add(new G25.CG.Shared.VerbatimCodeInstruction(nbTabs, code));

            // write function
            bool inline     = false; // never inline GMV functions
            bool staticFunc = Functions.OutputStaticFunctions(S);

            G25.CG.Shared.Functions.WriteFunction(S, cgd, F, inline, staticFunc, returnTypeName, funcName, returnArgument, FAI, I, comment);

            return(funcName);
        } // end of WriteGMVnormFunction
Esempio n. 2
0
        /// <summary>
        /// Determines whether this fgs is a converter for destination 'type'/'FT'.
        /// </summary>
        public bool IsConverterDestination(Specification S, G25.SMV smv, FloatType FT)
        {
            if (!IsConverter(S))
            {
                return(false);
            }

            if (!Name.Equals("_" + smv.GetName()))
            {
                return(false);
            }
            foreach (string floatName in FloatNames)
            {
                if (floatName.Equals(FT.type))
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 3
0
        /// <summary>
        /// Determines whether this fgs is a converter with source 'type'/'FT'.
        /// </summary>
        public bool IsConverterSource(Specification S, G25.SMV smv, FloatType FT)
        {
            if (!IsConverter(S))
            {
                return(false);
            }

            if (!ArgumentTypeNames[0].Equals(smv.GetName()))
            {
                return(false);
            }
            foreach (string floatName in FloatNames)
            {
                if (floatName.Equals(FT.type))
                {
                    return(true);
                }
            }
            return(false);
        }