2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
7 namespace NT2chCtrl.html.js
\r
9 class JsCmpFunction : JsFunction
\r
11 JsVariant mLhsValue;
\r
12 JsVariant mRhsValue;
\r
15 public JsCmpFunction(int lineNo, int srcIdx, JsToken opToken)
\r
16 : base(lineNo, srcIdx)
\r
20 public override int getPriority()
\r
22 return FUNC_PRIORITY_COMPARE;
\r
25 public override bool rearegeSquence(List<JsVariant> insList, int currIdx)
\r
27 int count = insList.Count;
\r
28 if (count < 3 || count <= (currIdx + 1))
\r
31 mRhsValue = insList[currIdx + 1];
\r
32 mLhsValue = insList[currIdx - 1];
\r
33 insList.RemoveAt(currIdx + 1);
\r
34 insList.RemoveAt(currIdx - 1);
\r
39 public override JsVariant Execute(JsFunctionContext ctx, HtmlElement rootElement)
\r
41 base.Execute(ctx, rootElement);
\r
43 JsVariant lhs = ctx.getParamValue(rootElement, mLhsValue);
\r
44 JsVariant rhs = ctx.getParamValue(rootElement, mRhsValue);
\r
48 case JsToken.KEY_OP_CMP_EQUAL:
\r
49 return cmpEqual(lhs, rhs);
\r
50 case JsToken.KEY_OP_CMP_STRICT_EQUAL:
\r
51 return cmpStrictEqual(lhs, rhs);
\r
52 case JsToken.KEY_OP_CMP_NOT_EQUAL:
\r
53 return cmpNotEqual(lhs, rhs);
\r
54 case JsToken.KEY_OP_CMP_STRICT_NOT_EQUAL:
\r
55 return cmpStrictNotEqual(lhs, rhs);
\r
56 case JsToken.KEY_OP_CMP_LT:
\r
57 case JsToken.KEY_OP_CMP_GT:
\r
58 case JsToken.KEY_OP_CMP_LT_EQUAL:
\r
59 case JsToken.KEY_OP_CMP_GT_EQUAL:
\r
60 return cmpValues(mOpToken, lhs, rhs);
\r
65 private JsVariant cmpValues(JsToken token, JsVariant lhs, JsVariant rhs)
\r
67 JsNumberValue nVal1 = lhs.getNumberValue();
\r
71 JsNumberValue nVal2 = rhs.getNumberValue();
\r
74 double d1 = nVal1.getValue();
\r
75 double d2 = nVal2.getValue();
\r
78 case JsToken.KEY_OP_CMP_LT:
\r
79 return JsBooleanValue.getConstantValue(d1 < d2);
\r
80 case JsToken.KEY_OP_CMP_GT:
\r
81 return JsBooleanValue.getConstantValue(d1 > d2);
\r
82 case JsToken.KEY_OP_CMP_LT_EQUAL:
\r
83 return JsBooleanValue.getConstantValue(d1 <= d2);
\r
84 case JsToken.KEY_OP_CMP_GT_EQUAL:
\r
85 return JsBooleanValue.getConstantValue(d1 >= d2);
\r
90 private JsVariant cmpStrictNotEqual(JsVariant lhs, JsVariant rhs)
\r
92 JsBooleanValue bVal = cmpStrictEqual(lhs, rhs) as JsBooleanValue;
\r
95 if (bVal.getValue())
\r
96 return JsBooleanValue.getFalseValue();
\r
98 return JsBooleanValue.getTrueValue();
\r
103 private JsVariant cmpStrictEqual(JsVariant lhs, JsVariant rhs)
\r
105 JsNumberValue nVal1, nVal2;
\r
106 JsStringValue sVal1, sVal2;
\r
109 if (lhs == null || rhs == null)
\r
112 if (lhs is JsNullValue)
\r
114 return JsBooleanValue.getConstantValue(rhs is JsNullValue);
\r
116 if (rhs is JsNullValue)
\r
118 return JsBooleanValue.getConstantValue(lhs is JsNullValue);
\r
120 if (lhs is JsUndefValue)
\r
122 return JsBooleanValue.getConstantValue(rhs is JsNullValue);
\r
124 if (rhs is JsUndefValue)
\r
126 return JsBooleanValue.getConstantValue(lhs is JsUndefValue);
\r
129 nVal1 = lhs as JsNumberValue;
\r
132 if (!(rhs is JsNumberValue))
\r
133 return JsBooleanValue.getFalseValue();
\r
134 nVal2 = rhs.getNumberValue();
\r
136 return JsBooleanValue.getFalseValue();
\r
137 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());
\r
139 nVal1 = rhs as JsNumberValue;
\r
142 if (!(lhs is JsNumberValue))
\r
143 return JsBooleanValue.getFalseValue();
\r
144 nVal2 = lhs.getNumberValue();
\r
146 return JsBooleanValue.getFalseValue();
\r
147 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());
\r
149 sVal1 = lhs as JsStringValue;
\r
152 if (!(rhs is JsStringValue))
\r
153 return JsBooleanValue.getFalseValue();
\r
154 sVal2 = rhs.getStringValue();
\r
156 return JsBooleanValue.getFalseValue();
\r
157 s1 = sVal1.getValue();
\r
158 s2 = sVal2.getValue();
\r
159 if (s1 == null || s2 == null)
\r
160 return JsBooleanValue.getFalseValue();
\r
161 return JsBooleanValue.getConstantValue(s1.Equals(s2));
\r
163 sVal1 = rhs as JsStringValue;
\r
166 if (!(lhs is JsStringValue))
\r
167 return JsBooleanValue.getFalseValue();
\r
168 sVal2 = lhs.getStringValue();
\r
170 return JsBooleanValue.getFalseValue();
\r
171 s1 = sVal1.getValue();
\r
172 s2 = sVal2.getValue();
\r
173 if (s1 == null || s2 == null)
\r
174 return JsBooleanValue.getFalseValue();
\r
175 return JsBooleanValue.getConstantValue(s1.Equals(s2));
\r
179 private JsVariant cmpNotEqual(JsVariant lhs, JsVariant rhs)
\r
181 JsBooleanValue bVal = cmpEqual(lhs, rhs) as JsBooleanValue;
\r
184 if (bVal.getValue())
\r
185 return JsBooleanValue.getFalseValue();
\r
187 return JsBooleanValue.getTrueValue();
\r
192 private JsVariant cmpEqual(JsVariant lhs, JsVariant rhs)
\r
194 JsNumberValue nVal1, nVal2;
\r
195 JsStringValue sVal1, sVal2;
\r
198 if (lhs == null || rhs == null)
\r
201 if (lhs is JsNullValue || lhs is JsUndefValue)
\r
203 if (rhs is JsNullValue || rhs is JsUndefValue)
\r
204 return JsBooleanValue.getTrueValue();
\r
205 if (rhs is JsNumberValue)
\r
207 double d = ((JsNumberValue)rhs).getValue();
\r
208 return JsBooleanValue.getConstantValue(d == 0);
\r
210 return JsBooleanValue.getFalseValue();
\r
212 if (rhs is JsNullValue || rhs is JsUndefValue)
\r
214 if (lhs is JsNullValue || lhs is JsUndefValue)
\r
215 return JsBooleanValue.getTrueValue();
\r
216 if (lhs is JsNumberValue)
\r
218 double d = ((JsNumberValue)lhs).getValue();
\r
219 return JsBooleanValue.getConstantValue(d == 0);
\r
221 return JsBooleanValue.getFalseValue();
\r
224 nVal1 = lhs as JsNumberValue;
\r
227 nVal2 = rhs.getNumberValue();
\r
229 return JsBooleanValue.getFalseValue();
\r
230 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());
\r
232 nVal1 = rhs as JsNumberValue;
\r
235 nVal2 = lhs.getNumberValue();
\r
237 return JsBooleanValue.getFalseValue();
\r
238 return JsBooleanValue.getConstantValue(nVal1.getValue() == nVal2.getValue());
\r
240 sVal1 = lhs as JsStringValue;
\r
243 sVal2 = rhs.getStringValue();
\r
245 return JsBooleanValue.getFalseValue();
\r
246 s1 = sVal1.getValue();
\r
247 s2 = sVal2.getValue();
\r
248 if (s1 == null || s2 == null)
\r
249 return JsBooleanValue.getFalseValue();
\r
250 return JsBooleanValue.getConstantValue(s1.Equals(s2));
\r
252 sVal1 = rhs as JsStringValue;
\r
255 sVal2 = lhs.getStringValue();
\r
257 return JsBooleanValue.getFalseValue();
\r
258 s1 = sVal1.getValue();
\r
259 s2 = sVal2.getValue();
\r
260 if (s1 == null || s2 == null)
\r
261 return JsBooleanValue.getFalseValue();
\r
262 return JsBooleanValue.getConstantValue(s1.Equals(s2));
\r