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

java.lang.Integer Maven / Gradle / Ivy

Go to download

JVM AOT compiler currently generating JavaScript, C++, Haxe, with initial focus on Kotlin and games.

There is a newer version: 0.6.8
Show newest version
/*
 * Copyright 2016 Carlos Ballesteros Velasco
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package java.lang;

import com.jtransc.annotation.JTranscKeep;
import com.jtransc.annotation.JTranscMethodBody;
import com.jtransc.annotation.haxe.HaxeMethodBody;
import com.jtransc.internal.JTranscCType;

@SuppressWarnings({"WeakerAccess", "unused", "NullableProblems"})
public final class Integer extends Number implements Comparable {
	public static final int MIN_VALUE = 0x80000000;
	public static final int MAX_VALUE = 0x7fffffff;

	@SuppressWarnings("unchecked")
	public static final Class TYPE = (Class) Class.getPrimitiveClass("int");

	private int value;

	public Integer(int value) {
		this.value = value;
	}

	public Integer(String s) {
		this.value = parseInt(s, 10);
	}

	static private char[] temp = new char[32 + 1];

	@HaxeMethodBody(target = "js", value = "return N.str(untyped __js__('p0.toString(p1)'));")
	@JTranscMethodBody(target = "js", value = "return N.str((p0|0).toString(p1));")
	//@JTranscMethodBody(target = "cpp", value = "wchar_t temp[64] = {0}; ::_itow_s(p0, temp, sizeof(temp), p1); return N::str(std::wstring(temp));")
	public static String toString(int i, int radix) {
		if (radix < 2) throw new RuntimeException("Invalid radix");
		if (i == 0) return "0";
		//if (i == MIN_VALUE) return "-2147483648";
		boolean negative = (i < 0);
		if (i < 0) i = -i;
		int tempPos = temp.length;
		while (i != 0) {
			temp[--tempPos] = JTranscCType.encodeDigit(Integer.remainderUnsigned(i, radix));
			i = Integer.divideUnsigned(i, radix);
		}
		if (negative) temp[--tempPos] = '-';
		return new String(temp, tempPos, temp.length - tempPos);
	}

	@JTranscMethodBody(target = "js", value = "return N.str((p0 >>> 0).toString(p1));")
	public static String toUnsignedString(int i, int radix) {
		if (i == 0) return "0";
		StringBuilder out = new StringBuilder();
		while (i != 0) {
			out.append(JTranscCType.encodeDigit(Integer.remainderUnsigned(i, radix)));
			i = Integer.divideUnsigned(i, radix);
		}
		out.reverse();
		return out.toString();
	}

	public static String toHexString(int i) {
		return toUnsignedString(i, 16);
	}

	public static String toOctalString(int i) {
		return toUnsignedString(i, 8);
	}

	public static String toBinaryString(int i) {
		return toUnsignedString(i, 2);
	}

	public static String toString(int i) {
		return toString(i, 10);
	}

	public static String toUnsignedString(int i) {
		return toUnsignedString(i, 10);
	}

	//@JTranscMethodBody(target = "js", value = "return parseInt(p0, p1);")
	public static int parseInt(String input, int radix) {
		String s = input;
		int result = 0;
		int sign = +1;
		if (s.startsWith("-")) {
			sign = -1;
			s = s.substring(1);
		} else if (s.startsWith("+")) {
			sign = +1;
			s = s.substring(1);
		}
		int len = s.length();
		for (int n = 0; n < len; n++) {
			char c = s.charAt(n);
			if (!JTranscCType.isDigit(c)) {
				throw new NumberFormatException("For input string: \"" + input + "\"");
			}
			result *= radix;
			result += JTranscCType.decodeDigit(c);
			//System.out.println(c + ": " + JTranscCType.decodeDigit(c));
		}
		return sign * result;
	}


	public static int parseInt(String s) {
		return parseInt(s, 10);
	}

	public static int parseUnsignedInt(String s, int radix) {
		return parseInt(s, radix);
	}

	public static int parseUnsignedInt(String s) {
		return parseUnsignedInt(s, 10);
	}

	public static Integer valueOf(String s, int radix) {
		return parseInt(s, radix);
	}

	public static Integer valueOf(String s) {
		return valueOf(s, 10);
	}

	static private Integer[] values;

	static private final int MIN = -128;
	static private final int MAX = 128;
	static private final int LENGTH = MAX - MIN;

	@SuppressWarnings("UnnecessaryBoxing")
	@JTranscKeep
	public static Integer valueOf(int i) {
		if (values == null) {
			values = new Integer[LENGTH];
			for (int n = MIN; n < MAX; n++) {
				values[n - MIN] = new Integer(n);
			}
		}
		if (i >= MIN && i < MAX) {
			return values[i - MIN];
		} else {
			return new Integer(i);
		}
	}

	public byte byteValue() {
		return (byte) value;
	}

	public short shortValue() {
		return (short) value;
	}

	public int intValue() {
		return value;
	}

	public long longValue() {
		return (long) value;
	}

	public float floatValue() {
		return (float) value;
	}

	public double doubleValue() {
		return (double) value;
	}

	public String toString() {
		return toString(value);
	}

	@Override
	public int hashCode() {
		return value;
	}

	public static int hashCode(int value) {
		return value;
	}

	public boolean equals(Object obj) {
		return obj instanceof Integer && ((Integer) obj).value == value;
	}

	public static Integer getInteger(String nm) {
		return getInteger(nm, null);
	}

	public static Integer getInteger(String nm, int val) {
		Integer result = getInteger(nm, null);
		return (result == null) ? new Integer(val) : result;
	}

	public static Integer getInteger(String nm, Integer val) {
		String out = System.getProperty(nm);
		if (out == null) return val;
		try {
			return decode(nm);
		} catch (NumberFormatException e) {
			return val;
		}
	}

	public static Integer decode(String nm) throws NumberFormatException {
		if (nm.length() == 0) throw new NumberFormatException("Zero length string");
		if (nm.startsWith("-")) return -decode(nm.substring(1));
		if (nm.startsWith("+")) return decode(nm.substring(1));
		if (nm.startsWith("0x")) return parseInt(nm.substring(2), 16);
		if (nm.startsWith("0X")) return parseInt(nm.substring(2), 16);
		if (nm.startsWith("#")) return parseInt(nm.substring(1), 16);
		if (nm.startsWith("0")) return parseInt(nm.substring(1), 8);
		return parseInt(nm, 10);
	}

	public int compareTo(Integer anotherInteger) {
		return Integer.compare(value, anotherInteger.value);
	}

	@JTranscMethodBody(target = "js", value = "return (p0 < p1) ? -1 : ((p0 > p1) ? 1 : 0);")
	@JTranscMethodBody(target = "cpp", value = "return (p0 < p1) ? -1 : ((p0 > p1) ? 1 : 0);")
	public static int compare(int l, int r) {
		return (l < r) ? -1 : ((l > r) ? 1 : 0);
	}

	public static int compareUnsigned(int l, int r) {
		return compare(l ^ MIN_VALUE, r ^ MIN_VALUE);
	}

	public static long toUnsignedLong(int value) {
		return ((long) value) & 0xffffffffL;
	}

	@JTranscMethodBody(target = "cpp", value = "return (int32_t)((uint32_t)p0 / (uint32_t)p1);")
	public static int divideUnsigned(int dividend, int divisor) {
		//return (int) (toUnsignedLong(dividend) / toUnsignedLong(divisor));
		if (divisor < 0) return (compareUnsigned(dividend, divisor) < 0) ? 0 : 1;
		if (dividend >= 0) return dividend / divisor;
		int quotient = ((dividend >>> 1) / divisor) << 1;
		int rem = dividend - quotient * divisor;
		return quotient + (compareUnsigned(rem, divisor) >= 0 ? 1 : 0);
	}

	@JTranscMethodBody(target = "cpp", value = "return (int32_t)((uint32_t)p0 % (uint32_t)p1);")
	public static int remainderUnsigned(int dividend, int divisor) {
		//return (int) (toUnsignedLong(dividend) % toUnsignedLong(divisor));
		if (divisor < 0) return (compareUnsigned(dividend, divisor) < 0) ? dividend : (dividend - divisor);
		if (dividend >= 0) return dividend % divisor;
		int quotient = ((dividend >>> 1) / divisor) << 1;
		int rem = dividend - quotient * divisor;
		return rem - (compareUnsigned(rem, divisor) >= 0 ? divisor : 0);
	}

	public static final int SIZE = 32;
	public static final int BYTES = SIZE / Byte.SIZE;

	public static int highestOneBit(int i) {
		// Hacker's Delight, Figure 3-1
		i |= (i >> 1);
		i |= (i >> 2);
		i |= (i >> 4);
		i |= (i >> 8);
		i |= (i >> 16);
		return i - (i >>> 1);
	}

	public static int lowestOneBit(int i) {
		return i & -i;
	}

	@JTranscMethodBody(target = "js", value = "return Math.clz32(p0);")
	public static int numberOfLeadingZeros(int i) {
		// Hacker's Delight, Figure 5-6
		if (i <= 0) {
			return (~i >> 26) & 32;
		}
		int n = 1;
		if (i >> 16 == 0) {
			n += 16;
			i <<= 16;
		}
		if (i >> 24 == 0) {
			n += 8;
			i <<= 8;
		}
		if (i >> 28 == 0) {
			n += 4;
			i <<= 4;
		}
		if (i >> 30 == 0) {
			n += 2;
			i <<= 2;
		}
		return n - (i >>> 31);
	}

	public static int numberOfTrailingZeros(int i) {
		return NTZ_TABLE[((i & -i) * 0x0450FBAF) >>> 26];
	}

	private static final byte[] NTZ_TABLE = {
		32, 0, 1, 12, 2, 6, -1, 13, 3, -1, 7, -1, -1, -1, -1, 14,
		10, 4, -1, -1, 8, -1, -1, 25, -1, -1, -1, -1, -1, 21, 27, 15,
		31, 11, 5, -1, -1, -1, -1, -1, 9, -1, -1, 24, -1, -1, 20, 26,
		30, -1, -1, -1, -1, 23, -1, 19, 29, -1, 22, 18, 28, 17, 16, -1
	};

	public static int bitCount(int i) {
		// Hacker's Delight, Figure 5-2
		i -= (i >> 1) & 0x55555555;
		i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
		i = ((i >> 4) + i) & 0x0F0F0F0F;
		i += i >> 8;
		i += i >> 16;
		return i & 0x0000003F;
	}

	public static int rotateLeft(int value, int distance) {
		return (value << distance) | (value >>> -distance);
	}

	public static int rotateRight(int value, int distance) {
		return (value >>> distance) | (value << -distance);
	}

	public static int reverse(int i) {
		// Hacker's Delight 7-1, with minor tweak from Veldmeijer
		// http://graphics.stanford.edu/~seander/bithacks.html
		i = ((i >>> 1) & 0x55555555) | ((i & 0x55555555) << 1);
		i = ((i >>> 2) & 0x33333333) | ((i & 0x33333333) << 2);
		i = ((i >>> 4) & 0x0F0F0F0F) | ((i & 0x0F0F0F0F) << 4);
		i = ((i >>> 8) & 0x00FF00FF) | ((i & 0x00FF00FF) << 8);
		return ((i >>> 16)) | ((i) << 16);
	}

	public static int signum(int value) {
		return (value >> 31) | (-value >>> 31);
	}

	@HaxeMethodBody("return N.swap32(p0);")
	public static int reverseBytes(int value) {
		return ((value >>> 24)) | ((value >> 8) & 0xFF00) | ((value << 8) & 0xFF0000) | ((value << 24));
	}

	public static int sum(int l, int r) {
		return l + r;
	}

	public static int max(int l, int r) {
		return Math.max(l, r);
	}

	public static int min(int l, int r) {
		return Math.min(l, r);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy