in scalding-base/src/main/scala/com/twitter/scalding/typed/HashEqualsArrayWrapper.scala [17:42]
def wrap[T](a: Array[T]): HashEqualsArrayWrapper[T] =
wrapByClassFn[T](a.getClass.asInstanceOf[Class[Array[T]]])(a)
/**
* Creates a function that can be used to wrap Arrays into objects with valid equals() and hashCode()
* methods.
*
* Using this method and applying it to many arrays should be faster than using wrap above on each array,
* because this method uses reflection once, and wrap above uses reflection on each individual array.
*/
def wrapByClassFn[T](clazz: Class[Array[T]]): Array[T] => HashEqualsArrayWrapper[T] = {
val fn = clazz match {
case c if classOf[Array[Long]].equals(c) => a: Array[Long] => new HashEqualsLongArrayWrapper(a)
case c if classOf[Array[Int]].equals(c) => a: Array[Int] => new HashEqualsIntArrayWrapper(a)
case c if classOf[Array[Short]].equals(c) => a: Array[Short] => new HashEqualsShortArrayWrapper(a)
case c if classOf[Array[Char]].equals(c) => a: Array[Char] => new HashEqualsCharArrayWrapper(a)
case c if classOf[Array[Byte]].equals(c) => a: Array[Byte] => new HashEqualsByteArrayWrapper(a)
case c if classOf[Array[Boolean]].equals(c) => a: Array[Boolean] => new HashEqualsBooleanArrayWrapper(a)
case c if classOf[Array[Float]].equals(c) => a: Array[Float] => new HashEqualsFloatArrayWrapper(a)
case c if classOf[Array[Double]].equals(c) => a: Array[Double] => new HashEqualsDoubleArrayWrapper(a)
case c => a: Array[T] => new HashEqualsObjectArrayWrapper(a)
}
fn.asInstanceOf[(Array[T] => HashEqualsArrayWrapper[T])]
}