update buffers

This commit is contained in:
tursom 2021-07-13 22:22:59 +08:00
parent 7045d77c7d
commit 858cb31fbc
6 changed files with 104 additions and 42 deletions

View File

@ -745,24 +745,26 @@ inline fun Double.toBytes(byteOrder: ByteOrder = ByteOrder.nativeOrder(), action
inline fun toChar(byteOrder: ByteOrder = ByteOrder.nativeOrder(), get: () -> Byte): Char {
return when (byteOrder) {
ByteOrder.LITTLE_ENDIAN -> {
(get().toInt() or (get().toInt() shl 8))
get().toInt() or (get().toInt() shl 8)
}
ByteOrder.BIG_ENDIAN -> {
val late = get()
(get().toInt() or (late.toInt() shl 8))
get().toInt() or (late.toInt() shl 8)
}
else -> {
throw UnsupportedOperationException()
}
else -> throw UnsupportedOperationException()
}.toChar()
}
inline fun toShort(byteOrder: ByteOrder = ByteOrder.nativeOrder(), get: () -> Byte): Short {
return when (byteOrder) {
ByteOrder.LITTLE_ENDIAN -> {
(get().toInt() or (get().toInt() shl 8))
get().toInt() or (get().toInt() shl 8)
}
ByteOrder.BIG_ENDIAN -> {
val late = get()
(get().toInt() or (late.toInt() shl 8))
get().toInt() or (late.toInt() shl 8)
}
else -> throw UnsupportedOperationException()
}.toShort()

View File

@ -1,8 +1,7 @@
package cn.tursom.core.buffer
import cn.tursom.core.AsyncFile
import cn.tursom.core.*
import cn.tursom.core.Utils.bufferThreadLocal
import cn.tursom.core.forEachIndex
import java.io.Closeable
import java.io.IOException
import java.io.InputStream
@ -94,12 +93,19 @@ interface ByteBuffer : Closeable {
}
fun get(): Byte = read { it.get() }
fun getChar(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Char = read { it.char }
fun getShort(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Short = read { it.short }
fun getInt(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Int = read { it.int }
fun getLong(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Long = read { it.long }
fun getFloat(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Float = read { it.float }
fun getDouble(byteOrder: ByteOrder = ByteOrder.nativeOrder()): Double = read { it.double }
fun getChar(): Char = read { it.char }
fun getShort(): Short = read { it.short }
fun getInt(): Int = read { it.int }
fun getLong(): Long = read { it.long }
fun getFloat(): Float = read { it.float }
fun getDouble(): Double = read { it.double }
fun getChar(byteOrder: ByteOrder): Char = toChar(byteOrder) { get() }
fun getShort(byteOrder: ByteOrder): Short = toShort(byteOrder) { get() }
fun getInt(byteOrder: ByteOrder): Int = toInt(byteOrder) { get() }
fun getLong(byteOrder: ByteOrder): Long = toLong(byteOrder) { get() }
fun getFloat(byteOrder: ByteOrder): Float = toFloat(byteOrder) { get() }
fun getDouble(byteOrder: ByteOrder): Double = toDouble(byteOrder) { get() }
fun getBytes(size: Int = readable): ByteArray = read {
val bytes = ByteArray(size)
@ -177,6 +183,14 @@ interface ByteBuffer : Closeable {
fun put(long: Long): Unit = write { it.putLong(long) }
fun put(float: Float): Unit = write { it.putFloat(float) }
fun put(double: Double): Unit = write { it.putDouble(double) }
fun put(char: Char, byteOrder: ByteOrder): Unit = char.toBytes(byteOrder) { put(it) }
fun put(short: Short, byteOrder: ByteOrder): Unit = short.toBytes(byteOrder) { put(it) }
fun put(int: Int, byteOrder: ByteOrder): Unit = int.toBytes(byteOrder) { put(it) }
fun put(long: Long, byteOrder: ByteOrder): Unit = long.toBytes(byteOrder) { put(it) }
fun put(float: Float, byteOrder: ByteOrder): Unit = float.toBytes(byteOrder) { put(it) }
fun put(double: Double, byteOrder: ByteOrder): Unit = double.toBytes(byteOrder) { put(it) }
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 {

View File

@ -7,6 +7,9 @@ package cn.tursom.core.buffer
import cn.tursom.buffer.MultipleByteBuffer
import cn.tursom.core.buffer.impl.ArrayByteBuffer
import cn.tursom.core.toBytes
import cn.tursom.core.toInt
import java.nio.ByteOrder
import java.nio.channels.GatheringByteChannel
import java.nio.channels.ReadableByteChannel
import java.nio.channels.ScatteringByteChannel
@ -152,4 +155,69 @@ val Collection<ByteBuffer>.writeable: Int
var size = 0
forEach { size += it.writeable }
return size
}
}
fun ByteBuffer.getIntWithSize(size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()): Int {
var time = 4
return toInt(byteOrder) {
if (--time < size) {
get()
} else {
0
}
}
}
fun ByteBuffer.getLongWithSize(size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()): Int {
var time = 8
return toInt(byteOrder) {
if (--time < size) {
get()
} else {
0
}
}
}
fun ByteBuffer.putIntWithSize(n: Int, size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()) {
when (byteOrder) {
ByteOrder.LITTLE_ENDIAN -> {
var time = size
n.toBytes(ByteOrder.LITTLE_ENDIAN) {
if (time++ < 4) {
put(it)
}
}
}
ByteOrder.BIG_ENDIAN -> {
var time = size
n.toBytes(ByteOrder.BIG_ENDIAN) {
if (++time > 4) {
put(it)
}
}
}
}
}
fun ByteBuffer.putLongWithSize(l: Long, size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()) {
when (byteOrder) {
ByteOrder.LITTLE_ENDIAN -> {
var time = size
l.toBytes(ByteOrder.LITTLE_ENDIAN) {
if (time++ < 8) {
put(it)
}
}
}
ByteOrder.BIG_ENDIAN -> {
var time = size
l.toBytes(ByteOrder.BIG_ENDIAN) {
if (++time > 8) {
put(it)
}
}
}
}
}

View File

@ -33,6 +33,7 @@ class DirectByteBuffer(
}
override fun reset() {
if (readPosition == 0) return
if (writePosition == readPosition) {
readPosition = 0
writePosition = 0
@ -40,8 +41,8 @@ class DirectByteBuffer(
buffer.limit(writePosition)
buffer.position(readPosition)
buffer.compact()
readPosition = buffer.position()
writePosition = buffer.limit()
readPosition = 0
writePosition = buffer.position()
}
}

View File

@ -41,6 +41,7 @@ class HeapByteBuffer(
}
override fun reset() {
if (readPosition == 0) return
if (writePosition == readPosition) {
readPosition = 0
writePosition = 0
@ -48,8 +49,8 @@ class HeapByteBuffer(
buffer.limit(writePosition)
buffer.position(readPosition)
buffer.compact()
readPosition = buffer.position()
writePosition = buffer.limit()
readPosition = 0
writePosition = buffer.position()
}
}

View File

@ -11,8 +11,6 @@ package cn.tursom.core.buffer
import cn.tursom.core.Unsafe.unsafe
import cn.tursom.core.isStatic
import cn.tursom.core.toInt
import java.nio.ByteOrder
class UnsupportedException : Exception()
@ -208,25 +206,3 @@ fun <T> ByteBuffer.unSerialize(clazz: Class<T>): T {
inline fun <reified T : Any> ByteBuffer.unSerialize(): T {
return unSerialize(T::class.java)
}
fun ByteBuffer.getIntWithSize(size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()): Int {
var time = 4
return toInt(byteOrder) {
if (--time < size) {
get()
} else {
0
}
}
}
fun ByteBuffer.getLongWithSize(size: Int, byteOrder: ByteOrder = ByteOrder.nativeOrder()): Int {
var time = 8
return toInt(byteOrder) {
if (--time < size) {
get()
} else {
0
}
}
}