diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 1999-04-07 14:42:40 +0000 |
commit | ee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch) | |
tree | d96801a16fdf03a5682ef98730fe333a46eef944 /libjava/java/lang/Integer.java | |
parent | 140fa895c6b859f827fc4437b91775a82cd105fb (diff) | |
download | gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.gz |
Initial revision
From-SVN: r26263
Diffstat (limited to 'libjava/java/lang/Integer.java')
-rw-r--r-- | libjava/java/lang/Integer.java | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/libjava/java/lang/Integer.java b/libjava/java/lang/Integer.java new file mode 100644 index 00000000000..54acc27ed6b --- /dev/null +++ b/libjava/java/lang/Integer.java @@ -0,0 +1,355 @@ +/* Copyright (C) 1998, 1999 Cygnus Solutions + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +package java.lang; + +/** + * @author Warren Levy <warrenl@cygnus.com> + * @date September 11, 1998. + */ +/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 + * "The Java Language Specification", ISBN 0-201-63451-1 + * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. + * Status: Believed complete and correct. + */ + +public final class Integer extends Number implements Comparable +{ + public static final int MAX_VALUE = 0x7FFFFFFF; + public static final int MIN_VALUE = 0x80000000; + + // This initialization is seemingly circular, but it is accepted + // by javac, and is handled specially by gcc. + public static final Class TYPE = int.class; + + /* The int value of the instance. */ + private int value; + + public Integer(int val) + { + value = val; + } + + public Integer(String str) throws NumberFormatException + { + value = parseInt(str, 10); + } + + public byte byteValue() + { + return (byte) value; + } + + public double doubleValue() + { + return (double) value; + } + + public float floatValue() + { + return (float) value; + } + + public int intValue() + { + return value; + } + + public long longValue() + { + return value; + } + + public short shortValue() + { + return (short) value; + } + + // Added in JDK 1.2 + public int compareTo(Integer anotherInteger) + { + if (this.value == anotherInteger.value) + return 0; + + // Returns just -1 or 1 on inequality; doing math might overflow the int. + if (this.value > anotherInteger.value) + return 1; + + return -1; + } + + // Added in JDK 1.2 + public int compareTo(Object o) throws ClassCastException + { + if (!(o instanceof Integer)) + throw new ClassCastException(); + + return this.compareTo((Integer) o); + } + + public static Integer decode(String str) throws NumberFormatException + { + boolean isNeg = false; + int index = 0; + int radix = 10; + final int len; + + if (str == null || (len = str.length()) == 0) + throw new NumberFormatException(); + + // Negative numbers are always radix 10. + if (str.charAt(0) == '-') + { + radix = 10; + index++; + isNeg = true; + } + else if (str.charAt(index) == '#') + { + radix = 16; + index++; + } + else if (str.charAt(index) == '0') + { + // Check if str is just "0" + if (len == 1) + return new Integer(0); + + index++; + if (str.charAt(index) == 'x') + { + radix = 16; + index++; + } + else + radix = 8; + } + + if (index >= len) + throw new NumberFormatException(); + + return new Integer(parseInt(str, index, len, isNeg, radix)); + } + + public boolean equals(Object obj) + { + return (obj != null && (obj instanceof Integer) + && ((Integer) obj).value == value); + } + + public static Integer getInteger(String prop) + { + return getInteger(prop, null); + } + + public static Integer getInteger(String prop, int defval) + { + Integer val = getInteger(prop, null); + return val == null ? new Integer(defval) : val; + } + + public static Integer getInteger(String prop, Integer defobj) + { + try + { + return decode(System.getProperty(prop)); + } + catch (NumberFormatException ex) + { + return defobj; + } + } + + public int hashCode() + { + return value; + } + + public static int parseInt(String str) throws NumberFormatException + { + return parseInt(str, 10); + } + + public static int parseInt(String str, int radix) throws NumberFormatException + { + final int len; + + if (str == null || (len = str.length()) == 0 || + radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) + throw new NumberFormatException(); + + boolean isNeg = false; + int index = 0; + if (str.charAt(index) == '-') + if (len > 1) + { + isNeg = true; + index++; + } + else + throw new NumberFormatException(); + + return parseInt(str, index, len, isNeg, radix); + } + + private static int parseInt(String str, int index, int len, boolean isNeg, + int radix) throws NumberFormatException + { + int val = 0; + int digval; + + for ( ; index < len; index++) + { + // The the previous loop iteration left us with a negative + // value (which can only be the most negative value, but we + // don't check that), then having more digits is wrong. + if (val == MIN_VALUE) + throw new NumberFormatException(); + + if ((digval = Character.digit(str.charAt(index), radix)) < 0) + throw new NumberFormatException(); + + // Throw an exception for overflow if result is negative. + // However, we special-case the most negative value. + val *= radix; + if (val < 0 || val + digval < 0) + { + if (isNeg && val + digval == MIN_VALUE) + { + // Ok. + } + else + throw new NumberFormatException(); + } + val += digval; + } + + return isNeg ? -(val) : val; + } + + public static String toBinaryString(int num) + { + return toUnsignedString(num, 1); + } + + public static String toHexString(int num) + { + return toUnsignedString(num, 4); + } + + public static String toOctalString(int num) + { + return toUnsignedString(num, 3); + } + + private static String toUnsignedString(int num, int exp) + { + // Use an array large enough for a binary number. + int radix = 1 << exp; + int mask = radix - 1; + char[] buffer = new char[32]; + int i = 32; + do + { + buffer[--i] = Character.forDigit(num & mask, radix); + num = num >>> exp; + } + while (num != 0); + + return String.valueOf(buffer, i, 32-i); + } + + public String toString() + { + return toString(this.value); + } + + public static String toString(int num) + { + // Use an arrary large enough for "-2147483648"; i.e. 11 chars. + char[] buffer = new char[11]; + int i = 11; + boolean isNeg; + if (num < 0) + { + isNeg = true; + num = -(num); + if (num < 0) + { + // Must be MIN_VALUE, so handle this special case. + buffer[--i] = '8'; + num = 214748364; + } + } + else + isNeg = false; + + do + { + buffer[--i] = (char) ((int) '0' + (num % 10)); + num /= 10; + } + while (num > 0); + + if (isNeg) + buffer[--i] = '-'; + + return String.valueOf(buffer, i, 11-i); + } + + public static String toString(int num, int radix) + { + // Use optimized method for the typical case. + if (radix == 10 || + radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) + return toString(num); + + // For negative numbers, print out the absolute value w/ a leading '-'. + // Use an array large enough for a binary number. + char[] buffer = new char[33]; + int i = 33; + boolean isNeg; + if (num < 0) + { + isNeg = true; + num = -(num); + + // When the value is MIN_VALUE, it overflows when made positive + if (num < 0) + { + buffer[--i] = Character.forDigit(-(num + radix) % radix, radix); + num = -(num / radix); + } + } + else + isNeg = false; + + do + { + buffer[--i] = Character.forDigit(num % radix, radix); + num /= radix; + } + while (num > 0); + + if (isNeg) + buffer[--i] = '-'; + + return String.valueOf(buffer, i, 33-i); + } + + public static Integer valueOf(String str) throws NumberFormatException + { + return new Integer(parseInt(str, 10)); + } + + public static Integer valueOf(String str, int radix) + throws NumberFormatException + { + return new Integer(parseInt(str, radix)); + } +} |