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

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

The 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 class Long {
            public static parseLong(d: any) {
                return parseInt(d);
            }
        }
        export class Integer {
            public static parseInt(d: any) {
                return parseInt(d);
            }
        }

    }

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

                    constructor(initialCapacity: number) {
                        this._internal = new Int32Array(initialCapacity);
                    }

                    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 AtomicLongArray {
                    _internal: Float64Array;

                    constructor(initialCapacity: number) {
                        this._internal = new Float64Array(initialCapacity);
                    }

                    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;
                        }
                    }

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

                export class AtomicReferenceArray {
                    _internal: Array;

                    constructor(initialCapacity: number) {
                        this._internal = new Array();
                    }

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

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

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

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

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

                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 {
            private seed: number = undefined;

            public nextInt(max?: number): number {
                if (typeof max === 'undefined') {
                    max = Math.pow(2, 32);
                }
                if (this.seed == undefined) {
                    return Math.floor(Math.random() * max);
                } else {
                    return Math.floor(this.nextSeeded(0, max));
                }
            }

            public nextDouble(): number {
                if (this.seed == undefined) {
                    return Math.random();
                } else {
                    return this.nextSeeded();
                }
            }

            public nextBoolean(): boolean {
                if (this.seed == undefined) {
                    return Math.random() >= 0.5;
                } else {
                    return this.nextSeeded() >= 0.5;
                }
            }

            public setSeed(seed: number): void {
                this.seed = seed;
            }

            private nextSeeded(min?: number, max?: number) {
                var max = max || 1;
                var min = min || 0;

                this.seed = (this.seed * 9301 + 49297) % 233280;
                var rnd = this.seed / 233280;

                return min + rnd * (max - min);
            }

            private haveNextNextGaussian : boolean = false;
            private nextNextGaussian : number = 0.;
            public nextGaussian() : number {

                if (this.haveNextNextGaussian) {
                    this.haveNextNextGaussian = false;
                    return this.nextNextGaussian;
                } else {
                    var v1, v2, s;
                    do {
                        v1 = 2 * this.nextDouble() - 1; // between -1 and 1
                        v2 = 2 * this.nextDouble() - 1; // between -1 and 1
                        s = v1 * v1 + v2 * v2;
                    } while (s >= 1 || s == 0);
                    var  multiplier = Math.sqrt(-2 * Math.log(s)/s);
                    this.nextNextGaussian = v2 * multiplier;
                    this.haveNextNextGaussian = true;
                    return v1 * multiplier;
                }
            }

        }

        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