Make SmartSet smarter
This commit is contained in:
committed by
Mikhail Glukhikh
parent
6322198a11
commit
9e052372e6
@@ -25,22 +25,22 @@ import java.util.*
|
|||||||
* Also, [iterator] returns an iterator which does not support [MutableIterator.remove].
|
* Also, [iterator] returns an iterator which does not support [MutableIterator.remove].
|
||||||
*/
|
*/
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
class SmartSet<T> private constructor() /* : AbstractSet<T>() */ {
|
class SmartSet<T> private constructor() : AbstractSet<T>() {
|
||||||
companion object {
|
companion object {
|
||||||
private val ARRAY_THRESHOLD = 5
|
private val ARRAY_THRESHOLD = 5
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun create<T>(): MutableSet<T> = LinkedHashSet()
|
fun <T> create() = SmartSet<T>()
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun create<T>(set: Set<T>): MutableSet<T> = LinkedHashSet(set)
|
fun <T> create(set: Set<T>) = SmartSet<T>().apply { this.addAll(set) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// null if size = 0, object if size = 1, array of objects if size < threshold, linked hash set otherwise
|
// null if size = 0, object if size = 1, array of objects if size < threshold, linked hash set otherwise
|
||||||
private var data: Any? = null
|
private var data: Any? = null
|
||||||
|
|
||||||
private var size: Int = 0
|
override var size: Int = 0
|
||||||
/*
|
|
||||||
override fun iterator(): MutableIterator<T> = when {
|
override fun iterator(): MutableIterator<T> = when {
|
||||||
size == 0 -> Collections.emptySet<T>().iterator()
|
size == 0 -> Collections.emptySet<T>().iterator()
|
||||||
size == 1 -> SingletonIterator(data as T)
|
size == 1 -> SingletonIterator(data as T)
|
||||||
@@ -78,15 +78,13 @@ class SmartSet<T> private constructor() /* : AbstractSet<T>() */ {
|
|||||||
size = 0
|
size = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun size(): Int = size
|
override fun contains(o: T): Boolean = when {
|
||||||
|
|
||||||
override fun contains(o: Any?): Boolean = when {
|
|
||||||
size == 0 -> false
|
size == 0 -> false
|
||||||
size == 1 -> data == o
|
size == 1 -> data == o
|
||||||
size < ARRAY_THRESHOLD -> o in data as Array<T>
|
size < ARRAY_THRESHOLD -> o in data as Array<T>
|
||||||
else -> o in data as Set<T>
|
else -> o in data as Set<T>
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
private class SingletonIterator<T>(private val element: T) : MutableIterator<T> {
|
private class SingletonIterator<T>(private val element: T) : MutableIterator<T> {
|
||||||
private var hasNext = true
|
private var hasNext = true
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user