This commit is contained in:
tursom 2022-04-16 21:27:47 +08:00
parent 58158b4662
commit 5a89be88df
189 changed files with 9440 additions and 2222 deletions

View File

@ -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)

View File

@ -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>()

View File

@ -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() {

View File

@ -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()

View File

@ -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)

View File

@ -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() {

View File

@ -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) {

View File

@ -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)

View File

@ -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)
}) {

View File

@ -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 ->

View File

@ -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,

View File

@ -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 ->

View File

@ -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

View File

@ -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)

View File

@ -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> {
/**
* 向缓冲中添加一个写入对象

View File

@ -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> {
/**
* 向缓冲中添加一个写入对象

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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,
)

View File

@ -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 {

View File

@ -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)

View File

@ -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)
}

View File

@ -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
}
}

View File

@ -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)
/**
* 使用读 bufferByteBuffer 实现类有义务维护指针正常推进
*/
fun <T> readBuffer(block: (java.nio.ByteBuffer) -> T): T {
val buffer = readBuffer()
return try {
block(buffer)
} finally {
finishRead(buffer)
}
}
/**
* 使用写 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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 {

View File

@ -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
/**
* 使用读 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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 {
/**
* 使用写 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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)

View File

@ -10,4 +10,3 @@ interface ByteBufferExtensionKey<T> {
null
}
}

View File

@ -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)
/**
* 使用读 bufferByteBuffer 实现类有义务维护指针正常推进
*/
fun <T> readBuffers(block: (Sequence<java.nio.ByteBuffer>) -> T): T {
val buffer = readBufferSequence()
return try {
block(buffer)
} finally {
finishRead(buffer)
}
}
/**
* 使用写 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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()
}

View File

@ -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
}
}

View File

@ -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
/**
* 使用读 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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()
}

View File

@ -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
/**
* 使用写 bufferByteBuffer 实现类有义务维护指针正常推进
*/
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
}
}

View File

@ -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() }
}

View File

@ -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() {

View File

@ -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() {

View File

@ -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++]
}
}

View File

@ -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 {

View File

@ -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()

View File

@ -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)

View File

@ -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() }))

View File

@ -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))

View File

@ -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() })

View File

@ -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)

View File

@ -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())

View File

@ -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() {

View File

@ -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)
}
}

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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()
}
}

View File

@ -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++]

View File

@ -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 }

View File

@ -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) {

View File

@ -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()

View File

@ -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()

View File

@ -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

View File

@ -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()

View File

@ -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]

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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")!!

View File

@ -1,5 +1,5 @@
package cn.tursom.core.encrypt
class AESPool(
initSize: Int = 16
initSize: Int = 16,
) : EncryptPool<AES>(initSize, { AES() })

View File

@ -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

View File

@ -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()

View File

@ -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 {

View File

@ -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>()

View File

@ -1,5 +1,5 @@
package cn.tursom.core.encrypt
class RSAPool(
initSize: Int = 16
initSize: Int = 16,
) : EncryptPool<RSA>(initSize, { RSA() })

View File

@ -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(

View File

@ -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,
)

View File

@ -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 ->
// 跳过已读邮件

View File

@ -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) {

View File

@ -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,

View File

@ -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,

View File

@ -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>>()

View File

@ -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)"

View File

@ -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)"

View File

@ -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>()

View File

@ -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

View File

@ -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 {

View File

@ -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) {

View File

@ -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)
}

View File

@ -7,7 +7,7 @@ interface XmlElement {
fun toString(
builder: StringBuilder,
indentation: String,
advanceIndentation: String
advanceIndentation: String,
): String {
builder.append(indentation)
when (this) {

View File

@ -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))

View File

@ -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? {

View File

@ -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

View File

@ -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)
}

View File

@ -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()

View File

@ -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

View File

@ -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)
}

View File

@ -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>> {

View File

@ -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(

View File

@ -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
}

View File

@ -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