Merge remote-tracking branch 'joncham/sgen-msvc2'
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.Analysis.Numerical / ExpressionOperator.cs
1 // 
2 // ExpressionOperator.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.
27 //
28
29 using System.Collections.Generic;
30
31 namespace Mono.CodeContracts.Static.Analysis.Numerical {
32         public enum ExpressionOperator {
33                 Constant,
34                 Variable,
35                 Not,
36                 And,
37                 Or,
38                 Xor,
39                 LogicalAnd,
40                 LogicalOr,
41                 LogicalNot,
42                 Equal,
43                 Equal_Obj,
44                 NotEqual,
45                 LessThan,
46                 LessEqualThan,
47                 GreaterThan,
48                 GreaterEqualThan,
49                 Add,
50                 Sub,
51                 Mult,
52                 Div,
53                 Mod,
54                 UnaryMinus,
55                 SizeOf,
56                 Unknown,
57
58                 ConvertToInt32
59         }
60
61         static class ExpressionOperatorExtensions {
62                 static readonly HashSet<ExpressionOperator> relationalOperators = new HashSet<ExpressionOperator> ();
63
64                 static ExpressionOperatorExtensions ()
65                 {
66                         relationalOperators.Add (ExpressionOperator.LessThan);
67                         relationalOperators.Add (ExpressionOperator.LessEqualThan);
68                         relationalOperators.Add (ExpressionOperator.GreaterThan);
69                         relationalOperators.Add (ExpressionOperator.GreaterEqualThan);
70                         relationalOperators.Add (ExpressionOperator.Equal);
71                         relationalOperators.Add (ExpressionOperator.Equal_Obj);
72                         relationalOperators.Add (ExpressionOperator.NotEqual);
73                 }
74
75                 public static bool IsUnary (this ExpressionOperator op)
76                 {
77                         return op == ExpressionOperator.UnaryMinus || op == ExpressionOperator.Not;
78                 }
79
80                 public static bool IsZerary (this ExpressionOperator op)
81                 {
82                         return op == ExpressionOperator.Constant || op == ExpressionOperator.Variable;
83                 }
84
85                 public static bool IsBinary (this ExpressionOperator op)
86                 {
87                         return !op.IsUnary () && !op.IsZerary ();
88                 }
89
90                 public static bool IsGreaterThan (this ExpressionOperator op)
91                 {
92                         return op == ExpressionOperator.GreaterThan;
93                 }
94
95                 public static bool IsGreaterEqualThan (this ExpressionOperator op)
96                 {
97                         return op == ExpressionOperator.GreaterEqualThan;
98                 }
99
100                 public static bool IsLessThan (this ExpressionOperator op)
101                 {
102                         return op == ExpressionOperator.LessThan;
103                 }
104
105                 public static bool IsLessEqualThan (this ExpressionOperator op)
106                 {
107                         return op == ExpressionOperator.LessEqualThan;
108                 }
109
110                 public static bool IsRelational (this ExpressionOperator op)
111                 {
112                         return relationalOperators.Contains (op);
113                 }
114         }
115 }