Skip to content

Commit 6c299f7

Browse files
committed
Migrate ++ operator
Uncomment all tests for ParIterable, except those that depend on ParMap.
1 parent 7dd0418 commit 6c299f7

File tree

2 files changed

+86
-94
lines changed

2 files changed

+86
-94
lines changed

core/src/main/scala/scala/collection/parallel/ParIterableLike.scala

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -582,13 +582,11 @@ self =>
582582
def filterNot(pred: T => Boolean): Repr = {
583583
tasksupport.executeAndWaitResult(new FilterNot(pred, combinerFactory, splitter) mapResult { _.resultWithTaskSupport })
584584
}
585-
/*
586-
def ++[U >: T, That](that: GenTraversableOnce[U])(implicit bf: OldCanBuildFrom[Repr, U, That]): That = {
587-
if (that.isParallel && bf.isParallel) {
585+
586+
def ++[U >: T](that: IterableOnce[U]): CC[U] = that match {
587+
case other: ParIterable[U] =>
588588
// println("case both are parallel")
589-
val other = that.asParIterable
590-
val pbf = bf.asParallel
591-
val cfactory = combinerFactory(() => pbf(repr))
589+
val cfactory = combinerFactory(() => companion.newCombiner[U])
592590
val copythis = new Copy(cfactory, splitter)
593591
val copythat = wrap {
594592
val othtask = new other.Copy(cfactory, other.splitter)
@@ -598,24 +596,17 @@ self =>
598596
_.resultWithTaskSupport
599597
}
600598
tasksupport.executeAndWaitResult(task)
601-
} else if (bf(repr).isCombiner) {
599+
case _ =>
602600
// println("case parallel builder, `that` not parallel")
603-
val copythis = new Copy(combinerFactory(() => bf(repr).asCombiner), splitter)
601+
val copythis = new Copy(combinerFactory(() => companion.newCombiner[U]), splitter)
604602
val copythat = wrap {
605-
val cb = bf(repr).asCombiner
606-
for (elem <- that.seq) cb += elem
603+
val cb = companion.newCombiner[U]
604+
cb ++= that
607605
cb
608606
}
609607
tasksupport.executeAndWaitResult((copythis parallel copythat) { _ combine _ } mapResult { _.resultWithTaskSupport })
610-
} else {
611-
// println("case not a parallel builder")
612-
val b = bf(repr)
613-
this.splitter.copy2builder[U, That, Builder[U, That]](b)
614-
for (elem <- that.seq) b += elem
615-
setTaskSupport(b.result(), tasksupport)
616-
}
617608
}
618-
*/
609+
619610
def partition(pred: T => Boolean): (Repr, Repr) = {
620611
tasksupport.executeAndWaitResult(
621612
new Partition(pred, combinerFactory, combinerFactory, splitter) mapResult {

scalacheck/src/test/scala/ParallelIterableCheck.scala

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,17 @@ abstract class ParallelIterableCheck[T](collName: String) extends Properties(col
6767
(inst, fromIterable(inst), modif)
6868
}
6969

70-
// def areEqual(t1: GenTraversable[T], t2: GenTraversable[T]) = if (hasStrictOrder) {
71-
// t1 == t2 && t2 == t1
72-
// } else (t1, t2) match { // it is slightly delicate what `equal` means if the order is not strict
73-
// case (m1: GenMap[_, _], m2: GenMap[_, _]) => m1 == m2 && m2 == m1
70+
def areEqual(t1: Iterable[T], t2: ParIterable[T]) = if (hasStrictOrder) {
71+
t1.iterator.sameElements(t2) && t2.sameElements(t1)
72+
} else (t1, t2) match { // it is slightly delicate what `equal` means if the order is not strict
73+
// TODO uncomment and update that part of the implementation when ParMap and ParSet are migrated
74+
// case (m1: Map[_, _], m2: ParMap[_, _]) => m1 == m2 && m2 == m1
7475
// case (i1: GenIterable[_], i2: GenIterable[_]) =>
7576
// val i1s = i1.toSet
7677
// val i2s = i2.toSet
7778
// i1s == i2s && i2s == i1s
78-
// case _ => t1 == t2 && t2 == t1
79-
// }
79+
case _ => t1.iterator.sameElements(t2) && t2.sameElements(t1)
80+
}
8081

8182
def printDebugInfo[A, CC[X] <: ParIterable[X], C <: ParIterable[A], S <: Iterable[A] with IterableOps[A, Iterable, S]](coll: ParIterableLike[A, CC, C, S]): Unit = {
8283
println("Collection debug info: ")
@@ -160,47 +161,47 @@ abstract class ParallelIterableCheck[T](collName: String) extends Properties(col
160161
results.reduceLeft(_ && _)
161162
}
162163

163-
// property("mappings must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
164-
// val results = for ((f, ind) <- mapFunctions.zipWithIndex) yield {
165-
// val ms = t.map(f)
166-
// val mp = coll.map(f)
167-
// val invs = checkDataStructureInvariants(ms, mp)
168-
// if (!areEqual(ms, mp) || !invs) {
169-
// println(t)
170-
// println(coll)
171-
// println("mapped to: ")
172-
// println(ms)
173-
// println(mp)
174-
// println("sizes: ")
175-
// println(ms.size)
176-
// println(mp.size)
177-
// println("valid: " + invs)
178-
// }
179-
// ("op index: " + ind) |: (areEqual(ms, mp) && invs)
180-
// }
181-
// results.reduceLeft(_ && _)
182-
// }
164+
property("mappings must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
165+
val results = for ((f, ind) <- mapFunctions.zipWithIndex) yield {
166+
val ms = t.map(f)
167+
val mp = coll.map(f)
168+
val invs = checkDataStructureInvariants(ms, mp)
169+
if (!areEqual(ms, mp) || !invs) {
170+
println(t)
171+
println(coll)
172+
println("mapped to: ")
173+
println(ms)
174+
println(mp)
175+
println("sizes: ")
176+
println(ms.size)
177+
println(mp.size)
178+
println("valid: " + invs)
179+
}
180+
("op index: " + ind) |: (areEqual(ms, mp) && invs)
181+
}
182+
results.reduceLeft(_ && _)
183+
}
183184

184-
// property("collects must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
185-
// val results = for ((f, ind) <- partialMapFunctions.zipWithIndex) yield {
186-
// val ps = t.collect(f)
187-
// val pp = coll.collect(f)
188-
// if (!areEqual(ps, pp)) {
189-
// println(t)
190-
// println(coll)
191-
// println("collected to: ")
192-
// println(ps)
193-
// println(pp)
194-
// }
195-
// ("op index: " + ind) |: areEqual(ps, pp)
196-
// }
197-
// results.reduceLeft(_ && _)
198-
// }
185+
property("collects must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
186+
val results = for ((f, ind) <- partialMapFunctions.zipWithIndex) yield {
187+
val ps = t.collect(f)
188+
val pp = coll.collect(f)
189+
if (!areEqual(ps, pp)) {
190+
println(t)
191+
println(coll)
192+
println("collected to: ")
193+
println(ps)
194+
println(pp)
195+
}
196+
("op index: " + ind) |: areEqual(ps, pp)
197+
}
198+
results.reduceLeft(_ && _)
199+
}
199200

200-
// property("flatMaps must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
201-
// (for ((f, ind) <- flatMapFunctions.zipWithIndex)
202-
// yield ("op index: " + ind) |: areEqual(t.flatMap(f), coll.flatMap(f))).reduceLeft(_ && _)
203-
// }
201+
property("flatMaps must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
202+
(for ((f, ind) <- flatMapFunctions.zipWithIndex)
203+
yield ("op index: " + ind) |: areEqual(t.flatMap(f), coll.flatMap(f))).reduceLeft(_ && _)
204+
}
204205

205206
property("filters must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
206207
(for ((p, ind) <- filterPredicates.zipWithIndex) yield {
@@ -353,37 +354,37 @@ abstract class ParallelIterableCheck[T](collName: String) extends Properties(col
353354
}).reduceLeft(_ && _)
354355
}
355356

356-
// property("++s must be equal") = forAll(collectionTriplets) { case (t, coll, colltoadd) =>
357-
// try {
358-
// val toadd = colltoadd
359-
// val tr = t ++ toadd.iterator
360-
// val cr = coll ++ toadd.iterator
361-
// if (!areEqual(tr, cr)) {
362-
// println("from: " + t)
363-
// println("and: " + coll.iterator.toList)
364-
// println("adding: " + toadd)
365-
// println(tr.toList)
366-
// println(cr.iterator.toList)
367-
// }
368-
// ("adding " |: areEqual(tr, cr)) &&
369-
// (for ((trav, ind) <- (addAllTraversables).zipWithIndex) yield {
370-
// val tadded = t ++ trav
371-
// val cadded = coll ++ collection.parallel.mutable.ParArray(trav.toSeq: _*)
372-
// if (!areEqual(tadded, cadded)) {
373-
// println("----------------------")
374-
// println("from: " + t)
375-
// println("and: " + coll)
376-
// println("adding: " + trav)
377-
// println(tadded)
378-
// println(cadded)
379-
// }
380-
// ("traversable " + ind) |: areEqual(tadded, cadded)
381-
// }).reduceLeft(_ && _)
382-
// } catch {
383-
// case e: java.lang.Exception =>
384-
// throw e
385-
// }
386-
// }
357+
property("++s must be equal") = forAll(collectionTriplets) { case (t, coll, colltoadd) =>
358+
try {
359+
val toadd = colltoadd
360+
val tr = t ++ toadd.iterator
361+
val cr = coll ++ toadd.iterator
362+
if (!areEqual(tr, cr)) {
363+
println("from: " + t)
364+
println("and: " + coll.iterator.toList)
365+
println("adding: " + toadd)
366+
println(tr.toList)
367+
println(cr.iterator.toList)
368+
}
369+
("adding " |: areEqual(tr, cr)) &&
370+
(for ((trav, ind) <- addAllIterables.zipWithIndex) yield {
371+
val tadded = t ++ trav
372+
val cadded = coll ++ collection.parallel.mutable.ParArray(trav.toSeq: _*)
373+
if (!areEqual(tadded, cadded)) {
374+
println("----------------------")
375+
println("from: " + t)
376+
println("and: " + coll)
377+
println("adding: " + trav)
378+
println(tadded)
379+
println(cadded)
380+
}
381+
("traversable " + ind) |: areEqual(tadded, cadded)
382+
}).reduceLeft(_ && _)
383+
} catch {
384+
case e: java.lang.Exception =>
385+
throw e
386+
}
387+
}
387388

388389
if (hasStrictOrder) property("copies to array must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) =>
389390
val tarr = newArray(t.size)

0 commit comments

Comments
 (0)