summaryrefslogtreecommitdiff
path: root/src/jvm/clojure/lang/Numbers.java
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-06-23 16:43:24 -0400
committerRich Hickey <richhickey@gmail.com>2010-06-23 16:43:24 -0400
commitc8ce4638779e91ba0792549e3dbded2393662a00 (patch)
tree271dc1a55e37d16fffa1cef995fb128b1d1e86dc /src/jvm/clojure/lang/Numbers.java
parent16fa2f141dd39b56f4e70ef534c938b4f1527a41 (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.java28
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();