Make SmartSet smarter

This commit is contained in:
Denis Zharkov
2015-10-14 14:42:08 +03:00
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