示例#1
0
 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);
     }));
 }
示例#2
0
        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));
                }
            }));
        }
示例#3
0
        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));
                }
            }));
        }
示例#4
0
        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));
                }