From c3de96dde08bcc72cda29da54d3b5551048e55bf Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Mon, 27 Apr 2020 22:07:27 +0800 Subject: [PATCH] Mark LockFreeLinkedList with MiraiInternalAPI, planning to make it internal in 1.0.0 --- .../kotlin/net.mamoe.mirai/contact/ContactList.kt | 4 ++++ .../event/internal/InternalEventListeners.kt | 2 ++ .../net.mamoe.mirai/message/data/CustomMessage.kt | 3 +++ .../kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt | 10 ++++++++++ .../mamoe/mirai/event/internal/MiraiAtomicBoolean.kt | 3 +++ 5 files changed, 22 insertions(+) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt index ef3770417..c82c75960 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactList.kt @@ -81,16 +81,19 @@ val ContactList<*>.idContentString: String ) + "]" +@MiraiInternalAPI operator fun <C : Contact> LockFreeLinkedList<C>.get(id: Long): C { forEach { if (it.id == id) return it } throw NoSuchElementException("No such contact: $id") } +@MiraiInternalAPI fun <C : Contact> LockFreeLinkedList<C>.getOrNull(id: Long): C? { forEach { if (it.id == id) return it } return null } +@OptIn(MiraiInternalAPI::class) @PlannedRemoval("1.0.0") @Deprecated( "use firstOrNull from stdlib", @@ -102,6 +105,7 @@ inline fun <C : Contact> LockFreeLinkedList<C>.firstOrNull(filter: (C) -> Boolea return null } +@OptIn(MiraiInternalAPI::class) @PlannedRemoval("1.0.0") @Deprecated( "use firstOrNull from stdlib", diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt index d7eca4ad0..e4af20054 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ +@file:OptIn(MiraiInternalAPI::class) package net.mamoe.mirai.event.internal @@ -122,6 +123,7 @@ internal object EventListenerManager { // 不要用 atomicfu. 在 publish 后会出现 VerifyError private val lock: MiraiAtomicBoolean = MiraiAtomicBoolean(false) + @OptIn(MiraiInternalAPI::class) @Suppress("UNCHECKED_CAST", "BooleanLiteralArgument") internal tailrec fun <E : Event> get(clazz: KClass<out E>): EventListeners<E> { registries.forEach { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt index 89ef02e51..73318dddf 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt @@ -7,6 +7,7 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ +@file:OptIn(MiraiInternalAPI::class) package net.mamoe.mirai.message.data import kotlinx.io.core.* @@ -114,6 +115,7 @@ sealed class CustomMessage : SingleMessage { override val typeName: String get() = "CustomMessage" private val factories: LockFreeLinkedList<Factory<*>> = LockFreeLinkedList() + @OptIn(MiraiInternalAPI::class) internal fun register(factory: Factory<out CustomMessage>) { factories.removeIf { it::class == factory::class } val exist = factories.asSequence().firstOrNull { it.typeName == factory.typeName } @@ -134,6 +136,7 @@ sealed class CustomMessage : SingleMessage { class CustomMessageFullDataDeserializeUserException(val body: ByteArray, cause: Throwable?) : RuntimeException(cause) + @OptIn(MiraiInternalAPI::class) internal fun deserialize(fullData: ByteReadPacket): CustomMessage? { val msg = kotlin.runCatching { val length = fullData.readInt() diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt index bfdb1cc0a..409b05fe5 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/LockFreeLinkedList.kt @@ -19,11 +19,13 @@ import kotlin.jvm.JvmOverloads /** * Collect all the elements into a [MutableList] then cast it as a [List] */ +@MiraiInternalAPI fun <E> LockFreeLinkedList<E>.toList(): List<E> = toMutableList() /** * Collect all the elements into a [MutableList]. */ +@MiraiInternalAPI fun <E> LockFreeLinkedList<E>.toMutableList(): MutableList<E> { val list = mutableListOf<E>() this.forEach { list.add(it) } @@ -33,11 +35,13 @@ fun <E> LockFreeLinkedList<E>.toMutableList(): MutableList<E> { /** * Collect all the elements into a [MutableSet] then cast it as a [Set] */ +@MiraiInternalAPI fun <E> LockFreeLinkedList<E>.toSet(): Set<E> = toMutableSet() /** * Collect all the elements into a [MutableSet]. */ +@MiraiInternalAPI fun <E> LockFreeLinkedList<E>.toMutableSet(): MutableSet<E> { val list = mutableSetOf<E>() this.forEach { list.add(it) } @@ -49,6 +53,7 @@ fun <E> LockFreeLinkedList<E>.toMutableSet(): MutableSet<E> { * * Note that the sequence is dynamic, that is, elements are yielded atomically only when it is required */ +@MiraiInternalAPI fun <E> LockFreeLinkedList<E>.asSequence(): Sequence<E> { return sequence { forEach { @@ -57,6 +62,7 @@ fun <E> LockFreeLinkedList<E>.asSequence(): Sequence<E> { } } +@MiraiInternalAPI operator fun <E> LockFreeLinkedList<E>.iterator(): Iterator<E> { return asSequence().iterator() } @@ -64,6 +70,7 @@ operator fun <E> LockFreeLinkedList<E>.iterator(): Iterator<E> { /** * 构建链表结构然后转为 [LockFreeLinkedList] */ +@MiraiInternalAPI fun <E> Iterable<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> { return LockFreeLinkedList<E>().apply { addAll(this@toLockFreeLinkedList) } } @@ -71,6 +78,7 @@ fun <E> Iterable<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> { /** * 构建链表结构然后转为 [LockFreeLinkedList] */ +@MiraiInternalAPI fun <E> Sequence<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> { return LockFreeLinkedList<E>().apply { addAll(this@toLockFreeLinkedList) } } @@ -81,6 +89,8 @@ fun <E> Sequence<E>.toLockFreeLinkedList(): LockFreeLinkedList<E> { * Modifying can be performed concurrently. * Iterating concurrency is guaranteed. */ +@PlannedRemoval("1.0.0") // make internal +@MiraiInternalAPI("This is unstable API and is going to be internal in 1.0.0") open class LockFreeLinkedList<E> { @PublishedApi internal val tail: Tail<E> = Tail() diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt index 36a9236f5..7101b3adc 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/MiraiAtomicBoolean.kt @@ -1,8 +1,11 @@ +@file:OptIn(MiraiInternalAPI::class) + package net.mamoe.mirai.event.internal import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Listener import net.mamoe.mirai.utils.LockFreeLinkedList +import net.mamoe.mirai.utils.MiraiInternalAPI import java.util.concurrent.atomic.AtomicBoolean import kotlin.reflect.KClass