Skip to content

Instantly share code, notes, and snippets.

@bishabosha
Last active November 23, 2025 15:44
Show Gist options
  • Select an option

  • Save bishabosha/5f693912173a371c1e561861506f876b to your computer and use it in GitHub Desktop.

Select an option

Save bishabosha/5f693912173a371c1e561861506f876b to your computer and use it in GitHub Desktop.
Benchmark varargs builder changes in scala 3
//> using jmh
//> using scala 3.7.4
package bench
import org.openjdk.jmh.annotations.BenchmarkMode
import org.openjdk.jmh.annotations.OutputTimeUnit
import org.openjdk.jmh.annotations.Mode
import org.openjdk.jmh.annotations.Warmup
import org.openjdk.jmh.annotations.Measurement
import org.openjdk.jmh.annotations.Fork
import org.openjdk.jmh.annotations.Benchmark
import java.util.concurrent.TimeUnit
@BenchmarkMode(Array(Mode.AverageTime))
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 20, time = 10, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 15, time = 10, timeUnit = TimeUnit.MILLISECONDS)
@Fork(0)
class Benchmarks {
@Benchmark
def oldVarArgs(): (Seq[Int], Seq[Int]) = {
var i = 0
var seq: Seq[Int] = Seq.empty
var seq2: Seq[Int] = Seq.empty
while i < 10_000_000 do
i += 1
seq = runtimeStrawman.VarArgsBuilder.ofInt(100)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
seq2 = runtimeStrawman.VarArgsBuilder.ofInt(100)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
end while
(seq, seq2)
}
@Benchmark
def newVarArgs(): (Seq[Int], Seq[Int]) = {
var i = 0
var seq: Seq[Int] = Seq.empty
var seq2: Seq[Int] = Seq.empty
while i < 10_000_000 do
i += 1
seq = (new runtimeStrawman.VarArgsBuilder2.ofInt(100))
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
seq2 = (new runtimeStrawman.VarArgsBuilder2.ofInt(100))
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
end while
(seq, seq2)
}
@Benchmark
def noVirtualVarargsArgs(): (Seq[Int], Seq[Int]) = {
var i = 0
var seq: Seq[Int] = Seq.empty
var seq2: Seq[Int] = Seq.empty
while i < 10_000_000 do
i += 1
seq = (new runtimeStrawman.VarArgsBuilder3.ofInt(100))
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
seq2 = (new runtimeStrawman.VarArgsBuilder3.ofInt(100))
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.add(10001)
.add(10002)
.add(10003)
.add(10004)
.add(10005)
.add(10006)
.add(10007)
.add(10008)
.add(10009)
.add(10010)
.add(10011)
.add(10012)
.add(10013)
.add(10014)
.add(10015)
.add(10016)
.add(10017)
.add(10018)
.add(10019)
.add(10020)
.add(10021)
.add(10022)
.add(10023)
.add(10024)
.add(10025)
.result()
end while
(seq, seq2)
}
@Benchmark
def controlOld(): (Seq[String], Seq[Object]) = {
var i = 0
var seq: Seq[String] = Seq.empty
var seq2: Seq[Object] = Seq.empty
while i < 10_000_000 do
i += 1
seq = (runtimeStrawman.VarArgsBuilder.ofRef[String](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
seq2 = (runtimeStrawman.VarArgsBuilder.generic[Object](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
end while
(seq, seq2)
}
@Benchmark
def controlNew(): (Seq[String], Seq[Object]) = {
var i = 0
var seq: Seq[String] = Seq.empty
var seq2: Seq[Object] = Seq.empty
while i < 10_000_000 do
i += 1
seq = (new runtimeStrawman.VarArgsBuilder2.ofRef[String](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
seq2 = (new runtimeStrawman.VarArgsBuilder2.generic[Object](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
end while
(seq, seq2)
}
@Benchmark
def controlNoVirtual(): (Seq[String], Seq[Object]) = {
var i = 0
var seq: Seq[String] = Seq.empty
var seq2: Seq[Object] = Seq.empty
while i < 10_000_000 do
i += 1
seq = (new runtimeStrawman.VarArgsBuilder3.ofRef[String](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
seq2 = (new runtimeStrawman.VarArgsBuilder3.generic[Object](100))
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.add("10001")
.add("10002")
.add("10003")
.add("10004")
.add("10005")
.add("10006")
.add("10007")
.add("10008")
.add("10009")
.add("10010")
.add("10011")
.add("10012")
.add("10013")
.add("10014")
.add("10015")
.add("10016")
.add("10017")
.add("10018")
.add("10019")
.add("10020")
.add("10021")
.add("10022")
.add("10023")
.add("10024")
.add("10025")
.result()
end while
(seq, seq2)
}
}
package runtimeStrawman
import scala.collection.immutable.ArraySeq
import scala.reflect.ClassTag
sealed abstract class VarArgsBuilder[T]:
def add(elem: T): this.type
def addSeq(elems: Seq[T]): this.type
def addArray(elems: Array[T]): this.type
def result(): Seq[T]
object VarArgsBuilder:
def generic[T](n: Int): VarArgsBuilder[T] = new VarArgsBuilder[T]:
private val xs = new Array[AnyRef](n)
def result() = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
def add(elem: T): this.type =
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
def ofRef[T <: AnyRef](n: Int): VarArgsBuilder[T] = new VarArgsBuilder[T]:
private val xs = new Array[AnyRef](n)
def result() = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
def add(elem: T): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofByte(n: Int): VarArgsBuilder[Byte] = new VarArgsBuilder[Byte]:
private val xs = new Array[Byte](n)
def result() = ArraySeq.ofByte(xs)
private var i = 0
def add(elem: Byte): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofShort(n: Int): VarArgsBuilder[Short] = new VarArgsBuilder[Short]:
private val xs = new Array[Short](n)
def result() = ArraySeq.ofShort(xs)
private var i = 0
def add(elem: Short): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofChar(n: Int): VarArgsBuilder[Char] = new VarArgsBuilder[Char]:
private val xs = new Array[Char](n)
def result() = ArraySeq.ofChar(xs)
private var i = 0
def add(elem: Char): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofInt(n: Int): VarArgsBuilder[Int] = new VarArgsBuilder[Int]:
private val xs = new Array[Int](n)
def result() = ArraySeq.ofInt(xs)
private var i = 0
def add(elem: Int): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofLong(n: Int): VarArgsBuilder[Long] = new VarArgsBuilder[Long]:
private val xs = new Array[Long](n)
def result() = ArraySeq.ofLong(xs)
private var i = 0
def add(elem: Long): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofFloat(n: Int): VarArgsBuilder[Float] = new VarArgsBuilder[Float]:
private val xs = new Array[Float](n)
def result() = ArraySeq.ofFloat(xs)
private var i = 0
def add(elem: Float): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofDouble(n: Int): VarArgsBuilder[Double] = new VarArgsBuilder[Double]:
private val xs = new Array[Double](n)
def result() = ArraySeq.ofDouble(xs)
private var i = 0
def add(elem: Double): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofBoolean(n: Int): VarArgsBuilder[Boolean] = new VarArgsBuilder[Boolean]:
private val xs = new Array[Boolean](n)
def result() = ArraySeq.ofBoolean(xs)
private var i = 0
def add(elem: Boolean): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def ofUnit(n: Int): VarArgsBuilder[Unit] = new VarArgsBuilder[Unit]:
private val xs = new Array[Unit](n)
def result() = ArraySeq.ofUnit(xs)
private var i = 0
def add(elem: Unit): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
end VarArgsBuilder
package runtimeStrawman
import scala.collection.immutable.ArraySeq
import scala.reflect.ClassTag
sealed abstract class VarArgsBuilder2[T]:
def add(elem: T): this.type
def addSeq(elems: Seq[T]): this.type
def addArray(elems: Array[T]): this.type
def result(): Seq[T]
object VarArgsBuilder2:
class generic[T](n: Int) extends VarArgsBuilder2[T]:
private val xs = new Array[AnyRef](n)
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
override def add(elem: T): this.type =
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
override def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
override def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
class ofRef[T <: AnyRef](n: Int) extends VarArgsBuilder2[T]:
private val xs = new Array[AnyRef](n)
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
override def add(elem: T): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofByte(n: Int) extends VarArgsBuilder2[Byte]:
private val xs = new Array[Byte](n)
override def result(): Seq[Byte] = ArraySeq.ofByte(xs)
private var i = 0
override def add(elem: Byte): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofShort(n: Int) extends VarArgsBuilder2[Short]:
private val xs = new Array[Short](n)
override def result(): Seq[Short] = ArraySeq.ofShort(xs)
private var i = 0
override def add(elem: Short): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofChar(n: Int) extends VarArgsBuilder2[Char]:
private val xs = new Array[Char](n)
override def result(): Seq[Char] = ArraySeq.ofChar(xs)
private var i = 0
override def add(elem: Char): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofInt(n: Int) extends VarArgsBuilder2[Int]:
private val xs = new Array[Int](n)
override def result(): Seq[Int] = ArraySeq.ofInt(xs)
private var i = 0
override def add(elem: Int): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofLong(n: Int) extends VarArgsBuilder2[Long]:
private val xs = new Array[Long](n)
override def result(): Seq[Long] = ArraySeq.ofLong(xs)
private var i = 0
override def add(elem: Long): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofFloat(n: Int) extends VarArgsBuilder2[Float]:
private val xs = new Array[Float](n)
override def result(): Seq[Float] = ArraySeq.ofFloat(xs)
private var i = 0
override def add(elem: Float): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofDouble(n: Int) extends VarArgsBuilder2[Double]:
private val xs = new Array[Double](n)
override def result(): Seq[Double] = ArraySeq.ofDouble(xs)
private var i = 0
override def add(elem: Double): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofBoolean(n: Int) extends VarArgsBuilder2[Boolean]:
private val xs = new Array[Boolean](n)
override def result(): Seq[Boolean] = ArraySeq.ofBoolean(xs)
private var i = 0
override def add(elem: Boolean): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
class ofUnit(n: Int) extends VarArgsBuilder2[Unit]:
private val xs = new Array[Unit](n)
override def result(): Seq[Unit] = ArraySeq.ofUnit(xs)
private var i = 0
override def add(elem: Unit): this.type =
xs(i) = elem
i += 1
this
override def addSeq(elems: Seq[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
override def addArray(elems: Array[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
end VarArgsBuilder2
package runtimeStrawman
import scala.collection.immutable.ArraySeq
import scala.reflect.ClassTag
sealed abstract class VarArgsBuilder3[T]:
// def add(elem: T): this.type
// def addSeq(elems: Seq[T]): this.type
// def addArray(elems: Array[T]): this.type
def result(): Seq[T]
object VarArgsBuilder3:
final class generic[T](n: Int) extends VarArgsBuilder3[T]:
private val xs = new Array[AnyRef](n)
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
def add(elem: T): this.type =
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem.asInstanceOf[AnyRef]
i += 1
this
final class ofRef[T <: AnyRef](n: Int) extends VarArgsBuilder3[T]:
private val xs = new Array[AnyRef](n)
override def result(): Seq[T] = ArraySeq.ofRef(xs).asInstanceOf[ArraySeq[T]]
private var i = 0
def add(elem: T): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[T]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofByte(n: Int) extends VarArgsBuilder3[Byte]:
private val xs = new Array[Byte](n)
override def result(): Seq[Byte] = ArraySeq.ofByte(xs)
private var i = 0
def add(elem: Byte): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Byte]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofShort(n: Int) extends VarArgsBuilder3[Short]:
private val xs = new Array[Short](n)
override def result(): Seq[Short] = ArraySeq.ofShort(xs)
private var i = 0
def add(elem: Short): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Short]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofChar(n: Int) extends VarArgsBuilder3[Char]:
private val xs = new Array[Char](n)
override def result(): Seq[Char] = ArraySeq.ofChar(xs)
private var i = 0
def add(elem: Char): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Char]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofInt(n: Int) extends VarArgsBuilder3[Int]:
private val xs = new Array[Int](n)
override def result(): Seq[Int] = ArraySeq.ofInt(xs)
private var i = 0
def add(elem: Int): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Int]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofLong(n: Int) extends VarArgsBuilder3[Long]:
private val xs = new Array[Long](n)
override def result(): Seq[Long] = ArraySeq.ofLong(xs)
private var i = 0
def add(elem: Long): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Long]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofFloat(n: Int) extends VarArgsBuilder3[Float]:
private val xs = new Array[Float](n)
override def result(): Seq[Float] = ArraySeq.ofFloat(xs)
private var i = 0
def add(elem: Float): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Float]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofDouble(n: Int) extends VarArgsBuilder3[Double]:
private val xs = new Array[Double](n)
override def result(): Seq[Double] = ArraySeq.ofDouble(xs)
private var i = 0
def add(elem: Double): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Double]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofBoolean(n: Int) extends VarArgsBuilder3[Boolean]:
private val xs = new Array[Boolean](n)
override def result(): Seq[Boolean] = ArraySeq.ofBoolean(xs)
private var i = 0
def add(elem: Boolean): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Boolean]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
final class ofUnit(n: Int) extends VarArgsBuilder3[Unit]:
private val xs = new Array[Unit](n)
override def result(): Seq[Unit] = ArraySeq.ofUnit(xs)
private var i = 0
def add(elem: Unit): this.type =
xs(i) = elem
i += 1
this
def addSeq(elems: Seq[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
def addArray(elems: Array[Unit]): this.type =
for elem <- elems do
xs(i) = elem
i += 1
this
end VarArgsBuilder3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment