Java implementation of CloseableWrapper

This commit is contained in:
Andrew Golovashevich 2025-08-24 16:48:00 +03:00
parent 96931fda41
commit c078394921
6 changed files with 141 additions and 31 deletions

View File

@ -65,7 +65,7 @@ xomrk {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation(kotlinStdlibDependency) implementation(kotlinStdlibDependency)
implementation("ru.landgrafhomyak.utility:highlevel-try-finally:0.5") implementation("ru.landgrafhomyak.utility:highlevel-try-finally:0.6")
} }
} }
val commonTest by getting { val commonTest by getting {

@ -1 +1 @@
Subproject commit 099c3fad269770649d5a67acd3cd07e378bc9f37 Subproject commit 6cfa6bddd04a041ae02ec8098c478762313c71de

View File

@ -1,40 +1,26 @@
package ru.landgrafhomyak.utility.closeable_state_1 package ru.landgrafhomyak.utility.closeable_state_1
public class CloseableStateCloseableWrapper( public expect class CloseableStateCloseableWrapper : CloseableState.ExternallySynchronized {
private val _parent: CloseableState.ExternallySynchronized,
private val _self: CloseableState.ExternallySynchronized
) : CloseableState.ExternallySynchronized {
override val isInUse: Boolean by this._self::isInUse public constructor(parent: CloseableState.ExternallySynchronized, self: CloseableState.ExternallySynchronized)
override val isClosed: Boolean by this._self::isInUse override val isInUse: Boolean
override fun assertNotClosed(): Unit = override val isClosed: Boolean
this._self.assertNotClosed()
override fun assertNotClosed()
@ManualStateManipulation @ManualStateManipulation
override fun startUsage() { override fun startUsage()
this._self.tryStartUsage {
this._parent.startUsage()
}
}
@ManualStateManipulation @ManualStateManipulation
override fun finishUsage() { override fun finishUsage()
this._self.tryFinishUsage {
this._parent.finishUsage()
}
}
@ManualStateManipulation @ManualStateManipulation
override fun finishUsage(close: Boolean) { override fun finishUsage(close: Boolean)
this._self.tryFinishUsageThenClose(close) {
this._parent.finishUsage()
}
}
@ManualStateManipulation @ManualStateManipulation
override fun close() { override fun close()
this._self.close()
} override fun toString(): String
} }

View File

@ -51,7 +51,6 @@ public inline fun <R> CloseableState.tryFinishUsage(block: () -> R): R {
contract { contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(block, InvocationKind.EXACTLY_ONCE)
} }
this.assertNotClosed()
return safeAutoClose2(action = block, onSuccess = this::finishUsage) return safeAutoClose2(action = block, onSuccess = this::finishUsage)
} }
@ -76,7 +75,6 @@ public inline fun <R> CloseableState.ExternallySynchronized.tryFinishUsageThenCl
contract { contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(block, InvocationKind.EXACTLY_ONCE)
} }
this.assertNotClosed()
return safeAutoClose2(action = block, onSuccess = { this.finishUsage(close) }) return safeAutoClose2(action = block, onSuccess = { this.finishUsage(close) })
} }
@ -86,7 +84,6 @@ public inline fun CloseableState.ExternallySynchronized.tryFinishUsageThenClose(
contract { contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(block, InvocationKind.EXACTLY_ONCE)
} }
this.assertNotClosed()
var needClose = false var needClose = false
return safeAutoClose2( return safeAutoClose2(
action = { needClose = block() }, action = { needClose = block() },

View File

@ -0,0 +1,70 @@
package ru.landgrafhomyak.utility.closeable_state_1;
import java.util.Objects;
public final class jCloseableStateCloseableWrapper
implements CloseableState.ExternallySynchronized {
private final CloseableState.ExternallySynchronized _parent;
private final CloseableState.ExternallySynchronized _self;
public jCloseableStateCloseableWrapper(CloseableState.ExternallySynchronized parent, CloseableState.ExternallySynchronized self) {
Objects.requireNonNull(parent, "param: parent");
Objects.requireNonNull(self, "param: self");
this._parent = parent;
this._self = self;
}
@Override
public boolean isInUse() {
return this._self.isInUse();
}
@Override
public boolean isClosed() {
return this._self.isClosed();
}
@Override
public void assertNotClosed() {
this._self.assertNotClosed();
}
@Override
public void startUsage() {
this._self.startUsage();
try {
this._parent.startUsage();
} catch (Throwable e1) {
try {
this._self.finishUsage();
} catch (Throwable e2) {
e1.addSuppressed(e2);
}
throw e1;
}
}
@Override
public void finishUsage() {
this._parent.finishUsage();
this._self.finishUsage();
}
@Override
public void finishUsage(boolean close) {
this._parent.finishUsage();
this._self.finishUsage(close);
}
@Override
public void close() {
this._self.close();
}
@Override
public String toString() {
return "<closeable state " + this._parent + " wrapped with " + this._self + ">";
}
}

View File

@ -0,0 +1,57 @@
package ru.landgrafhomyak.utility.closeable_state_1
public actual class CloseableStateCloseableWrapper : CloseableState.ExternallySynchronized {
private val _parent: CloseableState.ExternallySynchronized
private val _self: CloseableState.ExternallySynchronized
public actual constructor(
parent: CloseableState.ExternallySynchronized,
self: CloseableState.ExternallySynchronized,
) {
this._parent = parent
this._self = self
}
actual override val isInUse: Boolean
get() = this._self.isInUse
actual override val isClosed: Boolean
get() = this._self.isClosed
actual override fun assertNotClosed(): Unit =
this._self.assertNotClosed()
@ManualStateManipulation
actual override fun startUsage() {
this._self.startUsage()
try {
this._parent.startUsage()
} catch (e1: Throwable) {
try {
this._self.finishUsage()
} catch (e2: Throwable) {
e1.addSuppressed(e2)
}
throw e1
}
}
@ManualStateManipulation
actual override fun finishUsage() {
this._parent.finishUsage()
this._self.finishUsage()
}
@ManualStateManipulation
actual override fun finishUsage(close: Boolean) {
this._parent.finishUsage()
this._self.finishUsage(close)
}
@ManualStateManipulation
actual override fun close() {
this._self.close()
}
actual override fun toString(): String = "<closeable state ${this._parent} wrapped with ${this._self}>"
}