Int64.hx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package haxe;
  2. import eval.integers.Int64 as I64;
  3. private typedef __Int64 = I64;
  4. @:transitive
  5. @:coreApi
  6. abstract Int64(__Int64) from __Int64 to __Int64 {
  7. public static inline function make(high:Int32, low:Int32):Int64
  8. return I64.make(high, low);
  9. private inline function new(x:__Int64)
  10. this = x;
  11. private var val(get, set):__Int64;
  12. inline function get_val():__Int64
  13. return this;
  14. inline function set_val(x:__Int64):__Int64
  15. return this = x;
  16. public var high(get, never):Int32;
  17. inline function get_high():Int32
  18. return (this >> 32).toInt32();
  19. public var low(get, never):Int32;
  20. inline function get_low():Int32
  21. return this.toInt32();
  22. public inline function copy():Int64
  23. return new Int64(this);
  24. @:from public static inline function ofInt(x:Int):Int64
  25. return I64.ofInt(x);
  26. @:deprecated('haxe.Int64.is() is deprecated. Use haxe.Int64.isInt64() instead')
  27. inline public static function is(val:Dynamic):Bool {
  28. return isInt64(val);
  29. }
  30. inline public static function isInt64(val:Dynamic):Bool
  31. return Std.isOfType(val, eval.integers.Int64);
  32. public static inline function toInt(x:Int64):Int {
  33. if (x.high != x.low >> 31)
  34. throw "Overflow";
  35. return x.val.toInt();
  36. }
  37. public static inline function getHigh(x:Int64):Int32
  38. return x.high;
  39. public static inline function getLow(x:Int64):Int32
  40. return x.low;
  41. public static inline function isNeg(x:Int64):Bool
  42. return x.val < 0i64;
  43. public static inline function isZero(x:Int64):Bool
  44. return x.val == 0i64;
  45. public static inline function compare(a:Int64, b:Int64):Int {
  46. if (a.val < b.val)
  47. return -1;
  48. if (a.val > b.val)
  49. return 1;
  50. return 0;
  51. }
  52. public static inline function ucompare(a:Int64, b:Int64):Int {
  53. if (a.val < 0i64)
  54. return (b.val < 0i64) ? compare(a, b) : 1;
  55. return (b.val < 0i64) ? -1 : compare(a, b);
  56. }
  57. public static inline function toStr(x:Int64):String
  58. return '${x.val}';
  59. public static inline function divMod(dividend:Int64, divisor:Int64):{quotient:Int64, modulus:Int64}
  60. return {quotient: dividend / divisor, modulus: dividend % divisor};
  61. public inline function toString():String
  62. return '$this';
  63. public static function parseString(sParam:String):Int64 {
  64. return Int64Helper.parseString(sParam);
  65. }
  66. public static function fromFloat(f:Float):Int64 {
  67. return Int64Helper.fromFloat(f);
  68. }
  69. @:op(-A) public static function neg(x:Int64):Int64
  70. return -x.val;
  71. @:op(++A) private inline function preIncrement():Int64
  72. return ++this;
  73. @:op(A++) private inline function postIncrement():Int64
  74. return this++;
  75. @:op(--A) private inline function preDecrement():Int64
  76. return --this;
  77. @:op(A--) private inline function postDecrement():Int64
  78. return this
  79. --;
  80. @:op(A + B) public static inline function add(a:Int64, b:Int64):Int64
  81. return a.val + b.val;
  82. @:op(A + B) @:commutative private static inline function addInt(a:Int64, b:Int):Int64
  83. return a.val + I64.ofInt(b);
  84. @:op(A - B) public static inline function sub(a:Int64, b:Int64):Int64
  85. return a.val - b.val;
  86. @:op(A - B) private static inline function subInt(a:Int64, b:Int):Int64
  87. return a.val - I64.ofInt(b);
  88. @:op(A - B) private static inline function intSub(a:Int, b:Int64):Int64
  89. return I64.ofInt(a) - b.val;
  90. @:op(A * B) public static inline function mul(a:Int64, b:Int64):Int64
  91. return a.val * b.val;
  92. @:op(A * B) @:commutative private static inline function mulInt(a:Int64, b:Int):Int64
  93. return a.val * I64.ofInt(b);
  94. @:op(A / B) public static inline function div(a:Int64, b:Int64):Int64
  95. return a.val / b.val;
  96. @:op(A / B) private static inline function divInt(a:Int64, b:Int):Int64
  97. return a.val / I64.ofInt(b);
  98. @:op(A / B) private static inline function intDiv(a:Int, b:Int64):Int64
  99. return I64.ofInt(a) / b.val;
  100. @:op(A % B) public static inline function mod(a:Int64, b:Int64):Int64
  101. return a.val % b.val;
  102. @:op(A % B) private static inline function modInt(a:Int64, b:Int):Int64
  103. return a.val % I64.ofInt(b);
  104. @:op(A % B) private static inline function intMod(a:Int, b:Int64):Int64
  105. return I64.ofInt(a) % b.val;
  106. @:op(A == B) public static inline function eq(a:Int64, b:Int64):Bool
  107. return a.val == b.val;
  108. @:op(A == B) @:commutative private static inline function eqInt(a:Int64, b:Int):Bool
  109. return a.val == I64.ofInt(b);
  110. @:op(A != B) public static inline function neq(a:Int64, b:Int64):Bool
  111. return a.val != b.val;
  112. @:op(A != B) @:commutative private static inline function neqInt(a:Int64, b:Int):Bool
  113. return a.val != I64.ofInt(b);
  114. @:op(A < B) private static inline function lt(a:Int64, b:Int64):Bool
  115. return a.val < b.val;
  116. @:op(A < B) private static inline function ltInt(a:Int64, b:Int):Bool
  117. return a.val < I64.ofInt(b);
  118. @:op(A < B) private static inline function intLt(a:Int, b:Int64):Bool
  119. return I64.ofInt(a) < b.val;
  120. @:op(A <= B) private static inline function lte(a:Int64, b:Int64):Bool
  121. return a.val <= b.val;
  122. @:op(A <= B) private static inline function lteInt(a:Int64, b:Int):Bool
  123. return a.val <= I64.ofInt(b);
  124. @:op(A <= B) private static inline function intLte(a:Int, b:Int64):Bool
  125. return I64.ofInt(a) <= b.val;
  126. @:op(A > B) private static inline function gt(a:Int64, b:Int64):Bool
  127. return a.val > b.val;
  128. @:op(A > B) private static inline function gtInt(a:Int64, b:Int):Bool
  129. return a.val > I64.ofInt(b);
  130. @:op(A > B) private static inline function intGt(a:Int, b:Int64):Bool
  131. return I64.ofInt(a) > b.val;
  132. @:op(A >= B) private static inline function gte(a:Int64, b:Int64):Bool
  133. return a.val >= b.val;
  134. @:op(A >= B) private static inline function gteInt(a:Int64, b:Int):Bool
  135. return a.val >= I64.ofInt(b);
  136. @:op(A >= B) private static inline function intGte(a:Int, b:Int64):Bool
  137. return I64.ofInt(a) >= b.val;
  138. @:op(~A) private static inline function complement(x:Int64):Int64
  139. return ~x.val;
  140. @:op(A & B) public static inline function and(a:Int64, b:Int64):Int64
  141. return a.val & b.val;
  142. @:op(A | B) public static inline function or(a:Int64, b:Int64):Int64
  143. return a.val | b.val;
  144. @:op(A ^ B) public static inline function xor(a:Int64, b:Int64):Int64
  145. return a.val ^ b.val;
  146. @:op(A << B) public static inline function shl(a:Int64, b:Int):Int64
  147. return a.val << b;
  148. @:op(A >> B) public static inline function shr(a:Int64, b:Int):Int64
  149. return a.val >> b;
  150. @:op(A >>> B) public static inline function ushr(a:Int64, b:Int):Int64
  151. return a.val >>> b;
  152. }