set-has-bigint.js (1724B)
1 // Return a new set, possibly filling some dummy entries to enforce creating 2 // multiple hash buckets. 3 function createSet(values, n) { 4 var xs = [...values]; 5 for (var i = 0; i < n; ++i) { 6 xs.push({}); 7 } 8 return new Set(xs); 9 } 10 11 function runTest(fn) { 12 fn(0); 13 fn(100); 14 } 15 16 function testInlineDigitsSameSign(n) { 17 var xs = [1n, 2n]; 18 var ys = [3n, 4n]; 19 var zs = [...xs, ...ys]; 20 var set = createSet(xs, n); 21 22 var N = 100; 23 var c = 0; 24 for (var i = 0; i < N; ++i) { 25 var z = zs[i & 3]; 26 if (set.has(z)) c++; 27 } 28 assertEq(c, N / 2); 29 } 30 runTest(testInlineDigitsSameSign); 31 32 function testInlineDigitsDifferentSign(n) { 33 var xs = [-1n, 2n]; 34 var ys = [1n, -2n]; 35 var zs = [...xs, ...ys]; 36 var set = createSet(xs, n); 37 38 var N = 100; 39 var c = 0; 40 for (var i = 0; i < N; ++i) { 41 var z = zs[i & 3]; 42 if (set.has(z)) c++; 43 } 44 assertEq(c, N / 2); 45 } 46 runTest(testInlineDigitsDifferentSign); 47 48 function testHeapDigitsSameSign(n) { 49 // Definitely uses heap digits. 50 var heap = 2n ** 1000n; 51 52 var xs = [heap + 1n, heap + 2n]; 53 var ys = [heap + 3n, heap + 4n]; 54 var zs = [...xs, ...ys]; 55 var set = createSet(xs, n); 56 57 var N = 100; 58 var c = 0; 59 for (var i = 0; i < N; ++i) { 60 var z = zs[i & 3]; 61 if (set.has(z)) c++; 62 } 63 assertEq(c, N / 2); 64 } 65 runTest(testHeapDigitsSameSign); 66 67 function testHeapDigitsDifferentSign(n) { 68 // Definitely uses heap digits. 69 var heap = 2n ** 1000n; 70 71 var xs = [-(heap + 1n), heap + 2n]; 72 var ys = [heap + 1n, -(heap + 2n)]; 73 var zs = [...xs, ...ys]; 74 var set = createSet(xs, n); 75 76 var N = 100; 77 var c = 0; 78 for (var i = 0; i < N; ++i) { 79 var z = zs[i & 3]; 80 if (set.has(z)) c++; 81 } 82 assertEq(c, N / 2); 83 } 84 runTest(testHeapDigitsDifferentSign);