Skip to content

Commit

Permalink
better vector iterators
Browse files Browse the repository at this point in the history
  • Loading branch information
richhickey committed May 5, 2012
1 parent f416abb commit f8856dc
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/jvm/clojure/lang/APersistentVector.java
Expand Up @@ -520,6 +520,8 @@ public SubVector(IPersistentMap meta, IPersistentVector v, int start, int end){
this.end = end;
}

public Iterator iterator(){return ((PersistentVector)v).rangedIterator(start,end);}

public Object nth(int i){
if(start + i >= end)
throw new IndexOutOfBoundsException();
Expand Down
27 changes: 27 additions & 0 deletions src/jvm/clojure/lang/PersistentVector.java
Expand Up @@ -13,6 +13,7 @@
package clojure.lang;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

Expand Down Expand Up @@ -232,6 +233,32 @@ public ISeq seq(){
return chunkedSeq();
}

Iterator rangedIterator(final int start, final int end){
return new Iterator(){
int i = start;
int base = i - (i%32);
Object[] array = (start < count())?arrayFor(i):null;

public boolean hasNext(){
return i < end;
}

public Object next(){
if(i-base == 32){
array = arrayFor(i);
base += 32;
}
return array[i++ & 0x01f];
}

public void remove(){
throw new UnsupportedOperationException();
}
};
}

public Iterator iterator(){return rangedIterator(0,count());}

public Object kvreduce(IFn f, Object init){
int step = 0;
for(int i=0;i<cnt;i+=step){
Expand Down

0 comments on commit f8856dc

Please sign in to comment.