Typecheck instructions are supported for reified T

This commit is contained in:
Denis Zharkov
2014-10-06 13:46:23 +04:00
committed by Andrey Breslav
parent 416ac7917b
commit f3c49c605f
10 changed files with 154 additions and 24 deletions
@@ -0,0 +1,20 @@
import kotlin.test.assertEquals
inline fun<reified T> checkcast(x: Any?): T {
return x as T
}
fun box(): String {
val x = checkcast<String>("abc")
assertEquals("abc", x)
val y = checkcast<Int>(1)
assertEquals(1, y)
try {
val z = checkcast<Int>("abc")
} catch (e: Exception) {
return "OK"
}
return "Fail"
}
@@ -0,0 +1,16 @@
import kotlin.test.assertEquals
inline fun<reified T> Array<Any>.filterIsInstance(): List<T> {
return this.filter { it is T }.map { it as T }
}
fun box(): String {
val src: Array<Any> = array(1,2,3.toDouble(), "abc", "cde")
assertEquals(arrayListOf(1,2), src.filterIsInstance<Int>())
assertEquals(arrayListOf(3.0), src.filterIsInstance<Double>())
assertEquals(arrayListOf("abc", "cde"), src.filterIsInstance<String>())
assertEquals(src.toList(), src.filterIsInstance<Any>())
return "OK"
}
@@ -0,0 +1,11 @@
inline fun<reified T> isinstance(x: Any?): Boolean {
return x is T
}
fun box(): String {
assert(isinstance<String>("abc"))
assert(isinstance<Int>(1))
assert(!isinstance<Int>("abc"))
return "OK"
}
@@ -0,0 +1,17 @@
import kotlin.test.assertEquals
inline fun<reified T> safecast(x: Any?): T? {
return x as? T
}
fun box(): String {
val x = safecast<String>("abc")
assertEquals("abc", x)
val y = safecast<Int>(1)
assertEquals(1, y)
val z = safecast<Int>("abc")
assertEquals(null, z)
return "OK"
}