Minor. Add more tests
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
||||
// WITH_STDLIB
|
||||
// WORKS_WHEN_VALUE_CLASS
|
||||
// LANGUAGE: +ValueClasses, +GenericInlineClassParameter
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class Z<T: Int>(val x: T)
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class ZArray(val storage: IntArray) : Collection<Z<Int>> {
|
||||
override val size: Int
|
||||
get() = storage.size
|
||||
|
||||
override fun contains(element: Z<Int>): Boolean {
|
||||
return storage.contains(element.x)
|
||||
}
|
||||
|
||||
override fun containsAll(elements: Collection<Z<Int>>): Boolean {
|
||||
return elements.all { contains(it) }
|
||||
}
|
||||
|
||||
override fun isEmpty(): Boolean {
|
||||
return storage.isEmpty()
|
||||
}
|
||||
|
||||
private class ZArrayIterator(val storage: IntArray): Iterator<Z<Int>> {
|
||||
var index = 0
|
||||
|
||||
override fun hasNext(): Boolean = index < storage.size
|
||||
|
||||
override fun next(): Z<Int> = Z(storage[index++])
|
||||
}
|
||||
|
||||
override fun iterator(): Iterator<Z<Int>> = ZArrayIterator(storage)
|
||||
}
|
||||
|
||||
|
||||
fun box(): String {
|
||||
val zs = ZArray(IntArray(5))
|
||||
|
||||
val testSize = zs.size
|
||||
if (testSize != 5) return "Failed: testSize=$testSize"
|
||||
|
||||
val testContains = zs.contains(object {} as Any)
|
||||
if (testContains) return "Failed: testContains=$testContains"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+60
@@ -0,0 +1,60 @@
|
||||
// WITH_STDLIB
|
||||
// WORKS_WHEN_VALUE_CLASS
|
||||
// LANGUAGE: +ValueClasses, +GenericInlineClassParameter
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class Z<T: Int>(val x: T)
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class ZArray(val storage: IntArray) : List<Z<Int>> {
|
||||
override val size: Int
|
||||
get() = storage.size
|
||||
|
||||
override fun contains(element: Z<Int>): Boolean {
|
||||
return storage.contains(element.x)
|
||||
}
|
||||
|
||||
override fun containsAll(elements: Collection<Z<Int>>): Boolean {
|
||||
return elements.all { contains(it) }
|
||||
}
|
||||
|
||||
override fun isEmpty(): Boolean {
|
||||
return storage.isEmpty()
|
||||
}
|
||||
|
||||
override fun get(index: Int): Z<Int> = Z(storage[index])
|
||||
|
||||
override fun indexOf(element: Z<Int>): Int = storage.indexOf(element.x)
|
||||
|
||||
override fun lastIndexOf(element: Z<Int>): Int = storage.lastIndexOf(element.x)
|
||||
|
||||
override fun listIterator(): ListIterator<Z<Int>> = ZArrayIterator(storage)
|
||||
|
||||
override fun listIterator(index: Int): ListIterator<Z<Int>> = ZArrayIterator(storage, index)
|
||||
|
||||
override fun subList(fromIndex: Int, toIndex: Int): List<Z<Int>> = TODO()
|
||||
|
||||
private class ZArrayIterator(val storage: IntArray, var index: Int = 0): ListIterator<Z<Int>> {
|
||||
override fun hasNext(): Boolean = index < storage.size
|
||||
override fun next(): Z<Int> = Z(storage[index++])
|
||||
override fun nextIndex(): Int = index + 1
|
||||
|
||||
override fun hasPrevious(): Boolean = index > 0
|
||||
override fun previous(): Z<Int> = Z(storage[index--])
|
||||
override fun previousIndex(): Int = index - 1
|
||||
}
|
||||
|
||||
override fun iterator(): Iterator<Z<Int>> = ZArrayIterator(storage)
|
||||
}
|
||||
|
||||
|
||||
fun box(): String {
|
||||
val zs = ZArray(IntArray(5))
|
||||
|
||||
val testElement = object {} as Any
|
||||
zs.contains(testElement)
|
||||
zs.indexOf(testElement)
|
||||
zs.lastIndexOf(testElement)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+61
@@ -0,0 +1,61 @@
|
||||
// WITH_STDLIB
|
||||
// WORKS_WHEN_VALUE_CLASS
|
||||
// LANGUAGE: +ValueClasses, +GenericInlineClassParameter
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class Z<T: Int>(val x: T)
|
||||
|
||||
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||
value class ZArrayMap(val storage: IntArray) : Map<Z<Int>, Z<Int>> {
|
||||
override val size: Int
|
||||
get() = storage.size
|
||||
|
||||
private class MapEntry(val i: Int, val si: Int): Map.Entry<Z<Int>, Z<Int>> {
|
||||
override val key: Z<Int> get() = Z(i)
|
||||
override val value: Z<Int> get() = Z(si)
|
||||
}
|
||||
|
||||
private class MapEntrySet(val storage: IntArray) : AbstractSet<Map.Entry<Z<Int>, Z<Int>>>() {
|
||||
private inner class MyIterator : Iterator<Map.Entry<Z<Int>, Z<Int>>> {
|
||||
var index = 0
|
||||
override fun hasNext(): Boolean = index < size
|
||||
override fun next(): Map.Entry<Z<Int>, Z<Int>> = MapEntry(index, storage[index++])
|
||||
}
|
||||
|
||||
override val size: Int
|
||||
get() = storage.size
|
||||
|
||||
override fun iterator(): Iterator<Map.Entry<Z<Int>, Z<Int>>> = MyIterator()
|
||||
}
|
||||
|
||||
override val entries: Set<Map.Entry<Z<Int>, Z<Int>>>
|
||||
get() = MapEntrySet(storage)
|
||||
|
||||
override val keys: Set<Z<Int>>
|
||||
get() = (0 until size).mapTo(HashSet()) { Z(it) }
|
||||
|
||||
override val values: Collection<Z<Int>>
|
||||
get() = storage.mapTo(ArrayList()) { Z(it) }
|
||||
|
||||
override fun containsKey(key: Z<Int>): Boolean = key.x in (0 until size)
|
||||
|
||||
override fun containsValue(value: Z<Int>): Boolean = storage.contains(value.x)
|
||||
|
||||
override fun get(key: Z<Int>) = 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"
|
||||
}
|
||||
Reference in New Issue
Block a user