Wrap always_inline and noinline attributes in compiler checks and use MSVC equivalent.
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / ConditionRelationalExpression.cs
1 //
2 // ConditionRelationalExpression.cs
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 // 
7 // (C) 2006 Marek Sieradzki
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 #if NET_2_0
29
30 using System;
31 using System.Collections;
32 using System.Xml;
33
34 namespace Microsoft.Build.BuildEngine {
35         internal sealed class ConditionRelationalExpression : ConditionExpression {
36         
37                 readonly ConditionExpression left;
38                 readonly ConditionExpression right;
39                 readonly RelationOperator op;
40                 
41                 public ConditionRelationalExpression (ConditionExpression left,
42                                                       ConditionExpression right,
43                                                       RelationOperator op)
44                 {
45                         this.left = left;
46                         this.right = right;
47                         this.op = op;
48                 }
49                 
50                 public override  bool BoolEvaluate (Project context)
51                 {
52                         if (left.CanEvaluateToNumber (context) && right.CanEvaluateToNumber (context)) {
53                                 float l,r;
54                                 
55                                 l = left.NumberEvaluate (context);
56                                 r = right.NumberEvaluate (context);
57                                 
58                                 return NumberCompare (l, r, op);
59                         } else if (left.CanEvaluateToBool (context) && right.CanEvaluateToBool (context)) {
60                                 bool l,r;
61                                 
62                                 l = left.BoolEvaluate (context);
63                                 r = right.BoolEvaluate (context);
64                                 
65                                 return BoolCompare (l, r, op);
66                         } else {
67                                 string l,r;
68                                 
69                                 l = left.StringEvaluate (context);
70                                 r = right.StringEvaluate (context);
71                                 
72                                 return StringCompare (l, r, op);
73                         }
74                 }
75                 
76                 public override float NumberEvaluate (Project context)
77                 {
78                         throw new NotSupportedException ();
79                 }
80                 
81                 public override string StringEvaluate (Project context)
82                 {
83                         throw new NotSupportedException ();
84                 }
85                 
86                 // FIXME: check if we really can do it
87                 public override bool CanEvaluateToBool (Project context)
88                 {
89                         return true;
90                 }
91                 
92                 public override bool CanEvaluateToNumber (Project context)
93                 {
94                         return false;
95                 }
96                 
97                 public override bool CanEvaluateToString (Project context)
98                 {
99                         return false;
100                 }
101                 
102                 static bool NumberCompare (float l,
103                                            float r,
104                                            RelationOperator op)
105                 {
106                         IComparer comparer = CaseInsensitiveComparer.DefaultInvariant;
107                         
108                         switch (op) {
109                         case RelationOperator.Equal:
110                                 return comparer.Compare (l, r) == 0;
111                         case RelationOperator.NotEqual:
112                                 return comparer.Compare (l, r) != 0;
113                         case RelationOperator.Greater:
114                                 return comparer.Compare (l, r) > 0;
115                         case RelationOperator.GreaterOrEqual:
116                                 return comparer.Compare (l, r) >= 0;
117                         case RelationOperator.Less:
118                                 return comparer.Compare (l, r) < 0;
119                         case RelationOperator.LessOrEqual:
120                                 return comparer.Compare (l, r) <= 0;
121                         default:
122                                 throw new NotSupportedException (String.Format ("Relational operator {0} is not supported.", op));
123                         }
124                 }
125
126                 static bool BoolCompare (bool l,
127                                          bool r,
128                                          RelationOperator op)
129                 {
130                         IComparer comparer = CaseInsensitiveComparer.DefaultInvariant;
131                         
132                         switch (op) {
133                         case RelationOperator.Equal:
134                                 return comparer.Compare (l, r) == 0;
135                         case RelationOperator.NotEqual:
136                                 return comparer.Compare (l, r) != 0;
137                         default:
138                                 throw new NotSupportedException (String.Format ("Relational operator {0} is not supported.", op));
139                         }
140                 }
141
142                 static bool StringCompare (string l,
143                                            string r,
144                                            RelationOperator op)
145                 {
146                         IComparer comparer = CaseInsensitiveComparer.DefaultInvariant;
147                         
148                         switch (op) {
149                         case RelationOperator.Equal:
150                                 return comparer.Compare (l, r) == 0;
151                         case RelationOperator.NotEqual:
152                                 return comparer.Compare (l, r) != 0;
153                         default:
154                                 throw new NotSupportedException (String.Format ("Relational operator {0} is not supported.", op));
155                         }
156                 }
157         }
158         
159         internal enum RelationOperator {
160                 Equal,
161                 NotEqual,
162                 Less,
163                 Greater,
164                 LessOrEqual,
165                 GreaterOrEqual
166         }
167 }
168
169 #endif