summaryrefslogtreecommitdiff
path: root/src/build/genprod.scala
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2010-04-14 08:25:58 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2010-04-14 08:25:58 +0000
commit433ed7ef4fd7d6ed8067c10cebe1e7ec3f72b40f (patch)
tree270b56354e7dde32bb3fc7953d08baf92ba49326 /src/build/genprod.scala
parentd61d2c93d788fdf01ad2497b9c6bb69ab9d6a397 (diff)
downloadscala-433ed7ef4fd7d6ed8067c10cebe1e7ec3f72b40f.tar.gz
scala-433ed7ef4fd7d6ed8067c10cebe1e7ec3f72b40f.tar.bz2
scala-433ed7ef4fd7d6ed8067c10cebe1e7ec3f72b40f.zip
Merged revisions 21492-21512,21516-21518,21520-...
Merged revisions 21492-21512,21516-21518,21520-21525,21527,21529,21531,21535-21537,21539- 21543,21545-21548,21550,21552,21554-21560 via svnmerge from https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk ........ r21492 | dubochet | 2010-04-12 19:04:31 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Lazy vals are printed as such, no longer as vars. No review. ........ r21493 | dubochet | 2010-04-12 19:04:47 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Signature kind (def, val) needs more space to accommodate lazy vals and implicit defs. ........ r21494 | dubochet | 2010-04-12 19:05:04 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Comment summary (first sentence) is extracted by comment parser, which is a lot more robust and correct. No review. ........ r21495 | dragos | 2010-04-12 19:19:29 +0200 (Mon, 12 Apr 2010) | 4 lines Auto-generate scala.runtime.AbstractFunctionN classes. Moved zipped* methods in Tuple1/2 in genprod, so that regenerating tuples does not lose these methods. Added @specialized annotations into genprod for the same reason. ........ r21496 | dragos | 2010-04-12 19:19:38 +0200 (Mon, 12 Apr 2010) | 5 lines Regenerated tuples, products and (Abstract)Functions. We needed to have separate files for AbstractFunctionN because the compiler may need their symbol even before their sourcefile is parsed. In such cases it relies on finding a source file with the right name. ........ r21497 | dragos | 2010-04-12 19:19:51 +0200 (Mon, 12 Apr 2010) | 1 line Don't generate forwarders for specialized methods. no review. ........ r21498 | dragos | 2010-04-12 19:19:59 +0200 (Mon, 12 Apr 2010) | 3 lines Companion objects of case classes extend AbstractFunctionN instead of FunctionN. This saves quite some space, since FunctionN methods are not re-mixed in for each object. ........ r21499 | dragos | 2010-04-12 19:20:07 +0200 (Mon, 12 Apr 2010) | 5 lines Fixed various position issues in specialized members. Removed an instance where the tree transformer was run twice on the same tree, resulting in double definition errors. Fixed re-typing of super calls in constructor arguments for specialized members. No review. ........ r21500 | phaller | 2010-04-12 19:27:14 +0200 (Mon, 12 Apr 2010) | 1 line Restored partest behavior to write log files with normalized paths. For new tests the check file can be copied from the log file. This makes the behavior of --show-diff exactly the same as diffing the log and check file. Review by extempore. ........ r21501 | dubochet | 2010-04-12 19:30:24 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Inner objects, which according to the compiler are actually methods, are now printed as objects by Scaladoc. No review. ........ r21502 | phaller | 2010-04-12 21:18:31 +0200 (Mon, 12 Apr 2010) | 1 line Reverted r21500 until all test categories work again. ........ r21503 | dubochet | 2010-04-12 21:51:53 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Use case symbols have correct owner; inherited filter works as expected with use cases. Review by odersky. ........ r21504 | extempore | 2010-04-12 21:57:56 +0200 (Mon, 12 Apr 2010) | 5 lines Correct oversight where neg tests didn't demand a checkfile. More trying to get timeout/interrupted logic so we know when things die but also don't impede interrupts. Folded precondition logic into test sequence logic, it's plenty general to cover it. Closes #3282, review by phaller. ........ r21505 | malayeri | 2010-04-12 21:59:21 +0200 (Mon, 12 Apr 2010) | 7 lines [scaladoc] Cosmetic changes: - changed link color to underlined and dark purple - increased padding in gray lines of method definitions - lightened gray lines of method definitions - changed dashed and solid lines from black to gray - increased size of top template declaration; changed alignment Review by dubochet. ........ r21506 | phaller | 2010-04-12 22:17:13 +0200 (Mon, 12 Apr 2010) | 1 line Disabled test that hangs when actors package is compiled with specialization. Review by dragos. ........ r21507 | phaller | 2010-04-12 22:41:46 +0200 (Mon, 12 Apr 2010) | 1 line Another attempt at avoiding partest hang ups when the compiler crashes. Review by extempore. ........ r21508 | dubochet | 2010-04-12 22:48:42 +0200 (Mon, 12 Apr 2010) | 1 line [scaladoc] Members inherited from sourceless files are correctly printed in documentation. No review. ........ r21509 | malayeri | 2010-04-12 22:53:02 +0200 (Mon, 12 Apr 2010) | 1 line Changed the colors for types, value members, and tooltips. Feel free to revert. Review by dubochet. ........ r21510 | extempore | 2010-04-12 23:36:33 +0200 (Mon, 12 Apr 2010) | 9 lines Still working on partest. Added ant targets which can be temporary if considered clutter. ant test.partest ant test.partest-opt They run some recently troublesome partest tests with a low timeout. Logged some more exceptions where the compiler has been dying. Review by phaller. ........ r21511 | extempore | 2010-04-12 23:45:17 +0200 (Mon, 12 Apr 2010) | 10 lines Disabling what I think are the last two failing tests, one each of the two leading bugs among those we've seen here today on testing theater: "could not find toMap: (x$1: scala.collection.TraversableOnce,x$2: Predef$<:<)" and "scala.tools.nsc.symtab.Types$TypeError: method react cannot be accessed in java.lang.Object with scala.actors.Reactor[Any] No review but hey lets' see if we can re-enable these tests soonish. ........ r21512 | prokopec | 2010-04-12 23:53:30 +0200 (Mon, 12 Apr 2010) | 1 line Documentation for mutable collections. No review. ........ r21516 | extempore | 2010-04-13 01:20:03 +0200 (Tue, 13 Apr 2010) | 5 lines Noticed that Settings post-set hooks were not being set in the place where they ought to be, so multiple setting settings (such as -optimise) were not flipping all the right bits when set programmatically instead of via command line options. This may be a factor in inlining issues, though by itself it does not appear to solve anything. No review. ........ r21517 | malayeri | 2010-04-13 06:25:09 +0200 (Tue, 13 Apr 2010) | 1 line [scaladoc] Changed comment code and pre tages to not have "font-size: small" attribute. Review by dubochet. ........ r21518 | plocinic | 2010-04-13 10:12:05 +0200 (Tue, 13 Apr 2010) | 1 line Some clean-ups. Removed old syntax, code duplication etc. No review. ........ r21520 | prokopec | 2010-04-13 12:29:58 +0200 (Tue, 13 Apr 2010) | 1 line docs for immutable.A-L*. no review ........ r21521 | rytz | 2010-04-13 12:31:39 +0200 (Tue, 13 Apr 2010) | 1 line fixed most of stability, reviewed by iuli, so no review. continuations.jar is still failing stability, i'll look at that. ........ r21522 | rompf | 2010-04-13 13:08:12 +0200 (Tue, 13 Apr 2010) | 1 line closes #3241 and improves serialization of hash tries. review by community. ........ r21523 | phaller | 2010-04-13 13:37:42 +0200 (Tue, 13 Apr 2010) | 1 line Improved handling of uncaught exceptions in actors. See #711. Review by community. ........ r21524 | prokopec | 2010-04-13 13:41:54 +0200 (Tue, 13 Apr 2010) | 1 line A brace got hurt while documenting. no review. ........ r21525 | rytz | 2010-04-13 13:53:50 +0200 (Tue, 13 Apr 2010) | 1 line fix stability. jar is not stable. no review. ........ r21527 | dubochet | 2010-04-13 14:08:47 +0200 (Tue, 13 Apr 2010) | 1 line [scaladoc] Fixed CSS so that styles from wiki markup are correctly displayed in comments. No Review. ........ r21529 | prokopec | 2010-04-13 14:15:40 +0200 (Tue, 13 Apr 2010) | 1 line Immutable up to Queue docs. no review ........ r21531 | imaier | 2010-04-13 14:53:21 +0200 (Tue, 13 Apr 2010) | 1 line Fixed #3258 ........ r21535 | phaller | 2010-04-13 16:41:02 +0200 (Tue, 13 Apr 2010) | 1 line Hardened actor tests. No review. ........ r21536 | phaller | 2010-04-13 16:59:29 +0200 (Tue, 13 Apr 2010) | 1 line Removed obsolete AbstractReactor trait. No review. ........ r21537 | prokopec | 2010-04-13 17:50:39 +0200 (Tue, 13 Apr 2010) | 1 line Docs. no review ........ r21539 | prokopec | 2010-04-13 18:32:09 +0200 (Tue, 13 Apr 2010) | 1 line Documented immutable.*. no review ........ r21540 | odersky | 2010-04-13 19:36:21 +0200 (Tue, 13 Apr 2010) | 1 line more documentation ........ r21541 | odersky | 2010-04-13 19:36:54 +0200 (Tue, 13 Apr 2010) | 1 line fix for usecase in doccomments. ........ r21542 | odersky | 2010-04-13 19:37:24 +0200 (Tue, 13 Apr 2010) | 1 line attempted fix for the TypeSkolem problem under specialize. ........ r21543 | odersky | 2010-04-13 19:42:35 +0200 (Tue, 13 Apr 2010) | 1 line Fix for specialized fix. ........ r21545 | malayeri | 2010-04-13 20:13:53 +0200 (Tue, 13 Apr 2010) | 1 line [scaladoc] More cosmetic changes. Objects are a different shade of blue and classes are green. ........ r21546 | extempore | 2010-04-13 20:24:05 +0200 (Tue, 13 Apr 2010) | 1 line A redblack tree scalacheck test contributed by dcsobral. No review. ........ r21547 | extempore | 2010-04-13 20:24:27 +0200 (Tue, 13 Apr 2010) | 2 lines A safety improvement for random path generation, and a small change to Random for a more general interface. Review by community. ........ r21548 | extempore | 2010-04-13 20:24:48 +0200 (Tue, 13 Apr 2010) | 3 lines Some mopping up in equality. Found a stack overflow in the way equals was being handled, and hammered it out. New ==/## tests which covers all types and values. Review by odersky. ........ r21550 | odersky | 2010-04-13 21:46:21 +0200 (Tue, 13 Apr 2010) | 2 lines Removed trace output after having verified that skolems are correctly identified now. Now review. ........ r21552 | malayeri | 2010-04-13 22:48:50 +0200 (Tue, 13 Apr 2010) | 1 line [scaladoc] Tweak so that left pane has a little bit of left padding. Review by dubochet. ........ r21554 | dchenbecker | 2010-04-13 22:51:44 +0200 (Tue, 13 Apr 2010) | 4 lines Fix for #3284. This code should probably be refactored, but in the interest of not breaking backwards compatibility, the JSON.parse method has been marked deprecated for now. ........ r21555 | phaller | 2010-04-13 23:48:21 +0200 (Tue, 13 Apr 2010) | 1 line Reverted r21523. No review. ........ r21556 | dragos | 2010-04-14 00:50:37 +0200 (Wed, 14 Apr 2010) | 4 lines Fixed deadlocking behavior in actors. This bug deserves a few more lines. Specialization removed a 'private' modifier on Actor.resumeActor. Mixin did not mix this method in actor implementations, believing it was private. At runtime, an AbstractMethodError was thrown, but swallowed by forkjoin (probably), resulting in an apparent deadlock. It would have been much faster to find and fix if the stacktrace was printed, as it is in Java 1.5. No review. ........ r21557 | dragos | 2010-04-14 00:50:52 +0200 (Wed, 14 Apr 2010) | 1 line Don't decode symbols in .toString. ........ r21558 | dragos | 2010-04-14 00:51:04 +0200 (Wed, 14 Apr 2010) | 4 lines Made the icode reader more resilient to errors. A non-resolved symbol does not cause any crashes, but the method using an unknown symbol will not be used for inlining. Resurrected tests, removed spec-matrix for the moment. No review. ........ r21559 | dragos | 2010-04-14 00:52:56 +0200 (Wed, 14 Apr 2010) | 2 lines Revert "Fix for #3284. This code should probably be refactored,". It breaks test test/files/run/json.scala, and we need at least one good nightly before the RC. ........ r21560 | odersky | 2010-04-14 00:54:25 +0200 (Wed, 14 Apr 2010) | 2 lines Disabled failing json test. ........
Diffstat (limited to 'src/build/genprod.scala')
-rw-r--r--src/build/genprod.scala313
1 files changed, 305 insertions, 8 deletions
diff --git a/src/build/genprod.scala b/src/build/genprod.scala
index 099c24ef20..8217ce3c3b 100644
--- a/src/build/genprod.scala
+++ b/src/build/genprod.scala
@@ -32,7 +32,8 @@ object genprod {
def productFiles = arities map Product.make
def tupleFiles = arities map Tuple.make
def functionFiles = (0 :: arities) map Function.make
- def allfiles = productFiles ::: tupleFiles ::: functionFiles
+ def absFunctionFiles = (0 :: arities) map AbstractFunction.make
+ def allfiles = productFiles ::: tupleFiles ::: functionFiles ::: absFunctionFiles
trait Arity extends Group {
def i: Int // arity
@@ -48,8 +49,10 @@ object genprod {
def xdefs = to map ("x" + _)
def mdefs = to map ("_" + _)
def invariantArgs = typeArgsString(targs)
- def covariantArgs = typeArgsString(targs map ("+" + _))
- def contraCoArgs = typeArgsString((targs map ("-" + _)) ::: List("+R"))
+ def covariantArgs = typeArgsString(targs map (covariantSpecs + "+" + _))
+ def covariantSpecs = ""
+ def contravariantSpecs = ""
+ def contraCoArgs = typeArgsString((targs map (contravariantSpecs + "-" + _)) ::: List(covariantSpecs + "+R"))
def fields = List.map2(mdefs, targs)(_ + ":" + _) mkString ","
def funArgs = List.map2(vdefs, targs)(_ + ":" + _) mkString ","
@@ -59,6 +62,8 @@ object genprod {
def descriptiveComment = ""
def withFancy = if (descriptiveComment.isEmpty) "" else "(with fancy comment)"
def withMoreMethods = if (moreMethods.isEmpty) "" else "(with extra methods)"
+ def packageDef = "scala"
+ def imports = ""
def header = """
/* __ *\
@@ -73,8 +78,9 @@ object genprod {
%s
-package scala
-""".trim.format(genprodString) + "\n\n"
+package %s
+%s
+""".trim.format(genprodString, packageDef, imports) + "\n\n"
}
def main(args: Array[String]) {
@@ -96,7 +102,7 @@ package scala
w.close
} catch {
case e: java.io.IOException =>
- println(e.getMessage() + ": " + out)
+ println(e.getMessage() + ": " + f)
exit(-1)
}
}
@@ -112,6 +118,7 @@ import genprod._
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz */
object FunctionZero extends Function(0) {
+ override def covariantSpecs = "@specialized "
override def descriptiveComment = functionNTemplate.format("currentSeconds", "anonfun0",
""" *
* <b>val</b> currentSeconds = () => System.currentTimeMillis() / 1000L
@@ -126,6 +133,9 @@ object FunctionZero extends Function(0) {
}
object FunctionOne extends Function(1) {
+ override def contravariantSpecs = "@specialized(Int, Long, Double) "
+ override def covariantSpecs = "@specialized(Unit, Boolean, Int, Long, Double) "
+
override def descriptiveComment = functionNTemplate.format("succ", "anonfun1",
""" *
* <b>val</b> succ = (x: Int) => x + 1
@@ -149,6 +159,9 @@ object FunctionOne extends Function(1) {
}
object FunctionTwo extends Function(2) {
+ override def contravariantSpecs = "@specialized(Int, Long, Double) "
+ override def covariantSpecs = "@specialized(Unit, Boolean, Int, Long, Double) "
+
override def descriptiveComment = functionNTemplate.format("max", "anonfun2",
""" *
* <b>val</b> max = (x: Int, y: Int) => <b>if</b> (x < y) y <b>else</b> x
@@ -254,16 +267,245 @@ object Tuple
{
def make(i: Int) = apply(i)()
def apply(i: Int) = i match {
+ case 1 => TupleOne
case 2 => TupleTwo
+ case 3 => TupleThree
case _ => new Tuple(i)
}
}
+object TupleOne extends Tuple(1)
+{
+ override def covariantSpecs = "@specialized(Int, Long, Double) "
+}
+
object TupleTwo extends Tuple(2)
{
+ override def imports = """
+import scala.collection.{TraversableLike, IterableLike}
+import scala.collection.generic.CanBuildFrom
+"""
+ override def covariantSpecs = "@specialized(Int, Long, Double) "
override def moreMethods = """
/** Swap the elements of the tuple */
def swap: Tuple2[T2,T1] = Tuple2(_2, _1)
+
+ def zip[Repr1, El1, El2, To](implicit w1: T1 => TraversableLike[El1, Repr1],
+ w2: T2 => Iterable[El2],
+ cbf1: CanBuildFrom[Repr1, (El1, El2), To]): To = {
+ val coll1: TraversableLike[El1, Repr1] = _1
+ val coll2: Iterable[El2] = _2
+ val b1 = cbf1(coll1.repr)
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext)
+ b1 += ((el1, elems2.next))
+
+ b1.result
+ }
+
+ /** Wraps a tuple in a `Zipped`, which supports 2-ary generalisations of map, flatMap, filter,...
+ *
+ * @see Zipped
+ * $willNotTerminateInf
+ */
+ def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TraversableLike[El1, Repr1], w2: T2 => IterableLike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2]
+ = new Zipped[Repr1, El1, Repr2, El2](_1, _2)
+
+ class Zipped[+Repr1, +El1, +Repr2, +El2](coll1: TraversableLike[El1, Repr1], coll2: IterableLike[El2, Repr2]) { // coll2: IterableLike for filter
+ def map[B, To](f: (El1, El2) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = {
+ val b = cbf(coll1.repr)
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext)
+ b += f(el1, elems2.next)
+
+ b.result
+ }
+
+ def flatMap[B, To](f: (El1, El2) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = {
+ val b = cbf(coll1.repr)
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext)
+ b ++= f(el1, elems2.next)
+
+ b.result
+ }
+
+ def filter[To1, To2](f: (El1, El2) => Boolean)(implicit cbf1: CanBuildFrom[Repr1, El1, To1], cbf2: CanBuildFrom[Repr2, El2, To2]): (To1, To2) = {
+ val b1 = cbf1(coll1.repr)
+ val b2 = cbf2(coll2.repr)
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1) {
+ if(elems2.hasNext) {
+ val el2 = elems2.next
+ if(f(el1, el2)) {
+ b1 += el1
+ b2 += el2
+ }
+ }
+ }
+
+ (b1.result, b2.result)
+ }
+
+ def exists(f: (El1, El2) => Boolean): Boolean = {
+ var acc = false
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(!acc && elems2.hasNext)
+ acc = f(el1, elems2.next)
+
+ acc
+ }
+
+ def forall(f: (El1, El2) => Boolean): Boolean = {
+ var acc = true
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(acc && elems2.hasNext)
+ acc = f(el1, elems2.next)
+
+ acc
+ }
+
+ def foreach[U](f: (El1, El2) => U): Unit = {
+ val elems2 = coll2.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext)
+ f(el1, elems2.next)
+ }
+ }
+"""
+}
+
+object TupleThree extends Tuple(3) {
+ override def imports = """
+import scala.collection.{TraversableLike, IterableLike}
+import scala.collection.generic.CanBuildFrom
+"""
+ override def moreMethods = """
+ def zip[Repr1, El1, El2, El3, To](implicit w1: T1 => TraversableLike[El1, Repr1],
+ w2: T2 => Iterable[El2],
+ w3: T3 => Iterable[El3],
+ cbf1: CanBuildFrom[Repr1, (El1, El2, El3), To]): To = {
+ val coll1: TraversableLike[El1, Repr1] = _1
+ val coll2: Iterable[El2] = _2
+ val coll3: Iterable[El3] = _3
+ val b1 = cbf1(coll1.repr)
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext && elems3.hasNext)
+ b1 += ((el1, elems2.next, elems3.next))
+
+ b1.result
+ }
+
+ /** Wraps a tuple in a `Zipped`, which supports 3-ary generalisations of map, flatMap, filter,...
+ *
+ * @see Zipped
+ * $willNotTerminateInf
+ */
+ def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TraversableLike[El1, Repr1],
+ w2: T2 => IterableLike[El2, Repr2],
+ w3: T3 => IterableLike[El3, Repr3]): Zipped[Repr1, El1, Repr2, El2, Repr3, El3]
+ = new Zipped[Repr1, El1, Repr2, El2, Repr3, El3](_1, _2, _3)
+
+ class Zipped[+Repr1, +El1, +Repr2, +El2, +Repr3, +El3](coll1: TraversableLike[El1, Repr1],
+ coll2: IterableLike[El2, Repr2],
+ coll3: IterableLike[El3, Repr3]) {
+ def map[B, To](f: (El1, El2, El3) => B)(implicit cbf: CanBuildFrom[Repr1, B, To]): To = {
+ val b = cbf(coll1.repr)
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext && elems3.hasNext)
+ b += f(el1, elems2.next, elems3.next)
+
+ b.result
+ }
+
+ def flatMap[B, To](f: (El1, El2, El3) => Traversable[B])(implicit cbf: CanBuildFrom[Repr1, B, To]): To = {
+ val b = cbf(coll1.repr)
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext && elems3.hasNext)
+ b ++= f(el1, elems2.next, elems3.next)
+
+ b.result
+ }
+
+ def filter[To1, To2, To3](f: (El1, El2, El3) => Boolean)(
+ implicit cbf1: CanBuildFrom[Repr1, El1, To1],
+ cbf2: CanBuildFrom[Repr2, El2, To2],
+ cbf3: CanBuildFrom[Repr3, El3, To3]): (To1, To2, To3) = {
+ val b1 = cbf1(coll1.repr)
+ val b2 = cbf2(coll2.repr)
+ val b3 = cbf3(coll3.repr)
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1) {
+ if(elems2.hasNext && elems3.hasNext) {
+ val el2 = elems2.next
+ val el3 = elems3.next
+ if(f(el1, el2, el3)) {
+ b1 += el1
+ b2 += el2
+ b3 += el3
+ }
+ }
+ }
+
+ (b1.result, b2.result, b3.result)
+ }
+
+ def exists(f: (El1, El2, El3) => Boolean): Boolean = {
+ var acc = false
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(!acc && elems2.hasNext && elems3.hasNext)
+ acc = f(el1, elems2.next, elems3.next)
+
+ acc
+ }
+
+ def forall(f: (El1, El2, El3) => Boolean): Boolean = {
+ var acc = true
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(acc && elems2.hasNext && elems3.hasNext)
+ acc = f(el1, elems2.next, elems3.next)
+
+ acc
+ }
+
+ def foreach[U](f: (El1, El2, El3) => U): Unit = {
+ val elems2 = coll2.iterator
+ val elems3 = coll3.iterator
+
+ for(el1 <- coll1)
+ if(elems2.hasNext && elems3.hasNext)
+ f(el1, elems2.next, elems3.next)
+ }
+ }
"""
}
@@ -271,7 +513,7 @@ class Tuple(val i: Int) extends Group("Tuple") with Arity
{
// prettifies it a little if it's overlong
def mkToString() = {
- def str(xs: List[String]) = xs.mkString(""" + "," + """)
+ def str(xs: List[String]) = xs.mkString(""" + "," + """)
if (i <= MAX_ARITY / 2) str(mdefs)
else {
val s1 = str(mdefs take (i / 2))
@@ -303,7 +545,21 @@ zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz */
object Product extends Group("Product")
{
def make(i: Int) = apply(i)()
- def apply(i: Int) = new Product(i)
+ def apply(i: Int) = i match {
+ case 1 => ProductOne
+ case 2 => ProductTwo
+ case _ => new Product(i)
+ }
+}
+
+object ProductOne extends Product(1)
+{
+ override def covariantSpecs = "@specialized(Int, Long, Double) "
+}
+
+object ProductTwo extends Product(2)
+{
+ override def covariantSpecs = "@specialized(Int, Long, Double) "
}
class Product(val i: Int) extends Group("Product") with Arity
@@ -354,3 +610,44 @@ trait {className}{covariantArgs} extends Product {{
</file>}
}
+
+/** Abstract functions **/
+
+object AbstractFunctionZero extends AbstractFunction(0) {
+ override def covariantSpecs = FunctionZero.covariantSpecs
+}
+
+object AbstractFunctionOne extends AbstractFunction(1) {
+ override def covariantSpecs = FunctionOne.covariantSpecs
+ override def contravariantSpecs = FunctionOne.contravariantSpecs
+}
+
+object AbstractFunctionTwo extends AbstractFunction(2) {
+ override def covariantSpecs = FunctionTwo.covariantSpecs
+ override def contravariantSpecs = FunctionTwo.contravariantSpecs
+}
+
+class AbstractFunction(val i: Int) extends Group("AbstractFunction") with Arity
+{
+ override def packageDef = "scala.runtime"
+
+ val superTypeArgs = typeArgsString(targs ::: List("R"))
+
+ def apply() = {
+<file name={"runtime/" + fileName}>{header}
+abstract class {className}{contraCoArgs} extends Function{i}{superTypeArgs} {{
+{moreMethods}
+}}
+</file>}
+
+}
+object AbstractFunction
+{
+ def make(i: Int) = apply(i)()
+ def apply(i: Int) = i match {
+ case 0 => AbstractFunctionZero
+ case 1 => AbstractFunctionOne
+ case 2 => AbstractFunctionTwo
+ case _ => new AbstractFunction(i)
+ }
+}