diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-06-23 16:43:24 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-06-23 16:43:24 -0400 |
commit | c8ce4638779e91ba0792549e3dbded2393662a00 (patch) | |
tree | 271dc1a55e37d16fffa1cef995fb128b1d1e86dc /src/jvm/clojure/lang/Numbers.java | |
parent | 16fa2f141dd39b56f4e70ef534c938b4f1527a41 (diff) |
add hashCode/equals to BigInt, refine number =, new method equal checks for matching category before equivalence, move array and hashMap to equiv for keys
Diffstat (limited to 'src/jvm/clojure/lang/Numbers.java')
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index aa04a814..f20530a0 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -232,6 +232,11 @@ static public boolean equiv(Number x, Number y){ return ops(x).combine(ops(y)).equiv(x, y); } +static public boolean equal(Number x, Number y){ + return category(x) == category(y) + && ops(x).combine(ops(y)).equiv(x, y); +} + static public boolean lt(Object x, Object y){ return ops(x).combine(ops(y)).lt((Number)x, (Number)y); } @@ -1108,6 +1113,8 @@ static final BigDecimalOps BIGDECIMAL_OPS = new BigDecimalOps(); static final LongBitOps LONG_BITOPS = new LongBitOps(); static final BigIntegerBitOps BIGINTEGER_BITOPS = new BigIntegerBitOps(); +static public enum Category {INTEGER, FLOATING, DECIMAL, RATIO}; + static Ops ops(Object x){ Class xc = x.getClass(); @@ -1129,6 +1136,27 @@ static Ops ops(Object x){ return LONG_OPS; } +static Category category(Object x){ + Class xc = x.getClass(); + + if(xc == Integer.class) + return Category.INTEGER; + else if(xc == Double.class) + return Category.FLOATING; + else if(xc == Long.class) + return Category.INTEGER; + else if(xc == Float.class) + return Category.FLOATING; + else if(xc == BigInteger.class) + return Category.INTEGER; + else if(xc == Ratio.class) + return Category.RATIO; + else if(xc == BigDecimal.class) + return Category.DECIMAL; + else + return Category.INTEGER; +} + static BitOps bitOps(Object x){ Class xc = x.getClass(); |