// WITH_STDLIB // WORKS_WHEN_VALUE_CLASS // LANGUAGE: +ValueClasses, +GenericInlineClassParameter OPTIONAL_JVM_INLINE_ANNOTATION value class Z(val x: T) OPTIONAL_JVM_INLINE_ANNOTATION value class ZArrayMap(val storage: IntArray) : Map, Z> { override val size: Int get() = storage.size private class MapEntry(val i: Int, val si: Int): Map.Entry, Z> { override val key: Z get() = Z(i) override val value: Z get() = Z(si) } private class MapEntrySet(val storage: IntArray) : AbstractSet, Z>>() { private inner class MyIterator : Iterator, Z>> { var index = 0 override fun hasNext(): Boolean = index < size override fun next(): Map.Entry, Z> = MapEntry(index, storage[index++]) } override val size: Int get() = storage.size override fun iterator(): Iterator, Z>> = MyIterator() } override val entries: Set, Z>> get() = MapEntrySet(storage) override val keys: Set> get() = (0 until size).mapTo(HashSet()) { Z(it) } override val values: Collection> get() = storage.mapTo(ArrayList()) { Z(it) } override fun containsKey(key: Z): Boolean = key.x in (0 until size) override fun containsValue(value: Z): Boolean = storage.contains(value.x) override fun get(key: Z) = storage.getOrNull(key.x)?.let { Z(it) } override fun isEmpty(): Boolean = size > 0 } fun box(): String { val zm = ZArrayMap(IntArray(5)) zm.containsKey(Z(0)) zm.containsValue(Z(0)) zm[Z(0)] zm.containsKey(object {} as Any) zm.containsValue(object {} as Any) zm.get(object {} as Any) return "OK" }