[Kotlin] Support for optional scalars. (#6115)

More information on #6014
This commit is contained in:
Paulo Pinheiro
2020-09-18 08:31:51 +02:00
committed by GitHub
parent e1be8aaadd
commit 6228b66d3d
7 changed files with 463 additions and 31 deletions

View File

@@ -15,6 +15,7 @@
*/
import MyGame.Example.*
import optional_scalars.*
import com.google.flatbuffers.ByteBufferUtil
import com.google.flatbuffers.FlatBufferBuilder
import NamespaceA.*
@@ -77,7 +78,7 @@ class KotlinTest {
TestVectorOfUnions()
TestSharedStringPool()
TestScalarOptional()
println("FlatBuffers test: completed successfully")
}
@@ -467,5 +468,125 @@ class KotlinTest {
assert(offset == fb.createSharedString(testString));
}
}
fun TestScalarOptional() {
val fbb = FlatBufferBuilder(1)
ScalarStuff.startScalarStuff(fbb)
var pos = ScalarStuff.endScalarStuff(fbb)
fbb.finish(pos)
var scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())
assert(scalarStuff.justI8 == 0.toByte())
assert(scalarStuff.maybeI8 == null)
assert(scalarStuff.defaultI8 == 42.toByte())
assert(scalarStuff.justU8 == 0.toUByte())
assert(scalarStuff.maybeU8 == null)
assert(scalarStuff.defaultU8 == 42.toUByte())
assert(scalarStuff.justI16 == 0.toShort())
assert(scalarStuff.maybeI16 == null)
assert(scalarStuff.defaultI16 == 42.toShort())
assert(scalarStuff.justU16 == 0.toUShort())
assert(scalarStuff.maybeU16 == null)
assert(scalarStuff.defaultU16 == 42.toUShort())
assert(scalarStuff.justI32 == 0)
assert(scalarStuff.maybeI32 == null)
assert(scalarStuff.defaultI32 == 42)
assert(scalarStuff.justU32 == 0.toUInt())
assert(scalarStuff.maybeU32 == null)
assert(scalarStuff.defaultU32 == 42U)
assert(scalarStuff.justI64 == 0L)
assert(scalarStuff.maybeI64 == null)
assert(scalarStuff.defaultI64 == 42L)
assert(scalarStuff.justU64 == 0UL)
assert(scalarStuff.maybeU64 == null)
assert(scalarStuff.defaultU64 == 42UL)
assert(scalarStuff.justF32 == 0.0f)
assert(scalarStuff.maybeF32 == null)
assert(scalarStuff.defaultF32 == 42.0f)
assert(scalarStuff.justF64 == 0.0)
assert(scalarStuff.maybeF64 == null)
assert(scalarStuff.defaultF64 == 42.0)
assert(scalarStuff.justBool == false)
assert(scalarStuff.maybeBool == null)
assert(scalarStuff.defaultBool == true)
fbb.clear()
ScalarStuff.startScalarStuff(fbb)
ScalarStuff.addJustI8(fbb, 5.toByte())
ScalarStuff.addMaybeI8(fbb, 5.toByte())
ScalarStuff.addDefaultI8(fbb, 5.toByte())
ScalarStuff.addJustU8(fbb, 6.toUByte())
ScalarStuff.addMaybeU8(fbb, 6.toUByte())
ScalarStuff.addDefaultU8(fbb, 6.toUByte())
ScalarStuff.addJustI16(fbb, 7.toShort())
ScalarStuff.addMaybeI16(fbb, 7.toShort())
ScalarStuff.addDefaultI16(fbb, 7.toShort())
ScalarStuff.addJustU16(fbb, 8.toUShort())
ScalarStuff.addMaybeU16(fbb, 8.toUShort())
ScalarStuff.addDefaultU16(fbb, 8.toUShort())
ScalarStuff.addJustI32(fbb, 9)
ScalarStuff.addMaybeI32(fbb, 9)
ScalarStuff.addDefaultI32(fbb, 9)
ScalarStuff.addJustU32(fbb, 10.toUInt())
ScalarStuff.addMaybeU32(fbb, 10.toUInt())
ScalarStuff.addDefaultU32(fbb, 10.toUInt())
ScalarStuff.addJustI64(fbb, 11L)
ScalarStuff.addMaybeI64(fbb, 11L)
ScalarStuff.addDefaultI64(fbb, 11L)
ScalarStuff.addJustU64(fbb, 12UL)
ScalarStuff.addMaybeU64(fbb, 12UL)
ScalarStuff.addDefaultU64(fbb, 12UL)
ScalarStuff.addJustF32(fbb, 13.0f)
ScalarStuff.addMaybeF32(fbb, 13.0f)
ScalarStuff.addDefaultF32(fbb, 13.0f)
ScalarStuff.addJustF64(fbb, 14.0)
ScalarStuff.addMaybeF64(fbb, 14.0)
ScalarStuff.addDefaultF64(fbb, 14.0)
ScalarStuff.addJustBool(fbb, true)
ScalarStuff.addMaybeBool(fbb, true)
ScalarStuff.addDefaultBool(fbb, true)
pos = ScalarStuff.endScalarStuff(fbb)
fbb.finish(pos)
scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())
assert(scalarStuff.justI8 == 5.toByte())
assert(scalarStuff.maybeI8 == 5.toByte())
assert(scalarStuff.defaultI8 == 5.toByte())
assert(scalarStuff.justU8 == 6.toUByte())
assert(scalarStuff.maybeU8 == 6.toUByte())
assert(scalarStuff.defaultU8 == 6.toUByte())
assert(scalarStuff.justI16 == 7.toShort())
assert(scalarStuff.maybeI16 == 7.toShort())
assert(scalarStuff.defaultI16 == 7.toShort())
assert(scalarStuff.justU16 == 8.toUShort())
assert(scalarStuff.maybeU16 == 8.toUShort())
assert(scalarStuff.defaultU16 == 8.toUShort())
assert(scalarStuff.justI32 == 9)
assert(scalarStuff.maybeI32 == 9)
assert(scalarStuff.defaultI32 == 9)
assert(scalarStuff.justU32 == 10u)
assert(scalarStuff.maybeU32 == 10u)
assert(scalarStuff.defaultU32 == 10u)
assert(scalarStuff.justI64 == 11L)
assert(scalarStuff.maybeI64 == 11L)
assert(scalarStuff.defaultI64 == 11L)
assert(scalarStuff.justU64 == 12UL)
assert(scalarStuff.maybeU64 == 12UL)
assert(scalarStuff.defaultU64 == 12UL)
assert(scalarStuff.justF32 == 13.0f)
assert(scalarStuff.maybeF32 == 13.0f)
assert(scalarStuff.defaultF32 == 13.0f)
assert(scalarStuff.justF64 == 14.0)
assert(scalarStuff.maybeF64 == 14.0)
assert(scalarStuff.defaultF64 == 14.0)
assert(scalarStuff.justBool == true)
assert(scalarStuff.maybeBool == true)
assert(scalarStuff.defaultBool == true)
}
}
}

View File

@@ -53,7 +53,7 @@ $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS $TEST_JS_TS_FLAGS -o namespace
../flatc --dart monster_extra.fbs
# Generate optional scalar code for tests.
../flatc --rust --lobster optional_scalars.fbs
../flatc --kotlin --rust --lobster optional_scalars.fbs
# Generate the schema evolution tests
../flatc --cpp --scoped-enums $TEST_CPP_FLAGS -o evolution_test ./evolution_test/evolution_v*.fbs

View File

@@ -0,0 +1,268 @@
// automatically generated by the FlatBuffers compiler, do not modify
package optional_scalars
import java.nio.*
import kotlin.math.sign
import com.google.flatbuffers.*
@Suppress("unused")
@ExperimentalUnsignedTypes
class ScalarStuff : Table() {
fun __init(_i: Int, _bb: ByteBuffer) {
__reset(_i, _bb)
}
fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {
__init(_i, _bb)
return this
}
val justI8 : Byte
get() {
val o = __offset(4)
return if(o != 0) bb.get(o + bb_pos) else 0
}
val maybeI8 : Byte?
get() {
val o = __offset(6)
return if(o != 0) bb.get(o + bb_pos) else null
}
val defaultI8 : Byte
get() {
val o = __offset(8)
return if(o != 0) bb.get(o + bb_pos) else 42
}
val justU8 : UByte
get() {
val o = __offset(10)
return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u
}
val maybeU8 : UByte?
get() {
val o = __offset(12)
return if(o != 0) bb.get(o + bb_pos).toUByte() else null
}
val defaultU8 : UByte
get() {
val o = __offset(14)
return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u
}
val justI16 : Short
get() {
val o = __offset(16)
return if(o != 0) bb.getShort(o + bb_pos) else 0
}
val maybeI16 : Short?
get() {
val o = __offset(18)
return if(o != 0) bb.getShort(o + bb_pos) else null
}
val defaultI16 : Short
get() {
val o = __offset(20)
return if(o != 0) bb.getShort(o + bb_pos) else 42
}
val justU16 : UShort
get() {
val o = __offset(22)
return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
}
val maybeU16 : UShort?
get() {
val o = __offset(24)
return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null
}
val defaultU16 : UShort
get() {
val o = __offset(26)
return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u
}
val justI32 : Int
get() {
val o = __offset(28)
return if(o != 0) bb.getInt(o + bb_pos) else 0
}
val maybeI32 : Int?
get() {
val o = __offset(30)
return if(o != 0) bb.getInt(o + bb_pos) else null
}
val defaultI32 : Int
get() {
val o = __offset(32)
return if(o != 0) bb.getInt(o + bb_pos) else 42
}
val justU32 : UInt
get() {
val o = __offset(34)
return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u
}
val maybeU32 : UInt?
get() {
val o = __offset(36)
return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null
}
val defaultU32 : UInt
get() {
val o = __offset(38)
return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u
}
val justI64 : Long
get() {
val o = __offset(40)
return if(o != 0) bb.getLong(o + bb_pos) else 0L
}
val maybeI64 : Long?
get() {
val o = __offset(42)
return if(o != 0) bb.getLong(o + bb_pos) else null
}
val defaultI64 : Long
get() {
val o = __offset(44)
return if(o != 0) bb.getLong(o + bb_pos) else 42L
}
val justU64 : ULong
get() {
val o = __offset(46)
return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL
}
val maybeU64 : ULong?
get() {
val o = __offset(48)
return if(o != 0) bb.getLong(o + bb_pos).toULong() else null
}
val defaultU64 : ULong
get() {
val o = __offset(50)
return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL
}
val justF32 : Float
get() {
val o = __offset(52)
return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f
}
val maybeF32 : Float?
get() {
val o = __offset(54)
return if(o != 0) bb.getFloat(o + bb_pos) else null
}
val defaultF32 : Float
get() {
val o = __offset(56)
return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f
}
val justF64 : Double
get() {
val o = __offset(58)
return if(o != 0) bb.getDouble(o + bb_pos) else 0.0
}
val maybeF64 : Double?
get() {
val o = __offset(60)
return if(o != 0) bb.getDouble(o + bb_pos) else null
}
val defaultF64 : Double
get() {
val o = __offset(62)
return if(o != 0) bb.getDouble(o + bb_pos) else 42.0
}
val justBool : Boolean
get() {
val o = __offset(64)
return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false
}
val maybeBool : Boolean?
get() {
val o = __offset(66)
return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null
}
val defaultBool : Boolean
get() {
val o = __offset(68)
return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true
}
companion object {
fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())
fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {
_bb.order(ByteOrder.LITTLE_ENDIAN)
return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
}
fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean) : Int {
builder.startTable(33)
addDefaultF64(builder, defaultF64)
maybeF64?.run { addMaybeF64(builder, maybeF64) }
addJustF64(builder, justF64)
addDefaultU64(builder, defaultU64)
maybeU64?.run { addMaybeU64(builder, maybeU64) }
addJustU64(builder, justU64)
addDefaultI64(builder, defaultI64)
maybeI64?.run { addMaybeI64(builder, maybeI64) }
addJustI64(builder, justI64)
addDefaultF32(builder, defaultF32)
maybeF32?.run { addMaybeF32(builder, maybeF32) }
addJustF32(builder, justF32)
addDefaultU32(builder, defaultU32)
maybeU32?.run { addMaybeU32(builder, maybeU32) }
addJustU32(builder, justU32)
addDefaultI32(builder, defaultI32)
maybeI32?.run { addMaybeI32(builder, maybeI32) }
addJustI32(builder, justI32)
addDefaultU16(builder, defaultU16)
maybeU16?.run { addMaybeU16(builder, maybeU16) }
addJustU16(builder, justU16)
addDefaultI16(builder, defaultI16)
maybeI16?.run { addMaybeI16(builder, maybeI16) }
addJustI16(builder, justI16)
addDefaultBool(builder, defaultBool)
maybeBool?.run { addMaybeBool(builder, maybeBool) }
addJustBool(builder, justBool)
addDefaultU8(builder, defaultU8)
maybeU8?.run { addMaybeU8(builder, maybeU8) }
addJustU8(builder, justU8)
addDefaultI8(builder, defaultI8)
maybeI8?.run { addMaybeI8(builder, maybeI8) }
addJustI8(builder, justI8)
return endScalarStuff(builder)
}
fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(33)
fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)
fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)
fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)
fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)
fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)
fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)
fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)
fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)
fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)
fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)
fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)
fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)
fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)
fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)
fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)
fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)
fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)
fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)
fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)
fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)
fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)
fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)
fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)
fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)
fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)
fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)
fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)
fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)
fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)
fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)
fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)
fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)
fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)
fun endScalarStuff(builder: FlatBufferBuilder) : Int {
val o = builder.endTable()
return o
}
}
}

View File

@@ -3466,6 +3466,7 @@ void OptionalScalarsTest() {
const int kNumLanguages = 17;
const auto supported = (flatbuffers::IDLOptions::kRust |
flatbuffers::IDLOptions::kSwift |
flatbuffers::IDLOptions::kKotlin |
flatbuffers::IDLOptions::kLobster);
for (int lang=0; lang<kNumLanguages; lang++) {
flatbuffers::IDLOptions opts;