Skip to content

Commit 4dbc9fb

Browse files
authored
Merge pull request scala/scala#11083 from eejbyfeldt/i13108
Fix ArraySeq.ofFloat/ofDouble.equals for floating point
2 parents cc39281 + 5b76ce9 commit 4dbc9fb

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

library/src/scala/collection/immutable/ArraySeq.scala

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,14 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
575575
def apply(i: Int): Float = unsafeArray(i)
576576
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
577577
override def equals(that: Any) = that match {
578-
case that: ofFloat => Arrays.equals(unsafeArray, that.unsafeArray)
578+
case that: ofFloat =>
579+
val array = unsafeArray
580+
val thatArray = that.unsafeArray
581+
(array eq thatArray) || array.length == thatArray.length && {
582+
var i = 0
583+
while (i < array.length && array(i) == thatArray(i)) i += 1
584+
i >= array.length
585+
}
579586
case _ => super.equals(that)
580587
}
581588
override def iterator: Iterator[Float] = new ArrayOps.ArrayIterator[Float](unsafeArray)
@@ -610,7 +617,14 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
610617
def apply(i: Int): Double = unsafeArray(i)
611618
override def hashCode = MurmurHash3.arraySeqHash(unsafeArray)
612619
override def equals(that: Any) = that match {
613-
case that: ofDouble => Arrays.equals(unsafeArray, that.unsafeArray)
620+
case that: ofDouble =>
621+
val array = unsafeArray
622+
val thatArray = that.unsafeArray
623+
(array eq thatArray) || array.length == thatArray.length && {
624+
var i = 0
625+
while (i < array.length && array(i) == thatArray(i)) i += 1
626+
i >= array.length
627+
}
614628
case _ => super.equals(that)
615629
}
616630
override def iterator: Iterator[Double] = new ArrayOps.ArrayIterator[Double](unsafeArray)

library/src/scala/collection/mutable/ArraySeq.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,13 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
286286
def update(index: Int, elem: Float): Unit = { array(index) = elem }
287287
override def hashCode = MurmurHash3.arraySeqHash(array)
288288
override def equals(that: Any) = that match {
289-
case that: ofFloat => Arrays.equals(array, that.array)
289+
case that: ofFloat =>
290+
val thatArray = that.array
291+
(array eq thatArray) || array.length == thatArray.length && {
292+
var i = 0
293+
while (i < array.length && array(i) == thatArray(i)) i += 1
294+
i >= array.length
295+
}
290296
case _ => super.equals(that)
291297
}
292298
override def iterator: Iterator[Float] = new ArrayOps.ArrayIterator[Float](array)
@@ -306,7 +312,13 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
306312
def update(index: Int, elem: Double): Unit = { array(index) = elem }
307313
override def hashCode = MurmurHash3.arraySeqHash(array)
308314
override def equals(that: Any) = that match {
309-
case that: ofDouble => Arrays.equals(array, that.array)
315+
case that: ofDouble =>
316+
val thatArray = that.array
317+
(array eq thatArray) || array.length == thatArray.length && {
318+
var i = 0
319+
while (i < array.length && array(i) == thatArray(i)) i += 1
320+
i >= array.length
321+
}
310322
case _ => super.equals(that)
311323
}
312324
override def iterator: Iterator[Double] = new ArrayOps.ArrayIterator[Double](array)

0 commit comments

Comments
 (0)