Skip to content

Commit e827458

Browse files
authored
Inline Xof.use & Xof.Reader.use functions (#103)
1 parent 5cbbaa8 commit e827458

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

library/xof/api/xof.klib.api

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ sealed class <#A: org.kotlincrypto.core.xof/XofAlgorithm> org.kotlincrypto.core.
3737
final fun <get-delegate>(): #A // org.kotlincrypto.core.xof/Xof.delegate.<get-delegate>|<get-delegate>(){}[0]
3838

3939
abstract fun newReader(): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/Xof.newReader|newReader(){}[0]
40-
final fun <#A1: kotlin/Any?> use(kotlin/Boolean =..., kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A1>): #A1 // org.kotlincrypto.core.xof/Xof.use|use(kotlin.Boolean;kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<1:0>,0:0>){0§<kotlin.Any?>}[0]
4140
final fun reader(kotlin/Boolean =...): org.kotlincrypto.core.xof/Xof.Reader<#A> // org.kotlincrypto.core.xof/Xof.reader|reader(kotlin.Boolean){}[0]
4241
final fun toString(): kotlin/String // org.kotlincrypto.core.xof/Xof.toString|toString(){}[0]
42+
final inline fun <#A1: kotlin/Any?> use(kotlin/Boolean =..., kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A1>): #A1 // org.kotlincrypto.core.xof/Xof.use|use(kotlin.Boolean;kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<1:0>,0:0>){0§<kotlin.Any?>}[0]
4343

4444
abstract inner class Reader { // org.kotlincrypto.core.xof/Xof.Reader|null[0]
4545
constructor <init>() // org.kotlincrypto.core.xof/Xof.Reader.<init>|<init>(){}[0]
@@ -52,11 +52,11 @@ sealed class <#A: org.kotlincrypto.core.xof/XofAlgorithm> org.kotlincrypto.core.
5252

5353
abstract fun closeProtected() // org.kotlincrypto.core.xof/Xof.Reader.closeProtected|closeProtected(){}[0]
5454
abstract fun readProtected(kotlin/ByteArray, kotlin/Int, kotlin/Int): kotlin/Int // org.kotlincrypto.core.xof/Xof.Reader.readProtected|readProtected(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
55-
final fun <#A2: kotlin/Any?> use(kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A2>): #A2 // org.kotlincrypto.core.xof/Xof.Reader.use|use(kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<2:0>,0:0>){0§<kotlin.Any?>}[0]
5655
final fun close() // org.kotlincrypto.core.xof/Xof.Reader.close|close(){}[0]
5756
final fun read(kotlin/ByteArray): kotlin/Int // org.kotlincrypto.core.xof/Xof.Reader.read|read(kotlin.ByteArray){}[0]
5857
final fun read(kotlin/ByteArray, kotlin/Int, kotlin/Int): kotlin/Int // org.kotlincrypto.core.xof/Xof.Reader.read|read(kotlin.ByteArray;kotlin.Int;kotlin.Int){}[0]
5958
final fun toString(): kotlin/String // org.kotlincrypto.core.xof/Xof.Reader.toString|toString(){}[0]
59+
final inline fun <#A2: kotlin/Any?> use(kotlin/Function1<org.kotlincrypto.core.xof/Xof.Reader<#A>, #A2>): #A2 // org.kotlincrypto.core.xof/Xof.Reader.use|use(kotlin.Function1<org.kotlincrypto.core.xof.Xof.Reader<2:0>,0:0>){0§<kotlin.Any?>}[0]
6060
}
6161

6262
final object Companion { // org.kotlincrypto.core.xof/Xof.Companion|null[0]

library/xof/src/commonMain/kotlin/org/kotlincrypto/core/xof/Xof.kt

+20-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
package org.kotlincrypto.core.xof
1919

2020
import org.kotlincrypto.core.*
21+
import kotlin.contracts.ExperimentalContracts
22+
import kotlin.contracts.InvocationKind
23+
import kotlin.contracts.contract
2124
import kotlin.jvm.JvmField
2225
import kotlin.jvm.JvmName
2326
import kotlin.jvm.JvmOverloads
@@ -86,7 +89,16 @@ public sealed class Xof<A: XofAlgorithm>(
8689
* initial state after taking the snapshot.
8790
* */
8891
@JvmOverloads
89-
public fun <T: Any?> use(resetXof: Boolean = true, action: Reader.() -> T): T = reader(resetXof).use(action)
92+
@OptIn(ExperimentalContracts::class)
93+
public inline fun <T: Any?> use(
94+
resetXof: Boolean = true,
95+
action: Reader.() -> T,
96+
): T {
97+
contract {
98+
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
99+
}
100+
return reader(resetXof).use(action)
101+
}
90102

91103
/**
92104
* Takes a snapshot of the current [Xof]'s state and produces
@@ -145,9 +157,13 @@ public sealed class Xof<A: XofAlgorithm>(
145157
* Helper function which automatically invokes [close]
146158
* once action completes.
147159
* */
148-
public fun <T: Any?> use(action: Reader.() -> T): T {
149-
return try {
150-
action(this)
160+
@OptIn(ExperimentalContracts::class)
161+
public inline fun <T: Any?> use(action: Reader.() -> T): T {
162+
contract {
163+
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
164+
}
165+
try {
166+
return action(this)
151167
} finally {
152168
close()
153169
}

0 commit comments

Comments
 (0)