From f8856dc7183b1cf9ea19c53c52ef80b21d8fd1df Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Fri, 4 May 2012 20:49:08 -0400 Subject: [PATCH] better vector iterators --- src/jvm/clojure/lang/APersistentVector.java | 2 ++ src/jvm/clojure/lang/PersistentVector.java | 27 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 2b373790ae..995789ed91 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -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(); diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index 22dc890a9f..eb56d0f90a 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -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; @@ -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