Skip to content

Commit b26da40

Browse files
committed
Move IArrayBuilder to scala.collection.mutable
1 parent a55b18c commit b26da40

File tree

2 files changed

+193
-191
lines changed

2 files changed

+193
-191
lines changed

library/src/scala/IArray.scala

Lines changed: 1 addition & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package scala
22
import reflect.ClassTag
33

44
import scala.collection._
5-
import scala.collection.mutable.ArrayBuilder
5+
import scala.collection.mutable.IArrayBuilder
66

77
opaque type IArray[+T] = Array[_ <: T]
88

@@ -666,194 +666,4 @@ object IArray:
666666

667667
end WithFilter
668668

669-
/** A builder class for immutable arrays.
670-
*
671-
* @tparam T the type of the elements for the builder.
672-
*/
673-
@SerialVersionUID(3L)
674-
sealed abstract class IArrayBuilder[T]
675-
extends mutable.ReusableBuilder[T, IArray[T]]
676-
with Serializable {
677-
678-
protected[this] val arrayBuilder: ArrayBuilder[T]
679-
680-
override final def sizeHint(size: Int): Unit = arrayBuilder.sizeHint(size)
681-
def clear(): Unit = arrayBuilder.clear()
682-
683-
/** Add all elements of an array */
684-
def addAll(xs: IArray[T]): this.type =
685-
arrayBuilder.addAll(xs.asInstanceOf[Array[T]])
686-
this
687-
688-
/** Add a slice of an array */
689-
def addAll(xs: IArray[T], offset: Int, length: Int): this.type =
690-
arrayBuilder.addAll(xs.asInstanceOf[Array[T]], offset, length)
691-
this
692-
693-
override def addAll(xs: IterableOnce[T]): this.type =
694-
arrayBuilder.addAll(xs)
695-
this
696-
}
697-
698-
/** A companion object for array builders.
699-
*/
700-
object IArrayBuilder {
701-
702-
/** Creates a new arraybuilder of type `T`.
703-
*
704-
* @tparam T type of the elements for the array builder, with a `ClassTag` context bound.
705-
* @return a new empty array builder.
706-
*/
707-
@inline def make[T: ClassTag]: IArrayBuilder[T] = {
708-
val tag = implicitly[ClassTag[T]]
709-
tag.runtimeClass match {
710-
case java.lang.Byte.TYPE => new IArrayBuilder.ofByte().asInstanceOf[IArrayBuilder[T]]
711-
case java.lang.Short.TYPE => new IArrayBuilder.ofShort().asInstanceOf[IArrayBuilder[T]]
712-
case java.lang.Character.TYPE => new IArrayBuilder.ofChar().asInstanceOf[IArrayBuilder[T]]
713-
case java.lang.Integer.TYPE => new IArrayBuilder.ofInt().asInstanceOf[IArrayBuilder[T]]
714-
case java.lang.Long.TYPE => new IArrayBuilder.ofLong().asInstanceOf[IArrayBuilder[T]]
715-
case java.lang.Float.TYPE => new IArrayBuilder.ofFloat().asInstanceOf[IArrayBuilder[T]]
716-
case java.lang.Double.TYPE => new IArrayBuilder.ofDouble().asInstanceOf[IArrayBuilder[T]]
717-
case java.lang.Boolean.TYPE => new IArrayBuilder.ofBoolean().asInstanceOf[IArrayBuilder[T]]
718-
case java.lang.Void.TYPE => new IArrayBuilder.ofUnit().asInstanceOf[IArrayBuilder[T]]
719-
case _ => new IArrayBuilder.ofRef[T with AnyRef]()(tag.asInstanceOf[ClassTag[T with AnyRef]]).asInstanceOf[IArrayBuilder[T]]
720-
}
721-
}
722-
723-
/** A class for array builders for arrays of reference types.
724-
*
725-
* This builder can be reused.
726-
*
727-
* @tparam T type of elements for the array builder, subtype of `AnyRef` with a `ClassTag` context bound.
728-
*/
729-
@SerialVersionUID(3L)
730-
final class ofRef[T <: AnyRef](implicit ct: ClassTag[T]) extends IArrayBuilder[T] {
731-
protected[this] val arrayBuilder: ArrayBuilder[T] = new ArrayBuilder.ofRef
732-
def addOne(elem: T): this.type = { arrayBuilder.addOne(elem); this }
733-
def result(): IArray[T] = IArray.unsafeFromArray(arrayBuilder.result())
734-
override def equals(other: Any): Boolean = other match {
735-
case x: ofRef[_] => this.arrayBuilder == x.arrayBuilder
736-
case _ => false
737-
}
738-
override def toString = "IArrayBuilder.ofRef"
739-
}
740-
741-
/** A class for array builders for arrays of `byte`s. It can be reused. */
742-
@SerialVersionUID(3L)
743-
final class ofByte extends IArrayBuilder[Byte] {
744-
protected[this] val arrayBuilder: ArrayBuilder[Byte] = new ArrayBuilder.ofByte
745-
def addOne(elem: Byte): this.type = { arrayBuilder.addOne(elem); this }
746-
def result(): IArray[Byte] = IArray.unsafeFromArray(arrayBuilder.result())
747-
override def equals(other: Any): Boolean = other match {
748-
case x: ofByte => this.arrayBuilder == x.arrayBuilder
749-
case _ => false
750-
}
751-
override def toString = "IArrayBuilder.ofByte"
752-
}
753-
754-
/** A class for array builders for arrays of `short`s. It can be reused. */
755-
@SerialVersionUID(3L)
756-
final class ofShort extends IArrayBuilder[Short] {
757-
protected[this] val arrayBuilder: ArrayBuilder[Short] = new ArrayBuilder.ofShort
758-
def addOne(elem: Short): this.type = { arrayBuilder.addOne(elem); this }
759-
def result(): IArray[Short] = IArray.unsafeFromArray(arrayBuilder.result())
760-
override def equals(other: Any): Boolean = other match {
761-
case x: ofShort => this.arrayBuilder == x.arrayBuilder
762-
case _ => false
763-
}
764-
override def toString = "IArrayBuilder.ofShort"
765-
}
766-
767-
/** A class for array builders for arrays of `char`s. It can be reused. */
768-
@SerialVersionUID(3L)
769-
final class ofChar extends IArrayBuilder[Char] {
770-
protected[this] val arrayBuilder: ArrayBuilder[Char] = new ArrayBuilder.ofChar
771-
def addOne(elem: Char): this.type = { arrayBuilder.addOne(elem); this }
772-
def result(): IArray[Char] = IArray.unsafeFromArray(arrayBuilder.result())
773-
override def equals(other: Any): Boolean = other match {
774-
case x: ofChar => this.arrayBuilder == x.arrayBuilder
775-
case _ => false
776-
}
777-
override def toString = "IArrayBuilder.ofChar"
778-
}
779-
780-
/** A class for array builders for arrays of `int`s. It can be reused. */
781-
@SerialVersionUID(3L)
782-
final class ofInt extends IArrayBuilder[Int] {
783-
protected[this] val arrayBuilder: ArrayBuilder[Int] = new ArrayBuilder.ofInt
784-
def addOne(elem: Int): this.type = { arrayBuilder.addOne(elem); this }
785-
def result(): IArray[Int] = IArray.unsafeFromArray(arrayBuilder.result())
786-
override def equals(other: Any): Boolean = other match {
787-
case x: ofInt => this.arrayBuilder == x.arrayBuilder
788-
case _ => false
789-
}
790-
override def toString = "IArrayBuilder.ofInt"
791-
}
792-
793-
/** A class for array builders for arrays of `long`s. It can be reused. */
794-
@SerialVersionUID(3L)
795-
final class ofLong extends IArrayBuilder[Long] {
796-
protected[this] val arrayBuilder: ArrayBuilder[Long] = new ArrayBuilder.ofLong
797-
def addOne(elem: Long): this.type = { arrayBuilder.addOne(elem); this }
798-
def result(): IArray[Long] = IArray.unsafeFromArray(arrayBuilder.result())
799-
override def equals(other: Any): Boolean = other match {
800-
case x: ofLong => this.arrayBuilder == x.arrayBuilder
801-
case _ => false
802-
}
803-
override def toString = "IArrayBuilder.ofLong"
804-
}
805-
806-
/** A class for array builders for arrays of `float`s. It can be reused. */
807-
@SerialVersionUID(3L)
808-
final class ofFloat extends IArrayBuilder[Float] {
809-
protected[this] val arrayBuilder: ArrayBuilder[Float] = new ArrayBuilder.ofFloat
810-
def addOne(elem: Float): this.type = { arrayBuilder.addOne(elem); this }
811-
def result(): IArray[Float] = IArray.unsafeFromArray(arrayBuilder.result())
812-
override def equals(other: Any): Boolean = other match {
813-
case x: ofFloat => this.arrayBuilder == x.arrayBuilder
814-
case _ => false
815-
}
816-
override def toString = "IArrayBuilder.ofFloat"
817-
}
818-
819-
/** A class for array builders for arrays of `double`s. It can be reused. */
820-
@SerialVersionUID(3L)
821-
final class ofDouble extends IArrayBuilder[Double] {
822-
protected[this] val arrayBuilder: ArrayBuilder[Double] = new ArrayBuilder.ofDouble
823-
def addOne(elem: Double): this.type = { arrayBuilder.addOne(elem); this }
824-
def result(): IArray[Double] = IArray.unsafeFromArray(arrayBuilder.result())
825-
override def equals(other: Any): Boolean = other match {
826-
case x: ofDouble => this.arrayBuilder == x.arrayBuilder
827-
case _ => false
828-
}
829-
override def toString = "IArrayBuilder.ofDouble"
830-
}
831-
832-
/** A class for array builders for arrays of `boolean`s. It can be reused. */
833-
@SerialVersionUID(3L)
834-
class ofBoolean extends IArrayBuilder[Boolean] {
835-
protected[this] val arrayBuilder: ArrayBuilder[Boolean] = new ArrayBuilder.ofBoolean
836-
def addOne(elem: Boolean): this.type = { arrayBuilder.addOne(elem); this }
837-
def result(): IArray[Boolean] = IArray.unsafeFromArray(arrayBuilder.result())
838-
override def equals(other: Any): Boolean = other match {
839-
case x: ofBoolean => this.arrayBuilder == x.arrayBuilder
840-
case _ => false
841-
}
842-
override def toString = "IArrayBuilder.ofBoolean"
843-
}
844-
845-
/** A class for array builders for arrays of `Unit` type. It can be reused. */
846-
@SerialVersionUID(3L)
847-
final class ofUnit extends IArrayBuilder[Unit] {
848-
protected[this] val arrayBuilder: ArrayBuilder[Unit] = new ArrayBuilder.ofUnit
849-
def addOne(elem: Unit): this.type = { arrayBuilder.addOne(elem); this }
850-
def result(): IArray[Unit] = IArray.unsafeFromArray(arrayBuilder.result())
851-
override def equals(other: Any): Boolean = other match {
852-
case x: ofUnit => this.arrayBuilder == x.arrayBuilder
853-
case _ => false
854-
}
855-
override def toString = "IArrayBuilder.ofUnit"
856-
}
857-
}
858-
859669
end IArray
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package scala.collection.mutable
2+
3+
import scala.reflect.ClassTag
4+
5+
/** A builder class for immutable arrays.
6+
*
7+
* @tparam T the type of the elements for the builder.
8+
*/
9+
@SerialVersionUID(3L)
10+
sealed abstract class IArrayBuilder[T]
11+
extends ReusableBuilder[T, IArray[T]]
12+
with Serializable {
13+
14+
protected[this] val arrayBuilder: ArrayBuilder[T]
15+
16+
override final def sizeHint(size: Int): Unit = arrayBuilder.sizeHint(size)
17+
def clear(): Unit = arrayBuilder.clear()
18+
19+
/** Add all elements of an array */
20+
def addAll(xs: IArray[T]): this.type =
21+
arrayBuilder.addAll(xs.asInstanceOf[Array[T]])
22+
this
23+
24+
/** Add a slice of an array */
25+
def addAll(xs: IArray[T], offset: Int, length: Int): this.type =
26+
arrayBuilder.addAll(xs.asInstanceOf[Array[T]], offset, length)
27+
this
28+
29+
override def addAll(xs: IterableOnce[T]): this.type =
30+
arrayBuilder.addAll(xs)
31+
this
32+
}
33+
34+
/** A companion object for array builders. */
35+
object IArrayBuilder {
36+
37+
/** Creates a new arraybuilder of type `T`.
38+
*
39+
* @tparam T type of the elements for the array builder, with a `ClassTag` context bound.
40+
* @return a new empty array builder.
41+
*/
42+
@inline def make[T: ClassTag]: IArrayBuilder[T] = {
43+
val tag = implicitly[ClassTag[T]]
44+
tag.runtimeClass match {
45+
case java.lang.Byte.TYPE => new IArrayBuilder.ofByte().asInstanceOf[IArrayBuilder[T]]
46+
case java.lang.Short.TYPE => new IArrayBuilder.ofShort().asInstanceOf[IArrayBuilder[T]]
47+
case java.lang.Character.TYPE => new IArrayBuilder.ofChar().asInstanceOf[IArrayBuilder[T]]
48+
case java.lang.Integer.TYPE => new IArrayBuilder.ofInt().asInstanceOf[IArrayBuilder[T]]
49+
case java.lang.Long.TYPE => new IArrayBuilder.ofLong().asInstanceOf[IArrayBuilder[T]]
50+
case java.lang.Float.TYPE => new IArrayBuilder.ofFloat().asInstanceOf[IArrayBuilder[T]]
51+
case java.lang.Double.TYPE => new IArrayBuilder.ofDouble().asInstanceOf[IArrayBuilder[T]]
52+
case java.lang.Boolean.TYPE => new IArrayBuilder.ofBoolean().asInstanceOf[IArrayBuilder[T]]
53+
case java.lang.Void.TYPE => new IArrayBuilder.ofUnit().asInstanceOf[IArrayBuilder[T]]
54+
case _ => new IArrayBuilder.ofRef[T with AnyRef]()(tag.asInstanceOf[ClassTag[T with AnyRef]]).asInstanceOf[IArrayBuilder[T]]
55+
}
56+
}
57+
58+
/** A class for array builders for arrays of reference types.
59+
*
60+
* This builder can be reused.
61+
*
62+
* @tparam T type of elements for the array builder, subtype of `AnyRef` with a `ClassTag` context bound.
63+
*/
64+
@SerialVersionUID(3L)
65+
final class ofRef[T <: AnyRef](implicit ct: ClassTag[T]) extends IArrayBuilder[T] {
66+
protected[this] val arrayBuilder: ArrayBuilder[T] = new ArrayBuilder.ofRef
67+
def addOne(elem: T): this.type = { arrayBuilder.addOne(elem); this }
68+
def result(): IArray[T] = IArray.unsafeFromArray(arrayBuilder.result())
69+
override def equals(other: Any): Boolean = other match {
70+
case x: ofRef[_] => this.arrayBuilder == x.arrayBuilder
71+
case _ => false
72+
}
73+
override def toString = "IArrayBuilder.ofRef"
74+
}
75+
76+
/** A class for array builders for arrays of `byte`s. It can be reused. */
77+
@SerialVersionUID(3L)
78+
final class ofByte extends IArrayBuilder[Byte] {
79+
protected[this] val arrayBuilder: ArrayBuilder[Byte] = new ArrayBuilder.ofByte
80+
def addOne(elem: Byte): this.type = { arrayBuilder.addOne(elem); this }
81+
def result(): IArray[Byte] = IArray.unsafeFromArray(arrayBuilder.result())
82+
override def equals(other: Any): Boolean = other match {
83+
case x: ofByte => this.arrayBuilder == x.arrayBuilder
84+
case _ => false
85+
}
86+
override def toString = "IArrayBuilder.ofByte"
87+
}
88+
89+
/** A class for array builders for arrays of `short`s. It can be reused. */
90+
@SerialVersionUID(3L)
91+
final class ofShort extends IArrayBuilder[Short] {
92+
protected[this] val arrayBuilder: ArrayBuilder[Short] = new ArrayBuilder.ofShort
93+
def addOne(elem: Short): this.type = { arrayBuilder.addOne(elem); this }
94+
def result(): IArray[Short] = IArray.unsafeFromArray(arrayBuilder.result())
95+
override def equals(other: Any): Boolean = other match {
96+
case x: ofShort => this.arrayBuilder == x.arrayBuilder
97+
case _ => false
98+
}
99+
override def toString = "IArrayBuilder.ofShort"
100+
}
101+
102+
/** A class for array builders for arrays of `char`s. It can be reused. */
103+
@SerialVersionUID(3L)
104+
final class ofChar extends IArrayBuilder[Char] {
105+
protected[this] val arrayBuilder: ArrayBuilder[Char] = new ArrayBuilder.ofChar
106+
def addOne(elem: Char): this.type = { arrayBuilder.addOne(elem); this }
107+
def result(): IArray[Char] = IArray.unsafeFromArray(arrayBuilder.result())
108+
override def equals(other: Any): Boolean = other match {
109+
case x: ofChar => this.arrayBuilder == x.arrayBuilder
110+
case _ => false
111+
}
112+
override def toString = "IArrayBuilder.ofChar"
113+
}
114+
115+
/** A class for array builders for arrays of `int`s. It can be reused. */
116+
@SerialVersionUID(3L)
117+
final class ofInt extends IArrayBuilder[Int] {
118+
protected[this] val arrayBuilder: ArrayBuilder[Int] = new ArrayBuilder.ofInt
119+
def addOne(elem: Int): this.type = { arrayBuilder.addOne(elem); this }
120+
def result(): IArray[Int] = IArray.unsafeFromArray(arrayBuilder.result())
121+
override def equals(other: Any): Boolean = other match {
122+
case x: ofInt => this.arrayBuilder == x.arrayBuilder
123+
case _ => false
124+
}
125+
override def toString = "IArrayBuilder.ofInt"
126+
}
127+
128+
/** A class for array builders for arrays of `long`s. It can be reused. */
129+
@SerialVersionUID(3L)
130+
final class ofLong extends IArrayBuilder[Long] {
131+
protected[this] val arrayBuilder: ArrayBuilder[Long] = new ArrayBuilder.ofLong
132+
def addOne(elem: Long): this.type = { arrayBuilder.addOne(elem); this }
133+
def result(): IArray[Long] = IArray.unsafeFromArray(arrayBuilder.result())
134+
override def equals(other: Any): Boolean = other match {
135+
case x: ofLong => this.arrayBuilder == x.arrayBuilder
136+
case _ => false
137+
}
138+
override def toString = "IArrayBuilder.ofLong"
139+
}
140+
141+
/** A class for array builders for arrays of `float`s. It can be reused. */
142+
@SerialVersionUID(3L)
143+
final class ofFloat extends IArrayBuilder[Float] {
144+
protected[this] val arrayBuilder: ArrayBuilder[Float] = new ArrayBuilder.ofFloat
145+
def addOne(elem: Float): this.type = { arrayBuilder.addOne(elem); this }
146+
def result(): IArray[Float] = IArray.unsafeFromArray(arrayBuilder.result())
147+
override def equals(other: Any): Boolean = other match {
148+
case x: ofFloat => this.arrayBuilder == x.arrayBuilder
149+
case _ => false
150+
}
151+
override def toString = "IArrayBuilder.ofFloat"
152+
}
153+
154+
/** A class for array builders for arrays of `double`s. It can be reused. */
155+
@SerialVersionUID(3L)
156+
final class ofDouble extends IArrayBuilder[Double] {
157+
protected[this] val arrayBuilder: ArrayBuilder[Double] = new ArrayBuilder.ofDouble
158+
def addOne(elem: Double): this.type = { arrayBuilder.addOne(elem); this }
159+
def result(): IArray[Double] = IArray.unsafeFromArray(arrayBuilder.result())
160+
override def equals(other: Any): Boolean = other match {
161+
case x: ofDouble => this.arrayBuilder == x.arrayBuilder
162+
case _ => false
163+
}
164+
override def toString = "IArrayBuilder.ofDouble"
165+
}
166+
167+
/** A class for array builders for arrays of `boolean`s. It can be reused. */
168+
@SerialVersionUID(3L)
169+
class ofBoolean extends IArrayBuilder[Boolean] {
170+
protected[this] val arrayBuilder: ArrayBuilder[Boolean] = new ArrayBuilder.ofBoolean
171+
def addOne(elem: Boolean): this.type = { arrayBuilder.addOne(elem); this }
172+
def result(): IArray[Boolean] = IArray.unsafeFromArray(arrayBuilder.result())
173+
override def equals(other: Any): Boolean = other match {
174+
case x: ofBoolean => this.arrayBuilder == x.arrayBuilder
175+
case _ => false
176+
}
177+
override def toString = "IArrayBuilder.ofBoolean"
178+
}
179+
180+
/** A class for array builders for arrays of `Unit` type. It can be reused. */
181+
@SerialVersionUID(3L)
182+
final class ofUnit extends IArrayBuilder[Unit] {
183+
protected[this] val arrayBuilder: ArrayBuilder[Unit] = new ArrayBuilder.ofUnit
184+
def addOne(elem: Unit): this.type = { arrayBuilder.addOne(elem); this }
185+
def result(): IArray[Unit] = IArray.unsafeFromArray(arrayBuilder.result())
186+
override def equals(other: Any): Boolean = other match {
187+
case x: ofUnit => this.arrayBuilder == x.arrayBuilder
188+
case _ => false
189+
}
190+
override def toString = "IArrayBuilder.ofUnit"
191+
}
192+
}

0 commit comments

Comments
 (0)