Skip to content

Instantly share code, notes, and snippets.

@jdolson
Created February 15, 2012 19:24
Show Gist options
  • Save jdolson/1838320 to your computer and use it in GitHub Desktop.
Save jdolson/1838320 to your computer and use it in GitHub Desktop.
FlatArrayFactory with Boxed/Unboxed representation type-class
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable.{Builder, ArrayBuffer, IndexedSeq, IndexedSeqLike}
import scala.specialized
trait Representation[Unboxed, Boxed] {
def box(x: Unboxed): Boxed
def unbox(x: Boxed): Unboxed
}
abstract class FlatArrayFactory[@specialized Unboxed: ClassManifest, Boxed] {
class FlatArray(elems: Array[Unboxed])(implicit repr: Representation[Unboxed, Boxed])
extends IndexedSeq[Boxed] with IndexedSeqLike[Boxed, FlatArray] {
override protected[this] def newBuilder: Builder[Boxed, FlatArray] = FlatArray.newBuilder
def apply(idx: Int): Boxed = repr.box(elems(idx))
def update(idx: Int, elem: Boxed): Unit = elems(idx) = repr.unbox(elem)
def length = elems.length
override def foreach[U](f: Boxed => U): Unit = elems foreach (elem => f(repr.box(elem)))
override def stringPrefix = "FlatArray"
}
object FlatArray {
def fromSeq(elems: Seq[Boxed])(implicit repr: Representation[Unboxed, Boxed]): FlatArray = {
val xs: Array[Unboxed] = new Array[Unboxed](elems.length)
var i = 0
for (elem <- elems) {
xs(i) = repr.unbox(elem)
i += 1
}
new FlatArray(xs)
}
def apply(elems: Boxed*)(implicit repr: Representation[Unboxed, Boxed]) = fromSeq(elems)
def newBuilder(implicit repr: Representation[Unboxed, Boxed]): Builder[Boxed, FlatArray] =
new ArrayBuffer mapResult fromSeq
implicit def canBuildFrom(implicit repr: Representation[Unboxed, Boxed]) =
new CanBuildFrom[FlatArray, Boxed, FlatArray] {
def apply(): Builder[Boxed, FlatArray] = newBuilder
def apply(from: FlatArray): Builder[Boxed, FlatArray] = newBuilder
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment