summaryrefslogtreecommitdiff
path: root/examples/scala-js/library/src/main/scala/scala/scalajs/js/typedarray/package.scala
blob: 0ab5a053a90b5d333c46f67f4390169dff582f74 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package scala.scalajs.js

import JSConverters._

/** The typdearray package provides facade types for JavaScript
 *  ArrayBuffer, TypeArrays and DataView. Further, it provides
 *  conversions between primitive Scala arrays and TypedArrays
 */
package object typedarray {

  // Implicit classes scala.Array -> TypedArray
  implicit class AB2TA(val array: scala.Array[Byte]) extends AnyVal {
    def toTypedArray: Int8Array = byteArray2Int8Array(array)
  }

  implicit class AS2TA(val array: scala.Array[Short]) extends AnyVal {
    def toTypedArray: Int16Array = shortArray2Int16Array(array)
  }

  implicit class AC2TA(val array: scala.Array[Char]) extends AnyVal {
    def toTypedArray: Uint16Array = charArray2Uint16Array(array)
  }

  implicit class AI2TA(val array: scala.Array[Int]) extends AnyVal {
    def toTypedArray: Int32Array = intArray2Int32Array(array)
  }

  implicit class AF2TA(val array: scala.Array[Float]) extends AnyVal {
    def toTypedArray: Float32Array = floatArray2Float32Array(array)
  }

  implicit class AD2TA(val array: scala.Array[Double]) extends AnyVal {
    def toTypedArray: Float64Array = doubleArray2Float64Array(array)
  }

  // Implicit classes TypedArray -> scala.Array
  implicit class TA2AB(val array: Int8Array) extends AnyVal {
    def toArray: scala.Array[Byte] = int8Array2ByteArray(array)
  }

  implicit class TA2AS(val array: Int16Array) extends AnyVal {
    def toArray: scala.Array[Short] = int16Array2ShortArray(array)
  }

  implicit class TA2AC(val array: Uint16Array) extends AnyVal {
    def toArray: scala.Array[Char] = uint16Array2CharArray(array)
  }

  implicit class TA2AI(val array: Int32Array) extends AnyVal {
    def toArray: scala.Array[Int] = int32Array2IntArray(array)
  }

  implicit class TA2AF(val array: Float32Array) extends AnyVal {
    def toArray: scala.Array[Float] = float32Array2FloatArray(array)
  }

  implicit class TA2AD(val array: Float64Array) extends AnyVal {
    def toArray: scala.Array[Double] = float64Array2DoubleArray(array)
  }

  // scala.Array -> TypedArray

  def byteArray2Int8Array(array: scala.Array[Byte]): Int8Array =
    array2typedArrayImpl(array, new Int8Array(array.length))

  def shortArray2Int16Array(array: scala.Array[Short]): Int16Array =
    array2typedArrayImpl(array, new Int16Array(array.length))

  def charArray2Uint16Array(array: scala.Array[Char]): Uint16Array = {
    // Can't use array2typedArrayImpl because Uint16Array contains Ints
    val len = array.length
    val dest = new Uint16Array(len)
    var i = 0
    while (i < len) {
      dest(i) = array(i).toInt
      i += 1
    }
    dest
  }

  def intArray2Int32Array(array: scala.Array[Int]): Int32Array =
    array2typedArrayImpl(array, new Int32Array(array.length))

  def floatArray2Float32Array(array: scala.Array[Float]): Float32Array =
    array2typedArrayImpl(array, new Float32Array(array.length))

  def doubleArray2Float64Array(array: scala.Array[Double]): Float64Array =
    array2typedArrayImpl(array, new Float64Array(array.length))

  @inline private def array2typedArrayImpl[
      @specialized(Byte, Short, Int, Float, Double) T,
      Repr <: TypedArray[T, Repr]](
      array: scala.Array[T], dest: Repr): Repr = {
    val len = array.length
    var i = 0
    while (i < len) {
      dest(i) = array(i)
      i += 1
    }
    dest
  }

  // TypedArray -> scala.Array

  def int8Array2ByteArray(array: Int8Array): scala.Array[Byte] =
    typedArray2arrayImpl(array, new scala.Array(array.length))

  def int16Array2ShortArray(array: Int16Array): scala.Array[Short] =
    typedArray2arrayImpl(array, new scala.Array(array.length))

  def uint16Array2CharArray(array: Uint16Array): scala.Array[Char] = {
    // Can't use typedArray2arrayImpl because Uint16Array contains Ints
    val len = array.length
    val dest = new scala.Array[Char](len)
    var i = 0
    while (i < len) {
      dest(i) = array(i).toChar
      i += 1
    }
    dest
  }

  def int32Array2IntArray(array: Int32Array): scala.Array[Int] =
    typedArray2arrayImpl(array, new scala.Array(array.length))

  def float32Array2FloatArray(array: Float32Array): scala.Array[Float] =
    typedArray2arrayImpl(array, new scala.Array(array.length))

  def float64Array2DoubleArray(array: Float64Array): scala.Array[Double] =
    typedArray2arrayImpl(array, new scala.Array(array.length))

  @inline private def typedArray2arrayImpl[
      @specialized(Byte, Short, Int, Float, Double) T,
      Repr <: TypedArray[T, Repr]](
      array: Repr, dest: scala.Array[T]): scala.Array[T] = {
    val len = dest.length
    var i = 0
    while (i < len) {
      dest(i) = array(i)
      i += 1
    }
    dest
  }

}