summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-07-18 11:45:12 -0400
committerRich Hickey <richhickey@gmail.com>2009-07-18 11:45:12 -0400
commit2363d0078392a4d88153dfb2393d0c01b53aff4a (patch)
tree7b00965ce918de9748b1fdfe7cc10a9cf5a72d0d
parent63553773bebf7d76883b6d0485c4f3b5ac07ef42 (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.java136
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java22
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){