summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-03-01 16:34:39 +0000
committerRich Hickey <richhickey@gmail.com>2008-03-01 16:34:39 +0000
commit7705d1c11ba26627f4889f7b6afceb1e634c7839 (patch)
treeebf3a1543ed368949e28dfb734dba8f12e236e45 /src
parent978af02b0a7e2b430c917b32b58215edcae2ad2d (diff)
unified map entry and vector equality and hash
support conj of vector pair onto map
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/AMapEntry.java8
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java8
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java17
3 files changed, 19 insertions, 14 deletions
diff --git a/src/jvm/clojure/lang/AMapEntry.java b/src/jvm/clojure/lang/AMapEntry.java
index c1113058..24313bf2 100644
--- a/src/jvm/clojure/lang/AMapEntry.java
+++ b/src/jvm/clojure/lang/AMapEntry.java
@@ -17,14 +17,12 @@ import java.io.StringWriter;
public abstract class AMapEntry implements IMapEntry, IPersistentVector{
public boolean equals(Object obj){
- if(!(obj instanceof IMapEntry))
- return false;
- IMapEntry o = (IMapEntry) obj;
- return RT.equal(key(), o.key()) && RT.equal(val(), o.val());
+ return APersistentVector.doEquals(this, obj);
}
public int hashCode(){
- return RT.hashCombine(RT.hash(key()), RT.hash(val()));
+ //must match logic in APersistentVector
+ return RT.hashCombine(RT.hashCombine(0,RT.hash(key())), RT.hash(val()));
}
public String toString(){
diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java
index 807dfe9c..9e7cc289 100644
--- a/src/jvm/clojure/lang/APersistentMap.java
+++ b/src/jvm/clojure/lang/APersistentMap.java
@@ -29,10 +29,12 @@ public String toString(){
}
public IPersistentCollection cons(Object o){
- if(o instanceof IMapEntry)
+ if(o instanceof IPersistentVector)
{
- IMapEntry e = (IMapEntry) o;
- return assoc(e.key(), e.val());
+ IPersistentVector v = (IPersistentVector) o;
+ if(v.count() != 2)
+ throw new IllegalArgumentException("Vector arg to map conj must be a pair");
+ return assoc(v.nth(0), v.nth(1));
}
IPersistentMap ret = this;
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java
index 15ce1870..ffadc444 100644
--- a/src/jvm/clojure/lang/APersistentVector.java
+++ b/src/jvm/clojure/lang/APersistentVector.java
@@ -38,15 +38,15 @@ public ISeq rseq(){
return null;
}
-public boolean equals(Object obj){
+static boolean doEquals(IPersistentVector v, Object obj){
if(obj instanceof IPersistentVector)
{
IPersistentVector ma = (IPersistentVector) obj;
- if(ma.count() != count() || ma.hashCode() != hashCode())
+ if(ma.count() != v.count() || ma.hashCode() != v.hashCode())
return false;
- for(int i = 0; i < count(); i++)
+ for(int i = 0; i < v.count(); i++)
{
- if(!RT.equal(nth(i), ma.nth(i)))
+ if(!RT.equal(v.nth(i), ma.nth(i)))
return false;
}
}
@@ -55,9 +55,9 @@ public boolean equals(Object obj){
if(!(obj instanceof Sequential))
return false;
ISeq ms = ((IPersistentCollection) obj).seq();
- for(int i = 0; i < count(); i++, ms = ms.rest())
+ for(int i = 0; i < v.count(); i++, ms = ms.rest())
{
- if(ms == null || !RT.equal(nth(i), ms.first()))
+ if(ms == null || !RT.equal(v.nth(i), ms.first()))
return false;
}
if(ms != null)
@@ -65,6 +65,11 @@ public boolean equals(Object obj){
}
return true;
+
+}
+
+public boolean equals(Object obj){
+ return doEquals(this, obj);
}
public int hashCode(){