diff options
author | Paul Phillips <paulp@improving.org> | 2011-03-08 15:40:48 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-03-08 15:40:48 +0000 |
commit | 8328a880b60ded33d5d49b88bdc75020b577eb27 (patch) | |
tree | 43d596894cf699fa3d19fdb406825a1380db721d | |
parent | fff27219456d145cdb67502dd591dee32b01ce89 (diff) | |
download | scala-8328a880b60ded33d5d49b88bdc75020b577eb27.tar.gz scala-8328a880b60ded33d5d49b88bdc75020b577eb27.tar.bz2 scala-8328a880b60ded33d5d49b88bdc75020b577eb27.zip |
Fix for drop bug in parallel collections iterat...
Fix for drop bug in parallel collections iterator revealed during slice
work. Review by prokopec.
-rw-r--r-- | src/library/scala/collection/parallel/RemainsIterator.scala | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/src/library/scala/collection/parallel/RemainsIterator.scala b/src/library/scala/collection/parallel/RemainsIterator.scala index 442dc4cc65..508bc46a72 100644 --- a/src/library/scala/collection/parallel/RemainsIterator.scala +++ b/src/library/scala/collection/parallel/RemainsIterator.scala @@ -433,15 +433,20 @@ self => shortened filter { _.remaining > 0 } } } - - override def take(n: Int) = new Taken(n) - - override def slice(from1: Int, until1: Int) = { - val it = new Taken(until1) - var todrop = from1 - while (todrop > 0 && it.hasNext) it.next + /** To lower "virtual class" boilerplate tax, implement creation + * in method and override this method in the subclass. + */ + private[collection] def newTaken(until: Int): Taken = new Taken(until) + private[collection] def newSliceInternal[U <: Taken](it: U, from1: Int): U = { + var count = from1 + while (count > 0 && it.hasNext) { + it.next + count -= 1 + } it } + override def take(n: Int): ParIterableIterator[T] = newTaken(n) + override def slice(from1: Int, until1: Int): ParIterableIterator[T] = newSliceInternal(newTaken(until1), from1) class Mapped[S](f: T => S) extends ParIterableIterator[S] { var signalDelegate = self.signalDelegate @@ -525,7 +530,6 @@ extends ParIterableIterator[T] { self => def dup: ParSeqIterator[T] - def split: Seq[ParSeqIterator[T]] def psplit(sizes: Int*): Seq[ParSeqIterator[T]] @@ -545,15 +549,9 @@ self => override def split: Seq[ParSeqIterator[T]] = super.split.asInstanceOf[Seq[ParSeqIterator[T]]] def psplit(sizes: Int*): Seq[ParSeqIterator[T]] = takeSeq(self.psplit(sizes: _*)) { (p, n) => p.take(n) } } - - override def take(n: Int) = new Taken(n) - - override def slice(from1: Int, until1: Int) = { - val it = new Taken(until1) - var todrop = from1 - while (todrop > 0 && it.hasNext) it.next - it - } + override private[collection] def newTaken(until: Int): Taken = new Taken(until) + override def take(n: Int): ParSeqIterator[T] = newTaken(n) + override def slice(from1: Int, until1: Int): ParSeqIterator[T] = newSliceInternal(newTaken(until1), from1) class Mapped[S](f: T => S) extends super.Mapped[S](f) with ParSeqIterator[S] { override def dup = super.dup.asInstanceOf[ParSeqIterator[S]] |