mirror of
https://github.com/tursom/TursomServer.git
synced 2025-03-13 11:20:10 +08:00
update
This commit is contained in:
parent
58158b4662
commit
5a89be88df
@ -11,12 +11,12 @@ val ClassLoader.classes: List<Class<*>>
|
||||
|
||||
fun ClassLoader.getClassByPackage(
|
||||
packageName: String,
|
||||
childPackage: Boolean = true
|
||||
childPackage: Boolean = true,
|
||||
): List<String> = ClassLoaderUtil.getClassByPackage(packageName, childPackage, this)
|
||||
|
||||
inline fun <reified T> T.getClassByPackage(
|
||||
packageName: String,
|
||||
childPackage: Boolean = true
|
||||
childPackage: Boolean = true,
|
||||
): List<String> = ClassLoaderUtil.getClassByPackage(packageName, childPackage, T::class.java.classLoader)
|
||||
|
||||
object ClassLoaderUtil {
|
||||
@ -31,7 +31,7 @@ object ClassLoaderUtil {
|
||||
fun getClassByPackage(
|
||||
packageName: String,
|
||||
childPackage: Boolean = true,
|
||||
loader: ClassLoader = Thread.currentThread().contextClassLoader
|
||||
loader: ClassLoader = Thread.currentThread().contextClassLoader,
|
||||
): List<String> {
|
||||
val packagePath = packageName.replace(".", "/")
|
||||
val url: URL? = loader.getResource(packagePath)
|
||||
|
@ -3,7 +3,7 @@ package cn.tursom.core
|
||||
import java.util.concurrent.atomic.AtomicReference
|
||||
|
||||
class Disposable<T>(
|
||||
value: T? = null
|
||||
value: T? = null,
|
||||
) {
|
||||
private var value = AtomicReference<T>()
|
||||
|
||||
|
@ -3,7 +3,7 @@ package cn.tursom.core
|
||||
@Suppress("unused")
|
||||
class ListClassLoader(
|
||||
//url: Array<out URL>,
|
||||
parent: ClassLoader = getSystemClassLoader()
|
||||
parent: ClassLoader = getSystemClassLoader(),
|
||||
) : ClassLoader(parent),
|
||||
MutableList<ClassLoader> by ArrayList() {
|
||||
|
||||
|
@ -24,7 +24,7 @@ open class NonLockLinkedList<T> {
|
||||
|
||||
private class TaskListNode<T>(
|
||||
val data: T,
|
||||
@Volatile var next: TaskListNode<T>?
|
||||
@Volatile var next: TaskListNode<T>?,
|
||||
)
|
||||
|
||||
class NotSupportedException : Exception()
|
||||
|
@ -25,13 +25,13 @@ class Snowflake(
|
||||
val executorService: ScheduledExecutorService? = null,
|
||||
val updateRateMs: Long = defaultUpdateRateMs,
|
||||
val workMode: WorkMode = WorkMode.INCREMENT,
|
||||
val incrementLength: Int = 7
|
||||
val incrementLength: Int = 7,
|
||||
) {
|
||||
constructor(
|
||||
workerId: String,
|
||||
executorService: ScheduledExecutorService? = null,
|
||||
updateRateMs: Long = defaultUpdateRateMs,
|
||||
workMode: WorkMode = WorkMode.INCREMENT
|
||||
workMode: WorkMode = WorkMode.INCREMENT,
|
||||
) : this(parseId(workerId), executorService, updateRateMs, workMode)
|
||||
|
||||
private var _timestamp = System.currentTimeMillis().shl(incrementLength + 13).and(0x7f_ff_ff_ff__ff_ff_ff_ff)
|
||||
|
@ -2,7 +2,7 @@ package cn.tursom.core
|
||||
|
||||
class Switch(
|
||||
val value: Any? = null,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
object BreakException : Exception()
|
||||
|
||||
@ -44,7 +44,7 @@ inline fun <T : Any?> switch(value: T, block: Switch.() -> Unit) {
|
||||
|
||||
class ByteSwitch(
|
||||
val value: Byte,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -76,7 +76,7 @@ inline fun switch(value: Byte, block: ByteSwitch.() -> Unit) {
|
||||
|
||||
class ShortSwitch(
|
||||
val value: Short,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -108,7 +108,7 @@ inline fun switch(value: Short, block: ShortSwitch.() -> Unit) {
|
||||
|
||||
class IntSwitch(
|
||||
val value: Int,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -140,7 +140,7 @@ inline fun switch(value: Int, block: IntSwitch.() -> Unit) {
|
||||
|
||||
class LongSwitch(
|
||||
val value: Long,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -172,7 +172,7 @@ inline fun switch(value: Long, block: LongSwitch.() -> Unit) {
|
||||
|
||||
class FloatSwitch(
|
||||
val value: Float,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -204,7 +204,7 @@ inline fun switch(value: Float, block: FloatSwitch.() -> Unit) {
|
||||
|
||||
class DoubleSwitch(
|
||||
val value: Double,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
@ -236,7 +236,7 @@ inline fun switch(value: Double, block: DoubleSwitch.() -> Unit) {
|
||||
|
||||
class CharSwitch(
|
||||
val value: Char,
|
||||
var consider: Boolean = false
|
||||
var consider: Boolean = false,
|
||||
) {
|
||||
inline val `break`: Unit
|
||||
inline get() {
|
||||
|
@ -3,11 +3,11 @@ package cn.tursom.core
|
||||
import sun.misc.Unsafe
|
||||
|
||||
object Unsafe {
|
||||
val unsafe: Unsafe = Unsafe::class.java["theUnsafe"] as Unsafe
|
||||
val unsafe: Unsafe = Unsafe::class.java.getStaticField("theUnsafe") as Unsafe
|
||||
|
||||
operator fun <T> invoke(action: cn.tursom.core.Unsafe.() -> T): T = this.action()
|
||||
|
||||
operator fun Any.get(name: String): Any? {
|
||||
fun Any.getField(name: String): Any? {
|
||||
val clazz = this::class.java
|
||||
val field = try {
|
||||
clazz.getDeclaredField(name)
|
||||
@ -18,7 +18,18 @@ object Unsafe {
|
||||
return field.get(this)
|
||||
}
|
||||
|
||||
operator fun Class<*>.get(name: String): Any? {
|
||||
fun Any.setField(name: String, value: Any?) {
|
||||
val clazz = this::class.java
|
||||
val field = try {
|
||||
clazz.getDeclaredField(name)
|
||||
} catch (e: Exception) {
|
||||
return
|
||||
}
|
||||
field.isAccessible = true
|
||||
field.set(this, value)
|
||||
}
|
||||
|
||||
fun Class<*>.getStaticField(name: String): Any? {
|
||||
val field = try {
|
||||
getDeclaredField(name)
|
||||
} catch (e: Exception) {
|
||||
|
@ -4,7 +4,7 @@ import java.lang.ref.SoftReference
|
||||
|
||||
open class UpdatableThreadLocal<T>(
|
||||
@Volatile
|
||||
private var new: () -> T
|
||||
private var new: () -> T,
|
||||
) : ThreadLocal<T>() {
|
||||
@Suppress("LeakingThis")
|
||||
private val thisSoft: SoftReference<UpdatableThreadLocal<*>> = SoftReference(this)
|
||||
|
@ -4,7 +4,7 @@ import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
class UpdatableThreadLocalSimpleDateFormat(
|
||||
format: String = "YYYY-MM-dd'T'HH:mm:ssZZ"
|
||||
format: String = "YYYY-MM-dd'T'HH:mm:ssZZ",
|
||||
) : UpdatableThreadLocal<SimpleDateFormat>({
|
||||
SimpleDateFormat(format)
|
||||
}) {
|
||||
|
@ -10,7 +10,7 @@ interface MethodFilter {
|
||||
|
||||
|
||||
class Arg1MethodFilter<R>(
|
||||
val prevFilter: ReturnTypeMethodFilter<R>
|
||||
val prevFilter: ReturnTypeMethodFilter<R>,
|
||||
) : MethodFilter {
|
||||
override fun filterMethod(clazz: Class<*>): Sequence<Method> {
|
||||
return prevFilter.filterMethod(clazz).filter { method ->
|
||||
|
@ -19,7 +19,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType: Array<Class<*>>,
|
||||
self: Any? = null,
|
||||
handler: (Method, (Array<Any?>) -> R) -> Unit
|
||||
handler: (Method, (Array<Any?>) -> R) -> Unit,
|
||||
) {
|
||||
clazz.forAllMethods { method ->
|
||||
val parameterTypes = method.parameterTypes
|
||||
@ -47,7 +47,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType: Array<Class<*>>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend (Array<Any?>) -> R) -> Unit
|
||||
handler: (Method, suspend (Array<Any?>) -> R) -> Unit,
|
||||
) {
|
||||
clazz.forAllMethods { method ->
|
||||
val parameterTypes = method.parameterTypes
|
||||
@ -85,7 +85,7 @@ object MethodInspector {
|
||||
clazz: Class<*>,
|
||||
returnType: Class<out R>,
|
||||
self: Any? = null,
|
||||
handler: (Method, () -> R) -> Unit
|
||||
handler: (Method, () -> R) -> Unit,
|
||||
) {
|
||||
clazz.javaClass.forAllMethods { method ->
|
||||
val parameterTypes = method.parameterTypes
|
||||
@ -106,7 +106,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType: Class<T>,
|
||||
self: Any? = null,
|
||||
handler: (Method, (T) -> R) -> Unit
|
||||
handler: (Method, (T) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(clazz, returnType, arrayOf(argumentType), self) { method: Method, m: (Array<Any?>) -> R ->
|
||||
handler(method) {
|
||||
@ -121,7 +121,7 @@ object MethodInspector {
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
self: Any? = null,
|
||||
handler: (Method, (T1, T2) -> R) -> Unit
|
||||
handler: (Method, (T1, T2) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
clazz,
|
||||
@ -142,7 +142,7 @@ object MethodInspector {
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
self: Any? = null,
|
||||
handler: (Method, (T1, T2, T3) -> R) -> Unit
|
||||
handler: (Method, (T1, T2, T3) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
clazz,
|
||||
@ -164,7 +164,7 @@ object MethodInspector {
|
||||
argumentType3: Class<T3>,
|
||||
argumentType4: Class<T4>,
|
||||
self: Any? = null,
|
||||
handler: (Method, (T1, T2, T3, T4) -> R) -> Unit
|
||||
handler: (Method, (T1, T2, T3, T4) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
clazz,
|
||||
@ -186,7 +186,7 @@ object MethodInspector {
|
||||
clazz: Class<*>,
|
||||
returnType: Class<out R>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend () -> R) -> Unit
|
||||
handler: (Method, suspend () -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(clazz, returnType, arrayOf(), self) { method: Method, m: suspend (Array<Any?>) -> R ->
|
||||
handler(method) {
|
||||
@ -200,7 +200,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType: Class<T>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend (T) -> R) -> Unit
|
||||
handler: (Method, suspend (T) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
clazz,
|
||||
@ -220,7 +220,7 @@ object MethodInspector {
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend (T1, T2) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
clazz,
|
||||
@ -241,7 +241,7 @@ object MethodInspector {
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend (T1, T2, T3) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2, T3) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
clazz,
|
||||
@ -263,7 +263,7 @@ object MethodInspector {
|
||||
argumentType3: Class<T3>,
|
||||
argumentType4: Class<T4>,
|
||||
self: Any? = null,
|
||||
handler: (Method, suspend (T1, T2, T3, T4) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2, T3, T4) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
clazz,
|
||||
@ -282,7 +282,7 @@ object MethodInspector {
|
||||
self: Any,
|
||||
returnType: Class<out R>,
|
||||
argumentType: Array<Class<*>>,
|
||||
handler: (Method, (Array<Any?>) -> R) -> Unit
|
||||
handler: (Method, (Array<Any?>) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(self.javaClass, returnType, argumentType, self, handler)
|
||||
}
|
||||
@ -291,7 +291,7 @@ object MethodInspector {
|
||||
self: Any,
|
||||
returnType: Class<out R>,
|
||||
argumentType: Array<Class<*>>,
|
||||
handler: (Method, suspend (Array<Any?>) -> R) -> Unit
|
||||
handler: (Method, suspend (Array<Any?>) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(self.javaClass, returnType, argumentType, self, handler)
|
||||
}
|
||||
@ -308,7 +308,7 @@ object MethodInspector {
|
||||
self: Any,
|
||||
returnType: Class<out R>,
|
||||
argumentType: Class<T>,
|
||||
handler: (Method, (T) -> R) -> Unit
|
||||
handler: (Method, (T) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(self, returnType, arrayOf(argumentType)) { method: Method, m: (Array<Any?>) -> R ->
|
||||
handler(method) {
|
||||
@ -322,7 +322,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
handler: (Method, (T1, T2) -> R) -> Unit
|
||||
handler: (Method, (T1, T2) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
self,
|
||||
@ -341,7 +341,7 @@ object MethodInspector {
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
handler: (Method, (T1, T2, T3) -> R) -> Unit
|
||||
handler: (Method, (T1, T2, T3) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
self,
|
||||
@ -361,7 +361,7 @@ object MethodInspector {
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
argumentType4: Class<T4>,
|
||||
handler: (Method, (T1, T2, T3, T4) -> R) -> Unit
|
||||
handler: (Method, (T1, T2, T3, T4) -> R) -> Unit,
|
||||
) {
|
||||
forEachMethod(
|
||||
self,
|
||||
@ -390,7 +390,7 @@ object MethodInspector {
|
||||
self: Any,
|
||||
returnType: Class<out R>,
|
||||
argumentType: Class<T>,
|
||||
handler: (Method, suspend (T) -> R) -> Unit
|
||||
handler: (Method, suspend (T) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(self, returnType, arrayOf(argumentType)) { method: Method, m: suspend (Array<Any?>) -> R ->
|
||||
handler(method) {
|
||||
@ -404,7 +404,7 @@ object MethodInspector {
|
||||
returnType: Class<out R>,
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
handler: (Method, suspend (T1, T2) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
self,
|
||||
@ -423,7 +423,7 @@ object MethodInspector {
|
||||
argumentType1: Class<T1>,
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
handler: (Method, suspend (T1, T2, T3) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2, T3) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
self,
|
||||
@ -443,7 +443,7 @@ object MethodInspector {
|
||||
argumentType2: Class<T2>,
|
||||
argumentType3: Class<T3>,
|
||||
argumentType4: Class<T4>,
|
||||
handler: (Method, suspend (T1, T2, T3, T4) -> R) -> Unit
|
||||
handler: (Method, suspend (T1, T2, T3, T4) -> R) -> Unit,
|
||||
) {
|
||||
forEachSuspendMethod(
|
||||
self,
|
||||
|
@ -4,7 +4,7 @@ import cn.tursom.core.allMethodsSequence
|
||||
import java.lang.reflect.Method
|
||||
|
||||
class ReturnTypeMethodFilter<R>(
|
||||
val returnType: Class<R>
|
||||
val returnType: Class<R>,
|
||||
) : MethodFilter {
|
||||
override fun filterMethod(clazz: Class<*>): Sequence<Method> {
|
||||
return clazz.allMethodsSequence.filter { method ->
|
||||
|
@ -1,6 +1,6 @@
|
||||
package cn.tursom.core.reflect
|
||||
|
||||
import cn.tursom.core.Unsafe.get
|
||||
import cn.tursom.core.Unsafe.getField
|
||||
import cn.tursom.core.companionObjectInstanceOrNull
|
||||
import cn.tursom.core.isStatic
|
||||
import cn.tursom.core.uncheckedCast
|
||||
@ -23,7 +23,7 @@ fun <T> Class<*>.getStaticField(name: String): T? {
|
||||
|
||||
val companionObjectInstance = kotlin.companionObjectInstanceOrNull
|
||||
if (companionObjectInstance != null) {
|
||||
return companionObjectInstance[name]?.uncheckedCast()
|
||||
return companionObjectInstance.getField(name)?.uncheckedCast()
|
||||
}
|
||||
|
||||
return null
|
||||
|
@ -21,7 +21,7 @@ class BufferedStorageHandler<T>(
|
||||
private val minBufTime: Long = 500,
|
||||
private val singleThreadWrite: Boolean = true,
|
||||
// 数据批量写入处理器
|
||||
private val writeHandler: (list: Collection<T>) -> Unit
|
||||
private val writeHandler: (list: Collection<T>) -> Unit,
|
||||
) : StorageHandler<T> {
|
||||
private val onWrite = AtomicBoolean(false)
|
||||
|
||||
|
@ -5,7 +5,7 @@ package cn.tursom.core.storage
|
||||
*/
|
||||
class InstantStorageHandler<T>(
|
||||
// 数据批量写入处理器
|
||||
private val writeHandler: (obj: T) -> Unit
|
||||
private val writeHandler: (obj: T) -> Unit,
|
||||
) : StorageHandler<T> {
|
||||
/**
|
||||
* 向缓冲中添加一个写入对象
|
||||
|
@ -9,7 +9,7 @@ class ThreadPoolStorageHandler<T>(
|
||||
// 任务执行线程池
|
||||
private val executor: Executor,
|
||||
// 数据批量写入处理器
|
||||
private val writeHandler: (obj: T) -> Unit
|
||||
private val writeHandler: (obj: T) -> Unit,
|
||||
) : StorageHandler<T> {
|
||||
/**
|
||||
* 向缓冲中添加一个写入对象
|
||||
|
@ -38,7 +38,7 @@ class NonLockTaskQueue : TaskQueue {
|
||||
override val timeout: Long,
|
||||
override val task: () -> Unit,
|
||||
override val createTime: Long,
|
||||
@Volatile var next: TaskListNode?
|
||||
@Volatile var next: TaskListNode?,
|
||||
) : TimerTask {
|
||||
@Volatile
|
||||
override var canceled: Boolean = false
|
||||
|
@ -44,7 +44,7 @@ class SynchronizedTaskQueue : TaskQueue {
|
||||
override val task: () -> Unit,
|
||||
@Volatile var prev: TaskNode?,
|
||||
@Volatile var next: TaskNode?,
|
||||
override val createTime: Long = CurrentTimeMillisClock.now
|
||||
override val createTime: Long = CurrentTimeMillisClock.now,
|
||||
) : TimerTask {
|
||||
@Volatile
|
||||
override var canceled: Boolean = false
|
||||
|
@ -520,7 +520,7 @@ fun getCallerClass(thisClassName: List<String>): Class<*>? {
|
||||
do {
|
||||
clazz = getCallerClass(callStackDepth++)
|
||||
val clazzName = clazz?.name
|
||||
if (clazzName != "cn.tursom.core.ToolsKt" && clazzName !in thisClassName) {
|
||||
if (clazzName != "cn.tursom.core.UtilsKt" && clazzName !in thisClassName) {
|
||||
break
|
||||
}
|
||||
} while (clazz != null)
|
||||
|
@ -1,9 +1,9 @@
|
||||
package cn.tursom.http
|
||||
|
||||
import cn.tursom.core.Utils.gson
|
||||
import cn.tursom.core.coroutine.GlobalScope
|
||||
import cn.tursom.core.coroutine.MainDispatcher
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import org.jsoup.nodes.Document
|
||||
import retrofit2.Retrofit
|
||||
@ -58,13 +58,13 @@ data class RoomStatus(
|
||||
val recvCount: Int,
|
||||
val roomId: Int,
|
||||
val roomInfo: RoomInfo,
|
||||
val totalCount: Int
|
||||
val totalCount: Int,
|
||||
)
|
||||
|
||||
data class LiveUser(
|
||||
val info: Info,
|
||||
val level: Level,
|
||||
val san: Int
|
||||
val san: Int,
|
||||
)
|
||||
|
||||
data class RoomInfo(
|
||||
@ -104,7 +104,7 @@ data class RoomInfo(
|
||||
val uid: Int,
|
||||
val up_session: String,
|
||||
val user_cover: String,
|
||||
val verify: String
|
||||
val verify: String,
|
||||
)
|
||||
|
||||
data class Info(
|
||||
@ -117,7 +117,7 @@ data class Info(
|
||||
val rank: String,
|
||||
val uid: Int,
|
||||
val uname: String,
|
||||
val vip_type: Int
|
||||
val vip_type: Int,
|
||||
)
|
||||
|
||||
data class Level(
|
||||
@ -133,13 +133,13 @@ data class Level(
|
||||
val user_level: Int,
|
||||
val user_score: String,
|
||||
val vip: Int,
|
||||
val vip_time: String
|
||||
val vip_time: String,
|
||||
)
|
||||
|
||||
data class OfficialVerify(
|
||||
val desc: String,
|
||||
val role: Int,
|
||||
val type: Int
|
||||
val type: Int,
|
||||
)
|
||||
|
||||
data class MasterLevel(
|
||||
@ -150,25 +150,25 @@ data class MasterLevel(
|
||||
val master_level_color: Int,
|
||||
val next: List<Int>,
|
||||
val sort: String,
|
||||
val upgrade_score: Int
|
||||
val upgrade_score: Int,
|
||||
)
|
||||
|
||||
data class NewPendants(
|
||||
val badge: Badge,
|
||||
val frame: Frame,
|
||||
val mobile_frame: MobileFrame
|
||||
val mobile_frame: MobileFrame,
|
||||
)
|
||||
|
||||
data class StudioInfo(
|
||||
val master_list: List<Any>,
|
||||
val status: Int
|
||||
val status: Int,
|
||||
)
|
||||
|
||||
data class Badge(
|
||||
val desc: String,
|
||||
val name: String,
|
||||
val position: Double,
|
||||
val value: String
|
||||
val value: String,
|
||||
)
|
||||
|
||||
data class Frame(
|
||||
@ -180,7 +180,7 @@ data class Frame(
|
||||
val name: String,
|
||||
val position: Int,
|
||||
val use_old_area: Boolean,
|
||||
val value: String
|
||||
val value: String,
|
||||
)
|
||||
|
||||
data class MobileFrame(
|
||||
@ -192,5 +192,5 @@ data class MobileFrame(
|
||||
val name: String,
|
||||
val position: Int,
|
||||
val use_old_area: Boolean,
|
||||
val value: String
|
||||
val value: String,
|
||||
)
|
@ -8,6 +8,8 @@ dependencies {
|
||||
implementation(project(":ts-core:ts-log"))
|
||||
implementation(project(":ts-core"))
|
||||
compileOnly(group = "io.netty", name = "netty-all", version = "4.1.72.Final")
|
||||
|
||||
testApi(group = "junit", name = "junit", version = "4.13.2")
|
||||
}
|
||||
|
||||
artifacts {
|
||||
|
@ -3,6 +3,8 @@ package cn.tursom.core
|
||||
import cn.tursom.core.AsyncFile.Reader
|
||||
import cn.tursom.core.AsyncFile.Writer
|
||||
import cn.tursom.core.buffer.*
|
||||
import cn.tursom.core.buffer.NioBuffers.readNioBuffers
|
||||
import cn.tursom.core.buffer.NioBuffers.writeNioBuffers
|
||||
import java.nio.channels.AsynchronousFileChannel
|
||||
import java.nio.channels.CompletionHandler
|
||||
import java.nio.file.Files
|
||||
@ -24,26 +26,23 @@ class AsyncFile(val path: Path) {
|
||||
override val extensionClass: Class<Writer> = Writer::class.java
|
||||
|
||||
override tailrec fun get(buffer: ByteBuffer): Writer? {
|
||||
val sequences = buffer.getExtension(NioBuffers.Sequences)
|
||||
return when {
|
||||
sequences != null -> Writer { file, position ->
|
||||
buffer is MultipleByteBuffer -> Writer { file, position ->
|
||||
var writePosition = position
|
||||
val nioBuffers = sequences.readBufferSequence().toList()
|
||||
|
||||
run {
|
||||
nioBuffers.forEach { readBuf ->
|
||||
while (readBuf.position() < readBuf.limit()) {
|
||||
val writeSize = file.write(readBuf, writePosition)
|
||||
if (writeSize > 0) {
|
||||
writePosition += writeSize
|
||||
} else {
|
||||
return@run
|
||||
buffer.readNioBuffers {
|
||||
it.forEach { readBuf ->
|
||||
while (readBuf.position() < readBuf.limit()) {
|
||||
val writeSize = file.write(readBuf, writePosition)
|
||||
if (writeSize > 0) {
|
||||
writePosition += writeSize
|
||||
} else {
|
||||
return@run
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sequences.finishRead(nioBuffers.iterator())
|
||||
(writePosition - position).toInt()
|
||||
}
|
||||
buffer is ProxyByteBuffer -> get(buffer.agent)
|
||||
@ -60,26 +59,23 @@ class AsyncFile(val path: Path) {
|
||||
override val extensionClass: Class<Reader> = Reader::class.java
|
||||
|
||||
override tailrec fun get(buffer: ByteBuffer): Reader? {
|
||||
val sequences = buffer.getExtension(NioBuffers.Sequences)
|
||||
return when {
|
||||
sequences != null -> Reader { file, position ->
|
||||
buffer is MultipleByteBuffer -> Reader { file, position ->
|
||||
var readPosition = position
|
||||
val nioBuffers = sequences.writeBufferSequence().toList()
|
||||
|
||||
run {
|
||||
nioBuffers.forEach { nioBuf ->
|
||||
while (nioBuf.position() < nioBuf.limit()) {
|
||||
val readSize = file.read(nioBuf, readPosition)
|
||||
if (readSize > 0) {
|
||||
readPosition += readSize
|
||||
} else {
|
||||
return@run
|
||||
buffer.writeNioBuffers {
|
||||
it.forEach { nioBuf ->
|
||||
while (nioBuf.position() < nioBuf.limit()) {
|
||||
val readSize = file.read(nioBuf, readPosition)
|
||||
if (readSize > 0) {
|
||||
readPosition += readSize
|
||||
} else {
|
||||
return@run
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sequences.finishWrite(nioBuffers.iterator())
|
||||
(readPosition - position).toInt()
|
||||
}
|
||||
buffer is ProxyByteBuffer -> get(buffer.agent)
|
||||
|
@ -48,11 +48,15 @@ object ByteBufferUtil {
|
||||
return buffer
|
||||
}
|
||||
|
||||
fun wrap(bytes: ByteArray, write: Boolean = true): cn.tursom.core.buffer.ByteBuffer {
|
||||
return HeapByteBuffer(bytes, write)
|
||||
}
|
||||
|
||||
fun wrap(array: ByteArray, offset: Int = 0, size: Int = array.size - offset): ByteBuffer {
|
||||
val buffer = ByteBuffer.wrap(array, 0, offset + size)
|
||||
if (offset > 0) field.set(buffer, offset)
|
||||
return buffer
|
||||
}
|
||||
|
||||
fun wrap(string: String) = wrap(string.toByteArray())
|
||||
fun wrap(string: String) = wrap(string.toByteArray(), write = false)
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
interface BasicByteBuffer {
|
||||
val hasArray: Boolean
|
||||
val array: ByteArray
|
||||
|
||||
val readable: Int get() = writePosition - readPosition
|
||||
val writeable: Int get() = capacity - writePosition
|
||||
|
||||
val isReadable: Boolean get() = readable != 0
|
||||
val isWriteable: Boolean get() = writeable != 0
|
||||
|
||||
val capacity: Int
|
||||
val arrayOffset: Int
|
||||
var writePosition: Int
|
||||
var readPosition: Int
|
||||
val writeOffset: Int get() = arrayOffset + writePosition
|
||||
val readOffset: Int get() = arrayOffset + readPosition
|
||||
|
||||
val closed: Boolean get() = false
|
||||
val resized: Boolean
|
||||
|
||||
fun reset()
|
||||
|
||||
fun clear() {
|
||||
readPosition = 0
|
||||
writePosition = 0
|
||||
}
|
||||
}
|
@ -1,417 +1,26 @@
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
import cn.tursom.core.Utils.bufferThreadLocal
|
||||
import cn.tursom.core.forEachIndex
|
||||
import cn.tursom.core.reverseBytes
|
||||
import java.io.Closeable
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
import java.nio.ByteOrder
|
||||
import kotlin.math.min
|
||||
|
||||
/**
|
||||
* 针对其他库的字节缓冲的封装
|
||||
*/
|
||||
@Suppress("unused")
|
||||
interface ByteBuffer : Closeable {
|
||||
interface ByteBuffer : Closeable, ReadableByteBuffer, WriteableByteBuffer {
|
||||
fun <T> getExtension(key: ByteBufferExtensionKey<T>): T? = key.get(this)
|
||||
|
||||
/**
|
||||
* 使用读 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> readBuffer(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = readBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishRead(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用写 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> writeBuffer(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = writeBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishWrite(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
val readable: Int get() = writePosition - readPosition
|
||||
val writeable: Int get() = capacity - writePosition
|
||||
|
||||
val isReadable: Boolean get() = readable != 0
|
||||
val isWriteable: Boolean get() = writeable != 0
|
||||
|
||||
val hasArray: Boolean
|
||||
val array: ByteArray
|
||||
|
||||
val capacity: Int
|
||||
val arrayOffset: Int
|
||||
var writePosition: Int
|
||||
var readPosition: Int
|
||||
|
||||
val closed: Boolean get() = false
|
||||
val resized: Boolean
|
||||
|
||||
override fun close() {}
|
||||
fun closeChild(child: ByteBuffer) {}
|
||||
|
||||
fun readBuffer(): java.nio.ByteBuffer
|
||||
fun finishRead(buffer: java.nio.ByteBuffer)
|
||||
|
||||
fun writeBuffer(): java.nio.ByteBuffer
|
||||
fun finishWrite(buffer: java.nio.ByteBuffer)
|
||||
|
||||
fun reset()
|
||||
fun slice(position: Int, size: Int): ByteBuffer = slice(position, size, 0, 0)
|
||||
fun slice(position: Int, size: Int, readPosition: Int = 0, writePosition: Int = 0): ByteBuffer
|
||||
fun slice(position: Int, size: Int, readPosition: Int, writePosition: Int): ByteBuffer
|
||||
|
||||
/**
|
||||
* @return 底层 nio buffer 是否已更新
|
||||
*/
|
||||
fun resize(newSize: Int): Boolean
|
||||
|
||||
val writeOffset: Int get() = arrayOffset + writePosition
|
||||
val readOffset: Int get() = arrayOffset + readPosition
|
||||
|
||||
fun clear() {
|
||||
readPosition = 0
|
||||
writePosition = 0
|
||||
}
|
||||
|
||||
fun skip(n: Int): Int {
|
||||
readPosition += n
|
||||
return n
|
||||
}
|
||||
|
||||
fun get(): Byte = read { it.get() }
|
||||
|
||||
fun getChar(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Char = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.char
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.char.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getShort(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Short = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.short
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.short.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getInt(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Int = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.int
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.int.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getLong(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Long = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.long
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.long.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getFloat(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Float = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.float
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.float.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getDouble(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Double = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.double
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.double.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getBytes(size: Int = readable): ByteArray = read {
|
||||
if (it.limit() - it.position() < size) {
|
||||
throw IndexOutOfBoundsException()
|
||||
}
|
||||
val bytes = ByteArray(size)
|
||||
it.get(bytes)
|
||||
bytes
|
||||
}
|
||||
|
||||
fun getString(size: Int = readable): String = String(getBytes(size))
|
||||
|
||||
fun toString(size: Int): String {
|
||||
val bytes = getBytes(size)
|
||||
// 将测试的字节返还回来
|
||||
readPosition -= bytes.size
|
||||
return String(bytes)
|
||||
}
|
||||
|
||||
fun writeTo(buffer: ByteArray, bufferOffset: Int = 0, size: Int = min(readable, buffer.size)): Int {
|
||||
val readSize = min(readable, size)
|
||||
if (hasArray) {
|
||||
array.copyInto(buffer, bufferOffset, readOffset, readOffset + readSize)
|
||||
readPosition += readOffset
|
||||
reset()
|
||||
} else {
|
||||
read {
|
||||
it.put(buffer, bufferOffset, readSize)
|
||||
}
|
||||
}
|
||||
return readSize
|
||||
}
|
||||
|
||||
fun writeTo(os: OutputStream, buffer: ByteArray? = null): Int {
|
||||
val size = readable
|
||||
if (hasArray) {
|
||||
os.write(array, readOffset, size)
|
||||
readPosition += size
|
||||
reset()
|
||||
} else {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val buffer = buffer ?: bufferThreadLocal.get()
|
||||
read {
|
||||
while (it.remaining() > 0) {
|
||||
val min = min(it.remaining(), buffer.size)
|
||||
it.get(buffer, 0, min)
|
||||
os.write(buffer, 0, min)
|
||||
}
|
||||
}
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
fun writeTo(buffer: ByteBuffer): Int {
|
||||
val size = min(readable, buffer.writeable)
|
||||
if (hasArray) {
|
||||
buffer.put(array, readOffset, size)
|
||||
readPosition += size
|
||||
reset()
|
||||
} else {
|
||||
read { read ->
|
||||
buffer.write { write -> write.put(read) }
|
||||
}
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
fun toByteArray() = getBytes()
|
||||
|
||||
|
||||
/*
|
||||
* 数据写入方法
|
||||
*/
|
||||
|
||||
fun put(byte: Byte): Unit = write { it.put(byte) }
|
||||
|
||||
fun put(char: Char, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putChar(char)
|
||||
}
|
||||
|
||||
fun put(short: Short, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putShort(short)
|
||||
}
|
||||
|
||||
fun put(int: Int, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putInt(int)
|
||||
}
|
||||
|
||||
fun put(long: Long, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putLong(long)
|
||||
}
|
||||
|
||||
fun put(float: Float, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putFloat(float)
|
||||
}
|
||||
|
||||
fun put(double: Double, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putDouble(double)
|
||||
}
|
||||
|
||||
fun put(str: String): Int = put(str.toByteArray())
|
||||
fun put(buffer: ByteBuffer): Int = buffer.writeTo(this)
|
||||
fun put(byteArray: ByteArray, offset: Int = 0, len: Int = byteArray.size - offset): Int {
|
||||
return if (hasArray) {
|
||||
byteArray.copyInto(array, writeOffset, offset, offset + len)
|
||||
writePosition += len
|
||||
len
|
||||
} else {
|
||||
write {
|
||||
val position = it.position()
|
||||
it.put(byteArray, offset, len)
|
||||
it.position() - position
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: CharArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: ShortArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: IntArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: LongArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: FloatArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: DoubleArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(inputStream: InputStream): Int {
|
||||
return if (hasArray) {
|
||||
val read = inputStream.read(array, writeOffset, writeable)
|
||||
if (read < 0) throw IOException("stream closed")
|
||||
writePosition += read
|
||||
read
|
||||
} else {
|
||||
val buffer = bufferThreadLocal.get()
|
||||
val read = inputStream.read(buffer)
|
||||
put(buffer, 0, read)
|
||||
}
|
||||
}
|
||||
|
||||
fun put(inputStream: InputStream, size: Int): Int {
|
||||
assert(size <= writeable)
|
||||
return if (hasArray) {
|
||||
val read = inputStream.read(array, writeOffset, size)
|
||||
if (read > 0) {
|
||||
writePosition += read
|
||||
}
|
||||
read
|
||||
} else {
|
||||
val buffer = ByteArray(size)
|
||||
val read = inputStream.read(buffer)
|
||||
if (read > 0) {
|
||||
put(buffer, 0, read)
|
||||
}
|
||||
read
|
||||
}
|
||||
}
|
||||
|
||||
fun putByte(byte: Byte): Unit = put(byte)
|
||||
fun putChar(char: Char, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(char, byteOrder)
|
||||
fun putShort(short: Short, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(short, byteOrder)
|
||||
fun putInt(int: Int, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(int, byteOrder)
|
||||
fun putLong(long: Long, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(long, byteOrder)
|
||||
fun putFloat(float: Float, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(float, byteOrder)
|
||||
fun putDouble(double: Double, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(double, byteOrder)
|
||||
|
||||
fun putString(str: String): Int = put(str)
|
||||
fun putBuffer(buffer: ByteBuffer): Int = put(buffer)
|
||||
fun putBytes(byteArray: ByteArray, startIndex: Int = 0, endIndex: Int = byteArray.size - startIndex) =
|
||||
put(byteArray, startIndex, endIndex)
|
||||
|
||||
fun putChars(
|
||||
array: CharArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putShorts(
|
||||
array: ShortArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putInts(
|
||||
array: IntArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putLongs(
|
||||
array: LongArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putFloats(
|
||||
array: FloatArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putDoubles(
|
||||
array: DoubleArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun fill(byte: Byte) {
|
||||
readPosition = 0
|
||||
writePosition = 0
|
||||
write {
|
||||
while (it.remaining() != 0) {
|
||||
it.put(byte)
|
||||
}
|
||||
}
|
||||
writePosition = 0
|
||||
}
|
||||
|
||||
fun split(maxSize: Int): List<ByteBuffer> {
|
||||
fun split(maxSize: Int): Array<ByteBuffer> {
|
||||
val size = (((capacity - 1) / maxSize) + 1).and(0x7fff_ffff)
|
||||
return Array(size) {
|
||||
if (it != size - 1) {
|
||||
@ -419,7 +28,7 @@ interface ByteBuffer : Closeable {
|
||||
} else {
|
||||
slice(it * maxSize, capacity - it * maxSize)
|
||||
}
|
||||
}.asList()
|
||||
}
|
||||
}
|
||||
|
||||
fun readAllSize(): Int {
|
||||
|
@ -5,14 +5,6 @@
|
||||
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
import cn.tursom.core.buffer.NioBuffers.Arrays.Companion.readArrays
|
||||
import cn.tursom.core.buffer.NioBuffers.Arrays.Companion.writeArrays
|
||||
import cn.tursom.core.buffer.NioBuffers.Lists.Companion.readLists
|
||||
import cn.tursom.core.buffer.NioBuffers.Lists.Companion.writeLists
|
||||
import cn.tursom.core.buffer.NioBuffers.Sequences.Companion.readSequences
|
||||
import cn.tursom.core.buffer.NioBuffers.Sequences.Companion.writeSequences
|
||||
import cn.tursom.core.buffer.NioBuffers.readNioBuffers
|
||||
import cn.tursom.core.buffer.NioBuffers.writeNioBuffers
|
||||
import cn.tursom.core.buffer.impl.ArrayByteBuffer
|
||||
import cn.tursom.core.toBytes
|
||||
import cn.tursom.core.toInt
|
||||
@ -26,7 +18,7 @@ import java.nio.channels.WritableByteChannel
|
||||
/**
|
||||
* 使用读 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
inline fun <T> ByteBuffer.read(block: (java.nio.ByteBuffer) -> T): T {
|
||||
inline fun <T> ReadableByteBuffer.read(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = readBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
@ -38,7 +30,7 @@ inline fun <T> ByteBuffer.read(block: (java.nio.ByteBuffer) -> T): T {
|
||||
/**
|
||||
* 使用写 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
inline fun <T> ByteBuffer.write(block: (java.nio.ByteBuffer) -> T): T {
|
||||
inline fun <T> WriteableByteBuffer.write(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = writeBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
@ -47,69 +39,60 @@ inline fun <T> ByteBuffer.write(block: (java.nio.ByteBuffer) -> T): T {
|
||||
}
|
||||
}
|
||||
|
||||
fun ReadableByteChannel.read(buffer: ByteBuffer): Int {
|
||||
if (this is ScatteringByteChannel) {
|
||||
val arrays = buffer.getExtension(NioBuffers.Arrays)
|
||||
if (arrays != null) {
|
||||
return arrays.writeArrays { nioBuffers ->
|
||||
read(nioBuffers)
|
||||
}.toInt()
|
||||
}
|
||||
fun ReadableByteChannel.read(buffer: ByteBuffer): Long {
|
||||
if (buffer is NioBuffers.Arrays) {
|
||||
val buffers = buffer.writeBufferArray()
|
||||
try {
|
||||
if (this is ScatteringByteChannel) {
|
||||
return read(buffers)
|
||||
}
|
||||
|
||||
val list = buffer.getExtension(NioBuffers.Lists)
|
||||
if (list != null) {
|
||||
return list.writeLists { nioBuffers ->
|
||||
read(nioBuffers.toTypedArray())
|
||||
}.toInt()
|
||||
}
|
||||
|
||||
val sequences = buffer.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
return sequences.writeSequences { nioBuffers ->
|
||||
read(nioBuffers.toList().toTypedArray())
|
||||
}.toInt()
|
||||
var read = 0L
|
||||
buffers.forEach { buf ->
|
||||
if (buf.remaining() == 0) {
|
||||
return@forEach
|
||||
}
|
||||
val readOnce = read(buf)
|
||||
if (readOnce == 0) {
|
||||
return read
|
||||
}
|
||||
read += readOnce
|
||||
}
|
||||
return read
|
||||
} finally {
|
||||
buffer.finishWrite(buffers)
|
||||
}
|
||||
}
|
||||
|
||||
return buffer.write { read(it) }
|
||||
return buffer.write { read(it).toLong() }
|
||||
}
|
||||
|
||||
fun WritableByteChannel.write(buffer: ByteBuffer): Int {
|
||||
if (this is GatheringByteChannel) {
|
||||
val arrays = buffer.getExtension(NioBuffers.Arrays)
|
||||
if (arrays != null) {
|
||||
return arrays.readArrays { nioBuffers ->
|
||||
write(nioBuffers)
|
||||
}.toInt()
|
||||
}
|
||||
fun WritableByteChannel.write(buffer: ByteBuffer): Long {
|
||||
if (buffer is NioBuffers.Arrays) {
|
||||
val buffers = buffer.readBufferArray()
|
||||
try {
|
||||
if (this is GatheringByteChannel) {
|
||||
return write(buffers)
|
||||
}
|
||||
|
||||
val list = buffer.getExtension(NioBuffers.Lists)
|
||||
if (list != null) {
|
||||
return list.readLists { nioBuffers ->
|
||||
write(nioBuffers.toTypedArray())
|
||||
}.toInt()
|
||||
}
|
||||
|
||||
val sequences = buffer.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
return sequences.readSequences { nioBuffers ->
|
||||
write(nioBuffers.toList().toTypedArray())
|
||||
}.toInt()
|
||||
var write = 0L
|
||||
buffers.forEach { buf ->
|
||||
if (buf.remaining() == 0) {
|
||||
return@forEach
|
||||
}
|
||||
val writeOnce = write(buf)
|
||||
if (writeOnce == 0) {
|
||||
return write
|
||||
}
|
||||
write += writeOnce
|
||||
}
|
||||
return write
|
||||
} finally {
|
||||
buffer.finishRead(buffers)
|
||||
}
|
||||
}
|
||||
return buffer.read { write(it) }
|
||||
}
|
||||
|
||||
fun ScatteringByteChannel.read(
|
||||
buffers: Array<out ByteBuffer>
|
||||
): Long = buffers.writeNioBuffers { bufferList ->
|
||||
read(bufferList.toTypedArray())
|
||||
}
|
||||
|
||||
fun GatheringByteChannel.write(
|
||||
buffers: Array<out ByteBuffer>
|
||||
): Long = buffers.readNioBuffers { bufferList ->
|
||||
write(bufferList.toTypedArray())
|
||||
return buffer.read { write(it).toLong() }
|
||||
}
|
||||
|
||||
fun Array<out ByteBuffer>.asMultipleByteBuffer() = ArrayByteBuffer(buffers = this)
|
||||
|
@ -10,4 +10,3 @@ interface ByteBufferExtensionKey<T> {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,168 +1,113 @@
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
import cn.tursom.core.buffer.impl.ListByteBuffer
|
||||
import cn.tursom.core.forEachIndex
|
||||
import cn.tursom.core.toBytes
|
||||
import cn.tursom.core.*
|
||||
import cn.tursom.core.buffer.NioBuffers.readNioBuffers
|
||||
import cn.tursom.core.buffer.NioBuffers.writeNioBuffers
|
||||
import java.io.Closeable
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
import java.nio.ByteOrder
|
||||
import kotlin.math.min
|
||||
|
||||
@Suppress("unused")
|
||||
interface MultipleByteBuffer : Closeable, ByteBuffer, NioBuffers.Sequences {
|
||||
val buffers: List<ByteBuffer> get() = listOf(this)
|
||||
val buffersArray: Array<out ByteBuffer> get() = arrayOf(this)
|
||||
interface MultipleByteBuffer : Closeable, ByteBuffer, NioBuffers.Arrays {
|
||||
val buffers: Array<out ByteBuffer>
|
||||
val bufferIterable: Iterable<ByteBuffer>
|
||||
val bufferSize: Int get() = buffers.size
|
||||
|
||||
/**
|
||||
* append and give ownership to this MultipleByteBuffer
|
||||
*/
|
||||
fun append(buffer: ByteBuffer)
|
||||
|
||||
/**
|
||||
* 使用读 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> readBuffers(block: (Sequence<java.nio.ByteBuffer>) -> T): T {
|
||||
val buffer = readBufferSequence()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishRead(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用写 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> writeBuffers(block: (Sequence<java.nio.ByteBuffer>) -> T): T {
|
||||
val buffer = writeBufferSequence()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishWrite(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
override fun readBufferSequence(): Sequence<java.nio.ByteBuffer> = sequence {
|
||||
buffers.forEach { subBuf ->
|
||||
val sequences = subBuf.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
yieldAll(sequences.readBufferSequence())
|
||||
} else {
|
||||
yield(subBuf.readBuffer())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun writeBufferSequence(): Sequence<java.nio.ByteBuffer> = sequence {
|
||||
buffers.forEach { subBuf ->
|
||||
val sequences = subBuf.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
yieldAll(sequences.writeBufferSequence())
|
||||
} else {
|
||||
yield(subBuf.writeBuffer())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun finishRead(buffers: Sequence<java.nio.ByteBuffer>) = finishRead(buffers.iterator())
|
||||
override fun finishRead(buffers: Iterator<java.nio.ByteBuffer>) {
|
||||
this.buffers.forEach { subBuf ->
|
||||
val sequences = subBuf.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
sequences.finishRead(buffers)
|
||||
} else {
|
||||
subBuf.finishRead(buffers.next())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun finishWrite(buffers: Sequence<java.nio.ByteBuffer>) = finishWrite(buffers.iterator())
|
||||
override fun finishWrite(buffers: Iterator<java.nio.ByteBuffer>) {
|
||||
this.buffers.forEach { subBuf ->
|
||||
val sequences = subBuf.getExtension(NioBuffers.Sequences)
|
||||
if (sequences != null) {
|
||||
sequences.finishWrite(buffers)
|
||||
} else {
|
||||
subBuf.finishWrite(buffers.next())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun close() = buffers.forEach(ByteBuffer::close)
|
||||
override fun slice(position: Int, size: Int): MultipleByteBuffer {
|
||||
return ListByteBuffer(ArrayList(buffers.subList(position, position + size)))
|
||||
}
|
||||
override fun close() = bufferIterable.forEach(ByteBuffer::close)
|
||||
override fun slice(position: Int, size: Int): MultipleByteBuffer =
|
||||
throw UnsupportedOperationException()
|
||||
|
||||
override fun slice(position: Int, size: Int, readPosition: Int, writePosition: Int): ByteBuffer =
|
||||
throw UnsupportedOperationException()
|
||||
|
||||
override fun fill(byte: Byte) = buffers.forEach { it.fill(byte) }
|
||||
override fun clear() = buffers.forEach { it.clear() }
|
||||
override fun reset() = buffers.forEach { it.reset() }
|
||||
override fun fill(byte: Byte) = bufferIterable.forEach { it.fill(byte) }
|
||||
override fun clear() = bufferIterable.forEach { it.clear() }
|
||||
override fun reset() = bufferIterable.forEach { it.reset() }
|
||||
|
||||
|
||||
override val resized: Boolean get() = false
|
||||
override val hasArray: Boolean get() = false
|
||||
override val array: ByteArray get() = throw UnsupportedOperationException()
|
||||
override val arrayOffset: Int get() = 0
|
||||
override val capacity: Int get() = buffers.sumOf { it.capacity }
|
||||
override val isReadable: Boolean get() = buffers.any { it.isReadable }
|
||||
override val isWriteable: Boolean get() = buffers.any { it.isWriteable }
|
||||
override val readable: Int get() = buffers.sumOf { it.readable }
|
||||
override val writeable: Int get() = buffers.sumOf { it.writeable }
|
||||
|
||||
override fun readBuffer(): java.nio.ByteBuffer = throw UnsupportedOperationException()
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer) = throw UnsupportedOperationException()
|
||||
override fun writeBuffer(): java.nio.ByteBuffer = throw UnsupportedOperationException()
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer) = throw UnsupportedOperationException()
|
||||
|
||||
override fun resize(newSize: Int): Boolean = false
|
||||
|
||||
override fun get(): Byte
|
||||
|
||||
override fun getChar(byteOrder: ByteOrder): Char = cn.tursom.core.toChar(byteOrder) { get() }
|
||||
override fun getShort(byteOrder: ByteOrder): Short = cn.tursom.core.toShort(byteOrder) { get() }
|
||||
override fun getInt(byteOrder: ByteOrder): Int = cn.tursom.core.toInt(byteOrder) { get() }
|
||||
override fun getLong(byteOrder: ByteOrder): Long = cn.tursom.core.toLong(byteOrder) { get() }
|
||||
override fun getFloat(byteOrder: ByteOrder): Float = cn.tursom.core.toFloat(byteOrder) { get() }
|
||||
override fun getDouble(byteOrder: ByteOrder): Double = cn.tursom.core.toDouble(byteOrder) { get() }
|
||||
override fun getChar(byteOrder: ByteOrder): Char = toChar(byteOrder) { get() }
|
||||
override fun getShort(byteOrder: ByteOrder): Short = toShort(byteOrder) { get() }
|
||||
override fun getInt(byteOrder: ByteOrder): Int = toInt(byteOrder) { get() }
|
||||
override fun getLong(byteOrder: ByteOrder): Long = toLong(byteOrder) { get() }
|
||||
override fun getFloat(byteOrder: ByteOrder): Float = toFloat(byteOrder) { get() }
|
||||
override fun getDouble(byteOrder: ByteOrder): Double = toDouble(byteOrder) { get() }
|
||||
|
||||
override fun getBytes(size: Int): ByteArray {
|
||||
val buffer = ByteArray(size)
|
||||
buffer.indices.forEach {
|
||||
buffer[it] = get()
|
||||
if (size == 0) {
|
||||
return ByteArray(0)
|
||||
}
|
||||
val buffer = ByteArray(size)
|
||||
writeTo(buffer, 0, size)
|
||||
return buffer
|
||||
}
|
||||
|
||||
override fun writeTo(buffer: ByteArray, bufferOffset: Int, size: Int): Int {
|
||||
var write = 0
|
||||
try {
|
||||
repeat(size) {
|
||||
buffer[bufferOffset + it] = get()
|
||||
write++
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
if (size == 0) {
|
||||
return 0
|
||||
}
|
||||
return write
|
||||
var writePosition = bufferOffset
|
||||
readNioBuffers { buffers ->
|
||||
buffers.forEach { buf ->
|
||||
val limit = min(buf.remaining(), size - writePosition)
|
||||
if (limit == 0) {
|
||||
return@forEach
|
||||
}
|
||||
buf.get(buffer, writePosition, limit)
|
||||
writePosition += limit
|
||||
if (writePosition == size) {
|
||||
return@readNioBuffers
|
||||
}
|
||||
}
|
||||
}
|
||||
return writePosition - bufferOffset
|
||||
}
|
||||
|
||||
override fun writeTo(os: OutputStream, buffer: ByteArray?): Int {
|
||||
var write = 0
|
||||
try {
|
||||
while (true) {
|
||||
os.write(get().toInt())
|
||||
write++
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val buffer = buffer ?: Utils.bufferThreadLocal.get()
|
||||
do {
|
||||
val written = writeTo(buffer)
|
||||
write += written
|
||||
os.write(buffer, 0, written)
|
||||
} while (written != 0)
|
||||
return write
|
||||
}
|
||||
|
||||
override fun writeTo(buffer: ByteBuffer): Int {
|
||||
override fun writeTo(buffer: WriteableByteBuffer): Int {
|
||||
var write = 0
|
||||
try {
|
||||
while (true) {
|
||||
buffer.put(get().toInt())
|
||||
write++
|
||||
val buf = Utils.bufferThreadLocal.get()
|
||||
do {
|
||||
val written = writeTo(buf, 0, min(buffer.writeable, min(readable, buf.size)))
|
||||
if (written == 0) {
|
||||
break
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
}
|
||||
write += written
|
||||
buffer.putBytes(buf, 0, written)
|
||||
write++
|
||||
} while (true)
|
||||
return write
|
||||
}
|
||||
|
||||
@ -193,9 +138,18 @@ interface MultipleByteBuffer : Closeable, ByteBuffer, NioBuffers.Sequences {
|
||||
|
||||
override fun put(byteArray: ByteArray, offset: Int, len: Int): Int {
|
||||
var write = 0
|
||||
byteArray.forEachIndex(offset, offset + len) {
|
||||
put(it)
|
||||
write++
|
||||
writeNioBuffers { buffers ->
|
||||
buffers.forEach {
|
||||
if (it.remaining() == 0) {
|
||||
return@forEach
|
||||
}
|
||||
val limit = min(it.remaining(), len - write)
|
||||
it.put(byteArray, offset + write, limit)
|
||||
write += limit
|
||||
if (len == write) {
|
||||
return@writeNioBuffers
|
||||
}
|
||||
}
|
||||
}
|
||||
return write
|
||||
}
|
||||
@ -210,6 +164,6 @@ interface MultipleByteBuffer : Closeable, ByteBuffer, NioBuffers.Sequences {
|
||||
return read
|
||||
}
|
||||
|
||||
override fun split(maxSize: Int): List<ByteBuffer> = throw UnsupportedOperationException()
|
||||
override fun split(maxSize: Int): Array<ByteBuffer> = throw UnsupportedOperationException()
|
||||
override fun readAllSize(): Int = throw UnsupportedOperationException()
|
||||
}
|
@ -2,222 +2,86 @@ package cn.tursom.core.buffer
|
||||
|
||||
|
||||
object NioBuffers {
|
||||
|
||||
interface Arrays {
|
||||
fun readBufferArray(): Array<out java.nio.ByteBuffer>
|
||||
fun finishRead(buffers: Array<out java.nio.ByteBuffer>): Long
|
||||
|
||||
fun writeBufferArray(): Array<out java.nio.ByteBuffer>
|
||||
fun finishWrite(buffers: Array<out java.nio.ByteBuffer>): Long
|
||||
}
|
||||
|
||||
inline fun <T> Arrays.readNioBuffers(action: (bufferList: Array<out java.nio.ByteBuffer>) -> T): T {
|
||||
val buffers = readBufferArray()
|
||||
return try {
|
||||
action(buffers)
|
||||
} finally {
|
||||
finishRead(buffers)
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Arrays.writeNioBuffers(action: (bufferList: Array<out java.nio.ByteBuffer>) -> T): T {
|
||||
val buffers = writeBufferArray()
|
||||
return try {
|
||||
action(buffers)
|
||||
} finally {
|
||||
finishWrite(buffers)
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Array<out ByteBuffer>.readNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
offset: Int,
|
||||
length: Int,
|
||||
action: (bufferList: Array<out java.nio.ByteBuffer>) -> T,
|
||||
): T {
|
||||
val bufferList = getReadNioBufferList()
|
||||
val bufferList = getReadNioBufferList(offset, length)
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishRead(bufferList.iterator())
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Sequence<ByteBuffer>.readNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
): T {
|
||||
val bufferList = getReadNioBufferList()
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishRead(bufferList.iterator())
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Iterable<ByteBuffer>.readNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
): T {
|
||||
val bufferList = getReadNioBufferList()
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishRead(bufferList.iterator())
|
||||
finishRead(bufferList, offset)
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Array<out ByteBuffer>.writeNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
offset: Int,
|
||||
length: Int,
|
||||
action: (bufferList: Array<out java.nio.ByteBuffer>) -> T,
|
||||
): T {
|
||||
val bufferList = getWriteNioBufferList()
|
||||
val bufferList = getWriteNioBufferList(offset, length)
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishWrite(bufferList.iterator())
|
||||
finishWrite(bufferList, offset)
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <T> Sequence<ByteBuffer>.writeNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
): T {
|
||||
val bufferList = getWriteNioBufferList()
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishWrite(bufferList.iterator())
|
||||
}
|
||||
fun Array<out ByteBuffer>.getReadNioBufferList(
|
||||
offset: Int = 0,
|
||||
length: Int = size - offset,
|
||||
): Array<out java.nio.ByteBuffer> = Array(length) {
|
||||
get(offset + it).readBuffer()
|
||||
}
|
||||
|
||||
inline fun <T> Iterable<ByteBuffer>.writeNioBuffers(
|
||||
action: (bufferList: List<java.nio.ByteBuffer>) -> T
|
||||
): T {
|
||||
val bufferList = getWriteNioBufferList()
|
||||
try {
|
||||
return action(bufferList)
|
||||
} finally {
|
||||
finishWrite(bufferList.iterator())
|
||||
fun Array<out ByteBuffer>.finishRead(buffers: Array<out java.nio.ByteBuffer>, offset: Int): Long {
|
||||
var readed = 0L
|
||||
buffers.forEachIndexed { index, byteBuffer ->
|
||||
readed += get(offset + index).finishRead(byteBuffer)
|
||||
}
|
||||
return readed
|
||||
}
|
||||
|
||||
fun Array<out ByteBuffer>.getReadNioBufferList(): List<java.nio.ByteBuffer> = iterator().getReadNioBufferList()
|
||||
fun Sequence<ByteBuffer>.getReadNioBufferList(): List<java.nio.ByteBuffer> = iterator().getReadNioBufferList()
|
||||
fun Iterable<ByteBuffer>.getReadNioBufferList(): List<java.nio.ByteBuffer> = iterator().getReadNioBufferList()
|
||||
fun Iterator<ByteBuffer>.getReadNioBufferList(): List<java.nio.ByteBuffer> {
|
||||
val bufferList = ArrayList<java.nio.ByteBuffer>()
|
||||
forEach {
|
||||
val nioBuffersList = it.getExtension(Sequences)
|
||||
if (nioBuffersList != null) {
|
||||
bufferList.addAll(nioBuffersList.readBufferSequence())
|
||||
return@forEach
|
||||
}
|
||||
|
||||
bufferList.add(it.readBuffer())
|
||||
}
|
||||
|
||||
return bufferList
|
||||
fun Array<out ByteBuffer>.getWriteNioBufferList(
|
||||
offset: Int = 0,
|
||||
length: Int = size - offset,
|
||||
): Array<out java.nio.ByteBuffer> = Array(length) {
|
||||
get(offset + it).writeBuffer()
|
||||
}
|
||||
|
||||
fun Array<out ByteBuffer>.finishRead(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishRead(iterator)
|
||||
fun Sequence<ByteBuffer>.finishRead(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishRead(iterator)
|
||||
fun Iterable<ByteBuffer>.finishRead(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishRead(iterator)
|
||||
fun Iterator<ByteBuffer>.finishRead(iterator: Iterator<java.nio.ByteBuffer>) {
|
||||
forEach {
|
||||
val nioBuffersList = it.getExtension(Sequences)
|
||||
if (nioBuffersList != null) {
|
||||
nioBuffersList.finishRead(iterator)
|
||||
return@forEach
|
||||
}
|
||||
|
||||
it.finishRead(iterator.next())
|
||||
fun Array<out ByteBuffer>.finishWrite(buffers: Array<out java.nio.ByteBuffer>, offset: Int): Long {
|
||||
var written = 0L
|
||||
buffers.forEachIndexed { index, byteBuffer ->
|
||||
written += get(offset + index).finishWrite(byteBuffer)
|
||||
}
|
||||
}
|
||||
|
||||
fun Array<out ByteBuffer>.getWriteNioBufferList(): List<java.nio.ByteBuffer> = iterator().getWriteNioBufferList()
|
||||
fun Sequence<ByteBuffer>.getWriteNioBufferList(): List<java.nio.ByteBuffer> = iterator().getWriteNioBufferList()
|
||||
fun Iterable<ByteBuffer>.getWriteNioBufferList(): List<java.nio.ByteBuffer> = iterator().getWriteNioBufferList()
|
||||
fun Iterator<ByteBuffer>.getWriteNioBufferList(): List<java.nio.ByteBuffer> {
|
||||
val bufferList = ArrayList<java.nio.ByteBuffer>()
|
||||
forEach {
|
||||
val nioBuffersList = it.getExtension(Sequences)
|
||||
if (nioBuffersList != null) {
|
||||
bufferList.addAll(nioBuffersList.writeBufferSequence())
|
||||
return@forEach
|
||||
}
|
||||
|
||||
bufferList.add(it.writeBuffer())
|
||||
}
|
||||
|
||||
return bufferList
|
||||
}
|
||||
|
||||
fun Array<out ByteBuffer>.finishWrite(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishWrite(iterator)
|
||||
fun Sequence<ByteBuffer>.finishWrite(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishWrite(iterator)
|
||||
fun Iterable<ByteBuffer>.finishWrite(iterator: Iterator<java.nio.ByteBuffer>) = iterator().finishWrite(iterator)
|
||||
fun Iterator<ByteBuffer>.finishWrite(iterator: Iterator<java.nio.ByteBuffer>) {
|
||||
forEach {
|
||||
val nioBuffersList = it.getExtension(Sequences)
|
||||
if (nioBuffersList != null) {
|
||||
nioBuffersList.finishWrite(iterator)
|
||||
return@forEach
|
||||
}
|
||||
|
||||
it.finishRead(iterator.next())
|
||||
}
|
||||
}
|
||||
|
||||
interface Sequences {
|
||||
companion object : ByteBufferExtensionKey<Sequences> {
|
||||
override val extensionClass: Class<Sequences> = Sequences::class.java
|
||||
|
||||
inline fun <T> Sequences.readSequences(action: (nioBuffers: Sequence<java.nio.ByteBuffer>) -> T): T {
|
||||
val sequence = readBufferSequence()
|
||||
val ret = action(sequence)
|
||||
finishRead(sequence.iterator())
|
||||
return ret
|
||||
}
|
||||
|
||||
inline fun <T> Sequences.writeSequences(action: (nioBuffers: Sequence<java.nio.ByteBuffer>) -> T): T {
|
||||
val sequence = writeBufferSequence()
|
||||
val ret = action(sequence)
|
||||
finishWrite(sequence.iterator())
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
fun readBufferSequence(): Sequence<java.nio.ByteBuffer>
|
||||
fun finishRead(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
|
||||
fun writeBufferSequence(): Sequence<java.nio.ByteBuffer>
|
||||
fun finishWrite(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
}
|
||||
|
||||
interface Lists : Sequences {
|
||||
companion object : ByteBufferExtensionKey<Lists> {
|
||||
override val extensionClass: Class<Lists> = Lists::class.java
|
||||
|
||||
inline fun <T> Lists.readLists(action: (nioBuffers: List<java.nio.ByteBuffer>) -> T): T {
|
||||
val list = readBufferList()
|
||||
val ret = action(list)
|
||||
finishRead(list.iterator())
|
||||
return ret
|
||||
}
|
||||
|
||||
inline fun <T> Lists.writeLists(action: (nioBuffers: List<java.nio.ByteBuffer>) -> T): T {
|
||||
val list = writeBufferList()
|
||||
val ret = action(list)
|
||||
finishWrite(list.iterator())
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
override fun readBufferSequence(): Sequence<java.nio.ByteBuffer> = readBufferList().asSequence()
|
||||
override fun writeBufferSequence(): Sequence<java.nio.ByteBuffer> = writeBufferList().asSequence()
|
||||
|
||||
fun readBufferList(): List<java.nio.ByteBuffer>
|
||||
override fun finishRead(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
|
||||
fun writeBufferList(): List<java.nio.ByteBuffer>
|
||||
override fun finishWrite(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
}
|
||||
|
||||
interface Arrays : Lists {
|
||||
companion object : ByteBufferExtensionKey<Arrays> {
|
||||
override val extensionClass: Class<Arrays> = Arrays::class.java
|
||||
|
||||
inline fun <T> Arrays.readArrays(action: (nioBuffers: Array<out java.nio.ByteBuffer>) -> T): T {
|
||||
val arrayOfByteBuffers = readBufferArray()
|
||||
val ret = action(arrayOfByteBuffers)
|
||||
finishRead(arrayOfByteBuffers.iterator())
|
||||
return ret
|
||||
}
|
||||
|
||||
inline fun <T> Arrays.writeArrays(action: (nioBuffers: Array<out java.nio.ByteBuffer>) -> T): T {
|
||||
val arrayOfByteBuffers = writeBufferArray()
|
||||
val ret = action(arrayOfByteBuffers)
|
||||
finishWrite(arrayOfByteBuffers.iterator())
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
override fun readBufferSequence(): Sequence<java.nio.ByteBuffer> = readBufferArray().asSequence()
|
||||
override fun writeBufferSequence(): Sequence<java.nio.ByteBuffer> = writeBufferArray().asSequence()
|
||||
|
||||
override fun readBufferList(): List<java.nio.ByteBuffer> = readBufferArray().asList()
|
||||
override fun writeBufferList(): List<java.nio.ByteBuffer> = writeBufferArray().asList()
|
||||
|
||||
fun readBufferArray(): Array<out java.nio.ByteBuffer>
|
||||
override fun finishRead(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
|
||||
fun writeBufferArray(): Array<out java.nio.ByteBuffer>
|
||||
override fun finishWrite(buffers: Iterator<java.nio.ByteBuffer>)
|
||||
return written
|
||||
}
|
||||
}
|
@ -0,0 +1,147 @@
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
import cn.tursom.core.Utils
|
||||
import cn.tursom.core.reverseBytes
|
||||
import java.io.OutputStream
|
||||
import java.nio.ByteOrder
|
||||
import kotlin.math.min
|
||||
|
||||
interface ReadableByteBuffer : BasicByteBuffer {
|
||||
fun readBuffer(): java.nio.ByteBuffer
|
||||
fun finishRead(buffer: java.nio.ByteBuffer): Int
|
||||
|
||||
/**
|
||||
* 使用读 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> readBuffer(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = readBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishRead(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
fun skip(n: Int): Int {
|
||||
readPosition += n
|
||||
return n
|
||||
}
|
||||
|
||||
fun get(): Byte = read { it.get() }
|
||||
|
||||
fun getChar(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Char = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.char
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.char.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getShort(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Short = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.short
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.short.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getInt(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Int = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.int
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.int.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getLong(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Long = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.long
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.long.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getFloat(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Float = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.float
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.float.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getDouble(byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Double = read { buf ->
|
||||
when (byteOrder) {
|
||||
ByteOrder.BIG_ENDIAN -> buf.double
|
||||
ByteOrder.LITTLE_ENDIAN -> buf.double.reverseBytes()
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getBytes(size: Int = readable): ByteArray = read {
|
||||
if (it.limit() - it.position() < size) {
|
||||
throw IndexOutOfBoundsException()
|
||||
}
|
||||
val bytes = ByteArray(size)
|
||||
it.get(bytes)
|
||||
bytes
|
||||
}
|
||||
|
||||
fun getString(size: Int = readable): String = String(getBytes(size))
|
||||
|
||||
fun toString(size: Int): String {
|
||||
val bytes = getBytes(size)
|
||||
// 将测试的字节返还回来
|
||||
readPosition -= bytes.size
|
||||
return String(bytes)
|
||||
}
|
||||
|
||||
fun writeTo(buffer: ByteArray, bufferOffset: Int = 0, size: Int = min(readable, buffer.size)): Int {
|
||||
val readSize = min(readable, size)
|
||||
if (hasArray) {
|
||||
array.copyInto(buffer, bufferOffset, readOffset, readOffset + readSize)
|
||||
readPosition += readOffset
|
||||
reset()
|
||||
} else {
|
||||
read {
|
||||
it.put(buffer, bufferOffset, readSize)
|
||||
}
|
||||
}
|
||||
return readSize
|
||||
}
|
||||
|
||||
fun writeTo(os: OutputStream, buffer: ByteArray? = null): Int {
|
||||
val size = readable
|
||||
if (hasArray) {
|
||||
os.write(array, readOffset, size)
|
||||
readPosition += size
|
||||
reset()
|
||||
} else {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val buffer = buffer ?: Utils.bufferThreadLocal.get()
|
||||
read {
|
||||
while (it.remaining() > 0) {
|
||||
val min = min(it.remaining(), buffer.size)
|
||||
it.get(buffer, 0, min)
|
||||
os.write(buffer, 0, min)
|
||||
}
|
||||
}
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
fun writeTo(buffer: WriteableByteBuffer): Int {
|
||||
val size = min(readable, buffer.writeable)
|
||||
if (hasArray) {
|
||||
buffer.put(array, readOffset, size)
|
||||
readPosition += size
|
||||
reset()
|
||||
} else {
|
||||
read { read ->
|
||||
buffer.write { write -> write.put(read) }
|
||||
}
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
fun toByteArray() = getBytes()
|
||||
}
|
@ -0,0 +1,223 @@
|
||||
package cn.tursom.core.buffer
|
||||
|
||||
import cn.tursom.core.Utils
|
||||
import cn.tursom.core.forEachIndex
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.nio.ByteOrder
|
||||
|
||||
interface WriteableByteBuffer : BasicByteBuffer {
|
||||
fun writeBuffer(): java.nio.ByteBuffer
|
||||
fun finishWrite(buffer: java.nio.ByteBuffer): Int
|
||||
|
||||
/**
|
||||
* 使用写 buffer,ByteBuffer 实现类有义务维护指针正常推进
|
||||
*/
|
||||
fun <T> writeBuffer(block: (java.nio.ByteBuffer) -> T): T {
|
||||
val buffer = writeBuffer()
|
||||
return try {
|
||||
block(buffer)
|
||||
} finally {
|
||||
finishWrite(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
fun put(byte: Byte): Unit = write { it.put(byte) }
|
||||
|
||||
fun put(char: Char, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putChar(char)
|
||||
}
|
||||
|
||||
fun put(short: Short, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putShort(short)
|
||||
}
|
||||
|
||||
fun put(int: Int, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putInt(int)
|
||||
}
|
||||
|
||||
fun put(long: Long, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putLong(long)
|
||||
}
|
||||
|
||||
fun put(float: Float, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putFloat(float)
|
||||
}
|
||||
|
||||
fun put(double: Double, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = write { buf ->
|
||||
buf.order(byteOrder)
|
||||
buf.putDouble(double)
|
||||
}
|
||||
|
||||
fun put(str: String): Int = put(str.toByteArray())
|
||||
fun put(buffer: ReadableByteBuffer): Int = buffer.writeTo(this)
|
||||
fun put(byteArray: ByteArray, offset: Int = 0, len: Int = byteArray.size - offset): Int {
|
||||
return if (hasArray) {
|
||||
byteArray.copyInto(array, writeOffset, offset, offset + len)
|
||||
writePosition += len
|
||||
len
|
||||
} else {
|
||||
write {
|
||||
val position = it.position()
|
||||
it.put(byteArray, offset, len)
|
||||
it.position() - position
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: CharArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: ShortArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: IntArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: LongArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: FloatArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(
|
||||
array: DoubleArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) {
|
||||
array.forEachIndex(index, index + size - 1) { put(it, byteOrder) }
|
||||
}
|
||||
|
||||
fun put(inputStream: InputStream): Int {
|
||||
return if (hasArray) {
|
||||
val read = inputStream.read(array, writeOffset, writeable)
|
||||
if (read < 0) throw IOException("stream closed")
|
||||
writePosition += read
|
||||
read
|
||||
} else {
|
||||
val buffer = Utils.bufferThreadLocal.get()
|
||||
val read = inputStream.read(buffer)
|
||||
put(buffer, 0, read)
|
||||
}
|
||||
}
|
||||
|
||||
fun put(inputStream: InputStream, size: Int): Int {
|
||||
assert(size <= writeable)
|
||||
return if (hasArray) {
|
||||
val read = inputStream.read(array, writeOffset, size)
|
||||
if (read > 0) {
|
||||
writePosition += read
|
||||
}
|
||||
read
|
||||
} else {
|
||||
val buffer = ByteArray(size)
|
||||
val read = inputStream.read(buffer)
|
||||
if (read > 0) {
|
||||
put(buffer, 0, read)
|
||||
}
|
||||
read
|
||||
}
|
||||
}
|
||||
|
||||
fun putByte(byte: Byte): Unit = put(byte)
|
||||
fun putChar(char: Char, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(char, byteOrder)
|
||||
fun putShort(short: Short, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(short, byteOrder)
|
||||
fun putInt(int: Int, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(int, byteOrder)
|
||||
fun putLong(long: Long, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(long, byteOrder)
|
||||
fun putFloat(float: Float, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(float, byteOrder)
|
||||
fun putDouble(double: Double, byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN): Unit = put(double, byteOrder)
|
||||
|
||||
fun putString(str: String): Int = put(str)
|
||||
fun putBuffer(buffer: ReadableByteBuffer): Int = put(buffer)
|
||||
fun putBytes(byteArray: ByteArray, startIndex: Int = 0, endIndex: Int = byteArray.size - startIndex) =
|
||||
put(byteArray, startIndex, endIndex)
|
||||
|
||||
fun putChars(
|
||||
array: CharArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putShorts(
|
||||
array: ShortArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putInts(
|
||||
array: IntArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putLongs(
|
||||
array: LongArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putFloats(
|
||||
array: FloatArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun putDoubles(
|
||||
array: DoubleArray,
|
||||
index: Int = 0,
|
||||
size: Int = array.size - index,
|
||||
byteOrder: ByteOrder = ByteOrder.BIG_ENDIAN,
|
||||
) = put(array, index, size, byteOrder)
|
||||
|
||||
fun fill(byte: Byte) {
|
||||
readPosition = 0
|
||||
writePosition = 0
|
||||
write {
|
||||
while (it.remaining() != 0) {
|
||||
it.put(byte)
|
||||
}
|
||||
}
|
||||
writePosition = 0
|
||||
}
|
||||
}
|
@ -1,11 +1,165 @@
|
||||
package cn.tursom.core.buffer.impl
|
||||
|
||||
import cn.tursom.core.buffer.ByteBuffer
|
||||
import cn.tursom.core.buffer.MultipleByteBuffer
|
||||
import cn.tursom.core.buffer.NioBuffers.finishRead
|
||||
import cn.tursom.core.buffer.NioBuffers.finishWrite
|
||||
import cn.tursom.core.buffer.NioBuffers.getReadNioBufferList
|
||||
import cn.tursom.core.buffer.NioBuffers.getWriteNioBufferList
|
||||
import cn.tursom.core.uncheckedCast
|
||||
|
||||
class ArrayByteBuffer(
|
||||
vararg buffers: ByteBuffer,
|
||||
) : ListByteBuffer(ArrayList(buffers.asList())) {
|
||||
) : MultipleByteBuffer {
|
||||
constructor(
|
||||
buffer: Array<out ByteBuffer>,
|
||||
offset: Int = 0,
|
||||
length: Int = buffer.size - offset,
|
||||
) : this(buffers = Array(length) { buffer[offset + it] })
|
||||
|
||||
override val bufferIterable: List<ByteBuffer> get() = buffers.asList()
|
||||
override val bufferSize = buffers.sumOf {
|
||||
if (it is MultipleByteBuffer) {
|
||||
it.bufferSize
|
||||
} else {
|
||||
1
|
||||
}
|
||||
}
|
||||
override val buffers: Array<out ByteBuffer> = if (bufferSize == buffers.size) {
|
||||
buffers
|
||||
} else {
|
||||
val array = arrayOfNulls<ByteBuffer>(bufferSize).uncheckedCast<Array<ByteBuffer>>()
|
||||
var index = 0
|
||||
buffers.forEach { buffer ->
|
||||
if (buffer is MultipleByteBuffer) {
|
||||
buffer.bufferIterable.forEach {
|
||||
array[index++] = it
|
||||
}
|
||||
} else {
|
||||
array[index++] = buffer
|
||||
}
|
||||
}
|
||||
array
|
||||
}
|
||||
|
||||
override var capacity: Int = 0
|
||||
private set
|
||||
override var writePosition: Int = this.buffers.sumOf { it.writePosition }
|
||||
override var readPosition: Int = this.buffers.sumOf { it.readPosition }
|
||||
|
||||
private var readBufIndex = 0
|
||||
private var readBuf = this.buffers[readBufIndex++]
|
||||
get() {
|
||||
while (field.readable == 0 && readBufIndex < buffers.size) {
|
||||
field = buffers[readBufIndex++]
|
||||
}
|
||||
return field
|
||||
}
|
||||
private var writeBufIndex = 0
|
||||
private var writeBuf = this.buffers[writeBufIndex++]
|
||||
get() {
|
||||
while (field.writeable == 0 && writeBufIndex < buffers.size) {
|
||||
field = buffers[writeBufIndex++]
|
||||
}
|
||||
return field
|
||||
}
|
||||
|
||||
init {
|
||||
initCapacity()
|
||||
}
|
||||
|
||||
private fun initCapacity() {
|
||||
var end = false
|
||||
for (i in buffers.size - 1 downTo 0) {
|
||||
if (end) {
|
||||
capacity += buffers[i].writePosition
|
||||
} else {
|
||||
capacity += buffers[i].capacity
|
||||
if (buffers[i].readable != 0) {
|
||||
writeBufIndex = i
|
||||
writeBuf = this.buffers[writeBufIndex++]
|
||||
end = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ArrayByteBuffer not support append buffer for this while
|
||||
*/
|
||||
override fun append(buffer: ByteBuffer) = throw UnsupportedOperationException()
|
||||
|
||||
override fun get(): Byte {
|
||||
val byte = readBuf.get()
|
||||
readPosition++
|
||||
return byte
|
||||
}
|
||||
|
||||
override fun put(byte: Byte) {
|
||||
writeBuf.put(byte)
|
||||
writePosition++
|
||||
}
|
||||
|
||||
override fun clear() {
|
||||
buffers.forEach { buffer ->
|
||||
buffer.clear()
|
||||
}
|
||||
capacity = buffers.sumOf { it.capacity }
|
||||
readPosition = 0
|
||||
writePosition = 0
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
// TODO
|
||||
var ri = 1
|
||||
var wi = 0
|
||||
var writeBuf = buffers[wi++]
|
||||
writeBuf.reset()
|
||||
W@ while (ri < buffers.size) {
|
||||
val readBuf = buffers[ri++]
|
||||
do {
|
||||
if (readBuf == writeBuf) {
|
||||
readBuf.reset()
|
||||
continue@W
|
||||
} else {
|
||||
readBuf.writeTo(writeBuf)
|
||||
if (writeBuf.writeable == 0) {
|
||||
writeBuf = buffers[wi++]
|
||||
}
|
||||
}
|
||||
} while (readBuf.readable != 0)
|
||||
readBuf.clear()
|
||||
}
|
||||
readBufIndex = 1
|
||||
writeBufIndex = wi
|
||||
this.writeBuf = writeBuf
|
||||
this.readBuf = buffers[0]
|
||||
while (wi < buffers.size) {
|
||||
capacity += writeBuf.writeable
|
||||
writeBuf = buffers[wi++]
|
||||
}
|
||||
capacity += writeBuf.writeable
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "ArrayByteBuffer[$readPosition:$writePosition:$capacity]"
|
||||
}
|
||||
|
||||
override fun readBufferArray(): Array<out java.nio.ByteBuffer> {
|
||||
readBuf
|
||||
writeBuf
|
||||
return buffers.getReadNioBufferList(readBufIndex - 1, writeBufIndex - readBufIndex + 1)
|
||||
}
|
||||
|
||||
override fun finishRead(buffers: Array<out java.nio.ByteBuffer>) = this.buffers.finishRead(buffers, readBufIndex - 1)
|
||||
.also { readPosition += it.toInt() }
|
||||
|
||||
override fun writeBufferArray(): Array<out java.nio.ByteBuffer> {
|
||||
writeBuf
|
||||
return buffers.getWriteNioBufferList(writeBufIndex - 1)
|
||||
}
|
||||
|
||||
override fun finishWrite(buffers: Array<out java.nio.ByteBuffer>) =
|
||||
this.buffers.finishWrite(buffers, writeBufIndex - 1)
|
||||
.also { writePosition += it.toInt() }
|
||||
}
|
@ -5,7 +5,7 @@ import cn.tursom.core.buffer.ByteBuffer
|
||||
class DirectByteBuffer(
|
||||
private var buffer: java.nio.ByteBuffer,
|
||||
override var readPosition: Int = 0,
|
||||
override var writePosition: Int = 0
|
||||
override var writePosition: Int = 0,
|
||||
) : ByteBuffer {
|
||||
constructor(size: Int) : this(java.nio.ByteBuffer.allocateDirect(size))
|
||||
|
||||
@ -30,10 +30,12 @@ class DirectByteBuffer(
|
||||
return buffer
|
||||
}
|
||||
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer) {
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer): Int {
|
||||
val rp = readPosition
|
||||
if (buffer === this.buffer) {
|
||||
readPosition = buffer.position()
|
||||
}
|
||||
return readPosition - rp
|
||||
}
|
||||
|
||||
override fun writeBuffer(): java.nio.ByteBuffer {
|
||||
@ -44,10 +46,12 @@ class DirectByteBuffer(
|
||||
return buffer
|
||||
}
|
||||
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer) {
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer): Int {
|
||||
val wp = writePosition
|
||||
if (buffer === this.buffer) {
|
||||
writePosition = buffer.position()
|
||||
}
|
||||
return writePosition - wp
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
|
@ -44,10 +44,12 @@ class HeapByteBuffer(
|
||||
return buffer
|
||||
}
|
||||
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer) {
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer): Int {
|
||||
val rp = readPosition
|
||||
if (buffer === this.buffer) {
|
||||
readPosition = buffer.position()
|
||||
}
|
||||
return readPosition - rp
|
||||
}
|
||||
|
||||
override fun writeBuffer(): java.nio.ByteBuffer {
|
||||
@ -58,10 +60,12 @@ class HeapByteBuffer(
|
||||
return buffer
|
||||
}
|
||||
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer) {
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer): Int {
|
||||
val wp = writePosition
|
||||
if (buffer === this.buffer) {
|
||||
writePosition = buffer.position()
|
||||
}
|
||||
return writePosition - wp
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
|
@ -6,28 +6,27 @@ import java.nio.ByteOrder
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
open class ListByteBuffer(
|
||||
final override val buffers: MutableList<ByteBuffer> = ArrayList(),
|
||||
final override val bufferIterable: MutableList<ByteBuffer> = ArrayList(),
|
||||
) : MultipleByteBuffer {
|
||||
var readOperator = buffers.firstOrNull()
|
||||
var writeOperator = buffers.firstOrNull()
|
||||
var readOperator = bufferIterable.firstOrNull()
|
||||
var writeOperator = bufferIterable.firstOrNull()
|
||||
var readArrayPosition: Int = if (readOperator == null) -1 else 0
|
||||
var writeArrayPosition: Int = if (writeOperator == null) -1 else 0
|
||||
|
||||
private var buffersArrayCache: Array<out ByteBuffer>? = null
|
||||
override val buffersArray: Array<out ByteBuffer>
|
||||
override val buffers: Array<out ByteBuffer>
|
||||
get() {
|
||||
if (buffersArrayCache == null) {
|
||||
buffersArrayCache = buffers.toTypedArray()
|
||||
buffersArrayCache = bufferIterable.toTypedArray()
|
||||
}
|
||||
return buffersArrayCache!!
|
||||
}
|
||||
|
||||
override val hasArray: Boolean get() = false
|
||||
override val array: ByteArray get() = throw UnsupportedOperationException()
|
||||
override val capacity: Int get() = buffers.sumOf { it.capacity }
|
||||
final override var capacity: Int = bufferIterable.sumOf { it.capacity }
|
||||
private set
|
||||
|
||||
override var writePosition: Int = buffers.sumOf { it.writePosition }
|
||||
override var readPosition: Int = buffers.sumOf { it.readPosition }
|
||||
override var writePosition: Int = bufferIterable.sumOf { it.writePosition }
|
||||
override var readPosition: Int = bufferIterable.sumOf { it.readPosition }
|
||||
|
||||
override val resized: Boolean get() = false
|
||||
|
||||
@ -42,6 +41,8 @@ open class ListByteBuffer(
|
||||
return writeOperator?.isWriteable ?: false
|
||||
}
|
||||
|
||||
override val bufferSize: Int get() = bufferIterable.size
|
||||
|
||||
override fun clear() {
|
||||
super.clear()
|
||||
readPosition = 0
|
||||
@ -63,10 +64,10 @@ open class ListByteBuffer(
|
||||
n == 0 -> 0
|
||||
n > 0 -> {
|
||||
var skip = 0
|
||||
while (skip == n) {
|
||||
while (skip != n) {
|
||||
skip += readOperator?.skip(n - skip) ?: 0
|
||||
if (readArrayPosition < buffers.size) {
|
||||
readOperator = buffers[readArrayPosition++]
|
||||
if (readArrayPosition < bufferIterable.size) {
|
||||
readOperator = bufferIterable[readArrayPosition++]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
@ -75,10 +76,10 @@ open class ListByteBuffer(
|
||||
}
|
||||
else -> {
|
||||
var fallback = 0
|
||||
while (fallback == n) {
|
||||
while (fallback != n) {
|
||||
fallback += readOperator?.skip(n - fallback) ?: 0
|
||||
if (readArrayPosition > 0) {
|
||||
readOperator = buffers[--readArrayPosition]
|
||||
readOperator = bufferIterable[--readArrayPosition]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
@ -90,32 +91,65 @@ open class ListByteBuffer(
|
||||
|
||||
override fun readBuffer(): java.nio.ByteBuffer = throw UnsupportedOperationException()
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer) = throw UnsupportedOperationException()
|
||||
|
||||
override fun writeBuffer(): java.nio.ByteBuffer = throw UnsupportedOperationException()
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer) = throw UnsupportedOperationException()
|
||||
|
||||
override fun append(buffer: ByteBuffer) {
|
||||
val bufReadPosition = buffer.readPosition
|
||||
val bufWritePosition = buffer.writePosition
|
||||
buffers.add(buffer)
|
||||
buffersArrayCache = null
|
||||
readPosition += bufReadPosition
|
||||
writePosition += bufWritePosition
|
||||
override fun readBufferArray(): Array<out java.nio.ByteBuffer> {
|
||||
val iterator = bufferIterable.iterator()
|
||||
return Array(array.size) {
|
||||
iterator.next().readBuffer()
|
||||
}
|
||||
}
|
||||
|
||||
override fun slice(position: Int, size: Int, readPosition: Int, writePosition: Int): ByteBuffer =
|
||||
throw UnsupportedOperationException()
|
||||
override fun finishRead(buffers: Array<out java.nio.ByteBuffer>): Long {
|
||||
val iterator = this.bufferIterable.iterator()
|
||||
var readed = 0L
|
||||
buffers.forEach { buffer ->
|
||||
readed += iterator.next().finishRead(buffer)
|
||||
}
|
||||
return readed
|
||||
}
|
||||
|
||||
override fun writeBufferArray(): Array<out java.nio.ByteBuffer> {
|
||||
val iterator = bufferIterable.iterator()
|
||||
return Array(array.size) {
|
||||
iterator.next().writeBuffer()
|
||||
}
|
||||
}
|
||||
|
||||
override fun finishWrite(buffers: Array<out java.nio.ByteBuffer>): Long {
|
||||
val iterator = bufferIterable.iterator()
|
||||
var written = 0L
|
||||
buffers.forEach { buffer ->
|
||||
written += iterator.next().finishWrite(buffer)
|
||||
}
|
||||
return written
|
||||
}
|
||||
|
||||
override fun append(buffer: ByteBuffer) {
|
||||
if (buffer is MultipleByteBuffer) {
|
||||
bufferIterable.addAll(buffer.bufferIterable)
|
||||
} else {
|
||||
bufferIterable.add(buffer)
|
||||
}
|
||||
buffersArrayCache = null
|
||||
capacity += buffer.capacity
|
||||
readPosition += buffer.readPosition
|
||||
writePosition += buffer.writePosition
|
||||
}
|
||||
|
||||
override fun resize(newSize: Int): Boolean = throw UnsupportedOperationException()
|
||||
|
||||
private fun updateRead() {
|
||||
while (readArrayPosition < buffers.size && readOperator?.isReadable != true) {
|
||||
readOperator = buffers[readArrayPosition++]
|
||||
while (readArrayPosition < bufferIterable.size && readOperator?.isReadable != true) {
|
||||
readOperator = bufferIterable[readArrayPosition++]
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateWrite() {
|
||||
while (writeArrayPosition < buffers.size && writeOperator?.isWriteable != true) {
|
||||
writeOperator = buffers[writeArrayPosition++]
|
||||
while (writeArrayPosition < bufferIterable.size && writeOperator?.isWriteable != true) {
|
||||
writeOperator = bufferIterable[writeArrayPosition++]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@ import cn.tursom.core.reference.FreeReference
|
||||
import cn.tursom.core.uncheckedCast
|
||||
import cn.tursom.log.impl.Slf4jImpl
|
||||
import io.netty.buffer.ByteBuf
|
||||
import io.netty.buffer.Unpooled
|
||||
import java.io.OutputStream
|
||||
import java.nio.ByteOrder
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
@ -17,7 +18,12 @@ class NettyByteBuffer(
|
||||
val byteBuf: ByteBuf,
|
||||
autoClose: Boolean = false,
|
||||
) : ByteBuffer, AsyncFile.Reader, AsyncFile.Writer, NioBuffers.Arrays {
|
||||
companion object : Slf4jImpl()
|
||||
companion object : Slf4jImpl() {
|
||||
fun toByteBuf(buffer: ByteBuffer) = when (buffer) {
|
||||
is NettyByteBuffer -> buffer.byteBuf
|
||||
else -> Unpooled.wrappedBuffer(buffer.getBytes())
|
||||
}
|
||||
}
|
||||
|
||||
constructor(
|
||||
byteBuf: ByteBuf,
|
||||
@ -116,16 +122,16 @@ class NettyByteBuffer(
|
||||
return byteBuf.internalNioBuffer(readPosition, readable).slice()
|
||||
}
|
||||
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer) {
|
||||
byteBuf.readerIndex(buffer.position())
|
||||
override fun finishRead(buffer: java.nio.ByteBuffer): Int {
|
||||
return -(byteBuf.readerIndex() - byteBuf.readerIndex(buffer.position()).readerIndex())
|
||||
}
|
||||
|
||||
override fun writeBuffer(): java.nio.ByteBuffer {
|
||||
return byteBuf.internalNioBuffer(writePosition, writeable).slice()
|
||||
}
|
||||
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer) {
|
||||
byteBuf.writerIndex(buffer.position())
|
||||
override fun finishWrite(buffer: java.nio.ByteBuffer): Int {
|
||||
return -(byteBuf.writerIndex() - byteBuf.writerIndex(buffer.position()).writerIndex())
|
||||
}
|
||||
|
||||
override val readOffset: Int get() = byteBuf.arrayOffset() + byteBuf.readerIndex()
|
||||
@ -284,13 +290,16 @@ class NettyByteBuffer(
|
||||
return nioBuffers
|
||||
}
|
||||
|
||||
override fun finishRead(buffers: Iterator<java.nio.ByteBuffer>) {
|
||||
override fun finishRead(buffers: Array<out java.nio.ByteBuffer>): Long {
|
||||
val iterator = buffers.iterator()
|
||||
var readPositionResult = 0
|
||||
repeat(nioReadBuffersNum) {
|
||||
readPositionResult += buffers.next().position()
|
||||
readPositionResult += iterator.next().position()
|
||||
}
|
||||
nioReadBuffersNum = 0
|
||||
byteBuf.readerIndex(byteBuf.readerIndex() + readPositionResult - nioReadPosition)
|
||||
val readed = readPositionResult - nioReadPosition
|
||||
byteBuf.readerIndex(byteBuf.readerIndex() + readed)
|
||||
return readed.toLong()
|
||||
}
|
||||
|
||||
override fun writeBufferArray(): Array<out java.nio.ByteBuffer> {
|
||||
@ -300,13 +309,16 @@ class NettyByteBuffer(
|
||||
return nioBuffers
|
||||
}
|
||||
|
||||
override fun finishWrite(buffers: Iterator<java.nio.ByteBuffer>) {
|
||||
override fun finishWrite(buffers: Array<out java.nio.ByteBuffer>): Long {
|
||||
val iterator = buffers.iterator()
|
||||
var writePositionResult = 0
|
||||
repeat(nioWriteBuffersNum) {
|
||||
writePositionResult += buffers.next().position()
|
||||
writePositionResult += iterator.next().position()
|
||||
}
|
||||
nioWriteBuffersNum = 0
|
||||
byteBuf.writerIndex(byteBuf.writerIndex() + writePositionResult - nioWritePosition)
|
||||
val written = writePositionResult - nioWritePosition
|
||||
byteBuf.writerIndex(byteBuf.writerIndex() + written)
|
||||
return written.toLong()
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
|
@ -12,7 +12,7 @@ interface InputStream : Closeable {
|
||||
fun read(
|
||||
buffer: ByteArray,
|
||||
offset: Int = 0,
|
||||
len: Int = buffer.size - offset
|
||||
len: Int = buffer.size - offset,
|
||||
): Int {
|
||||
val byteBuffer = HeapByteBuffer(buffer, offset, len)
|
||||
byteBuffer.clear()
|
||||
|
@ -12,12 +12,12 @@ object Stream {
|
||||
fun open(outputStream: java.io.OutputStream) = JavaOutputStream(outputStream)
|
||||
fun open(
|
||||
inputStream: java.io.InputStream,
|
||||
outputStream: java.io.OutputStream
|
||||
outputStream: java.io.OutputStream,
|
||||
) = PairIOStream(JavaInputStream(inputStream), JavaOutputStream(outputStream))
|
||||
|
||||
fun open(
|
||||
outputStream: java.io.OutputStream,
|
||||
inputStream: java.io.InputStream
|
||||
inputStream: java.io.InputStream,
|
||||
) = PairIOStream(JavaInputStream(inputStream), JavaOutputStream(outputStream))
|
||||
|
||||
fun open(buffer: ByteBuffer) = ByteBufferIOStream(buffer)
|
||||
|
@ -6,7 +6,7 @@ import cn.tursom.core.stream.IOStream
|
||||
import cn.tursom.core.stream.SuspendInputStream
|
||||
|
||||
class BytesIOStream private constructor(
|
||||
private val buBufferIOStream: ByteBufferIOStream
|
||||
private val buBufferIOStream: ByteBufferIOStream,
|
||||
) : IOStream by buBufferIOStream, SuspendInputStream {
|
||||
constructor(bytes: ByteArray) : this(ByteBufferIOStream(HeapByteBuffer(bytes).apply { clear() }))
|
||||
|
||||
|
@ -6,5 +6,5 @@ import cn.tursom.core.stream.InputStream
|
||||
class BytesInputStream(
|
||||
val bytes: ByteArray,
|
||||
offset: Int = 0,
|
||||
len: Int = bytes.size - offset
|
||||
len: Int = bytes.size - offset,
|
||||
) : InputStream by ByteBufferInputStream(HeapByteBuffer(bytes, offset, len))
|
@ -6,5 +6,5 @@ import cn.tursom.core.stream.OutputStream
|
||||
class BytesOutputStream(
|
||||
val bytes: ByteArray,
|
||||
offset: Int = 0,
|
||||
len: Int = bytes.size - offset
|
||||
len: Int = bytes.size - offset,
|
||||
) : OutputStream by ByteBufferOutputStream(HeapByteBuffer(bytes, offset, len).apply { clear() })
|
@ -3,7 +3,7 @@ package cn.tursom.core.stream.impl
|
||||
import java.io.InputStream
|
||||
|
||||
class JavaInputStreamProxy(
|
||||
val inputStream: cn.tursom.core.stream.InputStream
|
||||
val inputStream: cn.tursom.core.stream.InputStream,
|
||||
) : InputStream() {
|
||||
override fun read(): Int = inputStream.read()
|
||||
override fun read(b: ByteArray, off: Int, len: Int): Int = inputStream.read(b, off, len)
|
||||
|
@ -4,7 +4,7 @@ import cn.tursom.core.buffer.ByteBuffer
|
||||
import cn.tursom.core.stream.OutputStream
|
||||
|
||||
class JavaOutputStream(
|
||||
@Suppress("MemberVisibilityCanBePrivate") val outputStream: java.io.OutputStream
|
||||
@Suppress("MemberVisibilityCanBePrivate") val outputStream: java.io.OutputStream,
|
||||
) : OutputStream {
|
||||
override fun write(byte: Byte) {
|
||||
outputStream.write(byte.toInt())
|
||||
|
@ -8,11 +8,11 @@ class PairIOStream(
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
val inputStream: JavaInputStream,
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
val outputStream: JavaOutputStream
|
||||
val outputStream: JavaOutputStream,
|
||||
) : IOStream, InputStream by inputStream, OutputStream by outputStream {
|
||||
constructor(
|
||||
outputStream: JavaOutputStream,
|
||||
inputStream: JavaInputStream
|
||||
inputStream: JavaInputStream,
|
||||
) : this(inputStream, outputStream)
|
||||
|
||||
override fun close() {
|
||||
|
@ -0,0 +1,43 @@
|
||||
package cn.tursom.core.buffer.impl
|
||||
|
||||
import cn.tursom.core.ByteBufferUtil
|
||||
import org.junit.Test
|
||||
|
||||
class ArrayByteBufferTest {
|
||||
@Test
|
||||
fun testGetString() {
|
||||
val buffer = ArrayByteBuffer(
|
||||
ByteBufferUtil.wrap("hello"),
|
||||
ByteBufferUtil.wrap(", "),
|
||||
ByteBufferUtil.wrap("world"),
|
||||
ByteBufferUtil.wrap("!"),
|
||||
HeapByteBuffer(32),
|
||||
ByteBufferUtil.wrap("!"),
|
||||
HeapByteBuffer(32),
|
||||
)
|
||||
buffer.put(" I'm tursom, this lib's author")
|
||||
buffer.put('.'.code.toByte())
|
||||
buffer.writePosition = buffer.capacity
|
||||
println(buffer)
|
||||
println(buffer.getString())
|
||||
println(buffer)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testReset() {
|
||||
val buffer = ArrayByteBuffer(
|
||||
ByteBufferUtil.wrap("hello"),
|
||||
HeapByteBuffer(4),
|
||||
ByteBufferUtil.wrap(", "),
|
||||
HeapByteBuffer(4),
|
||||
ByteBufferUtil.wrap("world"),
|
||||
ByteBufferUtil.wrap("!"),
|
||||
ByteBufferUtil.wrap("!"),
|
||||
)
|
||||
buffer.reset()
|
||||
println(buffer)
|
||||
val message = buffer.getString()
|
||||
println(message)
|
||||
println(buffer)
|
||||
}
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
package cn.tursom.core.coroutine
|
||||
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.channels.ReceiveChannel
|
||||
import kotlinx.coroutines.channels.SendChannel
|
||||
|
@ -5,7 +5,7 @@ import kotlinx.coroutines.ThreadContextElement
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
|
||||
open class CoroutineLocalContext(
|
||||
private val mapBuilder: () -> MutableMap<CoroutineLocal<*>, Any?> = { HashMap(4) }
|
||||
private val mapBuilder: () -> MutableMap<CoroutineLocal<*>, Any?> = { HashMap(4) },
|
||||
) : CoroutineContext.Element, ThreadContextElement<MutableMap<CoroutineLocal<*>, Any?>>,
|
||||
MutableMap<CoroutineLocal<*>, Any?> {
|
||||
override val key: CoroutineContext.Key<*> get() = Key
|
||||
|
@ -6,7 +6,7 @@ import kotlin.coroutines.CoroutineContext
|
||||
import kotlin.coroutines.EmptyCoroutineContext
|
||||
|
||||
class CoroutineLocalContinuation(
|
||||
private val completion: Continuation<*>
|
||||
private val completion: Continuation<*>,
|
||||
) : Continuation<Any?> by completion.cast() {
|
||||
override val context: CoroutineContext = completion.context + if (completion.context[CoroutineLocalContext] == null) {
|
||||
CoroutineLocalContext()
|
||||
|
@ -2,13 +2,12 @@ package cn.tursom.core.coroutine
|
||||
|
||||
import cn.tursom.core.cast
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
import kotlin.coroutines.coroutineContext
|
||||
|
||||
class CoroutineScopeContext(
|
||||
var coroutineScope: CoroutineScope = GlobalScope
|
||||
var coroutineScope: CoroutineScope = GlobalScope,
|
||||
) : CoroutineContext.Element {
|
||||
override val key: CoroutineContext.Key<*> get() = Companion
|
||||
|
||||
|
@ -25,7 +25,7 @@ object CurrentThreadCoroutineScope {
|
||||
|
||||
suspend fun launch(
|
||||
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||
block: suspend CoroutineScope.() -> Unit
|
||||
block: suspend CoroutineScope.() -> Unit,
|
||||
): Job {
|
||||
val coroutineScope = getCoroutineScope()
|
||||
//coroutineScope.launch(start = start, block = block)
|
||||
@ -58,7 +58,7 @@ object CurrentThreadCoroutineScope {
|
||||
private fun newBlockingCoroutine(
|
||||
coroutineContext: CoroutineContext,
|
||||
thread: Thread = Thread.currentThread(),
|
||||
eventLoop: CoroutineDispatcher
|
||||
eventLoop: CoroutineDispatcher,
|
||||
): CoroutineScope {
|
||||
return BlockingCoroutineConstructor.newInstance(coroutineContext, thread, eventLoop).cast()
|
||||
}
|
||||
@ -66,7 +66,7 @@ object CurrentThreadCoroutineScope {
|
||||
private fun <T> CoroutineScope.start(
|
||||
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||
receiver: CoroutineScope = this,
|
||||
block: suspend CoroutineScope.() -> T
|
||||
block: suspend CoroutineScope.() -> T,
|
||||
) {
|
||||
BlockingCoroutineStart.invoke(this, start, receiver, block)
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,116 +8,116 @@ import cn.tursom.core.uncheckedCast
|
||||
|
||||
|
||||
class VarargCurrying<A, R>(
|
||||
private val func: (Array<out A>) -> R,
|
||||
private val args: Array<out Any?>,
|
||||
private val componentType: Class<A>
|
||||
private val func: (Array<out A>) -> R,
|
||||
private val args: Array<out Any?>,
|
||||
private val componentType: Class<A>,
|
||||
) {
|
||||
companion object {
|
||||
inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R) =
|
||||
VarargCurrying(func, A::class.java)
|
||||
companion object {
|
||||
inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R) =
|
||||
VarargCurrying(func, A::class.java)
|
||||
|
||||
inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R, args: Array<out Any?>) =
|
||||
VarargCurrying(func, args, A::class.java)
|
||||
}
|
||||
inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R, args: Array<out Any?>) =
|
||||
VarargCurrying(func, args, A::class.java)
|
||||
}
|
||||
|
||||
constructor(
|
||||
func: (Array<out A>) -> R,
|
||||
componentType: Class<A> = func.javaClass.allMethods.find {
|
||||
it.name == "invoke" &&
|
||||
it.parameterTypes.size == 1 &&
|
||||
it.parameterTypes[0].isArray
|
||||
}!!.parameters[0].type.componentType.uncheckedCast()
|
||||
) : this(func, emptyArray(), componentType)
|
||||
constructor(
|
||||
func: (Array<out A>) -> R,
|
||||
componentType: Class<A> = func.javaClass.allMethods.find {
|
||||
it.name == "invoke" &&
|
||||
it.parameterTypes.size == 1 &&
|
||||
it.parameterTypes[0].isArray
|
||||
}!!.parameters[0].type.componentType.uncheckedCast(),
|
||||
) : this(func, emptyArray(), componentType)
|
||||
|
||||
operator fun invoke(): R = if (componentType == Any::class.java) {
|
||||
func(args.uncheckedCast())
|
||||
} else {
|
||||
val componentArgs = java.lang.reflect.Array.newInstance(componentType, args.size)
|
||||
System.arraycopy(args, 0, componentArgs, 0, args.size)
|
||||
func(componentArgs.uncheckedCast())
|
||||
}
|
||||
operator fun invoke(): R = if (componentType == Any::class.java) {
|
||||
func(args.uncheckedCast())
|
||||
} else {
|
||||
val componentArgs = java.lang.reflect.Array.newInstance(componentType, args.size)
|
||||
System.arraycopy(args, 0, componentArgs, 0, args.size)
|
||||
func(componentArgs.uncheckedCast())
|
||||
}
|
||||
|
||||
operator fun invoke(vararg args: A) = VarargCurrying(func, this.args + args, componentType)
|
||||
operator fun invoke(vararg args: A) = VarargCurrying(func, this.args + args, componentType)
|
||||
}
|
||||
|
||||
class BooleanVarargCurrying<R>(
|
||||
private val func: (BooleanArray) -> R,
|
||||
private val args: BooleanArray
|
||||
private val func: (BooleanArray) -> R,
|
||||
private val args: BooleanArray,
|
||||
) {
|
||||
constructor(func: (BooleanArray) -> R) : this(func, booleanArrayOf())
|
||||
constructor(func: (BooleanArray) -> R) : this(func, booleanArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Boolean) = BooleanVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Boolean) = BooleanVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class CharVarargCurrying<R>(
|
||||
private val func: (CharArray) -> R,
|
||||
private val args: CharArray
|
||||
private val func: (CharArray) -> R,
|
||||
private val args: CharArray,
|
||||
) {
|
||||
constructor(func: (CharArray) -> R) : this(func, charArrayOf())
|
||||
constructor(func: (CharArray) -> R) : this(func, charArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Char) = CharVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Char) = CharVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class ByteVarargCurrying<R>(
|
||||
private val func: (ByteArray) -> R,
|
||||
private val args: ByteArray
|
||||
private val func: (ByteArray) -> R,
|
||||
private val args: ByteArray,
|
||||
) {
|
||||
constructor(func: (ByteArray) -> R) : this(func, byteArrayOf())
|
||||
constructor(func: (ByteArray) -> R) : this(func, byteArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Byte) = ByteVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Byte) = ByteVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class ShortVarargCurrying<R>(
|
||||
private val func: (ShortArray) -> R,
|
||||
private val args: ShortArray
|
||||
private val func: (ShortArray) -> R,
|
||||
private val args: ShortArray,
|
||||
) {
|
||||
constructor(func: (ShortArray) -> R) : this(func, shortArrayOf())
|
||||
constructor(func: (ShortArray) -> R) : this(func, shortArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Short) = ShortVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Short) = ShortVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class IntVarargCurrying<R>(
|
||||
private val func: (IntArray) -> R,
|
||||
private val args: IntArray
|
||||
private val func: (IntArray) -> R,
|
||||
private val args: IntArray,
|
||||
) {
|
||||
constructor(func: (IntArray) -> R) : this(func, intArrayOf())
|
||||
constructor(func: (IntArray) -> R) : this(func, intArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Int) = IntVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Int) = IntVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class LongVarargCurrying<R>(
|
||||
private val func: (LongArray) -> R,
|
||||
private val args: LongArray
|
||||
private val func: (LongArray) -> R,
|
||||
private val args: LongArray,
|
||||
) {
|
||||
constructor(func: (LongArray) -> R) : this(func, longArrayOf())
|
||||
constructor(func: (LongArray) -> R) : this(func, longArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Long) = LongVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Long) = LongVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class FloatVarargCurrying<R>(
|
||||
private val func: (FloatArray) -> R,
|
||||
private val args: FloatArray
|
||||
private val func: (FloatArray) -> R,
|
||||
private val args: FloatArray,
|
||||
) {
|
||||
constructor(func: (FloatArray) -> R) : this(func, floatArrayOf())
|
||||
constructor(func: (FloatArray) -> R) : this(func, floatArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Float) = FloatVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Float) = FloatVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
class DoubleVarargCurrying<R>(
|
||||
private val func: (DoubleArray) -> R,
|
||||
private val args: DoubleArray
|
||||
private val func: (DoubleArray) -> R,
|
||||
private val args: DoubleArray,
|
||||
) {
|
||||
constructor(func: (DoubleArray) -> R) : this(func, doubleArrayOf())
|
||||
constructor(func: (DoubleArray) -> R) : this(func, doubleArrayOf())
|
||||
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Double) = DoubleVarargCurrying(func, this.args + args)
|
||||
operator fun invoke() = func(args)
|
||||
operator fun invoke(vararg args: Double) = DoubleVarargCurrying(func, this.args + args)
|
||||
}
|
||||
|
||||
inline fun <reified T, R> ((Array<out T>) -> R).currying() = VarargCurrying(this)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,96 +2,708 @@ package cn.tursom.core.curry
|
||||
|
||||
fun <T1, T2, R> ((T1, T2) -> R).currying() = { a1: T1 -> { a2: T2 -> this(a1, a2) } }
|
||||
fun <T1, T2, T3, R> ((T1, T2, T3) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> this(a1, a2, a3) } } }
|
||||
fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> this(a1, a2, a3, a4) } } } }
|
||||
fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> this(a1, a2, a3, a4, a5) } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> this(a1, a2, a3, a4, a5, a6) } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) } } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) } } } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) } } } } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> { a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) } } } } } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> { a19: T19 -> { a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) } } } } } } } } } } } } } } } } } } } }
|
||||
fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).currying() =
|
||||
{ a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> this(a1, a2, a3, a4) } } } }
|
||||
|
||||
fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).currying() =
|
||||
{ a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> this(a1, a2, a3, a4, a5) } } } } }
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).currying() =
|
||||
{ a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> this(a1, a2, a3, a4, a5, a6) } } } } } }
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).currying() = { a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).currying() = { a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying() = { a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
{ a16: T16 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15,
|
||||
a16)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
{ a16: T16 ->
|
||||
{ a17: T17 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15,
|
||||
a16,
|
||||
a17)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
{ a16: T16 ->
|
||||
{ a17: T17 ->
|
||||
{ a18: T18 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15,
|
||||
a16,
|
||||
a17,
|
||||
a18)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
{ a16: T16 ->
|
||||
{ a17: T17 ->
|
||||
{ a18: T18 ->
|
||||
{ a19: T19 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15,
|
||||
a16,
|
||||
a17,
|
||||
a18,
|
||||
a19)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying() =
|
||||
{ a1: T1 ->
|
||||
{ a2: T2 ->
|
||||
{ a3: T3 ->
|
||||
{ a4: T4 ->
|
||||
{ a5: T5 ->
|
||||
{ a6: T6 ->
|
||||
{ a7: T7 ->
|
||||
{ a8: T8 ->
|
||||
{ a9: T9 ->
|
||||
{ a10: T10 ->
|
||||
{ a11: T11 ->
|
||||
{ a12: T12 ->
|
||||
{ a13: T13 ->
|
||||
{ a14: T14 ->
|
||||
{ a15: T15 ->
|
||||
{ a16: T16 ->
|
||||
{ a17: T17 ->
|
||||
{ a18: T18 ->
|
||||
{ a19: T19 ->
|
||||
{ a20: T20 ->
|
||||
this(a1,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5,
|
||||
a6,
|
||||
a7,
|
||||
a8,
|
||||
a9,
|
||||
a10,
|
||||
a11,
|
||||
a12,
|
||||
a13,
|
||||
a14,
|
||||
a15,
|
||||
a16,
|
||||
a17,
|
||||
a18,
|
||||
a19,
|
||||
a20)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, R> ((Array<out T1>, T2) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, R> ((Array<out T1>, T2, T3) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, T3, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, R> ((Array<out T1>, T2, T3, T4) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, T3, T4, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, R> ((Array<out T1>, T2, T3, T4, T5) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, T3, T4, T5, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, R> ((Array<out T1>, T2, T3, T4, T5, T6) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, R>().currying(args = args)
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R>().currying(args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R>().currying(
|
||||
args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R>().currying(
|
||||
args = args)
|
||||
|
||||
@JvmName("curryingVararg")
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying(vararg args: T1) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R>().currying(args = args)
|
||||
inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying(
|
||||
vararg args: T1,
|
||||
) =
|
||||
currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R>().currying(
|
||||
args = args)
|
||||
|
@ -2,20 +2,253 @@ package cn.tursom.core.curry
|
||||
|
||||
operator fun <T1, T2, R> ((T1) -> (T2) -> R).invoke(a1: T1, a2: T2) = this(a1)(a2)
|
||||
operator fun <T1, T2, T3, R> ((T1) -> (T2) -> (T3) -> R).invoke(a1: T1, a2: T2, a3: T3) = this(a1)(a2)(a3)
|
||||
operator fun <T1, T2, T3, T4, R> ((T1) -> (T2) -> (T3) -> (T4) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = this(a1)(a2)(a3)(a4)
|
||||
operator fun <T1, T2, T3, T4, T5, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = this(a1)(a2)(a3)(a4)(a5)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = this(a1)(a2)(a3)(a4)(a5)(a6)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> (T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)(a20)
|
||||
operator fun <T1, T2, T3, T4, R> ((T1) -> (T2) -> (T3) -> (T4) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) =
|
||||
this(a1)(a2)(a3)(a4)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
a16: T16,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
a16: T16,
|
||||
a17: T17,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
a16: T16,
|
||||
a17: T17,
|
||||
a18: T18,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
a16: T16,
|
||||
a17: T17,
|
||||
a18: T18,
|
||||
a19: T19,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)
|
||||
|
||||
operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> (T20) -> R).invoke(
|
||||
a1: T1,
|
||||
a2: T2,
|
||||
a3: T3,
|
||||
a4: T4,
|
||||
a5: T5,
|
||||
a6: T6,
|
||||
a7: T7,
|
||||
a8: T8,
|
||||
a9: T9,
|
||||
a10: T10,
|
||||
a11: T11,
|
||||
a12: T12,
|
||||
a13: T13,
|
||||
a14: T14,
|
||||
a15: T15,
|
||||
a16: T16,
|
||||
a17: T17,
|
||||
a18: T18,
|
||||
a19: T19,
|
||||
a20: T20,
|
||||
) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)(a20)
|
||||
|
@ -4,186 +4,186 @@ import cn.tursom.core.removeLastChars
|
||||
import org.junit.Test
|
||||
|
||||
class CurryBuilder {
|
||||
@Test
|
||||
fun buildCurryClass() {
|
||||
(3..20).forEach(::buildCurryClass)
|
||||
}
|
||||
@Test
|
||||
fun buildCurryClass() {
|
||||
(3..20).forEach(::buildCurryClass)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun buildInvokeMethod() {
|
||||
(3..20).forEach(::buildInvokeMethod)
|
||||
}
|
||||
@Test
|
||||
fun buildInvokeMethod() {
|
||||
(3..20).forEach(::buildInvokeMethod)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun buildMethodInvoker() {
|
||||
(4..20).forEach(::buildMethodInvoker)
|
||||
}
|
||||
@Test
|
||||
fun buildMethodInvoker() {
|
||||
(4..20).forEach(::buildMethodInvoker)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun buildObjectI() {
|
||||
println(
|
||||
"package com.ddbes.kotlin.util\n" +
|
||||
"\n" +
|
||||
"import com.ddbes.kotlin.util.curry.*\n"
|
||||
@Test
|
||||
fun buildObjectI() {
|
||||
println(
|
||||
"package com.ddbes.kotlin.util\n" +
|
||||
"\n" +
|
||||
"import com.ddbes.kotlin.util.curry.*\n"
|
||||
)
|
||||
println(buildObjectI(20, "I", extensionLambda = false, extensionCurry = false))
|
||||
println(buildObjectI(20, "F", extensionLambda = true, extensionCurry = false))
|
||||
//println(buildObjectI(20, "C", extensionLambda = false, extensionCurry = true))
|
||||
}
|
||||
|
||||
fun args(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("a${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun args(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("a${it}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun types(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("T${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun types(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("T${it}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun argsWithType(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("a${it + 1}: T${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun argsWithType(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("a$it: T$it, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun buildObjectI(
|
||||
index: Int,
|
||||
objectName: String = "I",
|
||||
extensionLambda: Boolean = true,
|
||||
extensionCurry: Boolean = true,
|
||||
) = buildString {
|
||||
append("object $objectName {\n")
|
||||
append(" inline operator fun <R> invoke(f: () -> R) = f()\n")
|
||||
if (extensionLambda || extensionCurry) append("\n")
|
||||
(1..index).forEach {
|
||||
append(
|
||||
" inline operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
|
||||
argsWithType(it)
|
||||
}) = f(${args(it)})\n"
|
||||
)
|
||||
if (extensionCurry) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
|
||||
argsWithType(it)
|
||||
}) = f(${args(it)})\n"
|
||||
)
|
||||
repeat(it - 1) { curry ->
|
||||
if (extensionLambda) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
|
||||
argsWithType(it - curry - 1)
|
||||
}) = f(${args(it - curry - 1)})\n"
|
||||
)
|
||||
println(buildObjectI(20, "I", extensionLambda = false, extensionCurry = false))
|
||||
println(buildObjectI(20, "F", extensionLambda = true, extensionCurry = false))
|
||||
//println(buildObjectI(20, "C", extensionLambda = false, extensionCurry = true))
|
||||
if (extensionCurry) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
|
||||
argsWithType(it - curry - 1)
|
||||
}) = f(${args(it - curry - 1)})\n"
|
||||
)
|
||||
}
|
||||
if (extensionLambda || extensionCurry) append("\n")
|
||||
}
|
||||
append("}\n")
|
||||
}
|
||||
|
||||
fun args(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("a${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun args(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("a${it}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun types(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("T${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun types(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("T${it}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun argsWithType(index: Int) = buildString {
|
||||
repeat(index) {
|
||||
append("a${it + 1}: T${it + 1}, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun argsWithType(fromIndex: Int, toIndex: Int) = buildString {
|
||||
(fromIndex..toIndex).forEach {
|
||||
append("a$it: T$it, ")
|
||||
}
|
||||
removeLastChars(2)
|
||||
}
|
||||
|
||||
fun buildObjectI(
|
||||
index: Int,
|
||||
objectName: String = "I",
|
||||
extensionLambda: Boolean = true,
|
||||
extensionCurry: Boolean = true,
|
||||
) = buildString {
|
||||
append("object $objectName {\n")
|
||||
append(" inline operator fun <R> invoke(f: () -> R) = f()\n")
|
||||
if (extensionLambda || extensionCurry) append("\n")
|
||||
(1..index).forEach {
|
||||
append(
|
||||
" inline operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
|
||||
argsWithType(it)
|
||||
}) = f(${args(it)})\n"
|
||||
)
|
||||
if (extensionCurry) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
|
||||
argsWithType(it)
|
||||
}) = f(${args(it)})\n"
|
||||
)
|
||||
repeat(it - 1) { curry ->
|
||||
if (extensionLambda) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
|
||||
argsWithType(it - curry - 1)
|
||||
}) = f(${args(it - curry - 1)})\n"
|
||||
)
|
||||
if (extensionCurry) append(
|
||||
"operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
|
||||
argsWithType(it - curry - 1)
|
||||
}) = f(${args(it - curry - 1)})\n"
|
||||
)
|
||||
}
|
||||
if (extensionLambda || extensionCurry) append("\n")
|
||||
}
|
||||
append("}\n")
|
||||
}
|
||||
|
||||
fun buildCurryClass(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
val invokeAction = "action$index($args)"
|
||||
println(buildString {
|
||||
append("open class Curry$index<$types, R>(\n")
|
||||
append(" val action$index: ($argsWithType) -> R,\n")
|
||||
append(") : Curry${index - 1}<${types(index - 1)}, Curry1<T$index, R>>({ ${args(index - 1)} ->\n")
|
||||
append(" Curry1 { a$index ->\n")
|
||||
append(" action$index($args)\n")
|
||||
append(" }\n")
|
||||
append("}) {\n")
|
||||
if (index > 2) (1..index - 2).forEach { overrideInvoke ->
|
||||
append(" override operator fun invoke(${argsWithType(overrideInvoke)}): Curry${index - overrideInvoke}<${
|
||||
types(overrideInvoke + 1, index)
|
||||
}, R> = Curry${index - overrideInvoke} { ${args(overrideInvoke + 1, index)} ->\n")
|
||||
append(" $invokeAction\n")
|
||||
append(" }\n")
|
||||
append("\n")
|
||||
}
|
||||
append(" open operator fun invoke($argsWithType): R = $invokeAction\n")
|
||||
append("}\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildCurryMethod(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
|
||||
println(buildString {
|
||||
append("fun <$types, R> curry(action: ($types) -> R) =\n")
|
||||
append(" Curry$index { $argsWithType ->\n")
|
||||
append(" action($args)\n")
|
||||
append(" }\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildInvokeMethod(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
|
||||
println(buildString {
|
||||
append("operator fun <$types, R> ")
|
||||
repeat(index - 1) {
|
||||
append("Curry1<T${it + 1}, ")
|
||||
}
|
||||
append("Curry1<T$index, R>", ">".repeat(index - 1), ".invoke($argsWithType): R {\n")
|
||||
append(" return if (this is Curry$index) {\n")
|
||||
append(" uncheckedCast<Curry$index<$types, R>>()($args)\n")
|
||||
append(" } else {\n")
|
||||
append(" invoke")
|
||||
repeat(index) { an ->
|
||||
append("(a${an + 1})")
|
||||
}
|
||||
append("\n")
|
||||
append(" }\n")
|
||||
append("}\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildMethodInvoker(index: Int) {
|
||||
val args = args(index)
|
||||
val types = types(index)
|
||||
|
||||
println("operator fun <$types, R> (($types) -> R).invoke() = this")
|
||||
(1 until index).forEach { argCount ->
|
||||
println(
|
||||
"operator fun <$types, R> (($types) -> R).invoke(${argsWithType(argCount)}) = " +
|
||||
"{ ${argsWithType(argCount + 1, index)} -> this(${args}) }"
|
||||
)
|
||||
}
|
||||
println()
|
||||
fun buildCurryClass(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
val invokeAction = "action$index($args)"
|
||||
println(buildString {
|
||||
append("open class Curry$index<$types, R>(\n")
|
||||
append(" val action$index: ($argsWithType) -> R,\n")
|
||||
append(") : Curry${index - 1}<${types(index - 1)}, Curry1<T$index, R>>({ ${args(index - 1)} ->\n")
|
||||
append(" Curry1 { a$index ->\n")
|
||||
append(" action$index($args)\n")
|
||||
append(" }\n")
|
||||
append("}) {\n")
|
||||
if (index > 2) (1..index - 2).forEach { overrideInvoke ->
|
||||
append(" override operator fun invoke(${argsWithType(overrideInvoke)}): Curry${index - overrideInvoke}<${
|
||||
types(overrideInvoke + 1, index)
|
||||
}, R> = Curry${index - overrideInvoke} { ${args(overrideInvoke + 1, index)} ->\n")
|
||||
append(" $invokeAction\n")
|
||||
append(" }\n")
|
||||
append("\n")
|
||||
}
|
||||
append(" open operator fun invoke($argsWithType): R = $invokeAction\n")
|
||||
append("}\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildCurryMethod(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
|
||||
println(buildString {
|
||||
append("fun <$types, R> curry(action: ($types) -> R) =\n")
|
||||
append(" Curry$index { $argsWithType ->\n")
|
||||
append(" action($args)\n")
|
||||
append(" }\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildInvokeMethod(index: Int) {
|
||||
val args = args(index)
|
||||
val argsWithType = argsWithType(index)
|
||||
val types = types(index)
|
||||
|
||||
println(buildString {
|
||||
append("operator fun <$types, R> ")
|
||||
repeat(index - 1) {
|
||||
append("Curry1<T${it + 1}, ")
|
||||
}
|
||||
append("Curry1<T$index, R>", ">".repeat(index - 1), ".invoke($argsWithType): R {\n")
|
||||
append(" return if (this is Curry$index) {\n")
|
||||
append(" uncheckedCast<Curry$index<$types, R>>()($args)\n")
|
||||
append(" } else {\n")
|
||||
append(" invoke")
|
||||
repeat(index) { an ->
|
||||
append("(a${an + 1})")
|
||||
}
|
||||
append("\n")
|
||||
append(" }\n")
|
||||
append("}\n")
|
||||
})
|
||||
}
|
||||
|
||||
fun buildMethodInvoker(index: Int) {
|
||||
val args = args(index)
|
||||
val types = types(index)
|
||||
|
||||
println("operator fun <$types, R> (($types) -> R).invoke() = this")
|
||||
(1 until index).forEach { argCount ->
|
||||
println(
|
||||
"operator fun <$types, R> (($types) -> R).invoke(${argsWithType(argCount)}) = " +
|
||||
"{ ${argsWithType(argCount + 1, index)} -> this(${args}) }"
|
||||
)
|
||||
}
|
||||
println()
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ package cn.tursom.core.datastruct
|
||||
|
||||
open class AbstractListIterator<E>(
|
||||
val list: List<E>,
|
||||
private var index: Int = 0
|
||||
private var index: Int = 0,
|
||||
) : ListIterator<E> {
|
||||
override fun hasNext(): Boolean = list.size > index
|
||||
override fun next(): E = list[index++]
|
||||
|
@ -143,7 +143,7 @@ open class ArrayMap<K, V>(initialCapacity: Int = 16) : SimpMap<K, V> {
|
||||
|
||||
class Node<K, V>(
|
||||
override val key: K,
|
||||
@Volatile override var value: V
|
||||
@Volatile override var value: V,
|
||||
) : MutableMap.MutableEntry<K, V>, Comparable<K> {
|
||||
override fun toString(): String = "$key=$value"
|
||||
override fun setValue(newValue: V): V = value.also { value = newValue }
|
||||
|
@ -217,7 +217,7 @@ class AtomicBitSet(beginSize: Long = 256, val defaultState: Boolean = false) : S
|
||||
startIndex: Int,
|
||||
length: Int = length(),
|
||||
asc: Boolean = true,
|
||||
action: (index: Int, Long) -> Unit
|
||||
action: (index: Int, Long) -> Unit,
|
||||
) {
|
||||
repeat(length) {
|
||||
val index = if (asc) {
|
||||
|
@ -4,7 +4,7 @@ import kotlin.reflect.KProperty1
|
||||
|
||||
class KPropertyEntries(
|
||||
val target: Any,
|
||||
private val propertyMap: Map<String, KProperty1<Any, *>> = KPropertyValueMap[target]
|
||||
private val propertyMap: Map<String, KProperty1<Any, *>> = KPropertyValueMap[target],
|
||||
) : Set<Map.Entry<String, Any?>> {
|
||||
override val size: Int = propertyMap.size
|
||||
override fun isEmpty(): Boolean = propertyMap.isEmpty()
|
||||
|
@ -4,7 +4,7 @@ import kotlin.reflect.KProperty1
|
||||
|
||||
class KPropertyValueCollection(
|
||||
val target: Any,
|
||||
private val propertyMap: Map<String, KProperty1<Any, *>> = KPropertyValueMap[target]
|
||||
private val propertyMap: Map<String, KProperty1<Any, *>> = KPropertyValueMap[target],
|
||||
) : Collection<Any?> {
|
||||
override val size: Int get() = propertyMap.size
|
||||
override fun isEmpty(): Boolean = propertyMap.isEmpty()
|
||||
|
@ -3,7 +3,7 @@ package cn.tursom.core.datastruct
|
||||
class MutableSubList<T>(
|
||||
val parent: MutableList<T>,
|
||||
val fromIndex: Int,
|
||||
val toIndex: Int
|
||||
val toIndex: Int,
|
||||
) : AbstractMutableList<T> {
|
||||
override val size: Int get() = toIndex - fromIndex
|
||||
|
||||
|
@ -192,7 +192,7 @@ open class ParallelArrayMap<K, V>(initialCapacity: Int = 16) : SimpMap<K, V> {
|
||||
|
||||
class ParallelArrayMapEntry<K, V>(
|
||||
val map: ParallelArrayMap<K, V>,
|
||||
val index: Int
|
||||
val index: Int,
|
||||
) : MutableMap.MutableEntry<K, V> {
|
||||
override val key: K get() = map.getKeyByIndex(index).uncheckedCast()
|
||||
override val value: V get() = map.getByIndex(index).uncheckedCast()
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cn.tursom.core.datastruct
|
||||
|
||||
class ReversedList<E>(
|
||||
val list: List<E>
|
||||
val list: List<E>,
|
||||
) : List<E> by list {
|
||||
override fun get(index: Int): E = list[size - index - 1]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package cn.tursom.core.datastruct
|
||||
|
||||
class SimpHashMap<K, V>(
|
||||
val hashMap: java.util.AbstractMap<K, V> = HashMap()
|
||||
val hashMap: java.util.AbstractMap<K, V> = HashMap(),
|
||||
) : SimpMap<K, V>, MutableMap<K, V> by hashMap {
|
||||
override fun delete(key: K): V? {
|
||||
return hashMap.remove(key)
|
||||
|
@ -214,7 +214,7 @@ class StringRadixTree<T> {
|
||||
var str: String = "",
|
||||
var value: T? = null,
|
||||
var parent: Node<T>? = null,
|
||||
var subNodes: SimpMap<Char, Node<T>> = ArrayMap(0)
|
||||
var subNodes: SimpMap<Char, Node<T>> = ArrayMap(0),
|
||||
) {
|
||||
constructor(parent: Node<T>, str: String = "", value: T? = null) : this(str, value, parent, parent.subNodes) {
|
||||
parent.subNodes = ArrayMap(1)
|
||||
|
@ -133,7 +133,7 @@ class ConcurrentLinkedList<T> : AbstractMutableList<T> {
|
||||
|
||||
private inner class Iterator(
|
||||
var index: Int,
|
||||
var p: Node = prevNodeOfIndex(index - 1)
|
||||
var p: Node = prevNodeOfIndex(index - 1),
|
||||
) : MutableListIterator<T> {
|
||||
|
||||
override fun hasPrevious(): Boolean = p.prev != root
|
||||
|
@ -7,7 +7,7 @@ import javax.crypto.spec.SecretKeySpec
|
||||
|
||||
@Suppress("unused")
|
||||
class AES(
|
||||
@Suppress("CanBeParameter") val secKey: SecretKey
|
||||
@Suppress("CanBeParameter") val secKey: SecretKey,
|
||||
) : Encrypt {
|
||||
private val decryptCipher = Cipher.getInstance("AES")!!
|
||||
private val encryptCipher = Cipher.getInstance("AES")!!
|
||||
|
@ -1,5 +1,5 @@
|
||||
package cn.tursom.core.encrypt
|
||||
|
||||
class AESPool(
|
||||
initSize: Int = 16
|
||||
initSize: Int = 16,
|
||||
) : EncryptPool<AES>(initSize, { AES() })
|
@ -10,7 +10,7 @@ import java.security.spec.X509EncodedKeySpec
|
||||
@Suppress("unused", "MemberVisibilityCanBePrivate")
|
||||
class DSA(
|
||||
publicKey: DSAPublicKey,
|
||||
privateKey: DSAPrivateKey? = null
|
||||
privateKey: DSAPrivateKey? = null,
|
||||
) : AbstractPublicKeyEncrypt("DSA", publicKey, privateKey) {
|
||||
|
||||
override val decryptMaxLen = Int.MAX_VALUE
|
||||
|
@ -72,7 +72,7 @@ class ECC(
|
||||
val standardCurveLineSet by lazy {
|
||||
try {
|
||||
Unsafe {
|
||||
Class.forName("sun.security.ec.CurveDB")["nameMap"].uncheckedCast<Map<String, Any>>().keys
|
||||
Class.forName("sun.security.ec.CurveDB").getField("nameMap").uncheckedCast<Map<String, Any>>().keys
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
emptySet()
|
||||
|
@ -17,7 +17,7 @@ interface Encrypt {
|
||||
buffer: ByteArray,
|
||||
bufferOffset: Int = 0,
|
||||
offset: Int = 0,
|
||||
size: Int = data.size - offset
|
||||
size: Int = data.size - offset,
|
||||
): Int
|
||||
|
||||
fun decrypt(
|
||||
@ -25,7 +25,7 @@ interface Encrypt {
|
||||
buffer: ByteArray,
|
||||
bufferOffset: Int = 0,
|
||||
offset: Int = 0,
|
||||
size: Int = data.size - offset
|
||||
size: Int = data.size - offset,
|
||||
): Int
|
||||
|
||||
fun encrypt(data: ByteBuffer): ByteArray {
|
||||
|
@ -6,7 +6,7 @@ import cn.tursom.core.pool.Pool
|
||||
|
||||
open class EncryptPool<T : Encrypt>(
|
||||
initSize: Int = 0,
|
||||
encryptBuilder: () -> T
|
||||
encryptBuilder: () -> T,
|
||||
) : Pool<T> {
|
||||
private val aesPool = BlockingArrayList<T>()
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
package cn.tursom.core.encrypt
|
||||
|
||||
class RSAPool(
|
||||
initSize: Int = 16
|
||||
initSize: Int = 16,
|
||||
) : EncryptPool<RSA>(initSize, { RSA() })
|
@ -9,7 +9,7 @@ object LayoutEncoders {
|
||||
class JsonLayoutEncoder : CustomLayoutEncoder(JsonLayout())
|
||||
|
||||
operator fun invoke(
|
||||
layout: Layout<ILoggingEvent>
|
||||
layout: Layout<ILoggingEvent>,
|
||||
): Encoder<ILoggingEvent> = CustomLayoutEncoder(layout)
|
||||
|
||||
open class CustomLayoutEncoder(
|
||||
|
@ -4,5 +4,5 @@ import javax.activation.DataSource
|
||||
|
||||
data class MailStructure(
|
||||
val to: String?, val subject: String?, val html: String?, val text: String? = null,
|
||||
val image: Collection<Image>? = null, val attachment: Collection<DataSource>? = null
|
||||
val image: Collection<Image>? = null, val attachment: Collection<DataSource>? = null,
|
||||
)
|
@ -20,7 +20,7 @@ fun addMailListener(
|
||||
freq: Long, timeUnit: TimeUnit,
|
||||
listener: MessageCountListener,
|
||||
newFolder: () -> Folder? = { null },
|
||||
onHeartBeat: Folder. () -> Unit = {}
|
||||
onHeartBeat: Folder. () -> Unit = {},
|
||||
): ScheduledFuture<*> {
|
||||
folder.addMessageCountListener(listener)
|
||||
var mailFOlder = folder
|
||||
@ -42,7 +42,7 @@ fun addMailListener(
|
||||
newFolder: () -> Folder,
|
||||
freq: Long, timeUnit: TimeUnit,
|
||||
listener: MessageCountListener,
|
||||
onHeartBeat: Folder. () -> Unit = {}
|
||||
onHeartBeat: Folder. () -> Unit = {},
|
||||
): ScheduledFuture<*> = addMailListener(newFolder(), freq, timeUnit, listener, newFolder, onHeartBeat)
|
||||
|
||||
fun getStore(host: String, port: Int, account: String, password: String): Store {
|
||||
@ -113,7 +113,7 @@ fun forEachUnreadMail(
|
||||
port: Int,
|
||||
account: String,
|
||||
password: String,
|
||||
onMsg: (from: InternetAddress, msg: String) -> Boolean
|
||||
onMsg: (from: InternetAddress, msg: String) -> Boolean,
|
||||
) {
|
||||
forEachMail(host, port, account, password) { message ->
|
||||
// 跳过已读邮件
|
||||
|
@ -44,7 +44,7 @@ class RewriteFlvChecker {
|
||||
inputStream: InputStream,
|
||||
outputStream: OutputStream,
|
||||
lastTimestampRead: IntArray,
|
||||
lastTimestampWrite: IntArray
|
||||
lastTimestampWrite: IntArray,
|
||||
): Boolean {
|
||||
// 读取前一个tag size
|
||||
val frame = pool.get()
|
||||
@ -100,7 +100,7 @@ class RewriteFlvChecker {
|
||||
timestamp: Int,
|
||||
tagType: Int,
|
||||
lastTimestampRead: IntArray,
|
||||
lastTimestampWrite: IntArray
|
||||
lastTimestampWrite: IntArray,
|
||||
) {
|
||||
// 如果是首帧
|
||||
if (lastTimestampRead[tagType] == -1) {
|
||||
|
@ -8,7 +8,7 @@ import cn.tursom.core.buffer.impl.HeapByteBuffer
|
||||
class DirectMemoryPool(
|
||||
blockSize: Int = 1024,
|
||||
blockCount: Int = 16,
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer,
|
||||
) : AbstractMemoryPool(
|
||||
blockSize,
|
||||
blockCount,
|
||||
|
@ -8,7 +8,7 @@ import cn.tursom.core.buffer.impl.HeapByteBuffer
|
||||
class HeapMemoryPool(
|
||||
blockSize: Int = 1024,
|
||||
blockCount: Int = 16,
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer,
|
||||
) : AbstractMemoryPool(
|
||||
blockSize,
|
||||
blockCount,
|
||||
|
@ -8,7 +8,7 @@ import java.util.concurrent.ConcurrentLinkedQueue
|
||||
|
||||
class InstantMemoryPool(
|
||||
val blockSize: Int,
|
||||
val newMemory: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer
|
||||
val newMemory: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer,
|
||||
) : MemoryPool {
|
||||
private val memoryList = ConcurrentLinkedQueue<SoftReference<InstantByteBuffer>>()
|
||||
|
||||
|
@ -5,7 +5,7 @@ import cn.tursom.core.buffer.impl.DirectByteBuffer
|
||||
|
||||
class LongBitSetDirectMemoryPool(
|
||||
blockSize: Int,
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::DirectByteBuffer
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::DirectByteBuffer,
|
||||
) : LongBitSetAbstractMemoryPool(blockSize, emptyPoolBuffer, DirectByteBuffer(64 * blockSize)) {
|
||||
override fun toString(): String {
|
||||
return "LongBitSetDirectMemoryPool(blockSize=$blockSize, blockCount=$blockCount, allocated=$allocated)"
|
||||
|
@ -5,7 +5,7 @@ import cn.tursom.core.buffer.impl.HeapByteBuffer
|
||||
|
||||
class LongBitSetHeapMemoryPool(
|
||||
blockSize: Int,
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer
|
||||
emptyPoolBuffer: (blockSize: Int) -> ByteBuffer = ::HeapByteBuffer,
|
||||
) : LongBitSetAbstractMemoryPool(blockSize, emptyPoolBuffer, HeapByteBuffer(64 * blockSize)) {
|
||||
override fun toString(): String {
|
||||
return "LongBitSetDirectMemoryPool(blockSize=$blockSize, blockCount=$blockCount, allocated=$allocated)"
|
||||
|
@ -3,7 +3,7 @@ package cn.tursom.core.pool
|
||||
import cn.tursom.core.buffer.ByteBuffer
|
||||
|
||||
class ThreadLocalMemoryPool(
|
||||
private val poolFactory: () -> MemoryPool
|
||||
private val poolFactory: () -> MemoryPool,
|
||||
) : MemoryPool {
|
||||
private val threadLocal = ThreadLocal<MemoryPool>()
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
package cn.tursom.reflect
|
||||
|
||||
import cn.tursom.core.Unsafe.get
|
||||
import cn.tursom.core.Unsafe.getField
|
||||
import cn.tursom.core.companionObjectInstanceOrNull
|
||||
import cn.tursom.core.uncheckedCast
|
||||
import java.lang.reflect.Field
|
||||
@ -21,7 +21,7 @@ fun <T> Class<*>.getStaticField(name: String): T? {
|
||||
|
||||
val companionObjectInstance = kotlin.companionObjectInstanceOrNull
|
||||
if (companionObjectInstance != null) {
|
||||
return companionObjectInstance[name]?.uncheckedCast()
|
||||
return companionObjectInstance.getField(name)?.uncheckedCast()
|
||||
}
|
||||
|
||||
return null
|
||||
|
@ -137,12 +137,7 @@ open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T,
|
||||
|
||||
fun write(data: ByteBuffer): ChannelFuture {
|
||||
return ch!!.writeAndFlush(
|
||||
BinaryWebSocketFrame(
|
||||
when (data) {
|
||||
is NettyByteBuffer -> data.byteBuf
|
||||
else -> Unpooled.wrappedBuffer(data.getBytes())
|
||||
}
|
||||
)
|
||||
BinaryWebSocketFrame(NettyByteBuffer.toByteBuf(data))
|
||||
)
|
||||
}
|
||||
|
||||
@ -152,12 +147,7 @@ open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T,
|
||||
|
||||
fun writeText(data: ByteBuffer): ChannelFuture {
|
||||
return ch!!.writeAndFlush(
|
||||
TextWebSocketFrame(
|
||||
when (data) {
|
||||
is NettyByteBuffer -> data.byteBuf
|
||||
else -> Unpooled.wrappedBuffer(data.getBytes())
|
||||
}
|
||||
)
|
||||
TextWebSocketFrame(NettyByteBuffer.toByteBuf(data))
|
||||
)
|
||||
}
|
||||
|
||||
@ -171,12 +161,7 @@ open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T,
|
||||
|
||||
fun ping(data: ByteBuffer): ChannelFuture {
|
||||
return ch!!.writeAndFlush(
|
||||
PingWebSocketFrame(
|
||||
when (data) {
|
||||
is NettyByteBuffer -> data.byteBuf
|
||||
else -> Unpooled.wrappedBuffer(data.getBytes())
|
||||
}
|
||||
)
|
||||
PingWebSocketFrame(NettyByteBuffer.toByteBuf(data))
|
||||
)
|
||||
}
|
||||
|
||||
@ -189,14 +174,7 @@ open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T,
|
||||
}
|
||||
|
||||
fun pong(data: ByteBuffer): ChannelFuture {
|
||||
return ch!!.writeAndFlush(
|
||||
PongWebSocketFrame(
|
||||
when (data) {
|
||||
is NettyByteBuffer -> data.byteBuf
|
||||
else -> Unpooled.wrappedBuffer(data.getBytes())
|
||||
}
|
||||
)
|
||||
)
|
||||
return ch!!.writeAndFlush(PongWebSocketFrame(NettyByteBuffer.toByteBuf(data)))
|
||||
}
|
||||
|
||||
fun pong(data: ByteBuf): ChannelFuture {
|
||||
|
@ -197,7 +197,7 @@ object Xml {
|
||||
elementName: String,
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String
|
||||
advanceIndentation: String,
|
||||
): Boolean {
|
||||
val clazz = obj.javaClass
|
||||
getAnnotation(ToXml::class.java)?.let { getter ->
|
||||
@ -279,7 +279,7 @@ object Xml {
|
||||
obj: kotlin.Array<*>,
|
||||
rootName: String = obj.javaClass.elementName,
|
||||
indentation: String = " ",
|
||||
fieldName: String? = "i"
|
||||
fieldName: String? = "i",
|
||||
): String {
|
||||
val stringBuilder = StringBuilder()
|
||||
arrayXml(obj, rootName, stringBuilder, "", indentation, fieldName)
|
||||
@ -292,7 +292,7 @@ object Xml {
|
||||
subElementName: String,
|
||||
builder: StringBuilder,
|
||||
subIndentation: String,
|
||||
advanceIndentation: String
|
||||
advanceIndentation: String,
|
||||
) {
|
||||
val type = value.javaClass
|
||||
|
||||
@ -318,7 +318,7 @@ object Xml {
|
||||
indentation: String,
|
||||
advanceIndentation: String,
|
||||
fieldName: String? = "i",
|
||||
multipleField: Boolean = false
|
||||
multipleField: Boolean = false,
|
||||
) {
|
||||
if (obj.isEmpty()) return
|
||||
val clazz = obj.javaClass
|
||||
@ -347,7 +347,7 @@ object Xml {
|
||||
obj: Iterable<*>,
|
||||
rootName: String,
|
||||
indentation: String,
|
||||
fieldName: String? = "i"
|
||||
fieldName: String? = "i",
|
||||
): String {
|
||||
val stringBuilder = StringBuilder()
|
||||
iterableXml(obj, rootName, stringBuilder, "", indentation, fieldName)
|
||||
@ -360,7 +360,7 @@ object Xml {
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String,
|
||||
fieldName: String? = "i"
|
||||
fieldName: String? = "i",
|
||||
) {
|
||||
val subIndentation = "$advanceIndentation$indentation"
|
||||
builder.append("$indentation<$elementName>")
|
||||
@ -388,7 +388,7 @@ object Xml {
|
||||
fun mapXml(
|
||||
obj: Map<*, *>,
|
||||
rootName: String,
|
||||
indentation: String
|
||||
indentation: String,
|
||||
): String {
|
||||
val stringBuilder = StringBuilder()
|
||||
mapXml(obj, rootName, stringBuilder, "", indentation)
|
||||
@ -400,7 +400,7 @@ object Xml {
|
||||
elementName: String,
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String
|
||||
advanceIndentation: String,
|
||||
) {
|
||||
val subIndentation = "$advanceIndentation$indentation"
|
||||
builder.append("$indentation<$elementName>")
|
||||
@ -429,7 +429,7 @@ object Xml {
|
||||
elementName: String,
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String
|
||||
advanceIndentation: String,
|
||||
) {
|
||||
val clazz = obj.javaClass
|
||||
val textField = clazz.textField
|
||||
@ -491,7 +491,7 @@ object Xml {
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String,
|
||||
field: Field? = null
|
||||
field: Field? = null,
|
||||
) {
|
||||
try {
|
||||
obj as Pair<*, *>
|
||||
@ -556,7 +556,7 @@ object Xml {
|
||||
elementName: String,
|
||||
builder: StringBuilder,
|
||||
fieldName: String? = "i",
|
||||
multi: Boolean = false
|
||||
multi: Boolean = false,
|
||||
) {
|
||||
val clazz = obj.javaClass
|
||||
if (clazz.isArray) {
|
||||
|
@ -29,7 +29,7 @@ object XmlDocument {
|
||||
|
||||
fun subElement(
|
||||
name: String? = null,
|
||||
action: (ElementContainerPotableXmlElement.() -> Unit)? = null
|
||||
action: (ElementContainerPotableXmlElement.() -> Unit)? = null,
|
||||
): ElementContainerXmlElement {
|
||||
val container = ElementContainer()
|
||||
if (name != null) container.name = name
|
||||
@ -42,7 +42,7 @@ object XmlDocument {
|
||||
operator fun invoke(
|
||||
advanceIndentation: String = " ",
|
||||
indentation: String = "",
|
||||
action: XmlDocument.() -> XmlElement
|
||||
action: XmlDocument.() -> XmlElement,
|
||||
): String {
|
||||
return this.action().toString(StringBuilder(), indentation, advanceIndentation)
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ interface XmlElement {
|
||||
fun toString(
|
||||
builder: StringBuilder,
|
||||
indentation: String,
|
||||
advanceIndentation: String
|
||||
advanceIndentation: String,
|
||||
): String {
|
||||
builder.append(indentation)
|
||||
when (this) {
|
||||
|
@ -15,13 +15,13 @@ object Aggregate {
|
||||
|
||||
fun <TExpression, Boundary> bucket(
|
||||
groupBy: TExpression,
|
||||
boundaries: List<Boundary>
|
||||
boundaries: List<Boundary>,
|
||||
): Bson = Aggregates.bucket(groupBy, boundaries)
|
||||
|
||||
fun <TExpression, TBoundary> bucket(
|
||||
groupBy: TExpression,
|
||||
boundaries: List<TBoundary>,
|
||||
options: BucketOptions
|
||||
options: BucketOptions,
|
||||
): Bson = Aggregates.bucket(groupBy, boundaries, options)
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ object Aggregate {
|
||||
fun <TExpression> bucketAuto(
|
||||
groupBy: TExpression,
|
||||
buckets: Int,
|
||||
options: BucketAutoOptions
|
||||
options: BucketAutoOptions,
|
||||
): Bson = Aggregates.bucketAuto(groupBy, buckets, options)
|
||||
|
||||
fun count(): Bson = Aggregates.count()
|
||||
@ -48,7 +48,7 @@ object Aggregate {
|
||||
from: String,
|
||||
localField: String,
|
||||
foreignField: String,
|
||||
`as`: String
|
||||
`as`: String,
|
||||
): Bson = Aggregates.lookup(from, localField, foreignField, `as`)
|
||||
|
||||
fun lookup(from: String, pipeline: List<Bson?>, `as`: String): Bson = Aggregates.lookup(from, pipeline, `as`)
|
||||
@ -56,7 +56,7 @@ object Aggregate {
|
||||
from: String,
|
||||
let: List<Variable<TExpression>>? = null,
|
||||
pipeline: List<Bson>,
|
||||
`as`: String
|
||||
`as`: String,
|
||||
): Bson = Aggregates.lookup(from, let, pipeline, `as`)
|
||||
|
||||
|
||||
@ -68,7 +68,7 @@ object Aggregate {
|
||||
startWith: TExpression,
|
||||
connectFromField: String,
|
||||
connectToField: String,
|
||||
`as`: String
|
||||
`as`: String,
|
||||
): Bson = Aggregates.graphLookup(from, startWith, connectFromField, connectToField, `as`)
|
||||
|
||||
fun <TExpression> graphLookup(
|
||||
@ -77,18 +77,18 @@ object Aggregate {
|
||||
connectFromField: String,
|
||||
connectToField: String,
|
||||
`as`: String,
|
||||
options: GraphLookupOptions
|
||||
options: GraphLookupOptions,
|
||||
): Bson = Aggregates.graphLookup(from, startWith, connectFromField, connectToField, `as`, options)
|
||||
|
||||
|
||||
fun <TExpression> group(
|
||||
id: TExpression? = null,
|
||||
vararg fieldAccumulators: BsonField
|
||||
vararg fieldAccumulators: BsonField,
|
||||
): Bson = Aggregates.group(id, fieldAccumulators.asList())
|
||||
|
||||
fun <TExpression> group(
|
||||
id: TExpression? = null,
|
||||
fieldAccumulators: List<BsonField>
|
||||
fieldAccumulators: List<BsonField>,
|
||||
): Bson = Aggregates.group(id, fieldAccumulators)
|
||||
|
||||
fun unwind(field: KProperty1<*, *>): Bson = Aggregates.unwind(MongoUtil.fieldName(field))
|
||||
|
@ -27,7 +27,7 @@ interface MongoOperator<T : Any> : BsonFactory<T>, Closeable {
|
||||
|
||||
suspend fun saveDocument(
|
||||
documents: List<Document>,
|
||||
options: InsertManyOptions = InsertManyOptions()
|
||||
options: InsertManyOptions = InsertManyOptions(),
|
||||
): InsertManyResult?
|
||||
|
||||
suspend fun insertOne(entity: T, options: InsertOneOptions = InsertOneOptions()): InsertOneResult? {
|
||||
|
@ -7,49 +7,49 @@ import kotlin.reflect.KProperty
|
||||
@Suppress("unused")
|
||||
object AggregationBuilder : MongoName {
|
||||
inline infix operator fun invoke(
|
||||
operatorBuilder: AggregationBuilder.(MutableList<AggregationOperation>) -> MutableList<AggregationOperation>
|
||||
operatorBuilder: AggregationBuilder.(MutableList<AggregationOperation>) -> MutableList<AggregationOperation>,
|
||||
): Aggregation {
|
||||
val operator = this.operatorBuilder(ArrayList())
|
||||
return Aggregation.newAggregation(operator)
|
||||
}
|
||||
|
||||
infix operator fun MutableList<AggregationOperation>.plus(
|
||||
operation: AggregationOperation
|
||||
operation: AggregationOperation,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(operation)
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.match(
|
||||
builder: QueryBuilder.() -> Unit
|
||||
builder: QueryBuilder.() -> Unit,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.match(QueryBuilder criteria builder))
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.group(
|
||||
builder: GroupBuilder.() -> AggregationOperation
|
||||
builder: GroupBuilder.() -> AggregationOperation,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(GroupBuilder.builder())
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.project(
|
||||
builder: ProjectBuilder.() -> AggregationOperation
|
||||
builder: ProjectBuilder.() -> AggregationOperation,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(ProjectBuilder.builder())
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.unwind(
|
||||
field: String
|
||||
field: String,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.unwind(field))
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.unwind(
|
||||
field: KProperty<*>
|
||||
field: KProperty<*>,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.unwind(field.mongoName))
|
||||
return this
|
||||
@ -57,21 +57,21 @@ object AggregationBuilder : MongoName {
|
||||
|
||||
@JvmName("unwindString")
|
||||
infix fun MutableList<AggregationOperation>.unwind(
|
||||
field: () -> String
|
||||
field: () -> String,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.unwind(field()))
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.unwind(
|
||||
field: () -> KProperty<*>
|
||||
field: () -> KProperty<*>,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.unwind(field().mongoName))
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.sort(
|
||||
builder: SortBuilder.() -> Unit
|
||||
builder: SortBuilder.() -> Unit,
|
||||
): MutableList<AggregationOperation> {
|
||||
val sortBuilder = SortBuilder()
|
||||
sortBuilder.invoke(builder)
|
||||
@ -80,14 +80,14 @@ object AggregationBuilder : MongoName {
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.skip(
|
||||
skip: Long
|
||||
skip: Long,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.skip(skip))
|
||||
return this
|
||||
}
|
||||
|
||||
infix fun MutableList<AggregationOperation>.limit(
|
||||
limit: Long
|
||||
limit: Long,
|
||||
): MutableList<AggregationOperation> {
|
||||
add(Aggregation.limit(limit))
|
||||
return this
|
||||
|
@ -30,9 +30,9 @@ object MongoUtil {
|
||||
entity.javaClass.declaredFields.filter {
|
||||
it.isAccessible = true
|
||||
!it.isStatic()
|
||||
&& !it.isTransient()
|
||||
//&& it.getAnnotation(Ignore::class.java) == null
|
||||
&& (it.type != Lazy::class.java || it.get(entity).uncheckedCast<Lazy<*>>().isInitialized())
|
||||
&& !it.isTransient()
|
||||
//&& it.getAnnotation(Ignore::class.java) == null
|
||||
&& (it.type != Lazy::class.java || it.get(entity).uncheckedCast<Lazy<*>>().isInitialized())
|
||||
}.forEach {
|
||||
injectValue(bson, it.get(entity) ?: return@forEach, it)
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ internal val criteriaChainField: java.lang.reflect.Field? = try {
|
||||
}
|
||||
|
||||
fun List<Criteria>.toAndCriteria(
|
||||
uniqueField: Boolean = toSetNotNull { it.key }.size == size
|
||||
uniqueField: Boolean = toSetNotNull { it.key }.size == size,
|
||||
) = when (size) {
|
||||
0 -> Criteria()
|
||||
1 -> first()
|
||||
|
@ -4,44 +4,46 @@ import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper
|
||||
|
||||
inline fun <C : EnhanceCompare<T, W, Children>, T, W : AbstractWrapper<T, String, W>, Children : Wrapper<T>> C.compare(
|
||||
compare: EnhanceCompare<T, W, Children>.() -> Unit
|
||||
compare: EnhanceCompare<T, W, Children>.() -> Unit,
|
||||
): C {
|
||||
compare()
|
||||
return this
|
||||
}
|
||||
|
||||
inline fun <C : FuncEnhance<T, Children>, T, Children : Wrapper<T>> C.func(
|
||||
func: FuncEnhance<T, Children>.() -> Unit
|
||||
func: FuncEnhance<T, Children>.() -> Unit,
|
||||
): C {
|
||||
func()
|
||||
return this
|
||||
}
|
||||
|
||||
inline fun <C : JoinEnhance<Children>, Children> C.join(
|
||||
join: JoinEnhance<Children>.() -> Unit
|
||||
join: JoinEnhance<Children>.() -> Unit,
|
||||
): C {
|
||||
join()
|
||||
return this
|
||||
}
|
||||
|
||||
inline fun <C : EnhanceQuery<T, Children>, T, Children : Wrapper<T>> C.query(
|
||||
query: EnhanceQuery<T, Children>.() -> Unit
|
||||
query: EnhanceQuery<T, Children>.() -> Unit,
|
||||
): C {
|
||||
query()
|
||||
return this
|
||||
}
|
||||
|
||||
inline fun <C : EnhanceUpdate<T, Children>, T, Children : Wrapper<T>> C.update(
|
||||
update: EnhanceUpdate<T, Children>.() -> Unit
|
||||
update: EnhanceUpdate<T, Children>.() -> Unit,
|
||||
): C {
|
||||
update()
|
||||
return this
|
||||
}
|
||||
|
||||
inline fun <C : KtEnhanceWrapper<T, W, EnhanceWrapper>,
|
||||
T, W : AbstractWrapper<T, String, out W>, EnhanceWrapper : Wrapper<T>>
|
||||
inline fun <
|
||||
C : KtEnhanceWrapper<T, W, EnhanceWrapper>,
|
||||
T, W : AbstractWrapper<T, String, out W>, EnhanceWrapper : Wrapper<T>,
|
||||
>
|
||||
C.query(
|
||||
query: KtEnhanceWrapper<T, W, EnhanceWrapper>.() -> Unit
|
||||
query: KtEnhanceWrapper<T, W, EnhanceWrapper>.() -> Unit,
|
||||
): C {
|
||||
query()
|
||||
return this
|
||||
|
@ -6,70 +6,70 @@ import com.baomidou.mybatisplus.extension.service.IService
|
||||
|
||||
|
||||
inline fun <reified T> IService<T>.update(
|
||||
wrapperBuilder: KtEnhanceUpdateWrapper<T>.() -> Unit
|
||||
wrapperBuilder: KtEnhanceUpdateWrapper<T>.() -> Unit,
|
||||
): Boolean {
|
||||
val wrapper = KtEnhanceUpdateWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return update(wrapper)
|
||||
val wrapper = KtEnhanceUpdateWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return update(wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T> IService<T>.update(
|
||||
queryBuilder: KtEnhanceWrapper<T, UpdateWrapper<T>, KtEnhanceUpdateWrapper<T>>.() -> Unit,
|
||||
updateBuilder: EnhanceUpdate<T, KtEnhanceUpdateWrapper<T>>.() -> Unit
|
||||
queryBuilder: KtEnhanceWrapper<T, UpdateWrapper<T>, KtEnhanceUpdateWrapper<T>>.() -> Unit,
|
||||
updateBuilder: EnhanceUpdate<T, KtEnhanceUpdateWrapper<T>>.() -> Unit,
|
||||
): Boolean {
|
||||
val wrapper = KtEnhanceUpdateWrapper<T>()
|
||||
wrapper.queryBuilder()
|
||||
wrapper.updateBuilder()
|
||||
return update(wrapper)
|
||||
val wrapper = KtEnhanceUpdateWrapper<T>()
|
||||
wrapper.queryBuilder()
|
||||
wrapper.updateBuilder()
|
||||
return update(wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T> IService<T>.remove(
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): Boolean {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return remove(wrapper)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return remove(wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T> IService<T>.getOne(
|
||||
throwEx: Boolean = true,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
throwEx: Boolean = true,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): T {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return getOne(wrapper, throwEx)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return getOne(wrapper, throwEx)
|
||||
}
|
||||
|
||||
inline fun <reified T> IService<T>.count(
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): Long {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return count(wrapper)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return count(wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T> IService<T>.list(
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): List<T> {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return list(wrapper)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return list(wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T, E : IPage<T>> IService<T>.page(
|
||||
page: E,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
page: E,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): E {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return page(page, wrapper)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return page(page, wrapper)
|
||||
}
|
||||
|
||||
inline fun <reified T, E : IPage<Map<String, Any>>> IService<T>.pageMaps(
|
||||
page: E,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
|
||||
page: E,
|
||||
wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit,
|
||||
): E {
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return pageMaps(page, wrapper)
|
||||
val wrapper = KtEnhanceQueryWrapper<T>()
|
||||
wrapper.wrapperBuilder()
|
||||
return pageMaps(page, wrapper)
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package cn.tursom.database.mybatisplus
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
|
||||
|
||||
class KtEnhanceQueryWrapper<T>(
|
||||
override var enhanceEntityClass: Class<T>
|
||||
override var enhanceEntityClass: Class<T>,
|
||||
) : QueryWrapper<T>(),
|
||||
EnhanceQuery<T, KtEnhanceQueryWrapper<T>>,
|
||||
KtEnhanceWrapper<T, QueryWrapper<T>, KtEnhanceQueryWrapper<T>> {
|
||||
|
@ -9,7 +9,7 @@ interface RegexAbstractWrapperEnhance<T, out W : AbstractWrapper<T, String, out
|
||||
val wrapper: W get() = uncheckedCast()
|
||||
|
||||
infix fun String.regex(
|
||||
value: Any
|
||||
value: Any,
|
||||
): Children = WrapperEnhance.regex(wrapper, this, value).uncheckedCast()
|
||||
|
||||
infix fun KProperty1<T, *>.regex(
|
||||
|
@ -23,129 +23,129 @@ import kotlin.reflect.full.findAnnotation
|
||||
import kotlin.reflect.jvm.javaField
|
||||
|
||||
data class FieldData(
|
||||
val field: Field,
|
||||
val name: String,
|
||||
val selectionName: String,
|
||||
val tableField: TableField?,
|
||||
val column: String,
|
||||
val exist: Boolean = !field.transient && !field.static && tableField?.exist ?: true,
|
||||
val field: Field,
|
||||
val name: String,
|
||||
val selectionName: String,
|
||||
val tableField: TableField?,
|
||||
val column: String,
|
||||
val exist: Boolean = !field.transient && !field.static && tableField?.exist ?: true,
|
||||
)
|
||||
|
||||
val String.sqlName: String
|
||||
get() {
|
||||
val sb = StringBuilder()
|
||||
val iterator = iterator()
|
||||
sb.append(iterator.nextChar().lowercaseChar())
|
||||
iterator.forEach {
|
||||
if (it.isUpperCase()) {
|
||||
sb.append('_')
|
||||
sb.append(it.lowercaseChar())
|
||||
} else {
|
||||
sb.append(it)
|
||||
}
|
||||
}
|
||||
return sb.toString()
|
||||
get() {
|
||||
val sb = StringBuilder()
|
||||
val iterator = iterator()
|
||||
sb.append(iterator.nextChar().lowercaseChar())
|
||||
iterator.forEach {
|
||||
if (it.isUpperCase()) {
|
||||
sb.append('_')
|
||||
sb.append(it.lowercaseChar())
|
||||
} else {
|
||||
sb.append(it)
|
||||
}
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
val Class<*>.tableName
|
||||
get() = getAnnotation<TableName>()?.value ?: simpleName.sqlName
|
||||
get() = getAnnotation<TableName>()?.value ?: simpleName.sqlName
|
||||
|
||||
internal val allSelectionFieldMap = ConcurrentHashMap<Class<*>, Array<out String>>()
|
||||
internal val fieldDataMap = ConcurrentHashMap<Field, FieldData>()
|
||||
internal val kPropertyFieldDataMap = ConcurrentHashMap<KProperty<*>, StrongReference<FieldData?>>()
|
||||
|
||||
val Iterable<Field>.filterNotExists
|
||||
get() = asSequence().filter {
|
||||
it.getFieldData().exist
|
||||
}
|
||||
get() = asSequence().filter {
|
||||
it.getFieldData().exist
|
||||
}
|
||||
|
||||
@get:JvmName("filterNotExistsField")
|
||||
val Sequence<Field>.filterNotExists
|
||||
get() = filter {
|
||||
it.getFieldData().exist
|
||||
}
|
||||
get() = filter {
|
||||
it.getFieldData().exist
|
||||
}
|
||||
|
||||
@get:JvmName("filterNotExistsKProperty")
|
||||
val <T : KProperty<*>> Sequence<T>.filterNotExists
|
||||
get() = filter {
|
||||
it.getFieldData()?.exist ?: false
|
||||
}
|
||||
get() = filter {
|
||||
it.getFieldData()?.exist ?: false
|
||||
}
|
||||
|
||||
fun Field.getFieldData(): FieldData = fieldDataMap.getOrPut(this) {
|
||||
val tableField = getAnnotation<TableField>()
|
||||
try {
|
||||
val tableInfo = TableInfoHelper.getTableInfo(declaringClass)
|
||||
tableInfo?.fieldList?.firstOrNull {
|
||||
it.field == this
|
||||
}?.let { tableFieldInfo ->
|
||||
FieldData(
|
||||
field = tableFieldInfo.field,
|
||||
name = "${tableInfo.tableName}.${tableFieldInfo.column}",
|
||||
selectionName = "${tableInfo.tableName}.${tableFieldInfo.column} as ${name.sqlName}",
|
||||
tableField = getAnnotation(),
|
||||
column = tableFieldInfo.column,
|
||||
)
|
||||
} ?: run {
|
||||
if (tableInfo != null) {
|
||||
FieldData(
|
||||
field = this,
|
||||
name = "${tableInfo.tableName}.${name.sqlName}",
|
||||
selectionName = "${tableInfo.tableName}.${name.sqlName}",
|
||||
tableField = tableField,
|
||||
column = tableField?.value ?: name.sqlName,
|
||||
)
|
||||
} else null
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
null
|
||||
val tableField = getAnnotation<TableField>()
|
||||
try {
|
||||
val tableInfo = TableInfoHelper.getTableInfo(declaringClass)
|
||||
tableInfo?.fieldList?.firstOrNull {
|
||||
it.field == this
|
||||
}?.let { tableFieldInfo ->
|
||||
FieldData(
|
||||
field = tableFieldInfo.field,
|
||||
name = "${tableInfo.tableName}.${tableFieldInfo.column}",
|
||||
selectionName = "${tableInfo.tableName}.${tableFieldInfo.column} as ${name.sqlName}",
|
||||
tableField = getAnnotation(),
|
||||
column = tableFieldInfo.column,
|
||||
)
|
||||
} ?: run {
|
||||
val tableName = declaringClass.tableName
|
||||
if (tableInfo != null) {
|
||||
FieldData(
|
||||
field = this,
|
||||
name = "$tableName.${tableField?.value ?: name.sqlName}",
|
||||
selectionName = if (tableField == null) {
|
||||
"$tableName.${name.sqlName}"
|
||||
} else {
|
||||
"$tableName.${tableField.value} as ${name.sqlName}"
|
||||
},
|
||||
tableField = tableField,
|
||||
column = tableField?.value ?: name.sqlName,
|
||||
field = this,
|
||||
name = "${tableInfo.tableName}.${name.sqlName}",
|
||||
selectionName = "${tableInfo.tableName}.${name.sqlName}",
|
||||
tableField = tableField,
|
||||
column = tableField?.value ?: name.sqlName,
|
||||
)
|
||||
} else null
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
null
|
||||
} ?: run {
|
||||
val tableName = declaringClass.tableName
|
||||
FieldData(
|
||||
field = this,
|
||||
name = "$tableName.${tableField?.value ?: name.sqlName}",
|
||||
selectionName = if (tableField == null) {
|
||||
"$tableName.${name.sqlName}"
|
||||
} else {
|
||||
"$tableName.${tableField.value} as ${name.sqlName}"
|
||||
},
|
||||
tableField = tableField,
|
||||
column = tableField?.value ?: name.sqlName,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun KProperty<*>.getFieldData(): FieldData? {
|
||||
return kPropertyFieldDataMap.getOrPut(this) {
|
||||
StrongReference(javaField?.getFieldData() ?: run {
|
||||
val owner = owner ?: return@run null
|
||||
val enhanceField = findAnnotation<EnhanceField>() ?: return@run null
|
||||
if (enhanceField.field.isBlank()) {
|
||||
return@run null
|
||||
}
|
||||
owner.kotlin.allMemberPropertiesSequence.firstOrNull {
|
||||
it.name == enhanceField.field
|
||||
}?.getFieldData()
|
||||
})
|
||||
}?.r
|
||||
return kPropertyFieldDataMap.getOrPut(this) {
|
||||
StrongReference(javaField?.getFieldData() ?: run {
|
||||
val owner = owner ?: return@run null
|
||||
val enhanceField = findAnnotation<EnhanceField>() ?: return@run null
|
||||
if (enhanceField.field.isBlank()) {
|
||||
return@run null
|
||||
}
|
||||
owner.kotlin.allMemberPropertiesSequence.firstOrNull {
|
||||
it.name == enhanceField.field
|
||||
}?.getFieldData()
|
||||
})
|
||||
}?.r
|
||||
}
|
||||
|
||||
fun getAllSelectionFieldArray(clazz: Class<*>): Array<out String> = allSelectionFieldMap.getOrPut(clazz) {
|
||||
clazz.allFieldsSequence.filterNotExists.map {
|
||||
it.getFieldData().column
|
||||
}.toList().toTypedArray()
|
||||
clazz.allFieldsSequence.filterNotExists.map {
|
||||
it.getFieldData().column
|
||||
}.toList().toTypedArray()
|
||||
}
|
||||
|
||||
fun getAllSelectionField(clazz: Class<*>): List<String> = allSelectionFieldMap.getOrPut(clazz) {
|
||||
clazz.allFieldsSequence.filterNotExists.map {
|
||||
it.getFieldData().column
|
||||
}.toList().toTypedArray()
|
||||
clazz.allFieldsSequence.filterNotExists.map {
|
||||
it.getFieldData().column
|
||||
}.toList().toTypedArray()
|
||||
}.asList()
|
||||
|
||||
fun getSelectionField(vararg columns: KProperty<*>): Sequence<String> = getSelectionField(columns.asSequence())
|
||||
fun getSelectionField(columns: Iterable<KProperty<*>>): Sequence<String> = getSelectionField(columns.asSequence())
|
||||
|
||||
fun getSelectionField(columns: Sequence<KProperty<*>>): Sequence<String> = columns.map {
|
||||
it.getFieldData()
|
||||
it.getFieldData()
|
||||
}.filterNotNull().map {
|
||||
it.column
|
||||
it.column
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ plugins {
|
||||
|
||||
dependencies {
|
||||
implementation(project(":ts-core"))
|
||||
implementation(project(":ts-core:ts-coroutine"))
|
||||
implementation(project(":ts-core:ts-encrypt"))
|
||||
implementation(project(":ts-core:ts-buffer"))
|
||||
implementation(project(":ts-core:ts-pool"))
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user