diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-12-09 10:08:20 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-12-09 10:08:20 +0000 |
commit | f2ecbd04691b1914e2f77c60afc2b296aa6826ae (patch) | |
tree | 539b543eb173cfc7b0bbde4ca5f2c5bb187297df /src/library/scala/collection/parallel/RemainsIterator.scala | |
parent | 492b22576f2ad46b300ce8dc31c5b672aaf517e4 (diff) | |
download | scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.tar.gz scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.tar.bz2 scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.zip |
Array combiners implementation changed from arr...
Array combiners implementation changed from array buffers to doubling
unrolled buffers to avoid excessive copying. Still evaluating the
benefits of this.
No review.
Diffstat (limited to 'src/library/scala/collection/parallel/RemainsIterator.scala')
-rw-r--r-- | src/library/scala/collection/parallel/RemainsIterator.scala | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/library/scala/collection/parallel/RemainsIterator.scala b/src/library/scala/collection/parallel/RemainsIterator.scala index a33702a527..3363186b7d 100644 --- a/src/library/scala/collection/parallel/RemainsIterator.scala +++ b/src/library/scala/collection/parallel/RemainsIterator.scala @@ -87,6 +87,16 @@ trait AugmentedIterableIterator[+T] extends RemainsIterator[T] { } } + def reduceLeft[U >: T](howmany: Int, op: (U, U) => U): U = { + var i = howmany - 1 + var u: U = next + while (i > 0 && hasNext) { + u = op(u, next) + i -= 1 + } + u + } + /* transformers to combiners */ def map2combiner[S, That](f: T => S, cb: Combiner[S, That]): Combiner[S, That] = { @@ -165,7 +175,7 @@ trait AugmentedIterableIterator[+T] extends RemainsIterator[T] { def slice2combiner[U >: T, This](from: Int, until: Int, cb: Combiner[U, This]): Combiner[U, This] = { drop(from) - var left = until - from + var left = math.max(until - from, 0) cb.sizeHint(left) while (left > 0) { cb += next @@ -221,6 +231,26 @@ trait AugmentedIterableIterator[+T] extends RemainsIterator[T] { } } + def scanToCombiner[U >: T, That](startValue: U, op: (U, U) => U, cb: Combiner[U, That]) = { + var curr = startValue + while (hasNext) { + curr = op(curr, next) + cb += curr + } + cb + } + + def scanToCombiner[U >: T, That](howmany: Int, startValue: U, op: (U, U) => U, cb: Combiner[U, That]) = { + var curr = startValue + var left = howmany + while (left > 0) { + curr = op(curr, next) + cb += curr + left -= 1 + } + cb + } + def zip2combiner[U >: T, S, That](otherpit: RemainsIterator[S], cb: Combiner[(U, S), That]): Combiner[(U, S), That] = { cb.sizeHint(remaining min otherpit.remaining) while (hasNext && otherpit.hasNext) { @@ -336,6 +366,9 @@ extends AugmentedIterableIterator[T] { self => + /** Creates a copy of this iterator. */ + def dup: ParIterableIterator[T] + def split: Seq[ParIterableIterator[T]] /** The number of elements this iterator has yet to traverse. This method @@ -377,6 +410,7 @@ self => var remaining = taken min self.remaining def hasNext = remaining > 0 def next = { remaining -= 1; self.next } + def dup: ParIterableIterator[T] = self.dup.take(taken) def split: Seq[ParIterableIterator[T]] = takeSeq(self.split) { (p, n) => p.take(n) } protected[this] def takeSeq[PI <: ParIterableIterator[T]](sq: Seq[PI])(taker: (PI, Int) => PI) = { val sizes = sq.scanLeft(0)(_ + _.remaining) @@ -400,6 +434,7 @@ self => def hasNext = self.hasNext def next = f(self.next) def remaining = self.remaining + def dup: ParIterableIterator[S] = self.dup map f def split: Seq[ParIterableIterator[S]] = self.split.map { _ map f } } @@ -418,6 +453,7 @@ self => } else curr.next def remaining = if (curr eq self) curr.remaining + that.remaining else curr.remaining protected def firstNonEmpty = (curr eq self) && curr.hasNext + def dup: ParIterableIterator[U] = self.dup.appendParIterable[U, PI](that) def split: Seq[ParIterableIterator[U]] = if (firstNonEmpty) Seq(curr, that) else curr.split } @@ -428,6 +464,7 @@ self => def hasNext = self.hasNext && that.hasNext def next = (self.next, that.next) def remaining = self.remaining min that.remaining + def dup: ParIterableIterator[(T, S)] = self.dup.zipParSeq(that) def split: Seq[ParIterableIterator[(T, S)]] = { val selfs = self.split val sizes = selfs.map(_.remaining) @@ -447,6 +484,7 @@ self => else (self.next, thatelem) } else (thiselem, that.next); def remaining = self.remaining max that.remaining + def dup: ParIterableIterator[(U, S)] = self.dup.zipAllParSeq(that, thiselem, thatelem) def split: Seq[ParIterableIterator[(U, S)]] = { val selfrem = self.remaining val thatrem = that.remaining @@ -468,6 +506,8 @@ extends ParIterableIterator[T] with PreciseSplitter[T] { self => + def dup: ParSeqIterator[T] + def split: Seq[ParSeqIterator[T]] def psplit(sizes: Int*): Seq[ParSeqIterator[T]] @@ -483,6 +523,7 @@ self => /* iterator transformers */ class Taken(tk: Int) extends super.Taken(tk) with ParSeqIterator[T] { + override def dup = super.dup.asInstanceOf[ParSeqIterator[T]] 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) } } @@ -497,6 +538,7 @@ self => } class Mapped[S](f: T => S) extends super.Mapped[S](f) with ParSeqIterator[S] { + override def dup = super.dup.asInstanceOf[ParSeqIterator[S]] override def split: Seq[ParSeqIterator[S]] = super.split.asInstanceOf[Seq[ParSeqIterator[S]]] def psplit(sizes: Int*): Seq[ParSeqIterator[S]] = self.psplit(sizes: _*).map { _ map f } } @@ -504,6 +546,7 @@ self => override def map[S](f: T => S) = new Mapped(f) class Appended[U >: T, PI <: ParSeqIterator[U]](it: PI) extends super.Appended[U, PI](it) with ParSeqIterator[U] { + override def dup = super.dup.asInstanceOf[ParSeqIterator[U]] override def split: Seq[ParSeqIterator[U]] = super.split.asInstanceOf[Seq[ParSeqIterator[U]]] def psplit(sizes: Int*): Seq[ParSeqIterator[U]] = if (firstNonEmpty) { val selfrem = self.remaining @@ -534,6 +577,7 @@ self => def appendParSeq[U >: T, PI <: ParSeqIterator[U]](that: PI) = new Appended[U, PI](that) class Zipped[S](ti: ParSeqIterator[S]) extends super.Zipped[S](ti) with ParSeqIterator[(T, S)] { + override def dup = super.dup.asInstanceOf[ParSeqIterator[(T, S)]] override def split: Seq[ParSeqIterator[(T, S)]] = super.split.asInstanceOf[Seq[ParSeqIterator[(T, S)]]] def psplit(szs: Int*) = (self.psplit(szs: _*) zip that.psplit(szs: _*)) map { p => p._1 zipParSeq p._2 } } @@ -541,6 +585,7 @@ self => override def zipParSeq[S](that: ParSeqIterator[S]) = new Zipped(that) class ZippedAll[U >: T, S](ti: ParSeqIterator[S], thise: U, thate: S) extends super.ZippedAll[U, S](ti, thise, thate) with ParSeqIterator[(U, S)] { + override def dup = super.dup.asInstanceOf[ParSeqIterator[(U, S)]] private def patchem = { val selfrem = self.remaining val thatrem = that.remaining @@ -578,6 +623,7 @@ self => def hasNext = trio.hasNext def next = trio.next def remaining = trio.remaining + def dup = self.dup.patchParSeq(from, patch, replaced) def split = trio.split def psplit(sizes: Int*) = trio.psplit(sizes: _*) } |