You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This will be a direct port from this PR: scala/scala#7192
which is in turn dependent on scala/scala#7118
And once it does, we should add this test in junit
varhashCount=0/** * A key that produces lots of hash collisions, to exercise the part of the code that deals with those*/caseclassCollision(value: Int) {
overridedefhashCode= {
// we do not check hash counts for Collision keys because ListSet.++ uses a mutable hashset internally,// so when we have hash collisions, union will call key.hashCode.// hashCount += 1
value /5
}
}
/** * A key that is identical to int other than that it counts hashCode invocations*/caseclassHashCounter(value: Int) {
overridedefhashCode= {
hashCount +=1
value
}
}
deftestUnion[T](sizes: Seq[Int], offsets: Seq[Double], keyType: String, mkKey: Int=>T):Unit= {
for {
i <- sizes
o <- offsets
} {
vale=HashSet.empty[T]
valj= (i * o).toInt
// create two sets of size i with overlap ovala= e ++ (0 until i).map(mkKey)
require(a.size == i, s"Building HashSet of size $i failed. Key type $keyType.")
valb= e ++ (j until (i + j)).map(mkKey)
require(b.size == i, s"Building HashSet of size $i failed. Key type $keyType.")
valas= e ++ (0 until j).map(mkKey)
require(as.size == j, s"Building HashSet of size $j failed. Key type $keyType.")
valhashCount0= hashCount
valu= a union b
require(hashCount == hashCount0, s"key.hashCode should not be called, but has been called ${hashCount - hashCount0} times. Key type $keyType.")
require(u == (a union scala.collection.mutable.HashSet(b.toSeq: _*)), s"Operation must still work for other sets!")
require(u.size == i + j, s"Expected size ${i+j}. Real size ${u.size}. Key type $keyType.")
for (x <-0 until i + j)
require(u.contains(mkKey(x)), s"Key type $keyType. Set (0 until ${i + j}) should contain $x but does not.")
vala_as= a union as
valas_a= as union a
require((a_as eq a) || (a_as eq as), s"No structural sharing in a union as. Key type $keyType, a=(0 until $i) as=(0 until $j)")
require((as_a eq a) || (as_a eq as), s"No structural sharing in as union a. Key type $keyType, a=(0 until $i) as=(0 until $j)")
}
}
valsizes=Seq(1, 10, 100, 1000, 10000, 100000)
valoffsets=Seq(0.0, 0.25, 0.5, 0.75, 1.0)
testUnion(sizes, offsets, "int", identity[Int])
testUnion(sizes, offsets, "hashcounter", HashCounter.apply)
testUnion(sizes, offsets, "collision", Collision.apply)
The text was updated successfully, but these errors were encountered:
This will be a direct port from this PR:
scala/scala#7192
which is in turn dependent on scala/scala#7118
And once it does, we should add this test in junit
The text was updated successfully, but these errors were encountered: