// ............................ public override bool Compare(Operator op, double a, object b, out bool result) { result = false; double bDouble; if (!StoryVar.TryConvertTo <double>(b, out bDouble)) { return(false); } switch (op) { case Operator.Equals: result = a == bDouble; break; case Operator.GreaterThan: result = a > bDouble; break; case Operator.GreaterThanOrEquals: result = a >= bDouble; break; case Operator.LessThan: result = a < bDouble; break; case Operator.LessThanOrEquals: result = a <= bDouble; break; default: return(false); // comparison not possible } return(true); }
public override bool Combine(Operator op, bool a, object b, out StoryVar result) { result = default(StoryVar); if (op == Operator.LogicalAnd || op == Operator.LogicalOr) { bool bBool; if (!StoryVar.TryConvertTo <bool>(b, out bBool)) { return(false); } switch (op) { case Operator.LogicalAnd: result = a && bBool; break; case Operator.LogicalOr: result = a || bBool; break; default: break; } return(true); } double aDouble; return(ConvertTo <double>(a, out aDouble) && StoryVar.GetTypeService <double>(true).Combine(op, aDouble, b, out result)); }
// ............................ public override bool Compare(Operator op, string a, object b, out bool result) { result = false; // Logical operators, treat as bool if (op == Operator.LogicalAnd || op == Operator.LogicalOr) { bool aBool; return(ConvertTo <bool>(a, out aBool) && StoryVar.GetTypeService <bool>(true).Compare(op, aBool, b, out result)); } // Try numeric comparison (in strict mode this won't work) double aDouble; if (ConvertTo <double>(a, out aDouble) && StoryVar.GetTypeService <double>(true).Compare(op, aDouble, b, out result)) { return(true); } string bString; if (!StoryVar.TryConvertTo <string>(b, out bString)) { return(false); } switch (op) { case Operator.Equals: result = a == bString; break; case Operator.GreaterThan: result = String.Compare(a, bString) > 0; break; case Operator.GreaterThanOrEquals: result = String.Compare(a, bString) >= 0; break; case Operator.LessThan: result = String.Compare(a, bString) < 0; break; case Operator.LessThanOrEquals: result = String.Compare(a, bString) <= 0; break; case Operator.Contains: result = a.Contains(bString); break; default: return(false); } return(true); }
public override bool Combine(Operator op, double a, object b, out StoryVar result) { result = default(StoryVar); // Logical operators, treat as bool if (op == Operator.LogicalAnd || op == Operator.LogicalOr) { bool aBool; return(ConvertTo <bool>(a, out aBool) && StoryVar.GetTypeService <bool>(true).Combine(op, aBool, b, out result)); } double bDouble; if (!StoryVar.TryConvertTo <double>(b, out bDouble)) { return(false); } switch (op) { case Operator.Add: result = a + bDouble; break; case Operator.Subtract: result = a - bDouble; break; case Operator.Multiply: result = a * bDouble; break; case Operator.Divide: result = a / bDouble; break; case Operator.Modulo: result = a % bDouble; break; default: return(false); // combination not possible } return(true); }
public override StoryVar GetMember(string container, StoryVar member) { string containerString = (string)container; StoryVar value; int pos; if (StoryVar.TryConvertTo <int>(member, out pos)) { value = containerString[pos]; } else if (member.ToString() == "length") { value = containerString.Length; } else { value = default(StoryVar); } return(value); }
// ............................ public override bool Compare(Operator op, bool a, object b, out bool result) { result = false; if (op == Operator.Equals) { // Equaliy, evaluate as bools bool bBool; if (!StoryVar.TryConvertTo <bool>(b, out bBool)) { return(false); } result = a == bBool; return(true); } else { // Evaluate as numbers for other operators double aDouble; return(ConvertTo <double>(a, out aDouble) && StoryVar.GetTypeService <double>(true).Compare(op, aDouble, b, out result)); } }