Skip to content

Commit 82ec9a5

Browse files
committed
Finished Java collection stream typeclasses. Writing code generator for tests.
1 parent 970278c commit 82ec9a5

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package bench.codegen
2+
3+
import scala.util._
4+
import scala.util.control.NonFatal
5+
6+
object Generator {
7+
val names = "arr ish lst ils que stm trs vec arb ars ast mhs lhs prq muq wra jix jln".split(' ')
8+
def writeTo(f: java.io.File)(pr: (String => Unit) => Unit): Either[Throwable, Unit] = {
9+
try {
10+
val pw = new java.io.PrintWriter(f)
11+
val wr: String => Unit = s => pw.println(s)
12+
try { pr(wr); Right(()) }
13+
catch { case NonFatal(t) => Left(t) }
14+
finally { pw.close() }
15+
}
16+
catch { case NonFatal(t) => Left(t) }
17+
}
18+
def agreement(target: java.io.File, sizes: Option[Array[Int]] = None) {
19+
if (target.exists) throw new java.io.IOException("Generator will not write to existing file: " + target.getPath)
20+
writeTo(target){ pr =>
21+
Seq("test").foreach(pr)
22+
} match {
23+
case Left(t) => println("Did not successfully write file: " + target.getPath); throw t
24+
case _ =>
25+
}
26+
}
27+
}

benchmark/src/main/scala/bench/CollectionSource.scala

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,103 @@ package object generate {
117117
implicit def myCBFs = outerCBFs
118118
}
119119

120+
// Java collection CBFs
121+
122+
implicit val javaUtilArrayListIntCanBuildFrom = new CanBuildFrom[Nothing, Int, java.util.ArrayList[Int]] {
123+
def apply(from: Nothing): collection.mutable.Builder[Int, java.util.ArrayList[Int]] = apply()
124+
def apply(): collection.mutable.Builder[Int, java.util.ArrayList[Int]] = new collection.mutable.Builder[Int, java.util.ArrayList[Int]] {
125+
private var myAL = new java.util.ArrayList[Int]
126+
def clear() = { myAL = new java.util.ArrayList[Int]; () }
127+
def result() = { val ans = myAL; clear(); ans }
128+
def +=(x: Int) = { myAL add x; this }
129+
}
130+
}
131+
implicit val javaUtilArrayListStringCanBuildFrom = new CanBuildFrom[Nothing, String, java.util.ArrayList[String]] {
132+
def apply(from: Nothing): collection.mutable.Builder[String, java.util.ArrayList[String]] = apply()
133+
def apply(): collection.mutable.Builder[String, java.util.ArrayList[String]] = new collection.mutable.Builder[String, java.util.ArrayList[String]] {
134+
private var myAL = new java.util.ArrayList[String]
135+
def clear() = { myAL = new java.util.ArrayList[String]; () }
136+
def result() = { val ans = myAL; clear(); ans }
137+
def +=(x: String) = { myAL add x; this }
138+
}
139+
}
140+
implicit val javaUtilLinkedListIntCanBuildFrom = new CanBuildFrom[Nothing, Int, java.util.LinkedList[Int]] {
141+
def apply(from: Nothing): collection.mutable.Builder[Int, java.util.LinkedList[Int]] = apply()
142+
def apply(): collection.mutable.Builder[Int, java.util.LinkedList[Int]] = new collection.mutable.Builder[Int, java.util.LinkedList[Int]] {
143+
private var myLL = new java.util.LinkedList[Int]
144+
def clear() = { myLL = new java.util.LinkedList[Int]; () }
145+
def result() = { val ans = myLL; clear(); ans }
146+
def +=(x: Int) = { myLL add x; this }
147+
}
148+
}
149+
implicit val javaUtilLinkedListStringCanBuildFrom = new CanBuildFrom[Nothing, String, java.util.LinkedList[String]] {
150+
def apply(from: Nothing): collection.mutable.Builder[String, java.util.LinkedList[String]] = apply()
151+
def apply(): collection.mutable.Builder[String, java.util.LinkedList[String]] = new collection.mutable.Builder[String, java.util.LinkedList[String]] {
152+
private var myLL = new java.util.LinkedList[String]
153+
def clear() = { myLL = new java.util.LinkedList[String]; () }
154+
def result() = { val ans = myLL; clear(); ans }
155+
def +=(x: String) = { myLL add x; this }
156+
}
157+
}
158+
159+
// Streams from ArrayList (Java)
160+
161+
implicit val getsParStreamFromArrayListInt: (java.util.ArrayList[Int] => MakesParallelStream[java.lang.Integer, IntStream]) = ali => {
162+
new MakesParallelStream[java.lang.Integer, IntStream] {
163+
def parStream: IntStream = ali.
164+
asInstanceOf[java.util.ArrayList[java.lang.Integer]].
165+
parallelStream.parallel.
166+
mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
167+
}
168+
}
169+
implicit val getsSeqStreamFromArrayListInt: (java.util.ArrayList[Int] => MakesSequentialStream[java.lang.Integer, IntStream]) = ali => {
170+
new MakesSequentialStream[java.lang.Integer, IntStream] {
171+
def seqStream: IntStream = ali.
172+
asInstanceOf[java.util.ArrayList[java.lang.Integer]].
173+
stream().
174+
mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
175+
}
176+
}
177+
implicit val getsParStreamFromArrayListString: (java.util.ArrayList[String] => MakesParallelStream[String, Stream[String]]) = als => {
178+
new MakesParallelStream[String, Stream[String]] {
179+
def parStream: Stream[String] = als.parallelStream.parallel
180+
}
181+
}
182+
implicit val getsSeqStreamFromArrayListString: (java.util.ArrayList[String] => MakesSequentialStream[String, Stream[String]]) = als => {
183+
new MakesSequentialStream[String, Stream[String]] {
184+
def seqStream: Stream[String] = als.stream
185+
}
186+
}
187+
188+
// Streams from LinkedList (Java)
189+
190+
implicit val getsParStreamFromLinkedListInt: (java.util.LinkedList[Int] => MakesParallelStream[java.lang.Integer, IntStream]) = ali => {
191+
new MakesParallelStream[java.lang.Integer, IntStream] {
192+
def parStream: IntStream = ali.
193+
asInstanceOf[java.util.LinkedList[java.lang.Integer]].
194+
parallelStream.parallel.
195+
mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
196+
}
197+
}
198+
implicit val getsSeqStreamFromLinkedListInt: (java.util.LinkedList[Int] => MakesSequentialStream[java.lang.Integer, IntStream]) = ali => {
199+
new MakesSequentialStream[java.lang.Integer, IntStream] {
200+
def seqStream: IntStream = ali.
201+
asInstanceOf[java.util.LinkedList[java.lang.Integer]].
202+
stream().
203+
mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
204+
}
205+
}
206+
implicit val getsParStreamFromLinkedListString: (java.util.LinkedList[String] => MakesParallelStream[String, Stream[String]]) = als => {
207+
new MakesParallelStream[String, Stream[String]] {
208+
def parStream: Stream[String] = als.parallelStream.parallel
209+
}
210+
}
211+
implicit val getsSeqStreamFromLinkedListString: (java.util.LinkedList[String] => MakesSequentialStream[String, Stream[String]]) = als => {
212+
new MakesSequentialStream[String, Stream[String]] {
213+
def seqStream: Stream[String] = als.stream
214+
}
215+
}
216+
120217
class ArrThings(val sizes: Array[Int]) extends AbstractThings[Array]("Array") {}
121218

122219
class IshThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.HashSet]("immutable.HashSet") {}
@@ -149,6 +246,10 @@ package object generate {
149246

150247
class WraThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.WrappedArray]("mutable.WrappedArray") {}
151248

249+
class JixThings(val sizes: Array[Int]) extends AbstractThings[java.util.ArrayList]("java.util.ArrayList") {}
250+
251+
class JlnThings(val sizes: Array[Int]) extends AbstractThings[java.util.LinkedList]("java.util.LinkedList") {}
252+
152253
class Things(sizes: Array[Int] = Array(0, 1, 2, 5, 7, 15, 16, 32, 33, 64, 129, 256, 1023, 2914, 7151, 50000, 200000, 1000000)) {
153254
lazy val arr = new ArrThings(sizes)
154255
lazy val ish = new IshThings(sizes)
@@ -166,5 +267,7 @@ package object generate {
166267
lazy val prq = new PrqThings(sizes)
167268
lazy val muq = new MuqThings(sizes)
168269
lazy val wra = new WraThings(sizes)
270+
lazy val jix = new JixThings(sizes)
271+
lazy val jln = new JlnThings(sizes)
169272
}
170273
}

0 commit comments

Comments
 (0)