rtl.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. function Class(){}
  3. Class.extend = function extend(methods){
  4. function Type(){
  5. for(var m in methods)
  6. this[m] = methods[m];
  7. }
  8. Type.prototype = this.prototype;
  9. var result = methods.init;
  10. result.prototype = new Type(); // inherit this.prototype
  11. result.prototype.constructor = result; // to see constructor name in diagnostic
  12. result.extend = extend;
  13. return result;
  14. };
  15. var impl = {
  16. extend: Class.extend,
  17. typeGuard: function(from, to){
  18. if (!(from instanceof to))
  19. throw new Error("typeguard assertion failed");
  20. return from;
  21. },
  22. makeArray: function(/*dimensions, initializer*/){
  23. var forward = Array.prototype.slice.call(arguments);
  24. var result = new Array(forward.shift());
  25. var i;
  26. if (forward.length == 1){
  27. var init = forward[0];
  28. if (typeof init == "function")
  29. for(i = 0; i < result.length; ++i)
  30. result[i] = init();
  31. else
  32. for(i = 0; i < result.length; ++i)
  33. result[i] = init;
  34. }
  35. else
  36. for(i = 0; i < result.length; ++i)
  37. result[i] = this.makeArray.apply(this, forward);
  38. return result;
  39. },
  40. makeSet: function(/*...*/){
  41. var result = 0;
  42. function checkBit(b){
  43. if (b < 0 || b > 31)
  44. throw new Error("integers between 0 and 31 expected, got " + b);
  45. }
  46. function setBit(b){
  47. checkBit(b);
  48. result |= 1 << b;
  49. }
  50. for(var i = 0; i < arguments.length; ++i){
  51. var b = arguments[i];
  52. if (b instanceof Array){
  53. var from = b[0];
  54. var to = b[1];
  55. if (from < to)
  56. throw new Error("invalid SET diapason: " + from + ".." + to);
  57. for(var bi = from; bi <= to; ++bi)
  58. setBit(bi);
  59. }
  60. else
  61. setBit(b);
  62. }
  63. return result;
  64. },
  65. makeRef: function(obj, prop){
  66. return {set: function(v){ obj[prop] = v; },
  67. get: function(){ return obj[prop]; }};
  68. },
  69. setInclL: function(l, r){return (l & r) == l;},
  70. setInclR: function(l, r){return (l & r) == r;},
  71. assignArrayFromString: function(a, s){
  72. var i;
  73. for(i = 0; i < s.length; ++i)
  74. a[i] = s.charCodeAt(i);
  75. for(i = s.length; i < a.length; ++i)
  76. a[i] = 0;
  77. },
  78. strToArray: function(s){
  79. var result = new Array(s.length);
  80. for(var i = 0; i < s.length; ++i)
  81. result[i] = s.charCodeAt(i);
  82. return result;
  83. },
  84. strCmp: function(s1, s2){
  85. var cmp = 0;
  86. var i = 0;
  87. while (!cmp && i < s1.length && i < s2.length){
  88. cmp = s1[i] - s2[i];
  89. ++i;
  90. }
  91. return cmp ? cmp : s1.length - s2.length;
  92. },
  93. copy: function(from, to){
  94. for(var prop in to){
  95. if (to.hasOwnProperty(prop)){
  96. var v = from[prop];
  97. if (v !== null && typeof v == "object")
  98. this.copy(v, to[prop]);
  99. else
  100. to[prop] = v;
  101. }
  102. }
  103. },
  104. assert: function(condition, code){
  105. if (!condition)
  106. throw new Error("assertion failed"
  107. + ((code !== undefined) ? " with code " + code : ""));
  108. }
  109. };
  110. exports.Class = Class;
  111. for(var e in impl)
  112. exports[e] = impl[e];