| /* | |
| * Copyright 2010-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license | |
| * that can be found in the LICENSE file. | |
| */ | |
| @file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) | |
| import kotlin.test.* | |
| import kotlinx.cinterop.* | |
| typealias heap_t = IntVar | |
| fun heap_create(size: Long): CPointer<heap_t>? = null | |
| fun heap_alloc(heap: CPointer<heap_t>?, size: ULong): CPointer<*>? = null | |
| fun heap_free(heap: CPointer<heap_t>?, ptr: CPointer<*>?): CPointer<BooleanVar>? = null | |
| inline fun Heap(size: Long): CPointer<heap_t>? { | |
| return heap_create(size) | |
| } | |
| inline fun <reified T : CVariable> CPointer<heap_t>?.use(f: (CPointer<T>) -> Unit) { | |
| alloc<T>() | |
| ?.also(f) | |
| ?.also(::free) | |
| } | |
| inline fun <reified T : CVariable> CPointer<heap_t>?.alloc(): CPointer<T>? { | |
| return heap_alloc(this, sizeOf<T>().toULong())?.reinterpret() | |
| } | |
| inline fun CPointer<heap_t>?.free(ptr: CPointer<*>?): Boolean { | |
| return heap_free(this, ptr)?.pointed?.value ?: false | |
| } | |
| fun box(): String { | |
| memScoped { | |
| val heap = Heap(1024) | |
| heap.use<IntVar> { ptr -> | |
| ptr.pointed.value = 40 | |
| //println("PTR ${ptr.pointed}") | |
| } | |
| } | |
| return "OK" | |
| } |