Skip to content

Commit 239a63e

Browse files
committed
Rename Marker to MutabilityOwnership
1 parent 7036128 commit 239a63e

File tree

5 files changed

+89
-85
lines changed

5 files changed

+89
-85
lines changed

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/immutableList/PersistentVectorBuilder.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import kotlinx.collections.immutable.PersistentList
2020
import kotlinx.collections.immutable.internal.ListImplementation.checkElementIndex
2121
import kotlinx.collections.immutable.internal.ListImplementation.checkPositionIndex
2222

23-
private class Marker // TODO: Rename to MutabilityOwnership?
23+
private class MutabilityOwnership // TODO: Rename to MutabilityOwnership?
2424

2525
class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
2626
private var vectorRoot: Array<Any?>?,
2727
private var vectorTail: Array<Any?>,
2828
internal var rootShift: Int) : AbstractMutableList<E>(), PersistentList.Builder<E> {
29-
private var marker = Marker()
29+
private var ownership = MutabilityOwnership()
3030
internal var root = vectorRoot
3131
private set
3232
internal var tail = vectorTail
@@ -40,7 +40,7 @@ class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
4040
vector = if (root === vectorRoot && tail === vectorTail) {
4141
vector
4242
} else {
43-
marker = Marker()
43+
ownership = MutabilityOwnership()
4444
vectorRoot = root
4545
vectorTail = tail
4646
if (root == null) {
@@ -69,13 +69,13 @@ class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
6969
private fun makeMutable(buffer: Array<Any?>?): Array<Any?> {
7070
if (buffer == null) {
7171
val newBuffer = arrayOfNulls<Any?>(MUTABLE_BUFFER_SIZE)
72-
newBuffer[MUTABLE_BUFFER_SIZE - 1] = marker
72+
newBuffer[MUTABLE_BUFFER_SIZE - 1] = ownership
7373
return newBuffer
7474
}
75-
if (buffer.size != MUTABLE_BUFFER_SIZE || buffer[MUTABLE_BUFFER_SIZE - 1] !== marker) {
75+
if (buffer.size != MUTABLE_BUFFER_SIZE || buffer[MUTABLE_BUFFER_SIZE - 1] !== ownership) {
7676
val newBuffer = arrayOfNulls<Any?>(MUTABLE_BUFFER_SIZE)
7777
buffer.copyInto(newBuffer, endIndex = buffer.size.coerceAtMost(MAX_BUFFER_SIZE))
78-
newBuffer[MUTABLE_BUFFER_SIZE - 1] = marker
78+
newBuffer[MUTABLE_BUFFER_SIZE - 1] = ownership
7979
return newBuffer
8080
}
8181
return buffer
@@ -84,7 +84,7 @@ class PersistentVectorBuilder<E>(private var vector: PersistentList<E>,
8484
private fun mutableBufferWith(element: Any?): Array<Any?> {
8585
val buffer = arrayOfNulls<Any?>(MUTABLE_BUFFER_SIZE)
8686
buffer[0] = element
87-
buffer[MUTABLE_BUFFER_SIZE - 1] = marker
87+
buffer[MUTABLE_BUFFER_SIZE - 1] = ownership
8888
return buffer
8989
}
9090

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ package kotlinx.collections.immutable.implementations.immutableMap
1818

1919
import kotlinx.collections.immutable.PersistentMap
2020

21-
internal class Marker
21+
internal class MutabilityOwnership
2222

2323
internal class PersistentHashMapBuilder<K, V>(private var map: PersistentHashMap<K, V>) : PersistentMap.Builder<K, V>, AbstractMutableMap<K, V>() {
24-
internal var marker = Marker()
24+
internal var ownership = MutabilityOwnership()
25+
private set
2526
internal var node = map.node
2627
internal var operationResult: V? = null
2728
internal var modCount = 0
@@ -37,7 +38,7 @@ internal class PersistentHashMapBuilder<K, V>(private var map: PersistentHashMap
3738
map = if (node === map.node) {
3839
map
3940
} else {
40-
marker = Marker()
41+
ownership = MutabilityOwnership()
4142
PersistentHashMap(node, size)
4243
}
4344
return map

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/immutableMap/TrieNode.kt

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ internal class TrieNode<K, V>(
7171
private var dataMap: Int,
7272
private var nodeMap: Int,
7373
buffer: Array<Any?>,
74-
private val marker: Marker?
74+
private val ownedBy: MutabilityOwnership?
7575
) {
7676
constructor(dataMap: Int, nodeMap: Int, buffer: Array<Any?>) : this(dataMap, nodeMap, buffer, null)
7777

@@ -139,17 +139,17 @@ internal class TrieNode<K, V>(
139139
return TrieNode(dataMap or positionMask, nodeMap, newBuffer)
140140
}
141141

142-
private fun mutableInsertEntryAt(positionMask: Int, key: K, value: V, mutatorMarker: Marker): TrieNode<K, V> {
142+
private fun mutableInsertEntryAt(positionMask: Int, key: K, value: V, owner: MutabilityOwnership): TrieNode<K, V> {
143143
// assert(!hasEntryAt(positionMask))
144144

145145
val keyIndex = entryKeyIndex(positionMask)
146-
if (marker === mutatorMarker) {
146+
if (ownedBy === owner) {
147147
buffer = buffer.insertEntryAtIndex(keyIndex, key, value)
148148
dataMap = dataMap or positionMask
149149
return this
150150
}
151151
val newBuffer = buffer.insertEntryAtIndex(keyIndex, key, value)
152-
return TrieNode(dataMap or positionMask, nodeMap, newBuffer, mutatorMarker)
152+
return TrieNode(dataMap or positionMask, nodeMap, newBuffer, owner)
153153
}
154154

155155
private fun updateValueAtIndex(keyIndex: Int, value: V): TrieNode<K, V> {
@@ -164,7 +164,7 @@ internal class TrieNode<K, V>(
164164
// assert(buffer[keyIndex + 1] !== value)
165165

166166
// If the [mutator] is exclusive owner of this node, update value at specified index in-place.
167-
if (marker === mutator.marker) {
167+
if (ownedBy === mutator.ownership) {
168168
buffer[keyIndex + 1] = value
169169
return this
170170
}
@@ -173,7 +173,7 @@ internal class TrieNode<K, V>(
173173
// Create new node with updated value at specified index.
174174
val newBuffer = buffer.copyOf()
175175
newBuffer[keyIndex + 1] = value
176-
return TrieNode(dataMap, nodeMap, newBuffer, mutator.marker)
176+
return TrieNode(dataMap, nodeMap, newBuffer, mutator.ownership)
177177
}
178178

179179
private fun updateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<K, V>): TrieNode<K, V> {
@@ -184,25 +184,25 @@ internal class TrieNode<K, V>(
184184
return TrieNode(dataMap, nodeMap, newBuffer)
185185
}
186186

187-
private fun mutableUpdateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<K, V>, mutatorMarker: Marker): TrieNode<K, V> {
187+
private fun mutableUpdateNodeAtIndex(nodeIndex: Int, newNode: TrieNode<K, V>, owner: MutabilityOwnership): TrieNode<K, V> {
188188
// assert(buffer[nodeIndex] !== newNode)
189189

190-
if (marker === mutatorMarker) {
190+
if (ownedBy === owner) {
191191
buffer[nodeIndex] = newNode
192192
return this
193193
}
194194
val newBuffer = buffer.copyOf()
195195
newBuffer[nodeIndex] = newNode
196-
return TrieNode(dataMap, nodeMap, newBuffer, mutatorMarker)
196+
return TrieNode(dataMap, nodeMap, newBuffer, owner)
197197
}
198198

199199
private fun bufferMoveEntryToNode(keyIndex: Int, positionMask: Int, newKeyHash: Int,
200-
newKey: K, newValue: V, shift: Int, mutatorMarker: Marker?): Array<Any?> {
200+
newKey: K, newValue: V, shift: Int, owner: MutabilityOwnership?): Array<Any?> {
201201
val storedKey = keyAtIndex(keyIndex)
202202
val storedKeyHash = storedKey.hashCode()
203203
val storedValue = valueAtKeyIndex(keyIndex)
204204
val newNode = makeNode(storedKeyHash, storedKey, storedValue,
205-
newKeyHash, newKey, newValue, shift + LOG_MAX_BRANCHING_FACTOR, mutatorMarker)
205+
newKeyHash, newKey, newValue, shift + LOG_MAX_BRANCHING_FACTOR, owner)
206206

207207
val nodeIndex = nodeIndex(positionMask) + 1 // place where to insert new node in the current buffer
208208

@@ -220,27 +220,27 @@ internal class TrieNode<K, V>(
220220
}
221221

222222
private fun mutableMoveEntryToNode(keyIndex: Int, positionMask: Int, newKeyHash: Int,
223-
newKey: K, newValue: V, shift: Int, mutatorMarker: Marker): TrieNode<K, V> {
223+
newKey: K, newValue: V, shift: Int, owner: MutabilityOwnership): TrieNode<K, V> {
224224
// assert(hasEntryAt(positionMask))
225225
// assert(!hasNodeAt(positionMask))
226226

227-
if (marker === mutatorMarker) {
228-
buffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, mutatorMarker)
227+
if (ownedBy === owner) {
228+
buffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner)
229229
dataMap = dataMap xor positionMask
230230
nodeMap = nodeMap or positionMask
231231
return this
232232
}
233-
val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, mutatorMarker)
234-
return TrieNode(dataMap xor positionMask, nodeMap or positionMask, newBuffer, mutatorMarker)
233+
val newBuffer = bufferMoveEntryToNode(keyIndex, positionMask, newKeyHash, newKey, newValue, shift, owner)
234+
return TrieNode(dataMap xor positionMask, nodeMap or positionMask, newBuffer, owner)
235235
}
236236

237237
/** Creates a new TrieNode for holding two given key value entries */
238238
private fun makeNode(keyHash1: Int, key1: K, value1: V,
239-
keyHash2: Int, key2: K, value2: V, shift: Int, mutatorMarker: Marker?): TrieNode<K, V> {
239+
keyHash2: Int, key2: K, value2: V, shift: Int, owner: MutabilityOwnership?): TrieNode<K, V> {
240240
if (shift > MAX_SHIFT) {
241241
// assert(key1 != key2)
242242
// when two key hashes are entirely equal: the last level subtrie node stores them just as unordered list
243-
return TrieNode(0, 0, arrayOf(key1, value1, key2, value2), mutatorMarker)
243+
return TrieNode(0, 0, arrayOf(key1, value1, key2, value2), owner)
244244
}
245245

246246
val setBit1 = indexSegment(keyHash1, shift)
@@ -252,11 +252,11 @@ internal class TrieNode<K, V>(
252252
} else {
253253
arrayOf(key2, value2, key1, value1)
254254
}
255-
return TrieNode((1 shl setBit1) or (1 shl setBit2), 0, nodeBuffer, mutatorMarker)
255+
return TrieNode((1 shl setBit1) or (1 shl setBit2), 0, nodeBuffer, owner)
256256
}
257257
// hash segments at the given shift are equal: move these entries into the subtrie
258-
val node = makeNode(keyHash1, key1, value1, keyHash2, key2, value2, shift + LOG_MAX_BRANCHING_FACTOR, mutatorMarker)
259-
return TrieNode(0, 1 shl setBit1, arrayOf<Any?>(node), mutatorMarker)
258+
val node = makeNode(keyHash1, key1, value1, keyHash2, key2, value2, shift + LOG_MAX_BRANCHING_FACTOR, owner)
259+
return TrieNode(0, 1 shl setBit1, arrayOf<Any?>(node), owner)
260260
}
261261

262262
private fun removeEntryAtIndex(keyIndex: Int, positionMask: Int): TrieNode<K, V>? {
@@ -273,13 +273,13 @@ internal class TrieNode<K, V>(
273273
mutator.operationResult = valueAtKeyIndex(keyIndex)
274274
if (buffer.size == ENTRY_SIZE) return null
275275

276-
if (marker === mutator.marker) {
276+
if (ownedBy === mutator.ownership) {
277277
buffer = buffer.removeEntryAtIndex(keyIndex)
278278
dataMap = dataMap xor positionMask
279279
return this
280280
}
281281
val newBuffer = buffer.removeEntryAtIndex(keyIndex)
282-
return TrieNode(dataMap xor positionMask, nodeMap, newBuffer, mutator.marker)
282+
return TrieNode(dataMap xor positionMask, nodeMap, newBuffer, mutator.ownership)
283283
}
284284

285285
private fun collisionRemoveEntryAtIndex(i: Int): TrieNode<K, V>? {
@@ -294,12 +294,12 @@ internal class TrieNode<K, V>(
294294
mutator.operationResult = valueAtKeyIndex(i)
295295
if (buffer.size == ENTRY_SIZE) return null
296296

297-
if (marker === mutator.marker) {
297+
if (ownedBy === mutator.ownership) {
298298
buffer = buffer.removeEntryAtIndex(i)
299299
return this
300300
}
301301
val newBuffer = buffer.removeEntryAtIndex(i)
302-
return TrieNode(0, 0, newBuffer, mutator.marker)
302+
return TrieNode(0, 0, newBuffer, mutator.ownership)
303303
}
304304

305305
private fun removeNodeAtIndex(nodeIndex: Int, positionMask: Int): TrieNode<K, V>? {
@@ -310,17 +310,17 @@ internal class TrieNode<K, V>(
310310
return TrieNode(dataMap, nodeMap xor positionMask, newBuffer)
311311
}
312312

313-
private fun mutableRemoveNodeAtIndex(nodeIndex: Int, positionMask: Int, mutatorMarker: Marker): TrieNode<K, V>? {
313+
private fun mutableRemoveNodeAtIndex(nodeIndex: Int, positionMask: Int, owner: MutabilityOwnership): TrieNode<K, V>? {
314314
// assert(hasNodeAt(positionMask))
315315
if (buffer.size == 1) return null
316316

317-
if (marker === mutatorMarker) {
317+
if (ownedBy === owner) {
318318
buffer = buffer.removeNodeAtIndex(nodeIndex)
319319
nodeMap = nodeMap xor positionMask
320320
return this
321321
}
322322
val newBuffer = buffer.removeNodeAtIndex(nodeIndex)
323-
return TrieNode(dataMap, nodeMap xor positionMask, newBuffer, mutatorMarker)
323+
return TrieNode(dataMap, nodeMap xor positionMask, newBuffer, owner)
324324
}
325325

326326
private fun collisionContainsKey(key: K): Boolean {
@@ -361,7 +361,7 @@ internal class TrieNode<K, V>(
361361
mutator.operationResult = valueAtKeyIndex(i)
362362

363363
// If the [mutator] is exclusive owner of this node, update value of the entry in-place.
364-
if (marker === mutator.marker) {
364+
if (ownedBy === mutator.ownership) {
365365
buffer[i + 1] = value
366366
return this
367367
}
@@ -371,13 +371,13 @@ internal class TrieNode<K, V>(
371371
// Create new node with updated entry value.
372372
val newBuffer = buffer.copyOf()
373373
newBuffer[i + 1] = value
374-
return TrieNode(0, 0, newBuffer, mutator.marker)
374+
return TrieNode(0, 0, newBuffer, mutator.ownership)
375375
}
376376
}
377377
// Create new collision node with the specified entry added to it.
378378
mutator.size++
379379
val newBuffer = buffer.insertEntryAtIndex(0, key, value)
380-
return TrieNode(0, 0, newBuffer, mutator.marker)
380+
return TrieNode(0, 0, newBuffer, mutator.ownership)
381381
}
382382

383383
private fun collisionRemove(key: K): TrieNode<K, V>? {
@@ -501,7 +501,7 @@ internal class TrieNode<K, V>(
501501
return mutableUpdateValueAtIndex(keyIndex, value, mutator)
502502
}
503503
mutator.size++
504-
return mutableMoveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift, mutator.marker)
504+
return mutableMoveEntryToNode(keyIndex, keyPositionMask, keyHash, key, value, shift, mutator.ownership)
505505
}
506506
if (hasNodeAt(keyPositionMask)) { // key is in node
507507
val nodeIndex = nodeIndex(keyPositionMask)
@@ -515,12 +515,12 @@ internal class TrieNode<K, V>(
515515
if (targetNode === newNode) {
516516
return this
517517
}
518-
return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker)
518+
return mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
519519
}
520520

521521
// key is absent
522522
mutator.size++
523-
return mutableInsertEntryAt(keyPositionMask, key, value, mutator.marker)
523+
return mutableInsertEntryAt(keyPositionMask, key, value, mutator.ownership)
524524
}
525525

526526
fun remove(keyHash: Int, key: K, shift: Int): TrieNode<K, V>? {
@@ -576,8 +576,8 @@ internal class TrieNode<K, V>(
576576
}
577577
return when {
578578
targetNode === newNode -> this
579-
newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.marker)
580-
else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker)
579+
newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.ownership)
580+
else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
581581
}
582582
}
583583

@@ -638,8 +638,8 @@ internal class TrieNode<K, V>(
638638
}
639639
return when {
640640
targetNode === newNode -> this
641-
newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.marker)
642-
else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.marker)
641+
newNode == null -> mutableRemoveNodeAtIndex(nodeIndex, keyPositionMask, mutator.ownership)
642+
else -> mutableUpdateNodeAtIndex(nodeIndex, newNode, mutator.ownership)
643643
}
644644
}
645645

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/immutableSet/PersistentHashSetBuilder.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ package kotlinx.collections.immutable.implementations.immutableSet
1818

1919
import kotlinx.collections.immutable.PersistentSet
2020

21-
internal class Marker
21+
internal class MutabilityOwnership
2222

2323
internal class PersistentHashSetBuilder<E>(private var set: PersistentHashSet<E>) : AbstractMutableSet<E>(), PersistentSet.Builder<E> {
24-
internal var marker = Marker()
24+
internal var ownership = MutabilityOwnership()
25+
private set
2526
internal var node = set.node
27+
private set
2628
internal var modCount = 0
29+
private set
2730

2831
// Size change implies structural changes.
2932
override var size = set.size
@@ -36,7 +39,7 @@ internal class PersistentHashSetBuilder<E>(private var set: PersistentHashSet<E>
3639
set = if (node === set.node) {
3740
set
3841
} else {
39-
marker = Marker()
42+
ownership = MutabilityOwnership()
4043
PersistentHashSet(node, size)
4144
}
4245
return set

0 commit comments

Comments
 (0)