HashMap.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. "use strict";
  2. Object.defineProperty(exports, "t", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _Base = _interopRequireDefault(require("./Base"));
  7. var _Vector = _interopRequireDefault(require("../SequentialContainer/Vector"));
  8. var _OrderedMap = _interopRequireDefault(require("../TreeContainer/OrderedMap"));
  9. function _interopRequireDefault(e) {
  10. return e && e.t ? e : {
  11. default: e
  12. };
  13. }
  14. class HashMap extends _Base.default {
  15. constructor(e = [], t, s) {
  16. super(t, s);
  17. this.i = [];
  18. e.forEach((e => this.setElement(e[0], e[1])));
  19. }
  20. h() {
  21. if (this.u >= 1073741824) return;
  22. const e = [];
  23. const t = this.u;
  24. this.u <<= 1;
  25. const s = Object.keys(this.i);
  26. const r = s.length;
  27. for (let n = 0; n < r; ++n) {
  28. const r = parseInt(s[n]);
  29. const i = this.i[r];
  30. const o = i.size();
  31. if (o === 0) continue;
  32. if (o === 1) {
  33. const t = i.front();
  34. e[this.l(t[0]) & this.u - 1] = new _Vector.default([ t ], false);
  35. continue;
  36. }
  37. const c = [];
  38. const f = [];
  39. i.forEach((e => {
  40. const s = this.l(e[0]);
  41. if ((s & t) === 0) {
  42. c.push(e);
  43. } else f.push(e);
  44. }));
  45. if (i instanceof _OrderedMap.default) {
  46. if (c.length > 6) {
  47. e[r] = new _OrderedMap.default(c);
  48. } else {
  49. e[r] = new _Vector.default(c, false);
  50. }
  51. if (f.length > 6) {
  52. e[r + t] = new _OrderedMap.default(f);
  53. } else {
  54. e[r + t] = new _Vector.default(f, false);
  55. }
  56. } else {
  57. e[r] = new _Vector.default(c, false);
  58. e[r + t] = new _Vector.default(f, false);
  59. }
  60. }
  61. this.i = e;
  62. }
  63. forEach(e) {
  64. const t = Object.values(this.i);
  65. const s = t.length;
  66. let r = 0;
  67. for (let n = 0; n < s; ++n) {
  68. t[n].forEach((t => e(t, r++)));
  69. }
  70. }
  71. setElement(e, t) {
  72. const s = this.l(e) & this.u - 1;
  73. const r = this.i[s];
  74. if (!r) {
  75. this.o += 1;
  76. this.i[s] = new _Vector.default([ [ e, t ] ], false);
  77. } else {
  78. const n = r.size();
  79. if (r instanceof _Vector.default) {
  80. for (const s of r) {
  81. if (s[0] === e) {
  82. s[1] = t;
  83. return;
  84. }
  85. }
  86. r.pushBack([ e, t ]);
  87. if (n + 1 >= 8) {
  88. if (this.u <= 64) {
  89. this.o += 1;
  90. this.h();
  91. return;
  92. }
  93. this.i[s] = new _OrderedMap.default(this.i[s]);
  94. }
  95. this.o += 1;
  96. } else {
  97. r.setElement(e, t);
  98. const s = r.size();
  99. this.o += s - n;
  100. }
  101. }
  102. if (this.o > this.u * .75) {
  103. this.h();
  104. }
  105. }
  106. getElementByKey(e) {
  107. const t = this.l(e) & this.u - 1;
  108. const s = this.i[t];
  109. if (!s) return undefined;
  110. if (s instanceof _OrderedMap.default) {
  111. return s.getElementByKey(e);
  112. } else {
  113. for (const t of s) {
  114. if (t[0] === e) return t[1];
  115. }
  116. return undefined;
  117. }
  118. }
  119. eraseElementByKey(e) {
  120. const t = this.l(e) & this.u - 1;
  121. const s = this.i[t];
  122. if (!s) return;
  123. if (s instanceof _Vector.default) {
  124. let t = 0;
  125. for (const r of s) {
  126. if (r[0] === e) {
  127. s.eraseElementByPos(t);
  128. this.o -= 1;
  129. return;
  130. }
  131. t += 1;
  132. }
  133. } else {
  134. const r = s.size();
  135. s.eraseElementByKey(e);
  136. const n = s.size();
  137. this.o += n - r;
  138. if (n <= 6) {
  139. this.i[t] = new _Vector.default(s);
  140. }
  141. }
  142. }
  143. find(e) {
  144. const t = this.l(e) & this.u - 1;
  145. const s = this.i[t];
  146. if (!s) return false;
  147. if (s instanceof _OrderedMap.default) {
  148. return !s.find(e).equals(s.end());
  149. }
  150. for (const t of s) {
  151. if (t[0] === e) return true;
  152. }
  153. return false;
  154. }
  155. [Symbol.iterator]() {
  156. return function*() {
  157. const e = Object.values(this.i);
  158. const t = e.length;
  159. for (let s = 0; s < t; ++s) {
  160. const t = e[s];
  161. for (const e of t) {
  162. yield e;
  163. }
  164. }
  165. }.bind(this)();
  166. }
  167. }
  168. var _default = HashMap;
  169. exports.default = _default;