Skip to content

Commit 280fdaf

Browse files
author
Abduqodiri Qurbonzoda
committed
Make first/last contains either EndOfLink or instance of generic param
1 parent dc5fb37 commit 280fdaf

File tree

7 files changed

+38
-32
lines changed

7 files changed

+38
-32
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ internal class LinkedValue<V>(val value: V, val previous: Any?, val next: Any?)
3737
}
3838
}
3939

40-
internal class PersistentOrderedMap<K, V>(internal val firstKey: K?,
41-
internal val lastKey: K?,
40+
internal class PersistentOrderedMap<K, V>(internal val firstKey: Any?,
41+
internal val lastKey: Any?,
4242
internal val map: PersistentHashMap<K, LinkedValue<V>>): AbstractMap<K, V>(), PersistentMap<K, V> {
4343

4444
override val size: Int
@@ -78,6 +78,11 @@ internal class PersistentOrderedMap<K, V>(internal val firstKey: K?,
7878
}
7979

8080
override fun put(key: K, value: @UnsafeVariance V): PersistentOrderedMap<K, V> {
81+
if (isEmpty()) {
82+
val newMap = map.put(key, LinkedValue(value))
83+
return PersistentOrderedMap(key, key, newMap)
84+
}
85+
8186
val links = map[key]
8287
if (links != null) {
8388
if (links.value == value) {
@@ -86,10 +91,7 @@ internal class PersistentOrderedMap<K, V>(internal val firstKey: K?,
8691
val newMap = map.put(key, links.withValue(value))
8792
return PersistentOrderedMap(firstKey, lastKey, newMap)
8893
}
89-
if (isEmpty()) {
90-
val newMap = map.put(key, LinkedValue(value))
91-
return PersistentOrderedMap(key, key, newMap)
92-
}
94+
9395
val lastLink = map[lastKey]!!
9496
// assert(lastLink.next === EndOfLink)
9597
val newMap = map
@@ -112,8 +114,9 @@ internal class PersistentOrderedMap<K, V>(internal val firstKey: K?,
112114
// assert(nextLinks.previous == key)
113115
newMap = newMap.put(links.next as K, nextLinks.withPrevious(links.previous))
114116
}
115-
val newFirstKey = if (links.previous === EndOfLink) links.next as? K else firstKey
116-
val newLastKey = if (links.next === EndOfLink) links.previous as? K else lastKey
117+
118+
val newFirstKey = if (links.previous === EndOfLink) links.next else firstKey
119+
val newLastKey = if (links.next === EndOfLink) links.previous else lastKey
117120
return PersistentOrderedMap(newFirstKey, newLastKey, newMap)
118121
}
119122

@@ -135,7 +138,7 @@ internal class PersistentOrderedMap<K, V>(internal val firstKey: K?,
135138
}
136139

137140
internal companion object {
138-
private val EMPTY = PersistentOrderedMap<Nothing, Nothing>(null, null, PersistentHashMap.emptyOf())
141+
private val EMPTY = PersistentOrderedMap<Nothing, Nothing>(EndOfLink, EndOfLink, PersistentHashMap.emptyOf())
139142
internal fun <K, V> emptyOf(): PersistentOrderedMap<K, V> = EMPTY as PersistentOrderedMap<K, V>
140143
}
141144
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,16 @@ internal class PersistentOrderedMapBuilder<K, V>(private var map: PersistentOrde
9494
// assert(previousLinks.next == key)
9595
mapBuilder[links.previous as K] = previousLinks.withNext(links.next)
9696
} else {
97-
firstKey = links.next as? K
97+
firstKey = links.next
9898
}
9999
if (links.next !== EndOfLink) {
100100
val nextLinks = mapBuilder[links.next]!!
101101
// assert(nextLinks.previous == key)
102102
mapBuilder[links.next as K] = nextLinks.withPrevious(links.previous)
103103
} else {
104-
lastKey = links.previous as? K
104+
lastKey = links.previous
105105
}
106+
106107
return links.value
107108
}
108109

@@ -119,7 +120,7 @@ internal class PersistentOrderedMapBuilder<K, V>(private var map: PersistentOrde
119120

120121
override fun clear() {
121122
mapBuilder.clear()
122-
firstKey = null
123-
lastKey = null
123+
firstKey = EndOfLink
124+
lastKey = EndOfLink
124125
}
125126
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ package kotlinx.collections.immutable.implementations.persistentOrderedMap
1919
import kotlinx.collections.immutable.implementations.immutableMap.MapEntry
2020

2121
internal open class PersistentOrderedMapBuilderLinksIterator<K, V>(
22-
private var nextKey: K?,
22+
private var nextKey: Any?,
2323
internal val builder: PersistentOrderedMapBuilder<K, V>
2424
) : MutableIterator<LinkedValue<V>> {
2525

26-
internal var lastIteratedKey: K? = null
26+
internal var lastIteratedKey: Any? = EndOfLink
2727
private var nextWasInvoked = false
2828
private var expectedModCount = builder.mapBuilder.modCount
2929
internal var index = 0
@@ -39,7 +39,7 @@ internal open class PersistentOrderedMapBuilderLinksIterator<K, V>(
3939
nextWasInvoked = true
4040
index++
4141
val result = builder.mapBuilder[nextKey]!!
42-
nextKey = result.next as? K
42+
nextKey = result.next
4343
return result
4444
}
4545

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package kotlinx.collections.immutable.implementations.persistentOrderedMap
1818

1919
import kotlinx.collections.immutable.implementations.immutableMap.MapEntry
2020

21-
internal open class PersistentOrderedMapLinksIterator<K, V>(internal var nextKey: K?,
21+
internal open class PersistentOrderedMapLinksIterator<K, V>(internal var nextKey: Any?,
2222
internal val map: Map<K, LinkedValue<V>>) : Iterator<LinkedValue<V>> {
2323
internal var index = 0
2424

@@ -32,7 +32,7 @@ internal open class PersistentOrderedMapLinksIterator<K, V>(internal var nextKey
3232
}
3333
val result = map[nextKey]!!
3434
index++
35-
nextKey = result.next as? K
35+
nextKey = result.next
3636
return result
3737
}
3838

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ internal class Links(val previous: Any?, val next: Any?) {
3333
}
3434
}
3535

36-
internal class PersistentOrderedSet<E>(internal val firstElement: E?,
37-
internal val lastElement: E?,
36+
internal class PersistentOrderedSet<E>(internal val firstElement: Any?,
37+
internal val lastElement: Any?,
3838
internal val map: PersistentHashMap<E, Links>): AbstractSet<E>(), PersistentSet<E> {
3939

4040
override val size: Int
@@ -48,7 +48,7 @@ internal class PersistentOrderedSet<E>(internal val firstElement: E?,
4848
if (map.containsKey(element)) {
4949
return this
5050
}
51-
if (isEmpty()) { // isEmpty
51+
if (isEmpty()) {
5252
val newMap = map.put(element, Links())
5353
return PersistentOrderedSet(element, element, newMap)
5454
}
@@ -79,8 +79,8 @@ internal class PersistentOrderedSet<E>(internal val firstElement: E?,
7979
// assert(nextLinks.previous == element)
8080
newMap = newMap.put(links.next as E, nextLinks.withPrevious(links.previous))
8181
}
82-
val newFirstElement = if (links.previous === EndOfLink) links.next as? E else firstElement
83-
val newLastElement = if (links.next === EndOfLink) links.previous as? E else lastElement
82+
val newFirstElement = if (links.previous === EndOfLink) links.next else firstElement
83+
val newLastElement = if (links.next === EndOfLink) links.previous else lastElement
8484
return PersistentOrderedSet(newFirstElement, newLastElement, newMap)
8585
}
8686

@@ -105,7 +105,7 @@ internal class PersistentOrderedSet<E>(internal val firstElement: E?,
105105
}
106106

107107
internal companion object {
108-
private val EMPTY = PersistentOrderedSet(null, null, PersistentHashMap.emptyOf())
108+
private val EMPTY = PersistentOrderedSet<Nothing>(EndOfLink, EndOfLink, PersistentHashMap.emptyOf())
109109
internal fun <E> emptyOf(): PersistentSet<E> = EMPTY
110110
}
111111
}

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetBuilder.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ internal class PersistentOrderedSetBuilder<E>(private var set: PersistentOrdered
4747
if (mapBuilder.containsKey(element)) {
4848
return false
4949
}
50-
if (isEmpty()) { // isEmpty
50+
if (isEmpty()) {
5151
firstElement = element
5252
lastElement = element
5353
mapBuilder[element] = Links()
5454
return true
5555
}
56+
5657
val lastLinks = mapBuilder[lastElement]!!
5758
// assert(lastLinks.next === EndOfLink)
58-
5959
mapBuilder[lastElement as E] = lastLinks.withNext(element)
6060
mapBuilder[element] = lastLinks.putNextLink(lastElement)
6161
lastElement = element
62+
6263
return true
6364
}
6465

@@ -70,22 +71,23 @@ internal class PersistentOrderedSetBuilder<E>(private var set: PersistentOrdered
7071
// assert(previousLinks.next == element)
7172
mapBuilder[links.previous as E] = previousLinks.withNext(links.next)
7273
} else {
73-
firstElement = links.next as? E
74+
firstElement = links.next
7475
}
7576
if (links.next !== EndOfLink) {
7677
val nextLinks = mapBuilder[links.next]!!
7778
// assert(nextLinks.previous == element)
7879
mapBuilder[links.next as E] = nextLinks.withPrevious(links.previous)
7980
} else {
80-
lastElement = links.previous as? E
81+
lastElement = links.previous
8182
}
83+
8284
return true
8385
}
8486

8587
override fun clear() {
8688
mapBuilder.clear()
87-
firstElement = null
88-
lastElement = null
89+
firstElement = EndOfLink
90+
lastElement = EndOfLink
8991
}
9092

9193
override fun iterator(): MutableIterator<E> {

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSetIterator.kt

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

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

19-
internal open class PersistentOrderedSetIterator<E>(private var nextElement: E?,
19+
internal open class PersistentOrderedSetIterator<E>(private var nextElement: Any?,
2020
internal val map: Map<E, Links>) : Iterator<E> {
2121
internal var index = 0
2222

@@ -29,7 +29,7 @@ internal open class PersistentOrderedSetIterator<E>(private var nextElement: E?,
2929

3030
val result = nextElement as E
3131
index++
32-
nextElement = map[result]!!.next as? E
32+
nextElement = map[result]!!.next
3333
return result
3434
}
3535

0 commit comments

Comments
 (0)