Skip to content

Commit a7bc60b

Browse files
ruslansennovlrytz
authored andcommitted
BitSet{1,2} conversion (scala#5127)
In current implementation when we set high word (elems1) of BitSet2 to zero, the result is BitSet2 again. I believe it is leading to excessive memory usage and result should be BitSet1. Private helper method createSmall(a: Long, b: Long) introduced.
1 parent 4db1de6 commit a7bc60b

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/library/scala/collection/immutable/BitSet.scala

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ object BitSet extends BitSetFactory[BitSet] {
6868
/** The empty bitset */
6969
val empty: BitSet = new BitSet1(0L)
7070

71+
private def createSmall(a: Long, b: Long): BitSet = if (b == 0L) new BitSet1(a) else new BitSet2(a, b)
72+
7173
/** A builder that takes advantage of mutable BitSets. */
7274
def newBuilder: Builder[Int, BitSet] = new Builder[Int, BitSet] {
7375
private[this] val b = new mutable.BitSet
@@ -84,7 +86,7 @@ object BitSet extends BitSetFactory[BitSet] {
8486
val len = elems.length
8587
if (len == 0) empty
8688
else if (len == 1) new BitSet1(elems(0))
87-
else if (len == 2) new BitSet2(elems(0), elems(1))
89+
else if (len == 2) createSmall(elems(0), elems(1))
8890
else {
8991
val a = new Array[Long](len)
9092
Array.copy(elems, 0, a, 0, len)
@@ -99,7 +101,7 @@ object BitSet extends BitSetFactory[BitSet] {
99101
val len = elems.length
100102
if (len == 0) empty
101103
else if (len == 1) new BitSet1(elems(0))
102-
else if (len == 2) new BitSet2(elems(0), elems(1))
104+
else if (len == 2) createSmall(elems(0), elems(1))
103105
else new BitSetN(elems)
104106
}
105107

@@ -109,7 +111,7 @@ object BitSet extends BitSetFactory[BitSet] {
109111
protected def word(idx: Int) = if (idx == 0) elems else 0L
110112
protected def updateWord(idx: Int, w: Long): BitSet =
111113
if (idx == 0) new BitSet1(w)
112-
else if (idx == 1) new BitSet2(elems, w)
114+
else if (idx == 1) createSmall(elems, w)
113115
else fromBitMaskNoCopy(updateArray(Array(elems), idx, w))
114116
override def head: Int =
115117
if (elems == 0L) throw new NoSuchElementException("Empty BitSet")
@@ -124,7 +126,7 @@ object BitSet extends BitSetFactory[BitSet] {
124126
protected def word(idx: Int) = if (idx == 0) elems0 else if (idx == 1) elems1 else 0L
125127
protected def updateWord(idx: Int, w: Long): BitSet =
126128
if (idx == 0) new BitSet2(w, elems1)
127-
else if (idx == 1) new BitSet2(elems0, w)
129+
else if (idx == 1) createSmall(elems0, w)
128130
else fromBitMaskNoCopy(updateArray(Array(elems0, elems1), idx, w))
129131
override def head: Int =
130132
if (elems0 == 0L) {
@@ -135,7 +137,7 @@ object BitSet extends BitSetFactory[BitSet] {
135137
override def tail: BitSet =
136138
if (elems0 == 0L) {
137139
if (elems1 == 0L) throw new NoSuchElementException("Empty BitSet")
138-
new BitSet2(elems0, elems1 - java.lang.Long.lowestOneBit(elems1))
140+
createSmall(elems0, elems1 - java.lang.Long.lowestOneBit(elems1))
139141
}
140142
else new BitSet2(elems0 - java.lang.Long.lowestOneBit(elems0), elems1)
141143
}

0 commit comments

Comments
 (0)