From 709e897e44e353f2bda74d1f5b4bcaf413bf5a54 Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Fri, 28 Jul 2006 18:51:47 +0000 Subject: derived from Obj --- src/cli/runtime/PersistentArrayIdentityMap.cs | 8 ++++++-- src/cli/runtime/PersistentArrayMap.cs | 25 ++++++++++++++++++----- src/cli/runtime/PersistentHashtableIdentityMap.cs | 18 ++++++++++------ src/cli/runtime/PersistentHashtableMap.cs | 25 +++++++++++++++++------ 4 files changed, 57 insertions(+), 19 deletions(-) (limited to 'src/cli') 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){ -- cgit v1.2.3-70-g09d2