Skip to content

Commit 456a7ac

Browse files
author
Abduqodiri Qurbonzoda
committed
Fix PersistentMap hashCode implementation
1 parent 9bceeb0 commit 456a7ac

File tree

4 files changed

+19
-17
lines changed

4 files changed

+19
-17
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ internal class TrieNodeMutableEntriesIterator<K, V>(private val builder: Persist
2828
}
2929

3030
private class MutableMapEntry<K, V>(private val builder: PersistentHashMapBuilder<K, V>,
31-
override val key: K,
32-
override val value: V) : MutableMap.MutableEntry<K, V> {
31+
key: K,
32+
override var value: V) : MapEntry<K, V>(key, value), MutableMap.MutableEntry<K, V> {
3333
override fun setValue(newValue: V): V {
34+
val result = value
35+
value = newValue
3436
builder[key] = newValue
35-
return value
37+
return result
3638
}
3739
}
3840

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,13 @@ internal class TrieNodeEntriesIterator<out K, out V> : TrieNodeBaseIterator<K, V
7575
}
7676
}
7777

78-
private class MapEntry<out K, out V>(override val key: K, override val value: V) : Map.Entry<K, V>
78+
internal open class MapEntry<out K, out V>(override val key: K, override val value: V) : Map.Entry<K, V> {
79+
override fun hashCode(): Int = key.hashCode() xor value.hashCode()
80+
override fun equals(other: Any?): Boolean =
81+
(other as? Map.Entry<*, *>)?.let { it.key == key && it.value == value } ?: false
82+
83+
override fun toString(): String = key.toString() + "=" + value.toString()
84+
}
7985

8086

8187
internal abstract class PersistentHashMapBaseIterator<K, V, T>(node: TrieNode<K, V>,

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapBuilderContentIterators.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package kotlinx.collections.immutable.implementations.persistentOrderedMap
1818

19+
import kotlinx.collections.immutable.implementations.immutableMap.MapEntry
20+
1921
internal open class PersistentOrderedMapBuilderLinksIterator<K, V>(internal var nextKey: K?,
2022
internal val map: MutableMap<K, Links<K, V>>) : MutableIterator<Links<K, V>> {
2123
internal var lastProcessedKey: K? = null
@@ -66,9 +68,9 @@ internal class PersistentOrderedMapBuilderEntriesIterator<K, V>(map: PersistentO
6668
}
6769
}
6870

69-
private data class MutableMapEntry<K, V>(private val mutableMap: MutableMap<K, Links<K, V>>,
70-
override val key: K,
71-
private var links: Links<K, V>) : MutableMap.MutableEntry<K, V> {
71+
private class MutableMapEntry<K, V>(private val mutableMap: MutableMap<K, Links<K, V>>,
72+
key: K,
73+
private var links: Links<K, V>) : MapEntry<K, V>(key, links.value), MutableMap.MutableEntry<K, V> {
7274
override val value: V
7375
get() = links.value
7476

@@ -78,10 +80,6 @@ private data class MutableMapEntry<K, V>(private val mutableMap: MutableMap<K, L
7880
mutableMap[key] = links
7981
return result
8082
}
81-
82-
override fun toString(): String {
83-
return key.toString() + "=" + value.toString()
84-
}
8583
}
8684

8785
internal class PersistentOrderedMapBuilderKeysIterator<out K, out V>(map: PersistentOrderedMapBuilder<K, V>): MutableIterator<K> {

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/persistentOrderedMap/PersistentOrderedMapContentIterators.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package kotlinx.collections.immutable.implementations.persistentOrderedMap
1818

19+
import kotlinx.collections.immutable.implementations.immutableMap.MapEntry
20+
1921
internal open class PersistentOrderedMapLinksIterator<K, out V>(internal var nextKey: K?,
2022
internal val map: Map<K, Links<K, V>>) : Iterator<Links<K, V>> {
2123
internal var index = 0
@@ -50,12 +52,6 @@ internal class PersistentOrderedMapEntriesIterator<out K, out V>(map: Persistent
5052
}
5153
}
5254

53-
private data class MapEntry<out K, out V>(override val key: K, override val value: V) : Map.Entry<K, V> {
54-
override fun toString(): String {
55-
return key.toString() + "=" + value.toString()
56-
}
57-
}
58-
5955
internal class PersistentOrderedMapKeysIterator<out K, out V>(map: PersistentOrderedMap<K, V>): Iterator<K> {
6056
private val internal = PersistentOrderedMapLinksIterator(map.firstKey, map.map)
6157

0 commit comments

Comments
 (0)