Datasourceforcryptocurrency
/
node_modules
/pure-rand
/lib
/esm
/distribution
/internals
/ArrayInt.js
| export function addArrayIntToNew(arrayIntA, arrayIntB) { | |
| if (arrayIntA.sign !== arrayIntB.sign) { | |
| return substractArrayIntToNew(arrayIntA, { sign: -arrayIntB.sign, data: arrayIntB.data }); | |
| } | |
| var data = []; | |
| var reminder = 0; | |
| var dataA = arrayIntA.data; | |
| var dataB = arrayIntB.data; | |
| for (var indexA = dataA.length - 1, indexB = dataB.length - 1; indexA >= 0 || indexB >= 0; --indexA, --indexB) { | |
| var vA = indexA >= 0 ? dataA[indexA] : 0; | |
| var vB = indexB >= 0 ? dataB[indexB] : 0; | |
| var current = vA + vB + reminder; | |
| data.push(current >>> 0); | |
| reminder = ~~(current / 0x100000000); | |
| } | |
| if (reminder !== 0) { | |
| data.push(reminder); | |
| } | |
| return { sign: arrayIntA.sign, data: data.reverse() }; | |
| } | |
| export function addOneToPositiveArrayInt(arrayInt) { | |
| arrayInt.sign = 1; | |
| var data = arrayInt.data; | |
| for (var index = data.length - 1; index >= 0; --index) { | |
| if (data[index] === 0xffffffff) { | |
| data[index] = 0; | |
| } | |
| else { | |
| data[index] += 1; | |
| return arrayInt; | |
| } | |
| } | |
| data.unshift(1); | |
| return arrayInt; | |
| } | |
| function isStrictlySmaller(dataA, dataB) { | |
| var maxLength = Math.max(dataA.length, dataB.length); | |
| for (var index = 0; index < maxLength; ++index) { | |
| var indexA = index + dataA.length - maxLength; | |
| var indexB = index + dataB.length - maxLength; | |
| var vA = indexA >= 0 ? dataA[indexA] : 0; | |
| var vB = indexB >= 0 ? dataB[indexB] : 0; | |
| if (vA < vB) | |
| return true; | |
| if (vA > vB) | |
| return false; | |
| } | |
| return false; | |
| } | |
| export function substractArrayIntToNew(arrayIntA, arrayIntB) { | |
| if (arrayIntA.sign !== arrayIntB.sign) { | |
| return addArrayIntToNew(arrayIntA, { sign: -arrayIntB.sign, data: arrayIntB.data }); | |
| } | |
| var dataA = arrayIntA.data; | |
| var dataB = arrayIntB.data; | |
| if (isStrictlySmaller(dataA, dataB)) { | |
| var out = substractArrayIntToNew(arrayIntB, arrayIntA); | |
| out.sign = -out.sign; | |
| return out; | |
| } | |
| var data = []; | |
| var reminder = 0; | |
| for (var indexA = dataA.length - 1, indexB = dataB.length - 1; indexA >= 0 || indexB >= 0; --indexA, --indexB) { | |
| var vA = indexA >= 0 ? dataA[indexA] : 0; | |
| var vB = indexB >= 0 ? dataB[indexB] : 0; | |
| var current = vA - vB - reminder; | |
| data.push(current >>> 0); | |
| reminder = current < 0 ? 1 : 0; | |
| } | |
| return { sign: arrayIntA.sign, data: data.reverse() }; | |
| } | |
| export function trimArrayIntInplace(arrayInt) { | |
| var data = arrayInt.data; | |
| var firstNonZero = 0; | |
| for (; firstNonZero !== data.length && data[firstNonZero] === 0; ++firstNonZero) { } | |
| if (firstNonZero === data.length) { | |
| arrayInt.sign = 1; | |
| arrayInt.data = [0]; | |
| return arrayInt; | |
| } | |
| data.splice(0, firstNonZero); | |
| return arrayInt; | |
| } | |
| export function fromNumberToArrayInt64(out, n) { | |
| if (n < 0) { | |
| var posN = -n; | |
| out.sign = -1; | |
| out.data[0] = ~~(posN / 0x100000000); | |
| out.data[1] = posN >>> 0; | |
| } | |
| else { | |
| out.sign = 1; | |
| out.data[0] = ~~(n / 0x100000000); | |
| out.data[1] = n >>> 0; | |
| } | |
| return out; | |
| } | |
| export function substractArrayInt64(out, arrayIntA, arrayIntB) { | |
| var lowA = arrayIntA.data[1]; | |
| var highA = arrayIntA.data[0]; | |
| var signA = arrayIntA.sign; | |
| var lowB = arrayIntB.data[1]; | |
| var highB = arrayIntB.data[0]; | |
| var signB = arrayIntB.sign; | |
| out.sign = 1; | |
| if (signA === 1 && signB === -1) { | |
| var low_1 = lowA + lowB; | |
| var high = highA + highB + (low_1 > 0xffffffff ? 1 : 0); | |
| out.data[0] = high >>> 0; | |
| out.data[1] = low_1 >>> 0; | |
| return out; | |
| } | |
| var lowFirst = lowA; | |
| var highFirst = highA; | |
| var lowSecond = lowB; | |
| var highSecond = highB; | |
| if (signA === -1) { | |
| lowFirst = lowB; | |
| highFirst = highB; | |
| lowSecond = lowA; | |
| highSecond = highA; | |
| } | |
| var reminderLow = 0; | |
| var low = lowFirst - lowSecond; | |
| if (low < 0) { | |
| reminderLow = 1; | |
| low = low >>> 0; | |
| } | |
| out.data[0] = highFirst - highSecond - reminderLow; | |
| out.data[1] = low; | |
| return out; | |
| } | |