public ImmutableHashSet <object> VisitZenComparisonExpr <T>(ZenComparisonExpr <T> expression, Unit parameter) { return(LookupOrCompute(expression, () => { var x = expression.Expr1.Accept(this, parameter); var y = expression.Expr2.Accept(this, parameter); this.Combine(x, y); return x.Union(y); })); }
public Expression VisitZenComparisonExpr <T>(ZenComparisonExpr <T> expression, ExpressionConverterEnvironment parameter) { return(LookupOrCompute(expression, () => { switch (expression.ComparisonType) { case ComparisonType.Geq: if (ReflectionUtilities.IsFixedIntegerType(typeof(T))) { return Expression.Call( expression.Expr1.Accept(this, parameter), typeof(T).GetMethodCached("GreaterThanOrEqual"), expression.Expr2.Accept(this, parameter)); } return Expression.GreaterThanOrEqual( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); case ComparisonType.Leq: if (ReflectionUtilities.IsFixedIntegerType(typeof(T))) { return Expression.Call( expression.Expr1.Accept(this, parameter), typeof(T).GetMethodCached("LessThanOrEqual"), expression.Expr2.Accept(this, parameter)); } return Expression.LessThanOrEqual( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); default: if (ReflectionUtilities.IsFixedIntegerType(typeof(T))) { return Expression.Call( expression.Expr1.Accept(this, parameter), typeof(T).GetMethod("Equals", new Type[] { typeof(object) }), expression.Expr2.Accept(this, parameter)); } return Expression.Equal( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); } })); }
public Expression VisitZenComparisonExpr <T>(ZenComparisonExpr <T> expression, ExpressionConverterEnvironment parameter) { return(LookupOrCompute(expression, () => { switch (expression.ComparisonType) { case ComparisonType.Geq: return Expression.GreaterThanOrEqual( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); case ComparisonType.Leq: return Expression.LessThanOrEqual( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); default: return Expression.Equal( expression.Expr1.Accept(this, parameter), expression.Expr2.Accept(this, parameter)); } })); }
public SymbolicValue <TModel, TVar, TBool, TInt, TString> VisitZenComparisonExpr <T1>(ZenComparisonExpr <T1> expression, SymbolicEvaluationEnvironment <TModel, TVar, TBool, TInt, TString> parameter) { return(LookupOrCompute(expression, () => { switch (expression.ComparisonType) { case ComparisonType.Geq: case ComparisonType.Leq: var v1 = (SymbolicInteger <TModel, TVar, TBool, TInt, TString>)expression.Expr1.Accept(this, parameter); var v2 = (SymbolicInteger <TModel, TVar, TBool, TInt, TString>)expression.Expr2.Accept(this, parameter); var result = ReflectionUtilities.IsUnsignedIntegerType(typeof(T1)) ? (expression.ComparisonType == ComparisonType.Geq ? this.Solver.GreaterThanOrEqual(v1.Value, v2.Value) : this.Solver.LessThanOrEqual(v1.Value, v2.Value)) : (expression.ComparisonType == ComparisonType.Geq ? this.Solver.GreaterThanOrEqualSigned(v1.Value, v2.Value) : this.Solver.LessThanOrEqualSigned(v1.Value, v2.Value)); return new SymbolicBool <TModel, TVar, TBool, TInt, TString>(this.Solver, result); default: var e1 = expression.Expr1.Accept(this, parameter); var e2 = expression.Expr2.Accept(this, parameter); if (e1 is SymbolicBool <TModel, TVar, TBool, TInt, TString> b1 && e2 is SymbolicBool <TModel, TVar, TBool, TInt, TString> b2) { return new SymbolicBool <TModel, TVar, TBool, TInt, TString>(this.Solver, this.Solver.Iff(b1.Value, b2.Value)); } if (e1 is SymbolicString <TModel, TVar, TBool, TInt, TString> s1 && e2 is SymbolicString <TModel, TVar, TBool, TInt, TString> s2) { return new SymbolicBool <TModel, TVar, TBool, TInt, TString>(this.Solver, this.Solver.Eq(s1.Value, s2.Value)); } var i1 = (SymbolicInteger <TModel, TVar, TBool, TInt, TString>)e1; var i2 = (SymbolicInteger <TModel, TVar, TBool, TInt, TString>)e2; return new SymbolicBool <TModel, TVar, TBool, TInt, TString>(this.Solver, this.Solver.Eq(i1.Value, i2.Value)); }