Skip to content

Commit 165bd42

Browse files
committed
Use standard abstract collections.
1 parent 6e137f8 commit 165bd42

File tree

4 files changed

+18
-36
lines changed

4 files changed

+18
-36
lines changed

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/AbstractImmutableMap.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package kotlinx.collections.immutable
22

33
import org.pcollections.PMap
4-
import java.util.*
4+
import java.util.ConcurrentModificationException
55

66
internal abstract class AbstractImmutableMap<K, out V> protected constructor(protected val impl: PMap<K, @UnsafeVariance V>) : ImmutableMap<K, V> {
77

@@ -47,7 +47,7 @@ internal abstract class AbstractImmutableMap<K, out V> protected constructor(pro
4747
protected abstract fun wrap(impl: PMap<K, @UnsafeVariance V>): AbstractImmutableMap<K, V>
4848

4949

50-
abstract class Builder<K, V> protected constructor(protected var value: AbstractImmutableMap<K, V>, protected var impl: PMap<K, V>) : ImmutableMap.Builder<K, V>, AbstractMap<K, V>() {
50+
abstract class Builder<K, V> protected constructor(protected var value: AbstractImmutableMap<K, V>, protected var impl: PMap<K, V>) : ImmutableMap.Builder<K, V>, AbstractMutableMap<K, V>() {
5151
override fun build(): ImmutableMap<K, V> = value.wrap(impl).apply { value = this }
5252

5353
override val size: Int get() = impl.size
@@ -63,7 +63,9 @@ internal abstract class AbstractImmutableMap<K, out V> protected constructor(pro
6363

6464
private var entrySet: MutableSet<MutableMap.MutableEntry<K, V>>? = null
6565
override val entries: MutableSet<MutableMap.MutableEntry<K, V>>
66-
get() = entrySet ?: object : MutableSet<MutableMap.MutableEntry<K, V>>, AbstractSet<MutableMap.MutableEntry<K, V>>() {
66+
get() = entrySet ?: object : AbstractMutableSet<MutableMap.MutableEntry<K, V>>() {
67+
override fun add(element: MutableMap.MutableEntry<K, V>): Boolean = throw UnsupportedOperationException()
68+
6769
override val size: Int get() = impl.size
6870
override fun isEmpty(): Boolean = impl.isEmpty()
6971
override fun clear() = this@Builder.clear()
@@ -118,11 +120,6 @@ internal abstract class AbstractImmutableMap<K, out V> protected constructor(pro
118120
// override val keys: MutableSet<K>
119121
// override val values: MutableCollection<V>
120122

121-
override val values: MutableCollection<V>
122-
get() = super.values
123-
override val keys: MutableSet<K>
124-
get() = super.keys
125-
126123
override abstract fun clear()
127124

128125
override fun put(key: K, value: V): V?
@@ -152,7 +149,7 @@ internal fun <K, V> PMap<K, V>.contains(key: K, value: @UnsafeVariance V): Boole
152149
= this[key]?.let { candidate -> candidate == value } ?: (value == null && containsKey(key))
153150

154151

155-
152+
/*
156153
private open class ImmutableCollectionWrapper<E>(protected val impl: Collection<E>) : ImmutableCollection<E> {
157154
override val size: Int get() = impl.size
158155
override fun isEmpty(): Boolean = impl.isEmpty()
@@ -185,3 +182,4 @@ private class ImmutableSetWrapper<E>(impl: Set<E>) : ImmutableSet<E>, ImmutableC
185182
override fun removeAll(predicate: (E) -> Boolean): ImmutableSet<E> = super.removeAll(predicate) as ImmutableSet
186183
override fun clear(): ImmutableSet<E> = immutableSetOf()
187184
}
185+
*/

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/AbstractImmutableSet.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package kotlinx.collections.immutable
22

33
import org.pcollections.PSet
4-
import java.util.*
4+
import java.util.ConcurrentModificationException
55

66
internal abstract class AbstractImmutableSet<out E> protected constructor(protected val impl: PSet<@UnsafeVariance E>) : ImmutableSet<E> {
77

@@ -31,7 +31,7 @@ internal abstract class AbstractImmutableSet<out E> protected constructor(protec
3131

3232
protected abstract fun wrap(impl: PSet<@UnsafeVariance E>): AbstractImmutableSet<E>
3333

34-
abstract class Builder<E> internal constructor(protected var value: AbstractImmutableSet<E>, protected var impl: PSet<E>) : AbstractSet<E>(), ImmutableSet.Builder<E> {
34+
abstract class Builder<E> internal constructor(protected var value: AbstractImmutableSet<E>, protected var impl: PSet<E>) : AbstractMutableSet<E>(), ImmutableSet.Builder<E> {
3535
override fun build(): AbstractImmutableSet<E> = value.wrap(impl).apply { value = this }
3636
// delegating to impl
3737
override val size: Int get() = impl.size

kotlinx-collections-immutable/src/main/kotlin/kotlinx/collections/immutable/ImmutableVectorList.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package kotlinx.collections.immutable
22

33
import org.pcollections.*
4-
import java.util.*
54

65
internal class ImmutableVectorList<out E> private constructor(private val impl: PVector<E>) : ImmutableList<E> {
76

@@ -59,26 +58,21 @@ internal class ImmutableVectorList<out E> private constructor(private val impl:
5958
public fun <T> emptyOf(): ImmutableVectorList<T> = EMPTY
6059
}
6160

62-
class Builder<E> internal constructor(private var value: ImmutableVectorList<E>, private var impl: PVector<E>) : AbstractList<E>(), ImmutableList.Builder<E> {
61+
class Builder<E> internal constructor(private var value: ImmutableVectorList<E>, private var impl: PVector<E>) : AbstractMutableList<E>(), ImmutableList.Builder<E> {
6362
override fun build(): ImmutableVectorList<E> = value.wrap(impl).apply { value = this }
6463
// delegating to impl
6564
override val size: Int get() = impl.size
65+
override fun get(index: Int): E = impl.get(index)
66+
6667
override fun contains(element: @UnsafeVariance E): Boolean = impl.contains(element)
6768
override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean = impl.containsAll(elements)
68-
override fun get(index: Int): E = impl.get(index)
6969
override fun indexOf(element: @UnsafeVariance E): Int = impl.indexOf(element)
70-
override fun isEmpty(): Boolean = impl.isEmpty()
71-
72-
// override fun iterator(): MutableIterator<E> = listIterator(0)
7370
override fun lastIndexOf(element: @UnsafeVariance E): Int = impl.lastIndexOf(element)
74-
// override fun listIterator(): MutableListIterator<E> = listIterator(0)
75-
// override fun listIterator(index: Int): MutableListIterator<E> = impl.listIterator(0)
71+
7672
override fun equals(other: Any?): Boolean = impl.equals(other)
7773
override fun hashCode(): Int = impl.hashCode()
7874
override fun toString(): String = impl.toString()
7975

80-
81-
8276
private inline fun mutate(operation: (PVector<E>) -> PVector<E>): Boolean {
8377
val newValue = operation(impl)
8478
if (newValue !== impl) {

kotlinx-collections-immutable/tests/src/main/kotlin/ImmutableArrayList.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package kotlinx.collections.immutable
22

33
import java.util.*
4+
import kotlin.collections.AbstractList
45

5-
public class ImmutableArrayList<out E> private constructor(private val impl: Array<E>): ImmutableList<E> {
6-
7-
private var _implAsList: List<E>? = null
8-
private val implAsList: List<E> get() = _implAsList ?: impl.asList().apply { _implAsList = this }
6+
public class ImmutableArrayList<out E> private constructor(private val impl: Array<E>): ImmutableList<E>, AbstractList<E>() {
97

108
override val size: Int get() = impl.size
119
override fun isEmpty(): Boolean = impl.isEmpty()
@@ -17,9 +15,6 @@ public class ImmutableArrayList<out E> private constructor(private val impl: Arr
1715

1816

1917
override fun iterator(): Iterator<E> = impl.iterator()
20-
override fun listIterator(): ListIterator<E> = implAsList.listIterator()
21-
22-
override fun listIterator(index: Int): ListIterator<E> = implAsList.listIterator(index)
2318

2419
override fun subList(fromIndex: Int, toIndex: Int): ImmutableList<E> = ImmutableArrayList(impl.copyOfRange(fromIndex, toIndex))
2520

@@ -28,8 +23,8 @@ public class ImmutableArrayList<out E> private constructor(private val impl: Arr
2823
override fun addAll(elements: Collection<@UnsafeVariance E>): ImmutableList<E> = ImmutableArrayList(impl + elements)
2924

3025
override fun remove(element: @UnsafeVariance E): ImmutableList<E> {
31-
val values = implAsList - element
32-
return if (values.size < impl.size) ImmutableArrayList(values.toTypedArray<Any?>() as Array<E>) else this
26+
val index = indexOf(element).takeUnless { it < 0 } ?: return this
27+
return removeAt(index)
3328
}
3429

3530
override fun removeAll(elements: Collection<@UnsafeVariance E>): ImmutableList<E> {
@@ -52,15 +47,10 @@ public class ImmutableArrayList<out E> private constructor(private val impl: Arr
5247

5348
override fun removeAt(index: Int): ImmutableList<E> = mutate { it.removeAt(index) }
5449

55-
override fun builder(): ImmutableList.Builder<@UnsafeVariance E> = object : ArrayList<E>(implAsList), ImmutableList.Builder<E> {
50+
override fun builder(): ImmutableList.Builder<@UnsafeVariance E> = object : ArrayList<E>(impl.asList()), ImmutableList.Builder<E> {
5651
override fun build(): ImmutableList<E> = if (this.modCount == 0) this@ImmutableArrayList else ImmutableArrayList(this.toArray() as Array<E>)
5752
}
5853

59-
60-
override fun equals(other: Any?): Boolean = (other as? List<*>)?.equals(implAsList) ?: false
61-
override fun hashCode(): Int = Arrays.hashCode(impl)
62-
override fun toString(): String = Arrays.toString(impl)
63-
6454
companion object {
6555
public val EMPTY: ImmutableArrayList<Nothing> = ImmutableArrayList(emptyArray<Any?>()) as ImmutableArrayList<Nothing>
6656
}

0 commit comments

Comments
 (0)