Math.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. //
  2. // Math.cs
  3. //
  4. // (C) 2008 Mainsoft, Inc. (http://www.mainsoft.com)
  5. // (C) 2008 db4objects, Inc. (http://www.db4o.com)
  6. //
  7. // Permission is hereby granted, free of charge, to any person obtaining
  8. // a copy of this software and associated documentation files (the
  9. // "Software"), to deal in the Software without restriction, including
  10. // without limitation the rights to use, copy, modify, merge, publish,
  11. // distribute, sublicense, and/or sell copies of the Software, and to
  12. // permit persons to whom the Software is furnished to do so, subject to
  13. // the following conditions:
  14. //
  15. // The above copyright notice and this permission notice shall be
  16. // included in all copies or substantial portions of the Software.
  17. //
  18. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  19. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  21. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  22. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  23. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  24. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25. //
  26. using System;
  27. using System.Globalization;
  28. using System.Linq.Expressions;
  29. namespace System.Linq.jvm {
  30. class Math {
  31. public static object Evaluate (object a, object b, Type t, ExpressionType et)
  32. {
  33. TypeCode tc = Type.GetTypeCode (t);
  34. if (tc == TypeCode.Object) {
  35. if (!t.IsNullable ()) {
  36. throw new NotImplementedException (
  37. string.Format (
  38. "Expression with Node type {0} for type {1}",
  39. t.FullName,
  40. tc));
  41. }
  42. return EvaluateNullable (a, b, Type.GetTypeCode (t.GetGenericArguments () [0]), et);
  43. }
  44. return Evaluate (a, b, tc, et);
  45. }
  46. public static object EvaluateNullable (object a, object b, TypeCode tc, ExpressionType et)
  47. {
  48. object o = null;
  49. if (a == null || b == null) {
  50. if (tc != TypeCode.Boolean) {
  51. return null;
  52. }
  53. switch (et) {
  54. case ExpressionType.And:
  55. o = And (a, b);
  56. break;
  57. case ExpressionType.Or:
  58. o = Or (a, b);
  59. break;
  60. case ExpressionType.ExclusiveOr:
  61. o = ExclusiveOr (a, b);
  62. break;
  63. }
  64. } else {
  65. o = Evaluate (a, b, tc, et);
  66. }
  67. return Convert2Nullable (o, tc);
  68. }
  69. private static object ExclusiveOr (object a, object b)
  70. {
  71. if (a == null || b == null) {
  72. return null;
  73. }
  74. return (bool) a ^ (bool) b;
  75. }
  76. public static object Or (object a, object b)
  77. {
  78. if (a == null) {
  79. if (b == null || !((bool) b)) {
  80. return null;
  81. }
  82. return true;
  83. }
  84. if (b == null) {
  85. if (a == null || !((bool) a)) {
  86. return null;
  87. }
  88. return true;
  89. }
  90. return (bool) a || (bool) b;
  91. }
  92. public static object And (object a, object b)
  93. {
  94. if (a == null) {
  95. if (b == null || (bool) b) {
  96. return null;
  97. }
  98. return false;
  99. }
  100. if (b == null) {
  101. if (a == null || (bool) a) {
  102. return null;
  103. }
  104. return false;
  105. }
  106. return (bool) a && (bool) b;
  107. }
  108. private static object Convert2Nullable (object o, TypeCode tc)
  109. {
  110. if (o == null) {
  111. return null;
  112. }
  113. switch (tc) {
  114. case TypeCode.Char:
  115. return new Nullable<Char> ((Char) o);
  116. case TypeCode.Byte:
  117. return new Nullable<Byte> ((Byte) o);
  118. case TypeCode.Decimal:
  119. return new Nullable<Decimal> ((Decimal) o);
  120. case TypeCode.Double:
  121. return new Nullable<Double> ((Double) o);
  122. case TypeCode.Int16:
  123. return new Nullable<Int16> ((Int16) o);
  124. case TypeCode.Int32:
  125. return new Nullable<Int32> ((Int32) o);
  126. case TypeCode.Int64:
  127. return new Nullable<Int64> ((Int64) o);
  128. case TypeCode.UInt16:
  129. return new Nullable<UInt16> ((UInt16) o);
  130. case TypeCode.UInt32:
  131. return new Nullable<UInt32> ((UInt32) o);
  132. case TypeCode.SByte:
  133. return new Nullable<SByte> ((SByte) o);
  134. case TypeCode.Single:
  135. return new Nullable<Single> ((Single) o);
  136. case TypeCode.Boolean:
  137. return new Nullable<Boolean> ((Boolean) o);
  138. }
  139. throw new NotImplementedException ();
  140. }
  141. public static object Evaluate (object a, object b, TypeCode tc, ExpressionType et)
  142. {
  143. switch (tc) {
  144. case TypeCode.Boolean:
  145. return Evaluate (Convert.ToBoolean (a), Convert.ToBoolean (b), et);
  146. case TypeCode.Char:
  147. return Evaluate (Convert.ToChar (a), Convert.ToChar (b), et);
  148. case TypeCode.Byte:
  149. return unchecked ((Byte) Evaluate (Convert.ToByte (a), Convert.ToByte (b), et));
  150. case TypeCode.Decimal:
  151. return Evaluate (Convert.ToDecimal (a), Convert.ToDecimal (b), et);
  152. case TypeCode.Double:
  153. return Evaluate (Convert.ToDouble (a), Convert.ToDouble (b), et);
  154. case TypeCode.Int16:
  155. return unchecked ((Int16) Evaluate (Convert.ToInt16 (a), Convert.ToInt16 (b), et));
  156. case TypeCode.Int32:
  157. return Evaluate (Convert.ToInt32 (a), Convert.ToInt32 (b), et);
  158. case TypeCode.Int64:
  159. return Evaluate (Convert.ToInt64 (a), Convert.ToInt64 (b), et);
  160. case TypeCode.UInt16:
  161. return unchecked ((UInt16) Evaluate (Convert.ToUInt16 (a), Convert.ToUInt16 (b), et));
  162. case TypeCode.UInt32:
  163. return Evaluate (Convert.ToUInt32 (a), Convert.ToUInt32 (b), et);
  164. case TypeCode.UInt64:
  165. return Evaluate (Convert.ToUInt64 (a), Convert.ToUInt64 (b), et);
  166. case TypeCode.SByte:
  167. return unchecked ((SByte) Evaluate (Convert.ToSByte (a), Convert.ToSByte (b), et));
  168. case TypeCode.Single:
  169. return Evaluate (Convert.ToSingle (a), Convert.ToSingle (b), et);
  170. }
  171. throw new NotImplementedException ();
  172. }
  173. public static object NegateChecked (object a, TypeCode tc)
  174. {
  175. switch (tc) {
  176. case TypeCode.Char:
  177. return checked (-Convert.ToChar (a));
  178. case TypeCode.Byte:
  179. return checked (-Convert.ToByte (a));
  180. case TypeCode.Decimal:
  181. return checked (-Convert.ToDecimal (a));
  182. case TypeCode.Double:
  183. return checked (-Convert.ToDouble (a));
  184. case TypeCode.Int16:
  185. return checked (-Convert.ToInt16 (a));
  186. case TypeCode.Int32:
  187. return checked (-Convert.ToInt32 (a));
  188. case TypeCode.Int64:
  189. return checked (-Convert.ToInt64 (a));
  190. case TypeCode.UInt16:
  191. return checked (-Convert.ToUInt16 (a));
  192. case TypeCode.UInt32:
  193. return checked (-Convert.ToUInt32 (a));
  194. case TypeCode.SByte:
  195. return checked (-Convert.ToSByte (a));
  196. case TypeCode.Single:
  197. return checked (-Convert.ToSingle (a));
  198. }
  199. throw new NotImplementedException ();
  200. }
  201. static object CreateInstance (Type type, params object [] arguments)
  202. {
  203. return type.GetConstructor (
  204. (from argument in arguments select argument.GetType ()).ToArray ()).Invoke (arguments);
  205. }
  206. public static object ConvertToTypeChecked (object a, Type fromType, Type toType)
  207. {
  208. if (toType.IsNullable ())
  209. return a == null ? a : CreateInstance (toType,
  210. ConvertToTypeChecked (a, fromType.GetNotNullableType (), toType.GetNotNullableType ()));
  211. if (a == null) {
  212. if (!toType.IsValueType)
  213. return a;
  214. if (fromType.IsNullable ())
  215. throw new InvalidOperationException ("Nullable object must have a value");
  216. }
  217. if (IsType (toType, a)) {
  218. return a;
  219. }
  220. if (Expression.IsPrimitiveConversion (fromType, toType))
  221. return Convert.ChangeType (a, toType, CultureInfo.CurrentCulture);
  222. throw new NotImplementedException (
  223. string.Format ("No Convert defined for type {0} ", toType));
  224. }
  225. public static object ConvertToTypeUnchecked (object a, Type fromType, Type toType)
  226. {
  227. if (toType.IsNullable ())
  228. return a == null ? a : CreateInstance (toType,
  229. ConvertToTypeUnchecked (a, fromType.GetNotNullableType (), toType.GetNotNullableType ()));
  230. if (a == null) {
  231. if (!toType.IsValueType)
  232. return a;
  233. if (fromType.IsNullable ())
  234. throw new InvalidOperationException ("Nullable object must have a value");
  235. }
  236. if (IsType (toType, a))
  237. return a;
  238. if (Expression.IsPrimitiveConversion (fromType, toType))
  239. return Conversion.ConvertPrimitiveUnChecked (fromType, toType, a);
  240. throw new NotImplementedException (
  241. string.Format ("No Convert defined for type {0} ", toType));
  242. }
  243. public static bool IsType (Type t, Object o)
  244. {
  245. return t.IsInstanceOfType (o);
  246. }
  247. public static object Negate (object a, TypeCode tc)
  248. {
  249. switch (tc) {
  250. case TypeCode.Char:
  251. return unchecked (-Convert.ToChar (a));
  252. case TypeCode.Byte:
  253. return unchecked (-Convert.ToByte (a));
  254. case TypeCode.Decimal:
  255. return unchecked (-Convert.ToDecimal (a));
  256. case TypeCode.Double:
  257. return unchecked (-Convert.ToDouble (a));
  258. case TypeCode.Int16:
  259. return unchecked (-Convert.ToInt16 (a));
  260. case TypeCode.Int32:
  261. return unchecked (-Convert.ToInt32 (a));
  262. case TypeCode.Int64:
  263. return unchecked (-Convert.ToInt64 (a));
  264. case TypeCode.UInt16:
  265. return unchecked (-Convert.ToUInt16 (a));
  266. case TypeCode.UInt32:
  267. return unchecked (-Convert.ToUInt32 (a));
  268. case TypeCode.SByte:
  269. return unchecked (-Convert.ToSByte (a));
  270. case TypeCode.Single:
  271. return unchecked (-Convert.ToSingle (a));
  272. }
  273. throw new NotImplementedException ();
  274. }
  275. public static object RightShift (object a, int n, TypeCode tc)
  276. {
  277. switch (tc) {
  278. case TypeCode.Int16:
  279. return Convert.ToInt16 (a) >> n;
  280. case TypeCode.Int32:
  281. return Convert.ToInt32 (a) >> n;
  282. case TypeCode.Int64:
  283. return Convert.ToInt64 (a) >> n;
  284. case TypeCode.UInt16:
  285. return Convert.ToUInt16 (a) >> n;
  286. case TypeCode.UInt32:
  287. return Convert.ToUInt32 (a) >> n;
  288. case TypeCode.UInt64:
  289. return Convert.ToUInt64 (a) >> n;
  290. }
  291. throw new NotImplementedException ();
  292. }
  293. public static object LeftShift (object a, int n, TypeCode tc)
  294. {
  295. switch (tc) {
  296. case TypeCode.Int16:
  297. return Convert.ToInt16 (a) << n;
  298. case TypeCode.Int32:
  299. return Convert.ToInt32 (a) << n;
  300. case TypeCode.Int64:
  301. return Convert.ToInt64 (a) << n;
  302. case TypeCode.UInt16:
  303. return Convert.ToUInt16 (a) << n;
  304. case TypeCode.UInt32:
  305. return Convert.ToUInt32 (a) << n;
  306. case TypeCode.UInt64:
  307. return Convert.ToUInt64 (a) << n;
  308. }
  309. throw new NotImplementedException ();
  310. }
  311. private static Decimal Evaluate (Decimal a, Decimal b, ExpressionType et)
  312. {
  313. switch (et) {
  314. case ExpressionType.Add:
  315. return unchecked (a + b);
  316. case ExpressionType.AddChecked:
  317. return checked (a + b);
  318. case ExpressionType.Subtract:
  319. return unchecked (a - b);
  320. case ExpressionType.SubtractChecked:
  321. return checked (a - b);
  322. case ExpressionType.Multiply:
  323. return unchecked (a * b);
  324. case ExpressionType.MultiplyChecked:
  325. return checked (a * b);
  326. case ExpressionType.Divide:
  327. return a / b;
  328. case ExpressionType.Modulo:
  329. return a % b;
  330. }
  331. throw new NotImplementedException ();
  332. }
  333. private static Double Evaluate (Double a, Double b, ExpressionType et)
  334. {
  335. switch (et) {
  336. case ExpressionType.Add:
  337. return unchecked (a + b);
  338. case ExpressionType.AddChecked:
  339. return checked (a + b);
  340. case ExpressionType.Subtract:
  341. return unchecked (a - b);
  342. case ExpressionType.SubtractChecked:
  343. return checked (a - b);
  344. case ExpressionType.Multiply:
  345. return unchecked (a * b);
  346. case ExpressionType.MultiplyChecked:
  347. return checked (a * b);
  348. case ExpressionType.Divide:
  349. return a / b;
  350. case ExpressionType.Modulo:
  351. return a % b;
  352. case ExpressionType.Power:
  353. return System.Math.Pow (a, b);
  354. }
  355. throw new NotImplementedException ();
  356. }
  357. private static Int32 Evaluate (Int16 a, Int16 b, ExpressionType et)
  358. {
  359. switch (et) {
  360. case ExpressionType.Add:
  361. return unchecked (a + b);
  362. case ExpressionType.AddChecked:
  363. return checked (a + b);
  364. case ExpressionType.Subtract:
  365. return unchecked (a - b);
  366. case ExpressionType.SubtractChecked:
  367. return checked (a - b);
  368. case ExpressionType.Multiply:
  369. return unchecked (a * b);
  370. case ExpressionType.MultiplyChecked:
  371. return checked (a * b);
  372. case ExpressionType.Divide:
  373. return a / b;
  374. case ExpressionType.Modulo:
  375. return a % b;
  376. case ExpressionType.ExclusiveOr:
  377. return a ^ b;
  378. case ExpressionType.And:
  379. return a & b;
  380. case ExpressionType.Or:
  381. return a | b;
  382. }
  383. throw new NotImplementedException ();
  384. }
  385. private static Int32 Evaluate (Int32 a, Int32 b, ExpressionType et)
  386. {
  387. switch (et) {
  388. case ExpressionType.Add:
  389. return unchecked (a + b);
  390. case ExpressionType.AddChecked:
  391. return checked (a + b);
  392. case ExpressionType.Subtract:
  393. return unchecked (a - b);
  394. case ExpressionType.SubtractChecked:
  395. return checked (a - b);
  396. case ExpressionType.Multiply:
  397. return unchecked (a * b);
  398. case ExpressionType.MultiplyChecked:
  399. return checked (a * b);
  400. case ExpressionType.Divide:
  401. return a / b;
  402. case ExpressionType.Modulo:
  403. return a % b;
  404. case ExpressionType.ExclusiveOr:
  405. return a ^ b;
  406. case ExpressionType.And:
  407. return a & b;
  408. case ExpressionType.Or:
  409. return a | b;
  410. }
  411. throw new NotImplementedException ();
  412. }
  413. private static Int64 Evaluate (Int64 a, Int64 b, ExpressionType et)
  414. {
  415. switch (et) {
  416. case ExpressionType.Add:
  417. return unchecked (a + b);
  418. case ExpressionType.AddChecked:
  419. return checked (a + b);
  420. case ExpressionType.Subtract:
  421. return unchecked (a - b);
  422. case ExpressionType.SubtractChecked:
  423. return checked (a - b);
  424. case ExpressionType.Multiply:
  425. return unchecked (a * b);
  426. case ExpressionType.MultiplyChecked:
  427. return checked (a * b);
  428. case ExpressionType.Divide:
  429. return a / b;
  430. case ExpressionType.Modulo:
  431. return a % b;
  432. case ExpressionType.ExclusiveOr:
  433. return a ^ b;
  434. case ExpressionType.And:
  435. return a & b;
  436. case ExpressionType.Or:
  437. return a | b;
  438. }
  439. throw new NotImplementedException ();
  440. }
  441. private static Int32 Evaluate (UInt16 a, UInt16 b, ExpressionType et)
  442. {
  443. switch (et) {
  444. case ExpressionType.Add:
  445. return unchecked (a + b);
  446. case ExpressionType.AddChecked:
  447. return checked (a + b);
  448. case ExpressionType.Subtract:
  449. return unchecked (a - b);
  450. case ExpressionType.SubtractChecked:
  451. return checked ((UInt16) (a - b));
  452. case ExpressionType.Multiply:
  453. return unchecked (a * b);
  454. case ExpressionType.MultiplyChecked:
  455. return checked (a * b);
  456. case ExpressionType.Divide:
  457. return a / b;
  458. case ExpressionType.Modulo:
  459. return a % b;
  460. case ExpressionType.ExclusiveOr:
  461. return a ^ b;
  462. case ExpressionType.And:
  463. return a & b;
  464. case ExpressionType.Or:
  465. return a | b;
  466. }
  467. throw new NotImplementedException ();
  468. }
  469. private static UInt32 Evaluate (UInt32 a, UInt32 b, ExpressionType et)
  470. {
  471. switch (et) {
  472. case ExpressionType.Add:
  473. return unchecked (a + b);
  474. case ExpressionType.AddChecked:
  475. return checked (a + b);
  476. case ExpressionType.Subtract:
  477. return unchecked (a - b);
  478. case ExpressionType.SubtractChecked:
  479. return checked (a - b);
  480. case ExpressionType.Multiply:
  481. return unchecked (a * b);
  482. case ExpressionType.MultiplyChecked:
  483. return checked (a * b);
  484. case ExpressionType.Divide:
  485. return a / b;
  486. case ExpressionType.Modulo:
  487. return a % b;
  488. case ExpressionType.ExclusiveOr:
  489. return a ^ b;
  490. case ExpressionType.And:
  491. return a & b;
  492. case ExpressionType.Or:
  493. return a | b;
  494. }
  495. throw new NotImplementedException ();
  496. }
  497. private static UInt64 Evaluate (UInt64 a, UInt64 b, ExpressionType et)
  498. {
  499. switch (et) {
  500. case ExpressionType.Add:
  501. return unchecked (a + b);
  502. case ExpressionType.AddChecked:
  503. return checked (a + b);
  504. case ExpressionType.Subtract:
  505. return unchecked (a - b);
  506. case ExpressionType.SubtractChecked:
  507. return checked (a - b);
  508. case ExpressionType.Multiply:
  509. return unchecked (a * b);
  510. case ExpressionType.MultiplyChecked:
  511. return checked (a * b);
  512. case ExpressionType.Divide:
  513. return a / b;
  514. case ExpressionType.Modulo:
  515. return a % b;
  516. case ExpressionType.ExclusiveOr:
  517. return a ^ b;
  518. case ExpressionType.And:
  519. return a & b;
  520. case ExpressionType.Or:
  521. return a | b;
  522. }
  523. throw new NotImplementedException ();
  524. }
  525. private static object Evaluate (Char a, Char b, ExpressionType et)
  526. {
  527. switch (et) {
  528. case ExpressionType.ExclusiveOr:
  529. return a ^ b;
  530. case ExpressionType.And:
  531. return a & b;
  532. case ExpressionType.Or:
  533. return a | b;
  534. }
  535. throw new NotImplementedException ();
  536. }
  537. private static Int32 Evaluate (SByte a, SByte b, ExpressionType et)
  538. {
  539. switch (et) {
  540. case ExpressionType.Add:
  541. return unchecked (a + b);
  542. case ExpressionType.AddChecked:
  543. return checked (a + b);
  544. case ExpressionType.Subtract:
  545. return unchecked (a - b);
  546. case ExpressionType.SubtractChecked:
  547. return checked (a - b);
  548. case ExpressionType.Multiply:
  549. return unchecked (a * b);
  550. case ExpressionType.MultiplyChecked:
  551. return checked (a * b);
  552. case ExpressionType.Divide:
  553. return a / b;
  554. case ExpressionType.Modulo:
  555. return a % b;
  556. case ExpressionType.ExclusiveOr:
  557. return a ^ b;
  558. case ExpressionType.And:
  559. return a & b;
  560. case ExpressionType.Or:
  561. return a | b;
  562. }
  563. throw new NotImplementedException ();
  564. }
  565. private static Int32 Evaluate (Byte a, Byte b, ExpressionType et)
  566. {
  567. switch (et) {
  568. case ExpressionType.Add:
  569. return unchecked (a + b);
  570. case ExpressionType.AddChecked:
  571. return checked (a + b);
  572. case ExpressionType.Subtract:
  573. return unchecked (a - b);
  574. case ExpressionType.SubtractChecked:
  575. return checked (a - b);
  576. case ExpressionType.Multiply:
  577. return unchecked (a * b);
  578. case ExpressionType.MultiplyChecked:
  579. return checked (a * b);
  580. case ExpressionType.Divide:
  581. return a / b;
  582. case ExpressionType.Modulo:
  583. return a % b;
  584. case ExpressionType.ExclusiveOr:
  585. return a ^ b;
  586. case ExpressionType.And:
  587. return a & b;
  588. case ExpressionType.Or:
  589. return a | b;
  590. }
  591. throw new NotImplementedException ();
  592. }
  593. private static Single Evaluate (Single a, Single b, ExpressionType et)
  594. {
  595. switch (et) {
  596. case ExpressionType.Add:
  597. return unchecked (a + b);
  598. case ExpressionType.AddChecked:
  599. return checked (a + b);
  600. case ExpressionType.Subtract:
  601. return unchecked (a - b);
  602. case ExpressionType.SubtractChecked:
  603. return checked (a - b);
  604. case ExpressionType.Multiply:
  605. return unchecked (a * b);
  606. case ExpressionType.MultiplyChecked:
  607. return checked (a * b);
  608. case ExpressionType.Divide:
  609. return a / b;
  610. case ExpressionType.Modulo:
  611. return a % b;
  612. }
  613. throw new NotImplementedException ();
  614. }
  615. private static bool Evaluate (bool a, bool b, ExpressionType et)
  616. {
  617. switch (et) {
  618. case ExpressionType.ExclusiveOr:
  619. return a ^ b;
  620. case ExpressionType.And:
  621. return a & b;
  622. case ExpressionType.Or:
  623. return a | b;
  624. }
  625. throw new NotImplementedException ();
  626. }
  627. }
  628. }