[mcs] Reset also all partial parts current-type
[mono-project.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.Analysis.Numerical / ConstantEvaluatorVisitor.cs
blob97ced323ea17fa19456178e1eba087684f22b1e9
1 //
2 // ConstantEvaluatorVisitor.cs
3 //
4 // Authors:
5 // Alexander Chebaturkin (chebaturkin@gmail.com)
6 //
7 // Copyright (C) 2012 Alexander Chebaturkin
8 //
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:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
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.
29 using System;
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)
42 try {
43 switch (o) {
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);