@@ -99,21 +99,27 @@ internal class TrieNode<E>(
99
99
// assert(hasNoCellAt(positionMask))
100
100
101
101
val index = indexOfCellAt(positionMask)
102
+ val newBitmap = bitmap or positionMask
102
103
val newBuffer = buffer.addElementAtIndex(index, element)
103
- return TrieNode (bitmap or positionMask , newBuffer)
104
+ return setProperties(newBitmap , newBuffer, owner = null )
104
105
}
105
106
106
107
private fun mutableAddElementAt (positionMask : Int , element : E , owner : MutabilityOwnership ): TrieNode <E > {
107
108
// assert(hasNoCellAt(positionMask))
108
109
109
110
val index = indexOfCellAt(positionMask)
110
- if (ownedBy == = owner) {
111
- buffer = buffer.addElementAtIndex(index, element)
112
- bitmap = bitmap or positionMask
111
+ val newBitmap = bitmap or positionMask
112
+ val newBuffer = buffer.addElementAtIndex(index, element)
113
+ return setProperties(newBitmap, newBuffer, owner)
114
+ }
115
+
116
+ private fun setProperties (newBitmap : Int , newBuffer : Array <Any ?>, owner : MutabilityOwnership ? ): TrieNode <E > {
117
+ if (ownedBy != null && ownedBy == = owner) {
118
+ bitmap = newBitmap
119
+ buffer = newBuffer
113
120
return this
114
121
}
115
- val newBuffer = buffer.addElementAtIndex(index, element)
116
- return TrieNode (bitmap or positionMask, newBuffer, owner)
122
+ return TrieNode (newBitmap, newBuffer, owner)
117
123
}
118
124
119
125
/* * The given [newNode] must not be a part of any persistent set instance. */
@@ -187,35 +193,28 @@ internal class TrieNode<E>(
187
193
// assert(!hasNoCellAt(positionMask))
188
194
// assert(buffer.size > 1) can be false only for the root node
189
195
196
+ val newBitmap = bitmap xor positionMask
190
197
val newBuffer = buffer.removeCellAtIndex(cellIndex)
191
- return TrieNode (bitmap xor positionMask , newBuffer)
198
+ return setProperties(newBitmap , newBuffer, owner = null )
192
199
}
193
200
194
201
private fun mutableRemoveCellAtIndex (cellIndex : Int , positionMask : Int , owner : MutabilityOwnership ): TrieNode <E > {
195
202
// assert(!hasNoCellAt(positionMask))
196
203
// assert(buffer.size > 1)
197
204
198
- if (ownedBy == = owner) {
199
- buffer = buffer.removeCellAtIndex(cellIndex)
200
- bitmap = bitmap xor positionMask
201
- return this
202
- }
205
+ val newBitmap = bitmap xor positionMask
203
206
val newBuffer = buffer.removeCellAtIndex(cellIndex)
204
- return TrieNode (bitmap xor positionMask , newBuffer, owner)
207
+ return setProperties(newBitmap , newBuffer, owner)
205
208
}
206
209
207
210
private fun collisionRemoveElementAtIndex (i : Int ): TrieNode <E > {
208
211
val newBuffer = buffer.removeCellAtIndex(i)
209
- return TrieNode ( 0 , newBuffer)
212
+ return setProperties(newBitmap = 0 , newBuffer, owner = null )
210
213
}
211
214
212
215
private fun mutableCollisionRemoveElementAtIndex (i : Int , owner : MutabilityOwnership ): TrieNode <E > {
213
- if (ownedBy == = owner) {
214
- buffer = buffer.removeCellAtIndex(i)
215
- return this
216
- }
217
216
val newBuffer = buffer.removeCellAtIndex(i)
218
- return TrieNode ( 0 , newBuffer, owner)
217
+ return setProperties(newBitmap = 0 , newBuffer, owner)
219
218
}
220
219
221
220
private fun collisionContainsElement (element : E ): Boolean {
@@ -225,18 +224,14 @@ internal class TrieNode<E>(
225
224
private fun collisionAdd (element : E ): TrieNode <E > {
226
225
if (collisionContainsElement(element)) return this
227
226
val newBuffer = buffer.addElementAtIndex(0 , element)
228
- return TrieNode ( 0 , newBuffer)
227
+ return setProperties(newBitmap = 0 , newBuffer, owner = null )
229
228
}
230
229
231
230
private fun mutableCollisionAdd (element : E , mutator : PersistentHashSetBuilder <* >): TrieNode <E > {
232
231
if (collisionContainsElement(element)) return this
233
232
mutator.size++
234
- if (ownedBy == = mutator.ownership) {
235
- buffer = buffer.addElementAtIndex(0 , element)
236
- return this
237
- }
238
233
val newBuffer = buffer.addElementAtIndex(0 , element)
239
- return TrieNode ( 0 , newBuffer, mutator.ownership)
234
+ return setProperties(newBitmap = 0 , newBuffer, owner = mutator.ownership)
240
235
}
241
236
242
237
private fun collisionRemove (element : E ): TrieNode <E > {
@@ -274,12 +269,7 @@ internal class TrieNode<E>(
274
269
if (totalSize == otherNode.buffer.size) return otherNode
275
270
276
271
val newBuffer = if (totalSize == tempBuffer.size) tempBuffer else tempBuffer.copyOf(newSize = totalSize)
277
- return if (ownedBy == owner) {
278
- this .buffer = newBuffer
279
- this
280
- } else {
281
- TrieNode (0 , newBuffer, owner)
282
- }
272
+ return setProperties(newBitmap = 0 , newBuffer, owner)
283
273
}
284
274
285
275
private fun mutableCollisionRetainAll (otherNode : TrieNode <E >, intersectionSizeRef : DeltaCounter ,
@@ -289,7 +279,7 @@ internal class TrieNode<E>(
289
279
return this
290
280
}
291
281
val tempBuffer =
292
- if (owner == ownedBy) buffer
282
+ if (owner == = ownedBy) buffer
293
283
else arrayOfNulls<Any ?>(minOf(buffer.size, otherNode.buffer.size))
294
284
val totalWritten = buffer.filterTo(tempBuffer) {
295
285
@Suppress(" UNCHECKED_CAST" )
@@ -301,8 +291,8 @@ internal class TrieNode<E>(
301
291
1 -> tempBuffer[0 ]
302
292
this .buffer.size -> this
303
293
otherNode.buffer.size -> otherNode
304
- tempBuffer.size -> TrieNode < E >( 0 , tempBuffer, owner)
305
- else -> TrieNode < E >( 0 , tempBuffer.copyOf(newSize = totalWritten), owner)
294
+ tempBuffer.size -> setProperties(newBitmap = 0 , newBuffer = tempBuffer, owner)
295
+ else -> setProperties(newBitmap = 0 , newBuffer = tempBuffer.copyOf(newSize = totalWritten), owner)
306
296
}
307
297
}
308
298
@@ -313,7 +303,7 @@ internal class TrieNode<E>(
313
303
intersectionSizeRef + = buffer.size
314
304
return EMPTY
315
305
}
316
- val tempBuffer = if (owner == ownedBy) buffer else arrayOfNulls<Any ?>(buffer.size)
306
+ val tempBuffer = if (owner == = ownedBy) buffer else arrayOfNulls<Any ?>(buffer.size)
317
307
val totalWritten = buffer.filterTo(tempBuffer) {
318
308
@Suppress(" UNCHECKED_CAST" )
319
309
! otherNode.collisionContainsElement(it as E )
@@ -323,8 +313,8 @@ internal class TrieNode<E>(
323
313
0 -> EMPTY
324
314
1 -> tempBuffer[0 ]
325
315
this .buffer.size -> this
326
- tempBuffer.size -> TrieNode < E >( 0 , tempBuffer, owner)
327
- else -> TrieNode < E >( 0 , tempBuffer.copyOf(newSize = totalWritten), owner)
316
+ tempBuffer.size -> setProperties(newBitmap = 0 , newBuffer = tempBuffer, owner)
317
+ else -> setProperties(newBitmap = 0 , newBuffer = tempBuffer.copyOf(newSize = totalWritten), owner)
328
318
}
329
319
}
330
320
0 commit comments