Created
February 15, 2012 19:24
-
-
Save jdolson/1838320 to your computer and use it in GitHub Desktop.
FlatArrayFactory with Boxed/Unboxed representation type-class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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