Skip to content

Instantly share code, notes, and snippets.

@BomBardyGamer
Created July 11, 2021 23:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BomBardyGamer/95acca716345c7bf73c33fd5ebb503e5 to your computer and use it in GitHub Desktop.
Save BomBardyGamer/95acca716345c7bf73c33fd5ebb503e5 to your computer and use it in GitHub Desktop.
Highly optimised Steinborn-style VarLong writing, with full support up to 10 bit var longs
fun ByteBuf.writeVarLong(value: Long) {
when {
value and (0xFFFFFFFF shl 7) == 0L -> writeByte(value.toInt())
value and (0xFFFFFFFF shl 14) == 0L -> writeShort((value and 0x7F or 0x80 shl 8 or (value ushr 7)).toInt())
value and (0xFFFFFFFF shl 21) == 0L -> writeMedium((value and 0x7F or 0x80 shl 16 or (value ushr 7 and 0x7F or 0x80 shl 8) or (value ushr 14)).toInt())
value and (0xFFFFFFFF shl 28) == 0L -> writeInt((value and 0x7F or 0x80 shl 24 or (value ushr 7 and 0x7F or 0x80 shl 16) or (value ushr 14 and 0x7F or 0x80 shl 8) or (value ushr 21)).toInt())
value and (0xFFFFFFFF shl 35) == 0L -> {
writeInt((value and 0x7F or 0x80 shl 24 or (value ushr 7 and 0x7F or 0x80 shl 16) or (value ushr 14 and 0x7F or 0x80 shl 8) or (value ushr 21 and 0x7F or 0x80)).toInt())
writeByte((value ushr 28).toInt())
}
value and (0xFFFFFFFF shl 42) == 0L -> {
writeInt((value and 0x7F or 0x80 shl 24 or (value ushr 7 and 0x7F or 0x80 shl 16) or (value ushr 14 and 0x7F or 0x80 shl 8) or (value ushr 21 and 0x7F or 0x80)).toInt())
writeShort((value ushr 28 and 0x7F or 0x80 shl 8 or (value ushr 35)).toInt())
}
value and (0xFFFFFFFF shl 49) == 0L -> {
writeInt((value and 0x7F or 0x80 shl 24 or (value ushr 7 and 0x7F or 0x80 shl 16) or (value ushr 14 and 0x7F or 0x80 shl 8) or (value ushr 21 and 0x7F or 0x80)).toInt())
writeMedium((value ushr 28 and 0x7F or 0x80 shl 16 or (value ushr 35 and 0x7F or 0x80 shl 8) or (value ushr 42)).toInt())
}
value and (0xFFFFFFFF shl 56) == 0L -> {
writeLong((value and 0x7F or 0x80 shl 56 or (value ushr 7 and 0x7F or 0x80 shl 48) or (value ushr 14 and 0x7F or 0x80 shl 40) or (value ushr 21 and 0x7F or 0x80 shl 32) or (value ushr 28 and 0x7F or 0x80 shl 24) or (value ushr 35 and 0x7F or 0x80 shl 16) or (value ushr 42 and 0x7F or 0x80 shl 8) or (value ushr 49)))
}
value and (0xFFFFFFFF shl 63) == 0L -> {
writeLong((value and 0x7F or 0x80 shl 56 or (value ushr 7 and 0x7F or 0x80 shl 48) or (value ushr 14 and 0x7F or 0x80 shl 40) or (value ushr 21 and 0x7F or 0x80 shl 32) or (value ushr 28 and 0x7F or 0x80 shl 24) or (value ushr 35 and 0x7F or 0x80 shl 16) or (value ushr 42 and 0x7F or 0x80 shl 8) or (value ushr 49 and 0x7F or 0x80)))
writeByte((value ushr 56).toInt())
}
value and (0xFFFFFFFF shl 70) == 0L -> {
writeLong((value and 0x7F or 0x80 shl 56 or (value ushr 7 and 0x7F or 0x80 shl 48) or (value ushr 14 and 0x7F or 0x80 shl 40) or (value ushr 21 and 0x7F or 0x80 shl 32) or (value ushr 28 and 0x7F or 0x80 shl 24) or (value ushr 35 and 0x7F or 0x80 shl 16) or (value ushr 42 and 0x7F or 0x80 shl 8) or (value ushr 49 and 0x7F or 0x80)))
writeShort((value ushr 56 and 0x7F or 0x80 shl 8 or (value ushr 63)).toInt())
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment