Skip to content

Commit ef2e762

Browse files
mikerastuarthalloway
authored andcommitted
CLJ-1082 - add generic ranged iterator for use by SubVectors and a fallback for cases where it cannot be applied
Signed-off-by: Stuart Halloway <stu@cognitect.com>
1 parent 43873e4 commit ef2e762

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

src/jvm/clojure/lang/APersistentVector.java

+24-1
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,24 @@ public void add(Object o){
241241
};
242242
}
243243

244+
Iterator rangedIterator(final int start, final int end){
245+
return new Iterator(){
246+
int i = start;
247+
248+
public boolean hasNext(){
249+
return i < end;
250+
}
251+
252+
public Object next(){
253+
return nth(i++);
254+
}
255+
256+
public void remove(){
257+
throw new UnsupportedOperationException();
258+
}
259+
};
260+
}
261+
244262
public List subList(int fromIndex, int toIndex){
245263
return (List) RT.subvec(this, fromIndex, toIndex);
246264
}
@@ -524,7 +542,12 @@ public SubVector(IPersistentMap meta, IPersistentVector v, int start, int end){
524542
this.end = end;
525543
}
526544

527-
public Iterator iterator(){return ((PersistentVector)v).rangedIterator(start,end);}
545+
public Iterator iterator(){
546+
if (v instanceof APersistentVector) {
547+
return ((APersistentVector)v).rangedIterator(start,end);
548+
}
549+
return super.iterator();
550+
}
528551

529552
public Object nth(int i){
530553
if((start + i >= end) || (i < 0))

src/jvm/clojure/lang/PersistentVector.java

+1
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ public ISeq seq(){
233233
return chunkedSeq();
234234
}
235235

236+
@Override
236237
Iterator rangedIterator(final int start, final int end){
237238
return new Iterator(){
238239
int i = start;

test/clojure/test_clojure/vectors.clj

+5
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@
7979
vs-32 vs
8080
vs nil))))
8181

82+
(deftest test-primitive-subvector-reduce
83+
;; regression test for CLJ-1082
84+
(is (== 60 (let [prim-vec (into (vector-of :long) (range 1000))]
85+
(reduce + (subvec prim-vec 10 15))))))
86+
8287
(deftest test-vec-compare
8388
(let [nums (range 1 100)
8489
; randomly replaces a single item with the given value

0 commit comments

Comments
 (0)