// WITH_RUNTIME @file:JvmName("TestKt") package test import kotlinx.android.parcel.* import android.os.Parcel import android.os.Parcelable import java.util.Arrays /** * Generic pair parceler * Create concrete object to use (see below) */ open class PairParceler(private val firstParceler: Parceler, private val secondParceler: Parceler): Parceler> { /** * Reads the [T] instance state from the [parcel], constructs the new [T] instance and returns it. */ override fun create(parcel: Parcel): Pair = firstParceler.create(parcel) to secondParceler.create(parcel) /** * Writes the [T] instance state to the [parcel]. */ override fun Pair.write(parcel: Parcel, flags: Int) { with(firstParceler) { this@write.first.write(parcel, 0) } with(secondParceler) { this@write.second.write(parcel, 0) } } } object IntParceler: Parceler { /** * Reads the [T] instance state from the [parcel], constructs the new [T] instance and returns it. */ override fun create(parcel: Parcel): Int = parcel.readInt() /** * Writes the [T] instance state to the [parcel]. */ override fun Int.write(parcel: Parcel, flags: Int) { parcel.writeInt(this) } } /** * [Int] to [Int] pair parceler */ object IntToIntParceler: PairParceler(IntParceler, IntParceler) @Parcelize @TypeParceler, IntToIntParceler> class A(val pair: Pair): Parcelable fun box() = parcelTest { parcel -> val a1 = A(1 to 2) a1.writeToParcel(parcel, 0) val bytes = parcel.marshall() parcel.unmarshall(bytes, 0, bytes.size) parcel.setDataPosition(0) val a2 = readFromParcel(parcel) assert(a1.pair == a2.pair) }