/// <summary> /// IComparable.CompareTo implementation. /// </summary> public int CompareTo(object obj) { if (obj is UnaryScalarOp) { UnaryScalarOp I = (UnaryScalarOp)obj; int opNameComp = m_opName.CompareTo(I.m_opName); if (opNameComp != 0) { return(opNameComp); } else { return(Util.CompareScalarMultivector(this.value, I.value)); } } throw new ArgumentException("UnaryScalarOp.CompareTo(): object is not an UnaryScalarOp"); }
/// <summary> /// Converts a <c>RefGA.Symbolic.UnaryScalarOp</c> to code. /// /// Handles special cases (such as inversion) and understands floating point /// types (e.g., <c>fabsf()</c> is used for floats and <c>fabs()</c> is used for doubles in C. /// </summary> /// <param name="S">Used for output language.</param> /// <param name="FT">Floating point type used.</param> /// <param name="Op">The operation to convert to code.</param> /// <returns>Code for implementing <c>Op</c>c>.</returns> public static string UnaryScalarOpToLangString(G25.Specification S, G25.FloatType FT, RefGA.Symbolic.UnaryScalarOp Op) { string valueStr = ScalarOpValueToLangString(S, FT, Op.value); /*{ * if (!Op.value.IsScalar()) throw new Exception("G25.CG.Shared.BasisBlade.ScalarOpToLangString(): value should be scalar, found: " + Op.value.ToString(S.m_basisVectorNames)); * if (Op.value.IsZero()) valueStr = ScalarToLangString(S, FT, RefGA.BasisBlade.ZERO); * else valueStr = ScalarToLangString(S, FT, Op.value.BasisBlades[0]); * }*/ if (Op.opName == UnaryScalarOp.INVERSE) { if (FT.type == "float") { return("1.0f / (" + valueStr + ")"); } else if (FT.type == "double") { return("1.0 / (" + valueStr + ")"); } else { return(FT.castStr + "1.0 / (" + valueStr + ")"); } } else { return(OpNameToLangString(S, FT, Op.opName) + "(" + valueStr + ")"); } } // end of function ScalarOpToLangString()