2 // ConstantEvaluatorVisitor.cs
5 // Alexander Chebaturkin (chebaturkin@gmail.com)
7 // Copyright (C) 2012 Alexander Chebaturkin
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using Mono
.CodeContracts
.Static
.DataStructures
;
33 namespace Mono
.CodeContracts
.Static
.Analysis
.Numerical
{
34 abstract class ConstantEvaluatorVisitor
<In
, Out
> {
35 protected virtual bool Default (out Out result
)
37 return false.Without (out result
);
40 protected bool VisitBinary (ExpressionOperator o
, In left
, In right
, out Out result
)
44 case ExpressionOperator
.And
:
45 return VisitAnd (left
, right
, out result
);
46 case ExpressionOperator
.Or
:
47 return VisitOr (left
, right
, out result
);
48 case ExpressionOperator
.Xor
:
49 return VisitXor (left
, right
, out result
);
50 case ExpressionOperator
.LogicalAnd
:
51 return VisitLogicalAnd (left
, right
, out result
);
52 case ExpressionOperator
.LogicalOr
:
53 return VisitLogicalOr (left
, right
, out result
);
54 case ExpressionOperator
.Equal
:
55 case ExpressionOperator
.Equal_Obj
:
56 return VisitEqual (left
, right
, out result
);
57 case ExpressionOperator
.NotEqual
:
58 return VisitNotEqual (left
, right
, out result
);
59 case ExpressionOperator
.LessThan
:
60 return VisitLessThan (left
, right
, out result
);
61 case ExpressionOperator
.LessEqualThan
:
62 return VisitLessEqualThan (left
, right
, out result
);
63 case ExpressionOperator
.GreaterThan
:
64 return VisitGreaterThan (left
, right
, out result
);
65 case ExpressionOperator
.GreaterEqualThan
:
66 return VisitGreaterEqualThan (left
, right
, out result
);
67 case ExpressionOperator
.Add
:
68 return VisitAdd (left
, right
, out result
);
69 case ExpressionOperator
.Sub
:
70 return VisitSub (left
, right
, out result
);
71 case ExpressionOperator
.Mult
:
72 return VisitMult (left
, right
, out result
);
73 case ExpressionOperator
.Div
:
74 return VisitDiv (left
, right
, out result
);
75 case ExpressionOperator
.Mod
:
76 return VisitMod (left
, right
, out result
);
77 case ExpressionOperator
.Unknown
:
78 return VisitUnknown (left
, out result
);
80 throw new ArgumentOutOfRangeException ("not implemented");
82 catch (ArithmeticException
) {
83 return false.Without (out result
);
87 protected virtual bool VisitMod (In left
, In right
, out Out result
)
89 return Default (out result
);
92 protected virtual bool VisitDiv (In left
, In right
, out Out result
)
94 return Default (out result
);
97 protected virtual bool VisitMult (In left
, In right
, out Out result
)
99 return Default (out result
);
102 protected virtual bool VisitSub (In left
, In right
, out Out result
)
104 return Default (out result
);
107 protected virtual bool VisitGreaterEqualThan (In left
, In right
, out Out result
)
109 return Default (out result
);
112 protected virtual bool VisitGreaterThan (In left
, In right
, out Out result
)
114 return Default (out result
);
117 protected virtual bool VisitLessEqualThan (In left
, In right
, out Out result
)
119 return Default (out result
);
122 protected virtual bool VisitLessThan (In left
, In right
, out Out result
)
124 return Default (out result
);
127 protected virtual bool VisitNotEqual (In left
, In right
, out Out result
)
129 return Default (out result
);
132 protected virtual bool VisitEqual (In left
, In right
, out Out result
)
134 return Default (out result
);
137 protected virtual bool VisitLogicalOr (In left
, In right
, out Out result
)
139 return Default (out result
);
142 protected virtual bool VisitLogicalAnd (In left
, In right
, out Out result
)
144 return Default (out result
);
147 protected virtual bool VisitXor (In left
, In right
, out Out result
)
149 return Default (out result
);
152 protected virtual bool VisitOr (In left
, In right
, out Out result
)
154 return Default (out result
);
157 protected virtual bool VisitAnd (In left
, In right
, out Out result
)
159 return Default (out result
);
162 protected virtual bool VisitAdd (In left
, In right
, out Out result
)
164 return Default (out result
);
167 protected virtual bool VisitUnknown (In left
, out Out result
)
169 return Default (out result
);