summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/immutable/HashSet.scala
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:45 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:45 +0000
commit7ed18f3300c537600eceaa6b954a867aef91cb81 (patch)
tree08c00ee5cf26f9d0f4a1dd583c2b3ac3db9ada6b /src/library/scala/collection/immutable/HashSet.scala
parent9f39fc01244e953290b4734ed135ff4e91d4344e (diff)
downloadscala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.gz
scala-7ed18f3300c537600eceaa6b954a867aef91cb81.tar.bz2
scala-7ed18f3300c537600eceaa6b954a867aef91cb81.zip
Fixes #4398.
Review by extempore.
Diffstat (limited to 'src/library/scala/collection/immutable/HashSet.scala')
-rw-r--r--src/library/scala/collection/immutable/HashSet.scala16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/library/scala/collection/immutable/HashSet.scala b/src/library/scala/collection/immutable/HashSet.scala
index c4b0c65d99..579edc66cc 100644
--- a/src/library/scala/collection/immutable/HashSet.scala
+++ b/src/library/scala/collection/immutable/HashSet.scala
@@ -200,13 +200,16 @@ object HashSet extends ImmutableSetFactory[HashSet] {
val mask = (1 << index)
val offset = Integer.bitCount(bitmap & (mask-1))
if ((bitmap & mask) != 0) {
- val elemsNew = new Array[HashSet[A]](elems.length)
- Array.copy(elems, 0, elemsNew, 0, elems.length)
- val sub = elems(offset)
// TODO: might be worth checking if sub is HashTrieSet (-> monomorphic call site)
+ val sub = elems(offset)
val subNew = sub.updated0(key, hash, level + 5)
- elemsNew(offset) = subNew
- new HashTrieSet(bitmap, elemsNew, size + (subNew.size - sub.size))
+ if (sub eq subNew) this
+ else {
+ val elemsNew = new Array[HashSet[A]](elems.length)
+ Array.copy(elems, 0, elemsNew, 0, elems.length)
+ elemsNew(offset) = subNew
+ new HashTrieSet(bitmap, elemsNew, size + (subNew.size - sub.size))
+ }
} else {
val elemsNew = new Array[HashSet[A]](elems.length + 1)
Array.copy(elems, 0, elemsNew, 0, offset)
@@ -225,7 +228,8 @@ object HashSet extends ImmutableSetFactory[HashSet] {
val sub = elems(offset)
// TODO: might be worth checking if sub is HashTrieMap (-> monomorphic call site)
val subNew = sub.removed0(key, hash, level + 5)
- if (subNew.isEmpty) {
+ if (sub eq subNew) this
+ else if (subNew.isEmpty) {
val bitmapNew = bitmap ^ mask
if (bitmapNew != 0) {
val elemsNew = new Array[HashSet[A]](elems.length - 1)