summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/PersistentArrayIdentityMap.cs8
-rw-r--r--src/cli/runtime/PersistentArrayMap.cs25
-rw-r--r--src/cli/runtime/PersistentHashtableIdentityMap.cs18
-rw-r--r--src/cli/runtime/PersistentHashtableMap.cs25
-rw-r--r--src/jvm/clojure/lang/PersistentArrayIdentityMap.java15
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java22
-rw-r--r--src/jvm/clojure/lang/PersistentHashtableIdentityMap.java12
-rw-r--r--src/jvm/clojure/lang/PersistentHashtableMap.java20
8 files changed, 112 insertions, 33 deletions
diff --git a/src/cli/runtime/PersistentArrayIdentityMap.cs b/src/cli/runtime/PersistentArrayIdentityMap.cs
index fb5a4449..93fe2a15 100644
--- a/src/cli/runtime/PersistentArrayIdentityMap.cs
+++ b/src/cli/runtime/PersistentArrayIdentityMap.cs
@@ -28,11 +28,15 @@ PersistentArrayIdentityMap() {
override internal PersistentArrayMap create(params Object[] init)
{
- return new PersistentArrayIdentityMap(init);
+ PersistentArrayIdentityMap ret = new PersistentArrayIdentityMap(init);
+ ret._meta = _meta;
+ return ret;
}
override internal IPersistentMap createHT(Object[] init){
- return new PersistentHashtableIdentityMap(init);
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(init);
+ ret._meta = _meta;
+ return ret;
}
public PersistentArrayIdentityMap(params Object[] init) :base(init) {
diff --git a/src/cli/runtime/PersistentArrayMap.cs b/src/cli/runtime/PersistentArrayMap.cs
index ca48ee34..aa216b35 100644
--- a/src/cli/runtime/PersistentArrayMap.cs
+++ b/src/cli/runtime/PersistentArrayMap.cs
@@ -25,7 +25,7 @@ namespace clojure.lang
* null keys and values are ok, but you won't be able to distinguish a null value via get - use contains/find
*/
-public class PersistentArrayMap : IPersistentMap, ISequential {
+public class PersistentArrayMap : Obj, IPersistentMap, ISequential {
internal readonly Object[] array;
@@ -38,12 +38,23 @@ protected PersistentArrayMap(){
}
virtual internal PersistentArrayMap create(params Object[] init){
- return new PersistentArrayMap(init);
+ PersistentArrayMap ret = new PersistentArrayMap(init);
+ ret._meta = _meta;
+ return ret;
}
virtual internal IPersistentMap createHT(Object[] init){
- return new PersistentHashtableMap(init);
-}
+ PersistentHashtableMap ret = new PersistentHashtableMap(init);
+ ret._meta = _meta;
+ return ret;
+ }
+
+public override Obj withMeta(IPersistentMap meta)
+ {
+ Obj ret = (Obj)MemberwiseClone();
+ ret._meta = meta;
+ return ret;
+ }
/**
* This ctor captures/aliases the passed array, so do not modify later
* @param init {key1,val1,key2,val2,...}
@@ -134,7 +145,11 @@ public IPersistentMap remove(Object key) {
}
virtual public IPersistentMap empty() {
- return EMPTY;
+ if(_meta == null)
+ return EMPTY;
+ PersistentArrayMap ret = new PersistentArrayMap();
+ ret._meta = _meta;
+ return ret;
}
public Object get(Object key) {
diff --git a/src/cli/runtime/PersistentHashtableIdentityMap.cs b/src/cli/runtime/PersistentHashtableIdentityMap.cs
index 51078d0a..5ea01457 100644
--- a/src/cli/runtime/PersistentHashtableIdentityMap.cs
+++ b/src/cli/runtime/PersistentHashtableIdentityMap.cs
@@ -85,16 +85,22 @@ internal class Iter2 : IEnumerator
internal override IPersistentMap create(int capacity) {
- return new PersistentHashtableIdentityMap(capacity);
-}
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(capacity);
+ ret._meta = _meta;
+ return ret;
+ }
internal override IPersistentMap create(int count, PersistentArray array) {
- return new PersistentHashtableIdentityMap(count, array);
-}
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(count, array);
+ ret._meta = _meta;
+ return ret;
+ }
internal override IPersistentMap create(int i, PersistentArray newArray, int growAtCount){
-return new PersistentHashtableIdentityMap(i, newArray, growAtCount);
-}
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(i, newArray, growAtCount);
+ ret._meta = _meta;
+ return ret;
+ }
internal override IPersistentMap createListMap(Object key, Object val){
return PersistentListIdentityMap.create(key,val);
diff --git a/src/cli/runtime/PersistentHashtableMap.cs b/src/cli/runtime/PersistentHashtableMap.cs
index 51759d25..520bb05a 100644
--- a/src/cli/runtime/PersistentHashtableMap.cs
+++ b/src/cli/runtime/PersistentHashtableMap.cs
@@ -16,7 +16,7 @@ namespace clojure.lang
{
-public class PersistentHashtableMap : IPersistentMap {
+public class PersistentHashtableMap : Obj, IPersistentMap {
static readonly float FILL_FACTOR = 0.75f;
@@ -57,6 +57,13 @@ internal PersistentHashtableMap(int count,PersistentArray array,int growAt) {
this.growAtCount = growAt;
}
+public override Obj withMeta(IPersistentMap meta)
+ {
+ Obj ret = (Obj)MemberwiseClone();
+ ret._meta = meta;
+ return ret;
+ }
+
int calcPrimeCapacity(int capacity) {
// No .Net equivalent
//return BigInteger.valueOf((long) (capacity/FILL_FACTOR)).nextProbablePrime().intValue();
@@ -264,16 +271,22 @@ static int bucketFor(Object key, PersistentArray array) {
}
virtual internal IPersistentMap create(int capacity) {
- return new PersistentHashtableMap(capacity);
+ PersistentHashtableMap ret = new PersistentHashtableMap(capacity);
+ ret._meta = _meta;
+ return ret;
}
virtual internal IPersistentMap create(int count,PersistentArray array) {
- return new PersistentHashtableMap(count, array);
-}
+ PersistentHashtableMap ret = new PersistentHashtableMap(count, array);
+ ret._meta = _meta;
+ return ret;
+ }
virtual internal IPersistentMap create(int i, PersistentArray newArray, int growAtCount){
- return new PersistentHashtableMap(i, newArray, growAtCount);
-}
+ PersistentHashtableMap ret = new PersistentHashtableMap(i, newArray, growAtCount);
+ ret._meta = _meta;
+ return ret;
+ }
virtual internal IPersistentMap createListMap(Object key, Object val){
diff --git a/src/jvm/clojure/lang/PersistentArrayIdentityMap.java b/src/jvm/clojure/lang/PersistentArrayIdentityMap.java
index d74cbeeb..a66c0482 100644
--- a/src/jvm/clojure/lang/PersistentArrayIdentityMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayIdentityMap.java
@@ -22,14 +22,23 @@ private PersistentArrayIdentityMap() {
}
PersistentArrayMap create(Object... init){
- return new PersistentArrayIdentityMap(init);
+ PersistentArrayIdentityMap ret = new PersistentArrayIdentityMap(init);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap createHT(Object[] init){
- return new PersistentHashtableIdentityMap(init);
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(init);
+ ret._meta = _meta;
+ return ret;
}
+
IPersistentMap empty() {
- return EMPTY;
+ if(_meta == null)
+ return EMPTY;
+ PersistentArrayIdentityMap ret = new PersistentArrayIdentityMap();
+ ret._meta = _meta;
+ return ret;
}
public PersistentArrayIdentityMap(Object... init) {
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java
index 4a17418e..19a1b255 100644
--- a/src/jvm/clojure/lang/PersistentArrayMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayMap.java
@@ -23,7 +23,7 @@ import java.util.Iterator;
* null keys and values are ok, but you won't be able to distinguish a null value via get - use contains/find
*/
-public class PersistentArrayMap implements IPersistentMap, ISequential {
+public class PersistentArrayMap extends Obj implements IPersistentMap, ISequential, Cloneable {
final Object[] array;
static final int HASHTABLE_THRESHOLD = 42;
@@ -35,11 +35,21 @@ protected PersistentArrayMap(){
}
PersistentArrayMap create(Object... init){
- return new PersistentArrayMap(init);
+ PersistentArrayMap ret = new PersistentArrayMap(init);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap createHT(Object[] init){
- return new PersistentHashtableMap(init);
+ PersistentHashtableMap ret = new PersistentHashtableMap(init);
+ ret._meta = _meta;
+ return ret;
+}
+
+public Obj withMeta(IPersistentMap meta) throws Exception {
+ Obj ret = (Obj) clone();
+ ret._meta = meta;
+ return ret;
}
/**
@@ -132,7 +142,11 @@ public IPersistentMap remove(Object key) {
}
IPersistentMap empty() {
- return EMPTY;
+ if(_meta == null)
+ return EMPTY;
+ PersistentArrayMap ret = new PersistentArrayMap();
+ ret._meta = _meta;
+ return ret;
}
final public Object get(Object key) {
diff --git a/src/jvm/clojure/lang/PersistentHashtableIdentityMap.java b/src/jvm/clojure/lang/PersistentHashtableIdentityMap.java
index 281acc0c..1f1a50c0 100644
--- a/src/jvm/clojure/lang/PersistentHashtableIdentityMap.java
+++ b/src/jvm/clojure/lang/PersistentHashtableIdentityMap.java
@@ -78,15 +78,21 @@ static class Iter implements Iterator{
}
IPersistentMap create(int capacity) {
- return new PersistentHashtableIdentityMap(capacity);
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(capacity);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap create(int count, PersistentArray array) {
- return new PersistentHashtableIdentityMap(count, array);
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(count, array);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap create(int i, PersistentArray newArray, int growAtCount){
- return new PersistentHashtableIdentityMap(i, newArray, growAtCount);
+ PersistentHashtableIdentityMap ret = new PersistentHashtableIdentityMap(i, newArray, growAtCount);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap createListMap(Object key, Object val){
diff --git a/src/jvm/clojure/lang/PersistentHashtableMap.java b/src/jvm/clojure/lang/PersistentHashtableMap.java
index 290adb93..d60d15ba 100644
--- a/src/jvm/clojure/lang/PersistentHashtableMap.java
+++ b/src/jvm/clojure/lang/PersistentHashtableMap.java
@@ -13,7 +13,7 @@ package clojure.lang;
import java.util.Iterator;
import java.math.BigInteger;
-public class PersistentHashtableMap implements IPersistentMap {
+public class PersistentHashtableMap extends Obj implements IPersistentMap, Cloneable {
static final float FILL_FACTOR = 0.75f;
@@ -54,6 +54,12 @@ PersistentHashtableMap(int count,PersistentArray array,int growAt) {
this.growAtCount = growAt;
}
+public Obj withMeta(IPersistentMap meta) throws Exception {
+ Obj ret = (Obj) clone();
+ ret._meta = meta;
+ return ret;
+}
+
int calcPrimeCapacity(int capacity) {
return BigInteger.valueOf((long) (capacity/FILL_FACTOR)).nextProbablePrime().intValue();
}
@@ -253,15 +259,21 @@ static int bucketFor(Object key, PersistentArray array) {
}
IPersistentMap create(int capacity) {
- return new PersistentHashtableMap(capacity);
+ PersistentHashtableMap ret = new PersistentHashtableMap(capacity);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap create(int count,PersistentArray array) {
- return new PersistentHashtableMap(count, array);
+ PersistentHashtableMap ret = new PersistentHashtableMap(count, array);
+ ret._meta = _meta;
+ return ret;
}
IPersistentMap create(int i, PersistentArray newArray, int growAtCount){
- return new PersistentHashtableMap(i, newArray, growAtCount);
+ PersistentHashtableMap ret = new PersistentHashtableMap(i, newArray, growAtCount);
+ ret._meta = _meta;
+ return ret;
}