All Downloads are FREE. Search and download functionalities are using the official Maven repository.

odeling.j2ts.transpiler.62.source-code.java.ts Maven / Gradle / Ivy

There is a newer version: 82
Show newest version
module java {
    export module lang {
        export class System {
            static gc() {
            }

            static arraycopy(src:any[]| Float64Array | Int32Array, srcPos:number, dest:any[]| Float64Array | Int32Array, destPos:number, numElements:number):void {
                if ((dest instanceof Float64Array || dest instanceof Int32Array)
                    && (src instanceof Float64Array || src instanceof Int32Array)) {
                    if (numElements == src.length) {
                        dest.set(src, destPos);
                    } else {
                        dest.set(src.subarray(srcPos, srcPos + numElements), destPos);
                    }
                } else {
                    for (var i = 0; i < numElements; i++) {
                        dest[destPos + i] = src[srcPos + i];
                    }
                }
            }
        }

        export class StringBuilder {
            private _buffer:string = "";
            public length = 0;

            append(val:any):StringBuilder {
                this._buffer = this._buffer + val;
                this.length = this._buffer.length;
                return this;
            }

            insert(position:number, val:any):StringBuilder {
                this._buffer = this._buffer.slice(0, position) + val + this._buffer.slice(position);

                return this;
            }

            toString():string {
                return this._buffer;
            }
        }

        export class String {
            static valueOf(data:any, offset?:number, count?:number):string {
                if (typeof offset === 'undefined' && typeof count === 'undefined') {
                    return data + '';
                } else {
                    return data.slice(offset, offset + count);
                }
            }

            static hashCode(str:string):number {
                var h:number = str['_hashCode'] ? str['_hashCode'] : 0;
                if (h === 0 && str.length > 0) {
                    var val:string = str;

                    for (var i:number = 0; i < str.length; i++) {
                        h = 31 * h + str.charCodeAt(i);
                    }
                    str['_hashCode'] = h;
                }
                return h;
            }

            static isEmpty(str:string):boolean {
                return str.length === 0;
            }

            static join(delimiter:string, ...elements:string[]):string {
                return elements.join(delimiter);
            }
        }

        export class Thread {
            static sleep(time:number):void {

            }
        }
        export class Double {
            public static MAX_VALUE:number = Number.MAX_VALUE;
            public static POSITIVE_INFINITY : number = Number.POSITIVE_INFINITY;
            public static NEGATIVE_INFINITY : number = Number.NEGATIVE_INFINITY;
            public static NaN = NaN;
        }
    }

    export namespace util {
        export namespace concurrent {
            export namespace atomic {
                export class AtomicIntegerArray {
                    _internal:Int32Array;

                    constructor(p:Int32Array) {
                        this._internal = p;
                    }

                    set(index:number, newVal:number) {
                        this._internal[index] = newVal;
                    }

                    get(index:number) {
                        return this._internal[index];
                    }

                    getAndSet(index:number, newVal:number) {
                        var temp = this._internal[index];
                        this._internal[index] = newVal;
                        return temp;
                    }

                    compareAndSet(index:number, expect:number, update:number):boolean {
                        if (this._internal[index] == expect) {
                            this._internal[index] = update;
                            return true;
                        } else {
                            return false;
                        }
                    }

                }

                export class AtomicReference {
                    _internal:A = null;

                    compareAndSet(expect:A, update:A):boolean {
                        if (this._internal == expect) {
                            this._internal = update;
                            return true;
                        } else {
                            return false;
                        }
                    }

                    get():A {
                        return this._internal
                    }

                    set(newRef:A) {
                        this._internal = newRef;
                    }

                    getAndSet(newVal:A):A {
                        var temp = this._internal;
                        this._internal = newVal;
                        return temp;
                    }
                }

                export class AtomicLong {
                    _internal = 0;

                    constructor(init:number) {
                        this._internal = init;
                    }

                    compareAndSet(expect:number, update:number):boolean {
                        if (this._internal == expect) {
                            this._internal = update;
                            return true;
                        } else {
                            return false;
                        }
                    }

                    get():number {
                        return this._internal;
                    }

                    incrementAndGet():number {
                        this._internal++;
                        return this._internal;
                    }

                    decrementAndGet():number {
                        this._internal--;
                        return this._internal;
                    }
                }

                export class AtomicBoolean {
                    _internal = false;

                    constructor(init:boolean) {
                        this._internal = init;
                    }

                    compareAndSet(expect:boolean, update:boolean):boolean {
                        if (this._internal == expect) {
                            this._internal = update;
                            return true;
                        } else {
                            return false;
                        }
                    }

                    get():boolean {
                        return this._internal;
                    }

                    set(newVal:boolean) {
                        this._internal = newVal
                    }

                }

                export class AtomicInteger {
                    _internal = 0;

                    constructor(init:number) {
                        this._internal = init;
                    }

                    compareAndSet(expect:number, update:number):boolean {
                        if (this._internal == expect) {
                            this._internal = update;
                            return true;
                        } else {
                            return false;
                        }
                    }

                    get():number {
                        return this._internal;
                    }

                    set(newVal:number) {
                        this._internal = newVal
                    }

                    getAndSet(newVal:number):number {
                        var temp = this._internal;
                        this._internal = newVal;
                        return temp;
                    }

                    incrementAndGet():number {
                        this._internal++;
                        return this._internal;
                    }

                    decrementAndGet():number {
                        this._internal--;
                        return this._internal;
                    }

                    getAndIncrement():number {
                        var temp = this._internal;
                        this._internal++;
                        return temp;
                    }

                    getAndDecrement():number {
                        var temp = this._internal;
                        this._internal--;
                        return temp;
                    }
                }
            }
            export namespace locks {
                export class ReentrantLock {
                    public lock():void {

                    }

                    public unlock():void {

                    }
                }
            }
        }

        export class Random {
            public nextInt(max?:number):number {
                if (typeof max === 'undefined') {
                    max = Math.pow(2, 32);
                }
                return Math.floor(Math.random() * max);
            }

            public nextDouble():number {
                return Math.random();
            }

            public nextBoolean():boolean {
                return Math.random() >= 0.5;
            }
        }

        export interface Iterator {
            hasNext():boolean;
            next():E;
        }

        export class Arrays {
            public static fill(data:any, begin:number, nbElem:number, param:number):void {
                var max = begin + nbElem;
                for (var i = begin; i < max; i++) {
                    data[i] = param;
                }
            }

            public static copyOf(original:any[], newLength:number, ignore?:any):T[] {
                var copy = new Array(newLength);
                lang.System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
                return copy;
            }
        }

        export class Collections {

            public static swap(list:List, i:number, j:number) {
                const l = list;
                l.set(i, l.set(j, l.get(i)));
            }

        }

        export interface Collection {
            add(val:E):void;
            addAll(vals:Collection):void;
            get(index:number):E;
            remove(o:any):any;
            clear():void;
            isEmpty():boolean;
            size():number;
            contains(o:E):boolean;
            toArray(a:Array):E[];
            iterator():Iterator;
            containsAll(c:Collection):boolean;
            addAll(c:Collection):boolean;
            removeAll(c:Collection):boolean;

        }

        export interface List extends Collection {
            add(elem:E):void;
            add(index:number, elem:E):void;
            poll():E;
            addAll(c:Collection):boolean;
            addAll(index:number, c:Collection):boolean;
            get(index:number):E;
            set(index:number, element:E):E;
            indexOf(o:E):number;
            lastIndexOf(o:E):number;
            remove(index:number):E;
        }

        export interface Set extends Collection {
            forEach(f:(e:any)=>void):void;
        }

        export class Itr implements Iterator {
            public cursor:number = 0;
            public lastRet:number = -1;
            protected list:Collection;

            constructor(list:Collection) {
                this.list = list;
            }

            public hasNext():boolean {
                return this.cursor != this.list.size();
            }

            public next():E {
                try {
                    var i:number = this.cursor;
                    var next:E = this.list.get(i);
                    this.lastRet = i;
                    this.cursor = i + 1;
                    return next;
                } catch ($ex$) {
                    if ($ex$ instanceof Error) {
                        var e:Error = $ex$;
                        throw new Error("no such element exception");
                    } else {
                        throw $ex$;
                    }
                }
            }
        }

        export class HashSet implements Set {
            private content = {};

            add(val:E) {
                this.content[val] = val;
            }

            clear() {
                this.content = {};
            }

            contains(val:E):boolean {
                return this.content.hasOwnProperty(val);
            }

            containsAll(elems:Collection):boolean {
                return false;
            }

            addAll(vals:Collection):boolean {
                var tempArray = vals.toArray(null);
                for (var i = 0; i < tempArray.length; i++) {
                    this.content[tempArray[i]] = tempArray[i];
                }
                return true;
            }

            remove(val:E):boolean {
                var b = false;
                if (this.content[val]) {
                    b = true;
                }
                delete this.content[val];
                return b;
            }

            removeAll():boolean {
                return false;
            }

            size():number {
                return Object.keys(this.content).length;
            }

            isEmpty():boolean {
                return this.size() == 0;
            }

            toArray(a:Array):E[] {
                return Object.keys(this.content).map(key => this.content[key]);
            }

            iterator():Iterator {
                return new java.util.Itr(this);
            }

            forEach(f:(e:any)=>void):void {
                for (var p in this.content) {
                    f(this.content[p]);
                }
            }

            get(index:number):E {
                return this.content[index];
            }
        }


        export class AbstractList implements List {
            private content:E[] = [];

            addAll(index:any, vals?:any):boolean {
                var tempArray = vals.toArray(null);
                for (var i = 0; i < tempArray.length; i++) {
                    this.content.push(tempArray[i]);
                }
                return false;
            }

            clear() {
                this.content = [];
            }

            poll():E {
                return this.content.shift();
            }

            remove(indexOrElem:any):any {
                this.content.splice(indexOrElem, 1);
                return true;
            }

            removeAll():boolean {
                this.content = [];
                return true;
            }

            toArray(a:Array):E[] {
                return this.content;
            }

            size():number {
                return this.content.length;
            }

            add(index:any, elem?:E) {
                if (typeof elem !== 'undefined') {
                    this.content.splice(index, 0, elem);
                } else {
                    this.content.push(index);
                }
            }

            get(index:number):E {
                return this.content[index];
            }

            contains(val:E):boolean {
                return this.content.indexOf(val) != -1;
            }

            containsAll(elems:Collection):boolean {
                return false;
            }

            isEmpty():boolean {
                return this.content.length == 0;
            }

            set(index:number, element:E):E {
                this.content[index] = element;
                return element;
            }

            indexOf(element:E):number {
                return this.content.indexOf(element);
            }

            lastIndexOf(element:E):number {
                return this.content.lastIndexOf(element);
            }

            iterator():Iterator {
                return new Itr(this);
            }

        }

        export class LinkedList extends AbstractList {
        }
        export class ArrayList extends AbstractList {
        }

        export class Stack {
            content = new Array();

            pop():E {
                return this.content.pop();
            }

            push(t:E):void {
                this.content.push(t);
            }

            isEmpty():boolean {
                return this.content.length == 0;
            }

            peek():E {
                return this.content.slice(-1)[0];
            }
        }

        export interface Map {
            get(key:K):V;
            put(key:K, value:V):V;
            containsKey(key:K):boolean;
            remove(key:K):V;
            keySet():Set;
            isEmpty():boolean;
            values():Set;
            clear():void;
            size():number;
        }

        export class HashMap implements Map {

            private content = {};

            get(key:K):V {
                return this.content[key];
            }

            put(key:K, value:V):V {
                var previous_val = this.content[key];
                this.content[key] = value;
                return previous_val;
            }

            containsKey(key:K):boolean {
                return this.content.hasOwnProperty(key);
            }

            remove(key:K):V {
                var tmp = this.content[key];
                delete this.content[key];
                return tmp;
            }

            keySet():Set {
                var result = new HashSet();
                for (var p in this.content) {
                    if (this.content.hasOwnProperty(p)) {
                        result.add( p);
                    }
                }
                return > result;
            }

            isEmpty():boolean {
                return Object.keys(this.content).length == 0;
            }

            values():Set {
                var result = new HashSet();
                for (var p in this.content) {
                    if (this.content.hasOwnProperty(p)) {
                        result.add(this.content[p]);
                    }
                }
                return > result;
            }

            clear():void {
                this.content = {};
            }

            size():number {
                return Object.keys(this.content).length
            }
        }
        export class ConcurrentHashMap extends HashMap {

        }
    }
}

function arrayInstanceOf(arr:any, arg:Function):boolean {
    if (!(arr instanceof Array)) {
        return false;
    } else {
        if (arr.length == 0) {
            return true;
        } else {
            return (arr[0] instanceof arg);
        }
    }
}


class Long {

    /*
     long.js (c) 2013 Daniel Wirtz 
     Released under the Apache License, Version 2.0
     see: https://github.com/dcodeIO/long.js for details
     */

    private high:number = 0;
    private low:number = 0;
    private unsigned:boolean = false;

    private static INT_CACHE = {};
    private static UINT_CACHE = {};
    private static pow_dbl = Math.pow;


    private static TWO_PWR_16_DBL = 1 << 16;
    private static TWO_PWR_24_DBL = 1 << 24;
    private static TWO_PWR_32_DBL = Long.TWO_PWR_16_DBL * Long.TWO_PWR_16_DBL;
    private static TWO_PWR_64_DBL = Long.TWO_PWR_32_DBL * Long.TWO_PWR_32_DBL;
    private static TWO_PWR_63_DBL = Long.TWO_PWR_64_DBL / 2;
    private static TWO_PWR_24 = Long.fromInt(Long.TWO_PWR_24_DBL);

    public static ZERO:Long = Long.fromInt(0);
    public static UZERO:Long = Long.fromInt(0, true);
    public static ONE:Long = Long.fromInt(1);
    public static UONE:Long = Long.fromInt(1, true);
    public static NEG_ONE:Long = Long.fromInt(-1);
    public static MAX_VALUE:Long = Long.fromBits(0x7FFFFFFF, 0xFFFFFFFF, false);
    public static MAX_UNSIGNED_VALUE:Long = Long.fromBits(0xFFFFFFFF, 0xFFFFFFFF, true);
    public static MIN_VALUE:Long = Long.fromBits(0x80000000, 0, false);


    constructor(low ?:number, high ?:number, unsigned ?:boolean) {
        if (!(high == undefined)) {
            this.high = high;
        }
        if (!(low == undefined)) {
            this.low = low;
        }
        if (!(unsigned == undefined)) {
            this.unsigned = unsigned;
        }
    }

    public static isLong(obj:any):boolean {
        return (obj && obj["__isLong__"]) === true;
    }

    public static fromInt(value:number, unsigned ?:boolean):Long {
        var obj, cachedObj, cache;
        if (unsigned) {
            value >>>= 0;
            if (cache = (0 <= value && value < 256)) {
                cachedObj = Long.UINT_CACHE[value];
                if (cachedObj)
                    return cachedObj;
            }
            obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true);
            if (cache)
                Long.UINT_CACHE[value] = obj;
            return obj;
        } else {
            value |= 0;
            if (cache = (-128 <= value && value < 128)) {
                cachedObj = Long.INT_CACHE[value];
                if (cachedObj)
                    return cachedObj;
            }
            obj = Long.fromBits(value, value < 0 ? -1 : 0, false);
            if (cache)
                Long.INT_CACHE[value] = obj;
            return obj;
        }
    }

    public static fromNumber(value:number, unsigned ?:boolean):Long {
        if (isNaN(value) || !isFinite(value))
            return unsigned ? Long.UZERO : Long.ZERO;
        if (unsigned) {
            if (value < 0)
                return Long.UZERO;
            if (value >= Long.TWO_PWR_64_DBL)
                return Long.MAX_UNSIGNED_VALUE;
        } else {
            if (value <= -Long.TWO_PWR_63_DBL)
                return Long.MIN_VALUE;
            if (value + 1 >= Long.TWO_PWR_63_DBL)
                return Long.MAX_VALUE;
        }
        if (value < 0)
            return Long.fromNumber(-value, unsigned).neg();
        return Long.fromBits((value % Long.TWO_PWR_32_DBL) | 0, (value / Long.TWO_PWR_32_DBL) | 0, unsigned);
    }

    public static fromBits(lowBits ?:number, highBits ?:number, unsigned ?:boolean):Long {
        return new Long(lowBits, highBits, unsigned);
    }

    public static fromString(str:string, radix:number = 10, unsigned:boolean = false):Long {
        if (str.length === 0)
            throw Error('empty string');
        if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity")
            return Long.ZERO;
        radix = radix || 10;
        if (radix < 2 || 36 < radix)
            throw RangeError('radix');

        var p;
        if ((p = str.indexOf('-')) > 0)
            throw Error('interior hyphen');
        else if (p === 0) {
            return Long.fromString(str.substring(1), radix, unsigned).neg();
        }

        // Do several (8) digits each time through the loop, so as to
        // minimize the calls to the very expensive emulated div.
        var radixToPower = Long.fromNumber(Long.pow_dbl(radix, 8));

        var result = Long.ZERO;
        for (var i = 0; i < str.length; i += 8) {
            var size = Math.min(8, str.length - i),
                value = parseInt(str.substring(i, i + size), radix);
            if (size < 8) {
                var power = Long.fromNumber(Long.pow_dbl(radix, size));
                result = result.mul(power).add(Long.fromNumber(value));
            } else {
                result = result.mul(radixToPower);
                result = result.add(Long.fromNumber(value));
            }
        }
        result.unsigned = unsigned;
        return result;
    }

    public static  fromValue(val:any):Long {
        if (val /* is compatible */ instanceof Long)
            return val;
        if (typeof val === 'number')
            return Long.fromNumber(val);
        if (typeof val === 'string')
            return Long.fromString(val);
        // Throws for non-objects, converts non-instanceof Long:
        return Long.fromBits(val.low, val.high, val.unsigned);
    }


    public toInt():number {
        return this.unsigned ? this.low >>> 0 : this.low;
    };

    public toNumber():number {
        if (this.unsigned)
            return ((this.high >>> 0) * Long.TWO_PWR_32_DBL) + (this.low >>> 0);
        return this.high * Long.TWO_PWR_32_DBL + (this.low >>> 0);
    };

    public toString(radix:number):string {
        radix = radix || 10;
        if (radix < 2 || 36 < radix)
            throw RangeError('radix');
        if (this.isZero())
            return '0';
        if (this.isNegative()) { // Unsigned Longs are never negative
            if (this.eq(Long.MIN_VALUE)) {
                // We need to change the Long value before it can be negated, so we remove
                // the bottom-most digit in this base and then recurse to do the rest.
                var radixLong = Long.fromNumber(radix),
                    div = this.div(radixLong),
                    rem1 = div.mul(radixLong).sub(this);
                return div.toString(radix) + rem1.toInt().toString(radix);
            } else
                return '-' + this.neg().toString(radix);
        }

        // Do several (6) digits each time through the loop, so as to
        // minimize the calls to the very expensive emulated div.
        var radixToPower = Long.fromNumber(Long.pow_dbl(radix, 6), this.unsigned);
        var rem:Long = this;
        var result = '';
        while (true) {
            var remDiv = rem.div(radixToPower);
            var intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0;
            var digits = intval.toString(radix);
            rem = remDiv;
            if (rem.isZero())
                return digits + result;
            else {
                while (digits.length < 6)
                    digits = '0' + digits;
                result = '' + digits + result;
            }
        }
    };

    public getHighBits():number {
        return this.high;
    };

    public getHighBitsUnsigned():number {
        return this.high >>> 0;
    };

    public getLowBits():number {
        return this.low;
    };

    public getLowBitsUnsigned():number {
        return this.low >>> 0;
    };

    public getNumBitsAbs():number {
        if (this.isNegative()) // Unsigned Longs are never negative
            return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
        var val = this.high != 0 ? this.high : this.low;
        for (var bit = 31; bit > 0; bit--)
            if ((val & (1 << bit)) != 0)
                break;
        return this.high != 0 ? bit + 33 : bit + 1;
    };

    public isZero():boolean {
        return this.high === 0 && this.low === 0;
    };

    public isNegative():boolean {
        return !this.unsigned && this.high < 0;
    };

    public isPositive():boolean {
        return this.unsigned || this.high >= 0;
    };

    public isOdd():boolean {
        return (this.low & 1) === 1;
    };

    public isEven():boolean {
        return (this.low & 1) === 0;
    };

    public equals(other:any):boolean {
        if (!Long.isLong(other))
            other = Long.fromValue(other);
        if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)
            return false;
        return this.high === other.high && this.low === other.low;
    };

    public eq = this.equals;

    public notEquals(other:any):boolean {
        return !this.eq(other);
    };

    public neq = this.notEquals;

    public lessThan(other:any):boolean {
        return this.comp(other) < 0;
    };

    public lt = this.lessThan;

    public lessThanOrEqual(other:any):boolean {
        return this.comp(other) <= 0;
    };

    public lte = this.lessThanOrEqual;

    public greaterThan(other:any):boolean {
        return this.comp(other) > 0;
    };

    public gt = this.greaterThan;

    public greaterThanOrEqual(other:any):boolean {
        return this.comp(other) >= 0;
    };

    public gte = this.greaterThanOrEqual;

    public compare(other:any):number {
        if (!Long.isLong(other))
            other = Long.fromValue(other);
        if (this.eq(other))
            return 0;
        var thisNeg = this.isNegative(),
            otherNeg = other.isNegative();
        if (thisNeg && !otherNeg)
            return -1;
        if (!thisNeg && otherNeg)
            return 1;
        // At this point the sign bits are the same
        if (!this.unsigned)
            return this.sub(other).isNegative() ? -1 : 1;
        // Both are positive if at least one is unsigned
        return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;
    };

    public comp = this.compare;

    public negate():Long {
        if (!this.unsigned && this.eq(Long.MIN_VALUE))
            return Long.MIN_VALUE;
        return this.not().add(Long.ONE);
    };

    public neg = this.negate;

    public add(addend:any):Long {
        if (!Long.isLong(addend)) {
            addend = Long.fromValue(addend);
        }

        // Divide each number into 4 chunks of 16 bits, and then sum the chunks.

        var a48 = this.high >>> 16;
        var a32 = this.high & 0xFFFF;
        var a16 = this.low >>> 16;
        var a00 = this.low & 0xFFFF;

        var b48 = addend.high >>> 16;
        var b32 = addend.high & 0xFFFF;
        var b16 = addend.low >>> 16;
        var b00 = addend.low & 0xFFFF;

        var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
        c00 += a00 + b00;
        c16 += c00 >>> 16;
        c00 &= 0xFFFF;
        c16 += a16 + b16;
        c32 += c16 >>> 16;
        c16 &= 0xFFFF;
        c32 += a32 + b32;
        c48 += c32 >>> 16;
        c32 &= 0xFFFF;
        c48 += a48 + b48;
        c48 &= 0xFFFF;
        return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
    };

    public subtract(subtrahend:any):Long {
        if (!Long.isLong(subtrahend))
            subtrahend = Long.fromValue(subtrahend);
        return this.add(subtrahend.neg());
    };

    public sub = this.subtract;

    public multiply(multiplier:any):Long {
        if (this.isZero())
            return Long.ZERO;
        if (!Long.isLong(multiplier))
            multiplier = Long.fromValue(multiplier);
        if (multiplier.isZero())
            return Long.ZERO;
        if (this.eq(Long.MIN_VALUE))
            return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO;
        if (multiplier.eq(Long.MIN_VALUE))
            return this.isOdd() ? Long.MIN_VALUE : Long.ZERO;

        if (this.isNegative()) {
            if (multiplier.isNegative())
                return this.neg().mul(multiplier.neg());
            else
                return this.neg().mul(multiplier).neg();
        } else if (multiplier.isNegative())
            return this.mul(multiplier.neg()).neg();

        // If both longs are small, use float multiplication
        if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24))
            return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);

        // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
        // We can skip products that would overflow.

        var a48 = this.high >>> 16;
        var a32 = this.high & 0xFFFF;
        var a16 = this.low >>> 16;
        var a00 = this.low & 0xFFFF;

        var b48 = multiplier.high >>> 16;
        var b32 = multiplier.high & 0xFFFF;
        var b16 = multiplier.low >>> 16;
        var b00 = multiplier.low & 0xFFFF;

        var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
        c00 += a00 * b00;
        c16 += c00 >>> 16;
        c00 &= 0xFFFF;
        c16 += a16 * b00;
        c32 += c16 >>> 16;
        c16 &= 0xFFFF;
        c16 += a00 * b16;
        c32 += c16 >>> 16;
        c16 &= 0xFFFF;
        c32 += a32 * b00;
        c48 += c32 >>> 16;
        c32 &= 0xFFFF;
        c32 += a16 * b16;
        c48 += c32 >>> 16;
        c32 &= 0xFFFF;
        c32 += a00 * b32;
        c48 += c32 >>> 16;
        c32 &= 0xFFFF;
        c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
        c48 &= 0xFFFF;
        return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
    };

    public mul = this.multiply;

    public divide(divisor:any):Long {
        if (!Long.isLong(divisor))
            divisor = Long.fromValue(divisor);
        if (divisor.isZero())
            throw Error('division by zero');
        if (this.isZero())
            return this.unsigned ? Long.UZERO : Long.ZERO;
        var approx, rem, res;
        if (!this.unsigned) {
            // This section is only relevant for signed longs and is derived from the
            // closure library as a whole.
            if (this.eq(Long.MIN_VALUE)) {
                if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE))
                    return Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE
                else if (divisor.eq(Long.MIN_VALUE))
                    return Long.ONE;
                else {
                    // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
                    var halfThis = this.shr(1);
                    approx = halfThis.div(divisor).shl(1);
                    if (approx.eq(Long.ZERO)) {
                        return divisor.isNegative() ? Long.ONE : Long.NEG_ONE;
                    } else {
                        rem = this.sub(divisor.mul(approx));
                        res = approx.add(rem.div(divisor));
                        return res;
                    }
                }
            } else if (divisor.eq(Long.MIN_VALUE))
                return this.unsigned ? Long.UZERO : Long.ZERO;
            if (this.isNegative()) {
                if (divisor.isNegative())
                    return this.neg().div(divisor.neg());
                return this.neg().div(divisor).neg();
            } else if (divisor.isNegative())
                return this.div(divisor.neg()).neg();
            res = Long.ZERO;
        } else {
            // The algorithm below has not been made for unsigned longs. It's therefore
            // required to take special care of the MSB prior to running it.
            if (!divisor.unsigned)
                divisor = divisor.toUnsigned();
            if (divisor.gt(this))
                return Long.UZERO;
            if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true
                return Long.UONE;
            res = Long.UZERO;
        }

        // Repeat the following until the remainder is less than other:  find a
        // floating-point that approximates remainder / other *from below*, add this
        // into the result, and subtract it from the remainder.  It is critical that
        // the approximate value is less than or equal to the real value so that the
        // remainder never becomes negative.
        rem = this;
        while (rem.gte(divisor)) {
            // Approximate the result of division. This may be a little greater or
            // smaller than the actual value.
            approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));

            // We will tweak the approximate result by changing it in the 48-th digit or
            // the smallest non-fractional digit, whichever is larger.
            var log2 = Math.ceil(Math.log(approx) / Math.LN2),
                delta = (log2 <= 48) ? 1 : Long.pow_dbl(2, log2 - 48),

            // Decrease the approximation until it is smaller than the remainder.  Note
            // that if it is too large, the product overflows and is negative.
                approxRes = Long.fromNumber(approx),
                approxRem = approxRes.mul(divisor);
            while (approxRem.isNegative() || approxRem.gt(rem)) {
                approx -= delta;
                approxRes = Long.fromNumber(approx, this.unsigned);
                approxRem = approxRes.mul(divisor);
            }

            // We know the answer can't be zero... and actually, zero would cause
            // infinite recursion since we would make no progress.
            if (approxRes.isZero())
                approxRes = Long.ONE;

            res = res.add(approxRes);
            rem = rem.sub(approxRem);
        }
        return res;
    };

    public div = this.divide;

    public modulo(divisor:any):Long {
        if (!Long.isLong(divisor))
            divisor = Long.fromValue(divisor);
        return this.sub(this.div(divisor).mul(divisor));
    };

    public mod = this.modulo;

    public not():Long {
        return Long.fromBits(~this.low, ~this.high, this.unsigned);
    };

    public and(other:any):Long {
        if (!Long.isLong(other))
            other = Long.fromValue(other);
        return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned);
    };

    public or(other:any):Long {
        if (!Long.isLong(other))
            other = Long.fromValue(other);
        return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned);
    };

    public xor(other:any):Long {
        if (!Long.isLong(other))
            other = Long.fromValue(other);
        return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);
    };

    public shiftLeft(numBits):Long {
        if (Long.isLong(numBits))
            numBits = numBits.toInt();
        if ((numBits &= 63) === 0)
            return this;
        else if (numBits < 32)
            return Long.fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);
        else
            return Long.fromBits(0, this.low << (numBits - 32), this.unsigned);
    };

    public shl = this.shiftLeft;

    public shiftRight(numBits):Long {
        if (Long.isLong(numBits))
            numBits = numBits.toInt();
        if ((numBits &= 63) === 0)
            return this;
        else if (numBits < 32)
            return Long.fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);
        else
            return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);
    };

    public shr = this.shiftRight;

    public shiftRightUnsigned(numBits):Long {
        if (Long.isLong(numBits))
            numBits = numBits.toInt();
        numBits &= 63;
        if (numBits === 0)
            return this;
        else {
            var high = this.high;
            if (numBits < 32) {
                var low = this.low;
                return Long.fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);
            } else if (numBits === 32)
                return Long.fromBits(high, 0, this.unsigned);
            else
                return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned);
        }
    };

    public shru = this.shiftRightUnsigned;

    public toSigned():Long {
        if (!this.unsigned)
            return this;
        return Long.fromBits(this.low, this.high, false);
    };

    public toUnsigned():Long {
        if (this.unsigned)
            return this;
        return Long.fromBits(this.low, this.high, true);
    };


}

Object.defineProperty(Long.prototype, "__isLong__", {
    value: true,
    enumerable: false,
    configurable: false
});





© 2015 - 2025 Weber Informatics LLC | Privacy Policy