From f4cf5e842d91dbebf7a4cb1add50ca0afe7b725a Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 20 Nov 2018 17:29:33 +0300 Subject: [PATCH] Uniform `alloc` and `cValue` APIs in kotlinx.cinterop #KT-25628 Fixed --- .../Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt b/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt index 02ae0e9db15..1d14a81c424 100644 --- a/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt +++ b/Interop/Runtime/src/main/kotlin/kotlinx/cinterop/Utils.kt @@ -109,6 +109,14 @@ class Arena(parent: NativeFreeablePlacement = nativeHeap) : ArenaBase(parent) { inline fun NativePlacement.alloc(): T = alloc(sizeOf(), alignOf()).reinterpret() +/** + * Allocates variable of given type and initializes it applying given block. + * + * @param T must not be abstract + */ +inline fun NativePlacement.alloc(initialize: T.() -> Unit): T = + alloc().also { it.initialize() } + /** * Allocates C array of given elements type and length. * @@ -225,6 +233,8 @@ fun zeroValue(size: Int, align: Int): CValue = object : CValu inline fun zeroValue(): CValue = zeroValue(sizeOf().toInt(), alignOf()) +inline fun cValue(): CValue = zeroValue() + private fun NativePlacement.placeBytes(bytes: ByteArray, align: Int): CPointer { val result = this.alloc(size = bytes.size, align = align) nativeMemUtils.putByteArray(bytes, result, bytes.size)