Skip to content

[work in progress] Arrays of value classes #1228

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 30 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
53859df
New representation for arrays of value classes
smarter May 25, 2015
bc125df
Arrays of value classes, base version
VladimirNik Apr 18, 2016
385e437
update def arrayTag for work with vc-arrays
VladimirNik Apr 21, 2016
8c96401
vcArrays: Typed node processing fixed for vcArrays
VladimirNik Apr 21, 2016
fc33894
vcArrays: DefDef node processing fix for vcArrays
VladimirNik Apr 21, 2016
57692ee
Tests for vcArrays (functions, wrappers, vc arrays usage)
VladimirNik Apr 21, 2016
33d0269
arrayTag impl for vcArrays is moved to VCXCompanions
VladimirNik Apr 21, 2016
f07bb0e
ArrayBuilder, ArrayOps, WrappedArray are added/updated for arrays of …
VladimirNik Apr 22, 2016
958ac18
Add canBuildFrom for arrays of value classes
VladimirNik Apr 22, 2016
c8afac3
vcArrays: use newArray method while transforming arrays of value clas…
VladimirNik Apr 25, 2016
bed9260
vcArrays: tests for newArray invocation
VladimirNik Apr 25, 2016
43ffe07
fix hashCode for value classes with null argument: return 0
VladimirNik Apr 25, 2016
282cbe1
impl for def repl in VCArrayOps.scala
VladimirNik Apr 26, 2016
73e65ba
Predef.scala, ArrayBuilder.scala, WrappedArray.scala are added to src…
VladimirNik Apr 26, 2016
71c9c17
remove multidimensional array from tests (vc arrays)
VladimirNik Apr 26, 2016
99ef2d3
Update defs ArrayBuilder.make, scala.Predef.genericArrayOps, WrappedA…
VladimirNik Apr 27, 2016
4fd7af8
VCArrayOps: rewrite vcElementClass, transpose
VladimirNik Apr 27, 2016
508b062
ArrayOps.scala, ClassTag.scala shadowing
VladimirNik Apr 29, 2016
e9fb35e
vcArrays: support for multidimensional arrays is added
VladimirNik May 4, 2016
608530e
Rewrite ClassTag and ScalaRunTime for new representation of arrays of…
VladimirNik May 4, 2016
eeabf38
vcParents: add ensureConforms to class tag generated for arrays of va…
VladimirNik May 4, 2016
a00adb6
fix transpose for arrays of value classes
VladimirNik May 4, 2016
17e5fd4
arrays of value classes: fix impl of def ++= (VCArrayBuilder)
VladimirNik May 4, 2016
0c0f566
New tests are added (multidimensional arrays, array builder, wrapper,…
VladimirNik May 4, 2016
673a38d
vcArrays: fix for arrays of value classes with array as underlying type
VladimirNik May 4, 2016
f27bc4d
Rewrite vc support in Definitions; add def deepUnderlyingOfValueClass…
VladimirNik May 12, 2016
7ddac46
add support for arrays of value classes with underlying type that is …
VladimirNik May 12, 2016
145d90d
Add src/scala/Array.scala
VladimirNik May 12, 2016
5ddda8c
Fix for vc arrays creation: don't box values during array creation
VladimirNik May 13, 2016
44507fa
refactor vc array creation
VladimirNik May 14, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/dotty/DottyPredef.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package dotty

import scala.collection.generic.CanBuildFrom
import scala.reflect.runtime.universe.TypeTag
import scala.reflect.ClassTag
import scala.collection.mutable.{ArrayBuilder, ArrayOps, WrappedArray}
import dotty.runtime.vc._
import scala.Predef.???
import scala.collection.Seq

Expand Down Expand Up @@ -42,4 +45,10 @@ object DottyPredef {
implicit def eqNumFloat : Eq[Number, Float] = Eq
implicit def eqDoubleNum: Eq[Double, Number] = Eq
implicit def eqNumDouble: Eq[Number, Double] = Eq

def wrapVCArray[T](xs: Array[T]): WrappedArray[T] =
new VCWrappedArray[T](xs)

def opsVCArray[T /*<: AnyVal*/](xs: Array[T]): ArrayOps[T] =
new VCArrayOps[T](xs)
}
69 changes: 69 additions & 0 deletions src/dotty/runtime/vc/VCArrayBuilder.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package dotty.runtime.vc

import scala.collection.TraversableOnce
import scala.collection.mutable.ArrayBuilder
import scala.reflect.ClassTag

class VCArrayBuilder[T](implicit ct: ClassTag[T]) extends ArrayBuilder[T] {

private var elems: Array[T] = _
private var capacity: Int = 0
private var size: Int = 0

private def mkArray(size: Int): Array[T] = {
val newelems = new Array[T](size)
if (this.size > 0) Array.copy(elems, 0, newelems, 0, this.size)
newelems
}

private def resize(size: Int) = {
elems = mkArray(size)
capacity = size
}

override def sizeHint(size: Int) = {
if (capacity < size) resize(size)
}

private def ensureSize(size: Int) = {
if (capacity < size || capacity == 0) {
var newsize = if (capacity == 0) 16 else capacity * 2
while (newsize < size) newsize *= 2
resize(newsize)
}
}

def +=(elem: T): this.type = {
ensureSize(size + 1)
elems(size) = elem
size += 1
this
}

//use impl from Growable
// override def ++=(xs: TraversableOnce[T]): this.type = (xs.asInstanceOf[AnyRef]) match {
// case xs: VCWrappedArray[_] =>
// ensureSize(this.size + xs.length)
// Array.copy(xs.array, 0, elems, this.size, xs.length)
// size += xs.length
// this
// case _ =>
// super.++=(xs)
// }

def clear() = {
size = 0
}

def result() = {
if (capacity != 0 && capacity == size) elems
else mkArray(size)
}

override def equals(other: Any): Boolean = other match {
case x: VCArrayBuilder[_] => (size == x.size) && (elems == x.elems)
case _ => false
}

override def toString = "ArrayBuilder.ofVC"
}
46 changes: 46 additions & 0 deletions src/dotty/runtime/vc/VCArrayOps.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package dotty.runtime.vc

import scala.collection.mutable.{Builder, WrappedArray, ArrayBuilder, ArrayOps}
import scala.reflect.ClassTag
import dotty.DottyPredef._

import scala.runtime.ScalaRunTime._

class VCArrayOps[T](xs: Array[T]) extends ArrayOps[T] {
val array = xs
def length: Int = array.length
def apply(index: Int): T = array(index)
def update(index: Int, elem: T) = {
array(index) = elem
}

lazy val elemTag = (xs.asInstanceOf[Object]: @unchecked) match {
case vc: VCIntArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCShortArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCLongArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCFloatArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCDoubleArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCByteArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCBooleanArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCCharArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
case vc: VCObjectArray[_] => vc.ct.asInstanceOf[ClassTag[T]]
}

override def repr = xs

override protected[this] def newBuilder = new VCArrayBuilder[T]()(elemTag).asInstanceOf[ArrayBuilder[T]]
//override protected[this] def newBuilder = new ArrayBuilder.ofRef[T]()(ClassTag[T](arrayElementClass(repr.getClass)))

override protected[this] def thisCollection: WrappedArray[T] = wrapVCArray(xs)
override protected[this] def toCollection(repr: Array[T]): WrappedArray[T] = wrapVCArray(xs)

final def vcElementClass: Class[_] = arrayElementClass(elemTag)

override def toArray[U >: T : ClassTag]: Array[U] = {
val thatElementClass = arrayElementClass(implicitly[ClassTag[U]])
if (vcElementClass eq thatElementClass)
repr.asInstanceOf[Array[U]]
else
super.toArray[U]
}
}
Loading