diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-07-18 11:45:12 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-07-18 11:45:12 -0400 |
commit | 2363d0078392a4d88153dfb2393d0c01b53aff4a (patch) | |
tree | 7b00965ce918de9748b1fdfe7cc10a9cf5a72d0d | |
parent | 63553773bebf7d76883b6d0485c4f3b5ac07ef42 (diff) |
got rid of LazilyPersistentVector instances, trim tail in immutable, redefed vector factory fns in terms of MutableVector
-rw-r--r-- | src/jvm/clojure/lang/LazilyPersistentVector.java | 136 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 22 |
2 files changed, 20 insertions, 138 deletions
diff --git a/src/jvm/clojure/lang/LazilyPersistentVector.java b/src/jvm/clojure/lang/LazilyPersistentVector.java index f3562cae..44985467 100644 --- a/src/jvm/clojure/lang/LazilyPersistentVector.java +++ b/src/jvm/clojure/lang/LazilyPersistentVector.java @@ -14,141 +14,21 @@ package clojure.lang; import java.util.Collection; -public class LazilyPersistentVector extends APersistentVector{ -final Object[] array; -PersistentVector v = null; +public class LazilyPersistentVector{ + static public IPersistentVector createOwning(Object... items){ if(items.length == 0) return PersistentVector.EMPTY; - return new LazilyPersistentVector(null, items, null); + else if(items.length <= 32) + return new PersistentVector(items.length, 5, PersistentVector.EMPTY_NODE,items); + return PersistentVector.create(items); } static public IPersistentVector create(Collection coll){ - return createOwning(coll.toArray()); -} - -LazilyPersistentVector(IPersistentMap meta, Object[] array, PersistentVector v){ - super(meta); - this.array = array; - this.v = v; -} - -public ISeq seq(){ - if(array.length == 0) - return null; - return new ChunkedSeq(array); -} - -static class ChunkedSeq extends ASeq implements IChunkedSeq, IndexedSeq{ - final Object[] array; - final int offset; - final int end; - static final int BLOCK = 32; - - ChunkedSeq(IPersistentMap meta, Object[] array, int offset, int end){ - super(meta); - this.array = array; - this.offset = offset; - this.end = end; - } - - ChunkedSeq(Object[] array){ - this(array, 0); - } - - ChunkedSeq(Object[] array, int offset){ - this(array,offset,Math.min(offset + BLOCK, array.length)); - } - - ChunkedSeq(Object[] array, int offset, int end){ - this.array = array; - this.offset = offset; - this.end = end; - } - - public Obj withMeta(IPersistentMap meta){ - if(meta != _meta) - return new ChunkedSeq(meta, array,offset,end); - return this; - } - - public Object first(){ - return array[offset]; - } - - public ISeq next(){ - if(offset + 1 < end) - return new ChunkedSeq(array,offset + 1,end); - return chunkedNext(); - } - - public IChunk chunkedFirst(){ - return new ArrayChunk(array, offset, end); - } - - public ISeq chunkedNext(){ - if(end < array.length) - return new ChunkedSeq(array,end); - return null; - } - - public ISeq chunkedMore(){ - ISeq s = chunkedNext(); - if(s == null) - return PersistentList.EMPTY; - return s; - } - - public int index(){ - return offset; - } - - public int count(){ - return array.length - offset; - } -} - -public Object[] toArray(){ - return array.clone(); -} - -public Object nth(int i){ - return array[i]; -} - -public IPersistentVector assocN(int i, Object val){ - return (IPersistentVector) v().assoc(i, val); -} - -public int count(){ - return array.length; -} - -public IPersistentVector cons(Object o){ - return v().cons(o); -} - -public IPersistentCollection empty(){ - return PersistentVector.EMPTY.withMeta(meta()); -} - -public IPersistentStack pop(){ - return v().pop(); -} - -private synchronized IPersistentVector v(){ - if(v == null) - { - v = PersistentVector.create(array); - } - return v; -} - -public Obj withMeta(IPersistentMap meta){ - if(meta != _meta) - return new LazilyPersistentVector(meta, array, v); - return this; + if(!(coll instanceof ISeq) && coll.size() <= 32) + return createOwning(coll.toArray()); + return PersistentVector.create(RT.seq(coll)); } } diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index 80ac34d5..5184d81d 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -45,24 +45,24 @@ final Object[] tail; public final static PersistentVector EMPTY = new PersistentVector(0, 5, EMPTY_NODE, new Object[]{}); static public PersistentVector create(ISeq items){ - PersistentVector ret = EMPTY; + MutableVector ret = EMPTY.mutable(); for(; items != null; items = items.next()) - ret = ret.cons(items.first()); - return ret; + ret = ret.conj(items.first()); + return ret.immutable(); } static public PersistentVector create(List items){ - PersistentVector ret = EMPTY; + MutableVector ret = EMPTY.mutable(); for(Object item : items) - ret = ret.cons(item); - return ret; + ret = ret.conj(item); + return ret.immutable(); } static public PersistentVector create(Object... items){ - PersistentVector ret = EMPTY; + MutableVector ret = EMPTY.mutable(); for(Object item : items) - ret = ret.cons(item); - return ret; + ret = ret.conj(item); + return ret.immutable(); } PersistentVector(int cnt, int shift, Node root, Object[] tail){ @@ -411,7 +411,9 @@ static class MutableVector implements IMutableVector, Counted{ public PersistentVector immutable(){ root.edit.set(false); - return new PersistentVector(cnt, shift, root, tail); + Object[] trimmedTail = new Object[cnt-tailoff()]; + System.arraycopy(tail,0,trimmedTail,0,trimmedTail.length); + return new PersistentVector(cnt, shift, root, trimmedTail); } static Object[] editableTail(Object[] tl){ |