diff options
Diffstat (limited to 'src/cli')
-rw-r--r-- | src/cli/runtime/PersistentArrayIdentityMap.cs | 9 | ||||
-rw-r--r-- | src/cli/runtime/PersistentArrayMap.cs | 13 | ||||
-rw-r--r-- | src/cli/runtime/PersistentHybridIdentityMap.cs | 2 | ||||
-rw-r--r-- | src/cli/runtime/PersistentHybridMap.cs | 2 |
4 files changed, 21 insertions, 5 deletions
diff --git a/src/cli/runtime/PersistentArrayIdentityMap.cs b/src/cli/runtime/PersistentArrayIdentityMap.cs index b6cc57bc..232a143a 100644 --- a/src/cli/runtime/PersistentArrayIdentityMap.cs +++ b/src/cli/runtime/PersistentArrayIdentityMap.cs @@ -16,7 +16,14 @@ namespace org.clojure.runtime * ArrayMap using identity (==) comparison instead of equals
*/
public class PersistentArrayIdentityMap : PersistentArrayMap {
-public PersistentArrayIdentityMap() {
+
+new public static PersistentArrayIdentityMap EMPTY = new PersistentArrayIdentityMap();
+
+override public IPersistentMap empty() {
+ return EMPTY;
+}
+
+PersistentArrayIdentityMap() {
}
public PersistentArrayIdentityMap(Object[] init) :base(init) {
diff --git a/src/cli/runtime/PersistentArrayMap.cs b/src/cli/runtime/PersistentArrayMap.cs index f6a30be7..ebb217a4 100644 --- a/src/cli/runtime/PersistentArrayMap.cs +++ b/src/cli/runtime/PersistentArrayMap.cs @@ -29,7 +29,9 @@ public class PersistentArrayMap : IPersistentMap, ISequential { internal readonly Object[] array;
-public PersistentArrayMap(){
+ public static PersistentArrayMap EMPTY = new PersistentArrayMap();
+
+protected PersistentArrayMap(){
this.array = RT.EMPTY_ARRAY;
}
@@ -86,7 +88,10 @@ public IPersistentMap remove(Object key) { int i = indexOf(key);
if(i >= 0) //have key, will remove
{
- Object[] newArray = new Object[array.Length - 2];
+ int newlen = array.Length - 2;
+ if (newlen == 0)
+ return empty();
+ Object[] newArray = new Object[newlen];
for(int s=0,d=0;s<array.Length;s += 2)
{
if(!equalKey(array[s],key)) //skip removal key
@@ -102,6 +107,10 @@ public IPersistentMap remove(Object key) { return this;
}
+virtual public IPersistentMap empty() {
+ return EMPTY;
+}
+
public Object get(Object key) {
int i = indexOf(key);
if(i >= 0)
diff --git a/src/cli/runtime/PersistentHybridIdentityMap.cs b/src/cli/runtime/PersistentHybridIdentityMap.cs index 069a14fb..e1e420e8 100644 --- a/src/cli/runtime/PersistentHybridIdentityMap.cs +++ b/src/cli/runtime/PersistentHybridIdentityMap.cs @@ -34,7 +34,7 @@ override public PersistentArrayMap createArrayMap(Object[] init) { }
override internal IPersistentMap createArrayMap() {
- return new PersistentArrayIdentityMap();
+ return PersistentArrayIdentityMap.EMPTY;
}
override internal IPersistentMap createHashtableMap(Object[] init) {
diff --git a/src/cli/runtime/PersistentHybridMap.cs b/src/cli/runtime/PersistentHybridMap.cs index 7c0cc88e..67cbfb28 100644 --- a/src/cli/runtime/PersistentHybridMap.cs +++ b/src/cli/runtime/PersistentHybridMap.cs @@ -89,7 +89,7 @@ virtual public PersistentArrayMap createArrayMap(Object[] init) { }
virtual internal IPersistentMap createArrayMap() {
- return new PersistentArrayMap();
+ return PersistentArrayMap.EMPTY;
}
virtual internal IPersistentMap createHashtableMap(Object[] init) {
|