PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/src/sys/dotnet/fanx/util/OpUtil.cs

https://bitbucket.org/bedlaczech/fan-1.0
C# | 221 lines | 149 code | 44 blank | 28 comment | 65 complexity | 37ad2d74ac33457931db33c1ee9bf75a MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 31 Oct 06 Andy Frank Creation
  7. //
  8. using Fan.Sys;
  9. namespace Fanx.Util
  10. {
  11. /// <summary>
  12. /// OpUtil provides static methods used to implement special fcode opcodes.
  13. /// </summary>
  14. public class OpUtil
  15. {
  16. //////////////////////////////////////////////////////////////////////////
  17. // Object Comparisions
  18. //////////////////////////////////////////////////////////////////////////
  19. public static bool compareEQ(object a, object b)
  20. {
  21. if (a == null) return (b == null);
  22. return a.Equals(b);
  23. }
  24. public static bool compareNE(object a, object b)
  25. {
  26. if (a == null) return (b != null);
  27. return !a.Equals(b);
  28. }
  29. public static long compare(object a, object b)
  30. {
  31. if (a == null) return (b == null) ? 0 : -1;
  32. if (b == null) return +1;
  33. return FanObj.compare(a, b);
  34. }
  35. public static bool compareLT(object a, object b)
  36. {
  37. if (a == null) return (b == null) ? false : true;
  38. if (b == null) return false;
  39. return FanObj.compare(a, b) < 0 ? true : false;
  40. }
  41. public static bool compareLE(object a, object b)
  42. {
  43. if (a == null) return true;
  44. if (b == null) return false;
  45. return FanObj.compare(a, b) <= 0 ? true : false;
  46. }
  47. public static bool compareGE(object a, object b)
  48. {
  49. if (a == null) return (b == null) ? true : false;
  50. if (b == null) return true;
  51. return FanObj.compare(a, b) >= 0 ? true : false;
  52. }
  53. public static bool compareGT(object a, object b)
  54. {
  55. if (a == null) return false;
  56. if (b == null) return true;
  57. return FanObj.compare(a, b) > 0 ? true : false;
  58. }
  59. ///*
  60. public static bool compareSame(object a, object b) // need to use object for mixins
  61. {
  62. return a == b ? true : false;
  63. }
  64. public static bool compareNotSame(object a, object b) // need to use object for mixins
  65. {
  66. return a != b ? true : false;
  67. }
  68. public static bool compareNull(object a) // need to use object for mixins
  69. {
  70. return a == null ? true : false;
  71. }
  72. public static bool compareNotNull(object a) // need to use object for mixins
  73. {
  74. return a != null ? true : false;
  75. }
  76. //*/
  77. //////////////////////////////////////////////////////////////////////////
  78. // sys::Bool Comparisions
  79. //////////////////////////////////////////////////////////////////////////
  80. public static bool compareEQ(bool a, bool b) { return a == b; }
  81. public static bool compareEQ(bool a, object b) { return (b is Boolean) ? a == ((Boolean)b).booleanValue() : false; }
  82. public static bool compareEQ(object a, bool b) { return (a is Boolean) ? b == ((Boolean)a).booleanValue() : false; }
  83. public static bool compareNE(bool a, bool b) { return a != b; }
  84. public static bool compareNE(bool a, object b) { return (b is Boolean) ? a != ((Boolean)b).booleanValue() : true; }
  85. public static bool compareNE(object a, bool b) { return (a is Boolean) ? b != ((Boolean)a).booleanValue() : true; }
  86. public static bool compareLT(bool a, bool b) { return a == b ? false : !a; }
  87. public static bool compareLT(bool a, object b) { return (b is Boolean) ? compareLT(a, ((Boolean)b).booleanValue()) : compareLT((object)a, b); }
  88. public static bool compareLT(object a, bool b) { return (a is Boolean) ? compareLT(((Boolean)a).booleanValue(), b) : compareLT(a, (object)b); }
  89. public static bool compareLE(bool a, bool b) { return a == b ? true : !a; }
  90. public static bool compareLE(bool a, object b) { return (b is Boolean) ? compareLE(a, ((Boolean)b).booleanValue()) : compareLE((object)a, b); }
  91. public static bool compareLE(object a, bool b) { return (a is Boolean) ? compareLE(((Boolean)a).booleanValue(), b) : compareLE(a, (object)b); }
  92. public static bool compareGE(bool a, bool b) { return a == b ? true : a; }
  93. public static bool compareGE(bool a, object b) { return (b is Boolean) ? compareGE(a, ((Boolean)b).booleanValue()) : compareGE((object)a, b); }
  94. public static bool compareGE(object a, bool b) { return (a is Boolean) ? compareGE(((Boolean)a).booleanValue(), b) : compareGE(a, (object)b); }
  95. public static bool compareGT(bool a, bool b) { return a == b ? false : a; }
  96. public static bool compareGT(bool a, object b) { return (b is Boolean) ? compareGT(a, ((Boolean)b).booleanValue()) : compareGT((object)a, b); }
  97. public static bool compareGT(object a, bool b) { return (a is Boolean) ? compareGT(((Boolean)a).booleanValue(), b) : compareGT(a, (object)b); }
  98. public static long compare(bool a, bool b) { return a == b ? 0 : a ? +1 : -1; }
  99. public static long compare(bool a, object b) { return (b is Boolean) ? compare(a, ((Boolean)b).booleanValue()) : compare((object)a, b); }
  100. public static long compare(object a, bool b) { return (a is Boolean) ? compare(((Boolean)a).booleanValue(), b) : compare(a, (object)b); }
  101. //////////////////////////////////////////////////////////////////////////
  102. // sys::Int Comparisions
  103. //////////////////////////////////////////////////////////////////////////
  104. public static bool compareEQ(long a, long b) { return a == b; }
  105. public static bool compareEQ(long a, object b) { return (b is Long) ? a == ((Long)b).longValue() : false; }
  106. public static bool compareEQ(object a, long b) { return (a is Long) ? b == ((Long)a).longValue() : false; }
  107. public static bool compareNE(long a, long b) { return a != b; }
  108. public static bool compareNE(long a, object b) { return (b is Long) ? a != ((Long)b).longValue() : true; }
  109. public static bool compareNE(object a, long b) { return (a is Long) ? b != ((Long)a).longValue() : true; }
  110. public static bool compareLT(long a, long b) { return a < b; }
  111. public static bool compareLT(long a, object b) { return (b is Long) ? a < ((Long)b).longValue() : compareLT((object)a, b); }
  112. public static bool compareLT(object a, long b) { return (a is Long) ? ((Long)a).longValue() < b : compareLT(a, (object)b); }
  113. public static bool compareLE(long a, long b) { return a <= b; }
  114. public static bool compareLE(long a, object b) { return (b is Long) ? a <= ((Long)b).longValue() : compareLE((object)a, b); }
  115. public static bool compareLE(object a, long b) { return (a is Long) ? ((Long)a).longValue() <= b : compareLE(a, (object)b); }
  116. public static bool compareGE(long a, long b) { return a >= b; }
  117. public static bool compareGE(long a, object b) { return (b is Long) ? a >= ((Long)b).longValue() : compareGE((object)a, b); }
  118. public static bool compareGE(object a, long b) { return (a is Long) ? ((Long)a).longValue() >= b : compareGE(a, (object)b); }
  119. public static bool compareGT(long a, long b) { return a > b; }
  120. public static bool compareGT(long a, object b) { return (b is Long) ? a > ((Long)b).longValue() : compareGT((object)a, b); }
  121. public static bool compareGT(object a, long b) { return (a is Long) ? ((Long)a).longValue() > b : compareGT(a, (object)b); }
  122. public static long compare(long a, long b) { return a < b ? -1 : (a == b ? 0 : +1); }
  123. public static long compare(long a, object b) { return (b is Long) ? compare(a, ((Long)b).longValue()) : compare((object)a, b); }
  124. public static long compare(object a, long b) { return (a is Long) ? compare(((Long)a).longValue(), b) : compare(a, (object)b); }
  125. //////////////////////////////////////////////////////////////////////////
  126. // sys::Float Comparisions
  127. //////////////////////////////////////////////////////////////////////////
  128. public static bool compareEQ(double a, double b) { return a == b; }
  129. public static bool compareEQ(double a, object b) { return (b is Double) ? compareEQ(a, (b as Double).doubleValue()) : false; }
  130. public static bool compareEQ(object a, double b) { return (a is Double) ? compareEQ((a as Double).doubleValue(), b) : false; }
  131. public static bool compareNE(double a, double b) { return a != b; }
  132. public static bool compareNE(double a, object b) { return (b is Double) ? compareNE(a, (b as Double).doubleValue()) : true; }
  133. public static bool compareNE(object a, double b) { return (a is Double) ? compareNE((a as Double).doubleValue(), b) : true; }
  134. public static bool compareLT(double a, double b) { return a < b; }
  135. public static bool compareLT(double a, object b) { return (b is Double) ? compareLT(a, (b as Double).doubleValue()) : compareLT((object)a, b); }
  136. public static bool compareLT(object a, double b) { return (a is Double) ? compareLT((a as Double).doubleValue(), b) : compareLT(a, (object)b); }
  137. public static bool compareLE(double a, double b) { return a <= b; }
  138. public static bool compareLE(double a, object b) { return (b is Double) ? compareLE(a, (b as Double).doubleValue()) : compareLE((object)a, b); }
  139. public static bool compareLE(object a, double b) { return (a is Double) ? compareLE((a as Double).doubleValue(), b) : compareLE(a, (object)b); }
  140. public static bool compareGE(double a, double b) { return a >= b; }
  141. public static bool compareGE(double a, object b) { return (b is Double) ? compareGE(a, (b as Double).doubleValue()) : compareGE((object)a, b); }
  142. public static bool compareGE(object a, double b) { return (a is Double) ? compareGE((a as Double).doubleValue(), b) : compareGE(a, (object)b); }
  143. public static bool compareGT(double a, double b) { return a > b; }
  144. public static bool compareGT(double a, object b) { return (b is Double) ? compareGT(a, (b as Double).doubleValue()) : compareGT((object)a, b); }
  145. public static bool compareGT(object a, double b) { return (a is Double) ? compareGT((a as Double).doubleValue(), b) : compareGT(a, (object)b); }
  146. public static long compare(double a, object b) { return (b is Double) ? compare(a, (b as Double).doubleValue()) : compare((object)a, b); }
  147. public static long compare(object a, double b) { return (a is Double) ? compare((a as Double).doubleValue(), b) : compare(a, (object)b); }
  148. public static long compare(double a, double b)
  149. {
  150. if (System.Double.IsNaN(a))
  151. {
  152. return (System.Double.IsNaN(b)) ? 0 : -1;
  153. }
  154. if (System.Double.IsNaN(b)) return +1;
  155. return a < b ? -1 : (a == b ? 0 : +1);
  156. }
  157. //////////////////////////////////////////////////////////////////////////
  158. // Is/As
  159. //////////////////////////////////////////////////////////////////////////
  160. public static bool @is(object instance, Type type)
  161. {
  162. if (instance == null) return false;
  163. return FanObj.@typeof(instance).fits(type);
  164. }
  165. public static object toImmutable(object obj)
  166. {
  167. if (obj == null) return null;
  168. // TODO - this isn't quite right, need to clean up with FanObj.isImmutable
  169. if (obj is Double) return ((Double)obj).doubleValue();
  170. if (obj is Long) return ((Long)obj).longValue();
  171. if (FanObj.isImmutable(obj)) return obj;
  172. if (obj is List) return ((List)obj).toImmutable();
  173. if (obj is Map) return ((Map)obj).toImmutable();
  174. throw NotImmutableErr.make(FanObj.@typeof(obj).toStr()).val;
  175. }
  176. }
  177. }