From ea92a668d8aa7460dc4ce1a5039fac721a7c270b Mon Sep 17 00:00:00 2001 From: Derek Bailey Date: Fri, 30 Oct 2020 13:18:59 -0700 Subject: [PATCH] [C#] Optional Scalars (#6217) * [C#] Optional Scalars * Moved scalar optional check to avoid null enum conversion --- net/FlatBuffers/FlatBufferBuilder.cs | 89 +++++++ src/idl_gen_csharp.cpp | 35 ++- src/idl_parser.cpp | 15 +- .../FlatBufferBuilderTests.cs | 220 ++++++++++++++++++ .../FlatBuffers.Core.Test.csproj | 6 + .../FlatBuffers.Test/FlatBuffers.Test.csproj | 6 + .../FlatBuffersExampleTests.cs | 206 ++++++++++++++++ tests/generate_code.bat | 2 +- tests/generate_code.sh | 2 +- tests/optional_scalars/OptionalByte.cs | 16 ++ tests/optional_scalars/ScalarStuff.cs | 183 +++++++++++++++ 11 files changed, 758 insertions(+), 22 deletions(-) create mode 100644 tests/optional_scalars/OptionalByte.cs create mode 100644 tests/optional_scalars/ScalarStuff.cs diff --git a/net/FlatBuffers/FlatBufferBuilder.cs b/net/FlatBuffers/FlatBufferBuilder.cs index ba3839488..c72b6248a 100644 --- a/net/FlatBuffers/FlatBufferBuilder.cs +++ b/net/FlatBuffers/FlatBufferBuilder.cs @@ -449,6 +449,15 @@ namespace FlatBuffers /// The default value to compare the value against public void AddBool(int o, bool x, bool d) { if (ForceDefaults || x != d) { AddBool(x); Slot(o); } } + /// + /// Adds a Boolean to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable boolean value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddBool(int o, bool? x) { if (x.HasValue) { AddBool(x.Value); Slot(o); } } + + /// /// Adds a SByte to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -458,6 +467,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddSbyte(int o, sbyte x, sbyte d) { if (ForceDefaults || x != d) { AddSbyte(x); Slot(o); } } + /// + /// Adds a SByte to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable sbyte value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddSbyte(int o, sbyte? x) { if (x.HasValue) { AddSbyte(x.Value); Slot(o); } } + /// /// Adds a Byte to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -467,6 +484,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddByte(int o, byte x, byte d) { if (ForceDefaults || x != d) { AddByte(x); Slot(o); } } + /// + /// Adds a Byte to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable byte value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddByte(int o, byte? x) { if (x.HasValue) { AddByte(x.Value); Slot(o); } } + /// /// Adds a Int16 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -476,6 +501,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddShort(int o, short x, int d) { if (ForceDefaults || x != d) { AddShort(x); Slot(o); } } + /// + /// Adds a Int16 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable int16 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddShort(int o, short? x) { if (x.HasValue) { AddShort(x.Value); Slot(o); } } + /// /// Adds a UInt16 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -485,6 +518,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddUshort(int o, ushort x, ushort d) { if (ForceDefaults || x != d) { AddUshort(x); Slot(o); } } + /// + /// Adds a Uint16 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable uint16 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddUshort(int o, ushort? x) { if (x.HasValue) { AddUshort(x.Value); Slot(o); } } + /// /// Adds an Int32 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -494,6 +535,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddInt(int o, int x, int d) { if (ForceDefaults || x != d) { AddInt(x); Slot(o); } } + /// + /// Adds a Int32 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable int32 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddInt(int o, int? x) { if (x.HasValue) { AddInt(x.Value); Slot(o); } } + /// /// Adds a UInt32 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -503,6 +552,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddUint(int o, uint x, uint d) { if (ForceDefaults || x != d) { AddUint(x); Slot(o); } } + /// + /// Adds a UInt32 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable uint32 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddUint(int o, uint? x) { if (x.HasValue) { AddUint(x.Value); Slot(o); } } + /// /// Adds an Int64 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -512,6 +569,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddLong(int o, long x, long d) { if (ForceDefaults || x != d) { AddLong(x); Slot(o); } } + /// + /// Adds a Int64 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable int64 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddLong(int o, long? x) { if (x.HasValue) { AddLong(x.Value); Slot(o); } } + /// /// Adds a UInt64 to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -521,6 +586,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddUlong(int o, ulong x, ulong d) { if (ForceDefaults || x != d) { AddUlong(x); Slot(o); } } + /// + /// Adds a UInt64 to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable int64 value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddUlong(int o, ulong? x) { if (x.HasValue) { AddUlong(x.Value); Slot(o); } } + /// /// Adds a Single to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -530,6 +603,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddFloat(int o, float x, double d) { if (ForceDefaults || x != d) { AddFloat(x); Slot(o); } } + /// + /// Adds a Single to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable single value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddFloat(int o, float? x) { if (x.HasValue) { AddFloat(x.Value); Slot(o); } } + /// /// Adds a Double to the Table at index `o` in its vtable using the value `x` and default `d` /// @@ -539,6 +620,14 @@ namespace FlatBuffers /// The default value to compare the value against public void AddDouble(int o, double x, double d) { if (ForceDefaults || x != d) { AddDouble(x); Slot(o); } } + /// + /// Adds a Double to the Table at index `o` in its vtable using the nullable value `x` + /// + /// The index into the vtable + /// The nullable double value to put into the buffer. If it doesn't have a value + /// it will skip writing to the buffer. + public void AddDouble(int o, double? x) { if (x.HasValue) { AddDouble(x.Value); Slot(o); } } + /// /// Adds a buffer offset to the Table at index `o` in its vtable using the value `x` and default `d` /// diff --git a/src/idl_gen_csharp.cpp b/src/idl_gen_csharp.cpp index 3c1331e32..f98df4cc7 100644 --- a/src/idl_gen_csharp.cpp +++ b/src/idl_gen_csharp.cpp @@ -214,6 +214,9 @@ class CSharpGenerator : public BaseGenerator { std::string GenDefaultValue(const FieldDef &field, bool enableLangOverrides) const { + // If it is an optional scalar field, the default is null + if (field.IsScalarOptional()) { return "null"; } + auto &value = field.value; if (enableLangOverrides) { // handles both enum case and vector of enum case @@ -396,6 +399,7 @@ class CSharpGenerator : public BaseGenerator { } else { code += ", "; code += GenTypeBasic(type); + if (field.IsScalarOptional()) { code += "?"; } if (array_cnt > 0) { code += "["; for (size_t i = 1; i < array_cnt; i++) code += ","; @@ -610,6 +614,7 @@ class CSharpGenerator : public BaseGenerator { optional = "?"; conditional_cast = "(" + type_name_dest + optional + ")"; } + if (field.IsScalarOptional()) { optional = "?"; } std::string dest_mask = ""; std::string dest_cast = DestinationCast(field.value.type); std::string src_cast = SourceCast(field.value.type); @@ -646,9 +651,11 @@ class CSharpGenerator : public BaseGenerator { // that doesn't need to be casted. However, default values for enum // elements of vectors are integer literals ("0") and are still casted // for clarity. - if (field.value.type.enum_def == nullptr || - IsVector(field.value.type)) { - default_cast = "(" + type_name_dest + ")"; + // If the scalar is optional and enum, we still need the cast. + if ((field.value.type.enum_def == nullptr || + IsVector(field.value.type)) || + (IsEnum(field.value.type) && field.IsScalarOptional())) { + default_cast = "(" + type_name_dest + optional + ")"; } } std::string member_suffix = "; "; @@ -974,6 +981,7 @@ class CSharpGenerator : public BaseGenerator { code += " = null"; } else { code += GenTypeBasic(field.value.type); + if (field.IsScalarOptional()) { code += "?"; } code += " "; code += field.name; if (!IsScalar(field.value.type.base_type)) code += "Offset"; @@ -1034,6 +1042,7 @@ class CSharpGenerator : public BaseGenerator { code += GenTypeBasic(field.value.type); auto argname = MakeCamel(field.name, false); if (!IsScalar(field.value.type.base_type)) argname += "Offset"; + if (field.IsScalarOptional()) { code += "?"; } code += " " + argname + ") { builder.Add"; code += GenMethod(field.value.type) + "("; code += NumToString(it - struct_def.fields.vec.begin()) + ", "; @@ -1043,8 +1052,13 @@ class CSharpGenerator : public BaseGenerator { field.value.type.base_type != BASE_TYPE_UNION) { code += ".Value"; } - code += ", "; - code += GenDefaultValue(field, false); + if (!field.IsScalarOptional()) { + // When the scalar is optional, use the builder method that doesn't + // supply a default value. Otherwise, we to continue to use the + // default value method. + code += ", "; + code += GenDefaultValue(field, false); + } code += "); }\n"; if (IsVector(field.value.type)) { auto vector_type = field.value.type.VectorType(); @@ -1069,7 +1083,7 @@ class CSharpGenerator : public BaseGenerator { code += SourceCastBasic(vector_type); code += "data[i]"; if (vector_type.base_type == BASE_TYPE_STRUCT || - IsString(vector_type)) + IsString(vector_type)) code += ".Value"; code += "); return "; code += "builder.EndVector(); }\n"; @@ -1476,11 +1490,10 @@ class CSharpGenerator : public BaseGenerator { case BASE_TYPE_ARRAY: { auto type_name = GenTypeGet_ObjectAPI(field.value.type, opts); auto length_str = NumToString(field.value.type.fixed_length); - auto unpack_method = field.value.type.struct_def == nullptr - ? "" - : field.value.type.struct_def->fixed - ? ".UnPack()" - : "?.UnPack()"; + auto unpack_method = field.value.type.struct_def == nullptr ? "" + : field.value.type.struct_def->fixed + ? ".UnPack()" + : "?.UnPack()"; code += start + "new " + type_name.substr(0, type_name.length() - 1) + length_str + "];\n"; code += " for (var _j = 0; _j < " + length_str + "; ++_j) { _o." + diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 9eebac9d6..ca4500f9e 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -716,8 +716,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) { // with a special suffix. ECHECK(AddField(struct_def, name + UnionTypeFieldSuffix(), type.enum_def->underlying_type, &typefield)); - } else if (IsVector(type) && - type.element == BASE_TYPE_UNION) { + } else if (IsVector(type) && type.element == BASE_TYPE_UNION) { // Only cpp, js and ts supports the union vector feature so far. if (!SupportsAdvancedUnionFeatures()) { return Error( @@ -792,8 +791,8 @@ CheckedError Parser::ParseField(StructDef &struct_def) { // Table, struct or string can't have enum_def. // Default value of union and vector in NONE, NULL translated to "0". FLATBUFFERS_ASSERT(IsInteger(type.base_type) || - (type.base_type == BASE_TYPE_UNION) || - IsVector(type) || IsArray(type)); + (type.base_type == BASE_TYPE_UNION) || IsVector(type) || + IsArray(type)); if (IsVector(type)) { // Vector can't use initialization list. FLATBUFFERS_ASSERT(field->value.constant == "0"); @@ -814,8 +813,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) { field->deprecated = field->attributes.Lookup("deprecated") != nullptr; auto hash_name = field->attributes.Lookup("hash"); if (hash_name) { - switch ((IsVector(type)) ? type.element - : type.base_type) { + switch ((IsVector(type)) ? type.element : type.base_type) { case BASE_TYPE_SHORT: case BASE_TYPE_USHORT: { if (FindHashFunction16(hash_name->constant.c_str()) == nullptr) @@ -968,8 +966,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field, auto &type = elem->second->value.type; if (type.enum_def == val.type.enum_def) { if (inside_vector) { - if (IsVector(type) && - type.element == BASE_TYPE_UTYPE) { + if (IsVector(type) && type.element == BASE_TYPE_UTYPE) { // Vector of union type field. uoffset_t offset; ECHECK(atot(elem->first.constant.c_str(), *this, &offset)); @@ -2283,7 +2280,7 @@ bool Parser::SupportsOptionalScalars(const flatbuffers::IDLOptions &opts) { static FLATBUFFERS_CONSTEXPR unsigned long supported_langs = IDLOptions::kRust | IDLOptions::kSwift | IDLOptions::kLobster | IDLOptions::kKotlin | IDLOptions::kCpp | IDLOptions::kJava | - IDLOptions::kTs | IDLOptions::kJs; + IDLOptions::kCSharp | IDLOptions::kTs | IDLOptions::kJs; unsigned long langs = opts.lang_to_generate; return (langs > 0 && langs < IDLOptions::kMAX) && !(langs & ~supported_langs); } diff --git a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs index 06bca0f39..e2b72c7ee 100644 --- a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs +++ b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs @@ -248,6 +248,226 @@ namespace FlatBuffers.Test Assert.AreEqual(endOffset, storedOffset); } + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddBool(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddSbyte(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddByte(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddShort(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUshort(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddInt(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUint(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddLong(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUlong(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddFloat(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsUnchanged() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddDouble(0, null); + var endOffset = fbb.Offset; + Assert.AreEqual(endOffset, storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddBool(0, true); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(bool), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddSbyte(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(sbyte), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddByte(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(byte), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddShort(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(short), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUshort(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(ushort), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddInt(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(int), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUint(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(uint), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddLong(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(long), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddUlong(0, 1); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(ulong), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddFloat(0, 1.0F); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(float), endOffset - storedOffset); + } + + [FlatBuffersTestMethod] + public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsChangedBySize() + { + var fbb = CreateBuffer(false); + var storedOffset = fbb.Offset; + fbb.AddDouble(0, 1.0); + var endOffset = fbb.Offset; + Assert.AreEqual(sizeof(double), endOffset - storedOffset); + } + [FlatBuffersTestMethod] public void FlatBufferBuilder_Add_Array_Float() { diff --git a/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj index 93b9f0729..bbbd7d812 100644 --- a/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj +++ b/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj @@ -128,6 +128,12 @@ union_vector\Rapunzel.cs + + optional_scalars\OptionalByte.cs + + + optional_scalars\ScalarStuff.cs + diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj index e26f918eb..616ab1963 100644 --- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj +++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj @@ -159,6 +159,12 @@ union_vector\Rapunzel.cs + + optional_scalars\OptionalByte.cs + + + optional_scalars\ScalarStuff.cs + diff --git a/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs b/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs index 1324c8cb8..b4093d4db 100644 --- a/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs +++ b/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs @@ -18,6 +18,7 @@ using System.IO; using System.Text; using System.Threading; using MyGame.Example; +using optional_scalars; namespace FlatBuffers.Test { @@ -891,5 +892,210 @@ namespace FlatBuffers.Test // Make sure we never read the values incorrectly. Assert.AreEqual(0, _failures); } + + [FlatBuffersTestMethod] + public void TestScalarOptional_EmptyBuffer() { + var fbb = new FlatBufferBuilder(1); + ScalarStuff.StartScalarStuff(fbb); + var offset = ScalarStuff.EndScalarStuff(fbb); + ScalarStuff.FinishScalarStuffBuffer(fbb, offset); + + ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer); + Assert.AreEqual((sbyte)0, scalarStuff.JustI8); + Assert.AreEqual(null, scalarStuff.MaybeI8); + Assert.AreEqual((sbyte)42, scalarStuff.DefaultI8); + Assert.AreEqual((byte)0, scalarStuff.JustU8); + Assert.AreEqual(null, scalarStuff.MaybeU8); + Assert.AreEqual((byte)42, scalarStuff.DefaultU8); + + Assert.AreEqual((short)0, scalarStuff.JustI16); + Assert.AreEqual(null, scalarStuff.MaybeI16); + Assert.AreEqual((short)42, scalarStuff.DefaultI16); + Assert.AreEqual((ushort)0, scalarStuff.JustU16); + Assert.AreEqual(null, scalarStuff.MaybeU16); + Assert.AreEqual((ushort)42, scalarStuff.DefaultU16); + + Assert.AreEqual((int)0, scalarStuff.JustI32); + Assert.AreEqual(null, scalarStuff.MaybeI32); + Assert.AreEqual((int)42, scalarStuff.DefaultI32); + Assert.AreEqual((uint)0, scalarStuff.JustU32); + Assert.AreEqual(null, scalarStuff.MaybeU32); + Assert.AreEqual((uint)42, scalarStuff.DefaultU32); + + Assert.AreEqual((long)0, scalarStuff.JustI64); + Assert.AreEqual(null, scalarStuff.MaybeI64); + Assert.AreEqual((long)42, scalarStuff.DefaultI64); + Assert.AreEqual((ulong)0, scalarStuff.JustU64); + Assert.AreEqual(null, scalarStuff.MaybeU64); + Assert.AreEqual((ulong)42, scalarStuff.DefaultU64); + + Assert.AreEqual((float)0.0F, scalarStuff.JustF32); + Assert.AreEqual(null, scalarStuff.MaybeF32); + Assert.AreEqual((float)42.0F, scalarStuff.DefaultF32); + + Assert.AreEqual((double)0.0, scalarStuff.JustF64); + Assert.AreEqual(null, scalarStuff.MaybeF64); + Assert.AreEqual((double)42.0, scalarStuff.DefaultF64); + + Assert.AreEqual(false, scalarStuff.JustBool); + Assert.AreEqual(null, scalarStuff.MaybeBool); + Assert.AreEqual(true, scalarStuff.DefaultBool); + + Assert.AreEqual(OptionalByte.None, scalarStuff.JustEnum); + Assert.AreEqual(null, scalarStuff.MaybeEnum); + Assert.AreEqual(OptionalByte.One, scalarStuff.DefaultEnum); + } + + [FlatBuffersTestMethod] + public void TestScalarOptional_Construction() { + var fbb = new FlatBufferBuilder(1); + ScalarStuff.StartScalarStuff(fbb); + ScalarStuff.AddJustI8(fbb, 5); + ScalarStuff.AddMaybeI8(fbb, 5); + ScalarStuff.AddDefaultI8(fbb, 5); + ScalarStuff.AddJustU8(fbb, 6); + ScalarStuff.AddMaybeU8(fbb, 6); + ScalarStuff.AddDefaultU8(fbb, 6); + + ScalarStuff.AddJustI16(fbb, 7); + ScalarStuff.AddMaybeI16(fbb, 7); + ScalarStuff.AddDefaultI16(fbb, 7); + ScalarStuff.AddJustU16(fbb, 8); + ScalarStuff.AddMaybeU16(fbb, 8); + ScalarStuff.AddDefaultU16(fbb, 8); + + ScalarStuff.AddJustI32(fbb, 9); + ScalarStuff.AddMaybeI32(fbb, 9); + ScalarStuff.AddDefaultI32(fbb, 9); + ScalarStuff.AddJustU32(fbb, 10); + ScalarStuff.AddMaybeU32(fbb, 10); + ScalarStuff.AddDefaultU32(fbb, 10); + + ScalarStuff.AddJustI64(fbb, 11); + ScalarStuff.AddMaybeI64(fbb, 11); + ScalarStuff.AddDefaultI64(fbb, 11); + ScalarStuff.AddJustU64(fbb, 12); + ScalarStuff.AddMaybeU64(fbb, 12); + ScalarStuff.AddDefaultU64(fbb, 12); + + 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, false); // note this is the opposite + + ScalarStuff.AddJustEnum(fbb, OptionalByte.Two); + ScalarStuff.AddMaybeEnum(fbb, OptionalByte.Two); + ScalarStuff.AddDefaultEnum(fbb, OptionalByte.Two); + + var offset = ScalarStuff.EndScalarStuff(fbb); + ScalarStuff.FinishScalarStuffBuffer(fbb, offset); + + ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer); + Assert.AreEqual((sbyte)5, scalarStuff.JustI8); + Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8); + Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8); + Assert.AreEqual((byte)6, scalarStuff.JustU8); + Assert.AreEqual((byte)6, scalarStuff.MaybeU8); + Assert.AreEqual((byte)6, scalarStuff.DefaultU8); + + Assert.AreEqual((short)7, scalarStuff.JustI16); + Assert.AreEqual((short)7, scalarStuff.MaybeI16); + Assert.AreEqual((short)7, scalarStuff.DefaultI16); + Assert.AreEqual((ushort)8, scalarStuff.JustU16); + Assert.AreEqual((ushort)8, scalarStuff.MaybeU16); + Assert.AreEqual((ushort)8, scalarStuff.DefaultU16); + + Assert.AreEqual((int)9, scalarStuff.JustI32); + Assert.AreEqual((int)9, scalarStuff.MaybeI32); + Assert.AreEqual((int)9, scalarStuff.DefaultI32); + Assert.AreEqual((uint)10, scalarStuff.JustU32); + Assert.AreEqual((uint)10, scalarStuff.MaybeU32); + Assert.AreEqual((uint)10, scalarStuff.DefaultU32); + + Assert.AreEqual((long)11, scalarStuff.JustI64); + Assert.AreEqual((long)11, scalarStuff.MaybeI64); + Assert.AreEqual((long)11, scalarStuff.DefaultI64); + Assert.AreEqual((ulong)12, scalarStuff.JustU64); + Assert.AreEqual((ulong)12, scalarStuff.MaybeU64); + Assert.AreEqual((ulong)12, scalarStuff.DefaultU64); + + Assert.AreEqual((float)13.0F, scalarStuff.JustF32); + Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32); + Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32); + + Assert.AreEqual((double)14.0, scalarStuff.JustF64); + Assert.AreEqual((double)14.0, scalarStuff.MaybeF64); + Assert.AreEqual((double)14.0, scalarStuff.DefaultF64); + + Assert.AreEqual(true, scalarStuff.JustBool); + Assert.AreEqual(true, scalarStuff.MaybeBool); + Assert.AreEqual(false, scalarStuff.DefaultBool); + + Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum); + Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum); + Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum); + } + + [FlatBuffersTestMethod] + public void TestScalarOptional_Construction_CreatorMethod() { + var fbb = new FlatBufferBuilder(1); + + var offset = ScalarStuff.CreateScalarStuff(fbb,5,5,5,6,6,6,7,7,7, + 8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13.0f,13.0f,13.0f,14.0, + 14.0,14.0,true,true,false,OptionalByte.Two,OptionalByte.Two, + OptionalByte.Two); + ScalarStuff.FinishScalarStuffBuffer(fbb, offset); + + ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer); + Assert.AreEqual((sbyte)5, scalarStuff.JustI8); + Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8); + Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8); + Assert.AreEqual((byte)6, scalarStuff.JustU8); + Assert.AreEqual((byte)6, scalarStuff.MaybeU8); + Assert.AreEqual((byte)6, scalarStuff.DefaultU8); + + Assert.AreEqual((short)7, scalarStuff.JustI16); + Assert.AreEqual((short)7, scalarStuff.MaybeI16); + Assert.AreEqual((short)7, scalarStuff.DefaultI16); + Assert.AreEqual((ushort)8, scalarStuff.JustU16); + Assert.AreEqual((ushort)8, scalarStuff.MaybeU16); + Assert.AreEqual((ushort)8, scalarStuff.DefaultU16); + + Assert.AreEqual((int)9, scalarStuff.JustI32); + Assert.AreEqual((int)9, scalarStuff.MaybeI32); + Assert.AreEqual((int)9, scalarStuff.DefaultI32); + Assert.AreEqual((uint)10, scalarStuff.JustU32); + Assert.AreEqual((uint)10, scalarStuff.MaybeU32); + Assert.AreEqual((uint)10, scalarStuff.DefaultU32); + + Assert.AreEqual((long)11, scalarStuff.JustI64); + Assert.AreEqual((long)11, scalarStuff.MaybeI64); + Assert.AreEqual((long)11, scalarStuff.DefaultI64); + Assert.AreEqual((ulong)12, scalarStuff.JustU64); + Assert.AreEqual((ulong)12, scalarStuff.MaybeU64); + Assert.AreEqual((ulong)12, scalarStuff.DefaultU64); + + Assert.AreEqual((float)13.0F, scalarStuff.JustF32); + Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32); + Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32); + + Assert.AreEqual((double)14.0, scalarStuff.JustF64); + Assert.AreEqual((double)14.0, scalarStuff.MaybeF64); + Assert.AreEqual((double)14.0, scalarStuff.DefaultF64); + + Assert.AreEqual(true, scalarStuff.JustBool); + Assert.AreEqual(true, scalarStuff.MaybeBool); + Assert.AreEqual(false, scalarStuff.DefaultBool); + + Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum); + Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum); + Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum); + } } } diff --git a/tests/generate_code.bat b/tests/generate_code.bat index 025f8b041..1fc96a206 100644 --- a/tests/generate_code.bat +++ b/tests/generate_code.bat @@ -55,7 +55,7 @@ set TEST_NOINCL_FLAGS=%TEST_BASE_FLAGS% --no-includes --no-fb-import ..\%buildtype%\flatc.exe --cpp %TEST_BASE_FLAGS% --cpp-ptr-type flatbuffers::unique_ptr native_type_test.fbs || goto FAIL @rem Generate the optional scalar code for tests. -..\%buildtype%\flatc.exe --kotlin --rust --lobster --ts --js optional_scalars.fbs || goto FAIL +..\%buildtype%\flatc.exe --csharp --java --kotlin --rust --lobster --ts --js optional_scalars.fbs || goto FAIL ..\%buildtype%\flatc.exe %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% --cpp optional_scalars.fbs || goto FAIL @rem Generate the schema evolution tests diff --git a/tests/generate_code.sh b/tests/generate_code.sh index bbba2a5fb..89d94297c 100755 --- a/tests/generate_code.sh +++ b/tests/generate_code.sh @@ -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 --java --kotlin --rust --lobster --ts --js optional_scalars.fbs +../flatc --csharp --java --kotlin --rust --lobster --ts --js optional_scalars.fbs ../flatc $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS --cpp optional_scalars.fbs # Generate the schema evolution tests diff --git a/tests/optional_scalars/OptionalByte.cs b/tests/optional_scalars/OptionalByte.cs new file mode 100644 index 000000000..79a20045b --- /dev/null +++ b/tests/optional_scalars/OptionalByte.cs @@ -0,0 +1,16 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace optional_scalars +{ + +public enum OptionalByte : sbyte +{ + None = 0, + One = 1, + Two = 2, +}; + + +} diff --git a/tests/optional_scalars/ScalarStuff.cs b/tests/optional_scalars/ScalarStuff.cs new file mode 100644 index 000000000..a5c9ffb5e --- /dev/null +++ b/tests/optional_scalars/ScalarStuff.cs @@ -0,0 +1,183 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace optional_scalars +{ + +using global::System; +using global::System.Collections.Generic; +using global::FlatBuffers; + +public struct ScalarStuff : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); } + public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb) { return GetRootAsScalarStuff(_bb, new ScalarStuff()); } + public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public static bool ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "NULL"); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public sbyte JustI8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } } + public sbyte? MaybeI8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte?)null; } } + public sbyte DefaultI8 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)42; } } + public byte JustU8 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } } + public byte? MaybeU8 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte?)null; } } + public byte DefaultU8 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)42; } } + public short JustI16 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } } + public short? MaybeI16 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short?)null; } } + public short DefaultI16 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)42; } } + public ushort JustU16 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } } + public ushort? MaybeU16 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort?)null; } } + public ushort DefaultU16 { get { int o = __p.__offset(26); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)42; } } + public int JustI32 { get { int o = __p.__offset(28); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } + public int? MaybeI32 { get { int o = __p.__offset(30); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int?)null; } } + public int DefaultI32 { get { int o = __p.__offset(32); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)42; } } + public uint JustU32 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } } + public uint? MaybeU32 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint?)null; } } + public uint DefaultU32 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)42; } } + public long JustI64 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } } + public long? MaybeI64 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long?)null; } } + public long DefaultI64 { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)42; } } + public ulong JustU64 { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } } + public ulong? MaybeU64 { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong?)null; } } + public ulong DefaultU64 { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)42; } } + public float JustF32 { get { int o = __p.__offset(52); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } + public float? MaybeF32 { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float?)null; } } + public float DefaultF32 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)42.0f; } } + public double JustF64 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } } + public double? MaybeF64 { get { int o = __p.__offset(60); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double?)null; } } + public double DefaultF64 { get { int o = __p.__offset(62); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)42.0; } } + public bool JustBool { get { int o = __p.__offset(64); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } } + public bool? MaybeBool { get { int o = __p.__offset(66); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool?)null; } } + public bool DefaultBool { get { int o = __p.__offset(68); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)true; } } + public optional_scalars.OptionalByte JustEnum { get { int o = __p.__offset(70); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.None; } } + public optional_scalars.OptionalByte? MaybeEnum { get { int o = __p.__offset(72); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : (optional_scalars.OptionalByte?)null; } } + public optional_scalars.OptionalByte DefaultEnum { get { int o = __p.__offset(74); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.One; } } + + public static Offset CreateScalarStuff(FlatBufferBuilder builder, + sbyte just_i8 = 0, + sbyte? maybe_i8 = null, + sbyte default_i8 = 42, + byte just_u8 = 0, + byte? maybe_u8 = null, + byte default_u8 = 42, + short just_i16 = 0, + short? maybe_i16 = null, + short default_i16 = 42, + ushort just_u16 = 0, + ushort? maybe_u16 = null, + ushort default_u16 = 42, + int just_i32 = 0, + int? maybe_i32 = null, + int default_i32 = 42, + uint just_u32 = 0, + uint? maybe_u32 = null, + uint default_u32 = 42, + long just_i64 = 0, + long? maybe_i64 = null, + long default_i64 = 42, + ulong just_u64 = 0, + ulong? maybe_u64 = null, + ulong default_u64 = 42, + float just_f32 = 0.0f, + float? maybe_f32 = null, + float default_f32 = 42.0f, + double just_f64 = 0.0, + double? maybe_f64 = null, + double default_f64 = 42.0, + bool just_bool = false, + bool? maybe_bool = null, + bool default_bool = true, + optional_scalars.OptionalByte just_enum = optional_scalars.OptionalByte.None, + optional_scalars.OptionalByte? maybe_enum = null, + optional_scalars.OptionalByte default_enum = optional_scalars.OptionalByte.One) { + builder.StartTable(36); + ScalarStuff.AddDefaultF64(builder, default_f64); + ScalarStuff.AddMaybeF64(builder, maybe_f64); + ScalarStuff.AddJustF64(builder, just_f64); + ScalarStuff.AddDefaultU64(builder, default_u64); + ScalarStuff.AddMaybeU64(builder, maybe_u64); + ScalarStuff.AddJustU64(builder, just_u64); + ScalarStuff.AddDefaultI64(builder, default_i64); + ScalarStuff.AddMaybeI64(builder, maybe_i64); + ScalarStuff.AddJustI64(builder, just_i64); + ScalarStuff.AddDefaultF32(builder, default_f32); + ScalarStuff.AddMaybeF32(builder, maybe_f32); + ScalarStuff.AddJustF32(builder, just_f32); + ScalarStuff.AddDefaultU32(builder, default_u32); + ScalarStuff.AddMaybeU32(builder, maybe_u32); + ScalarStuff.AddJustU32(builder, just_u32); + ScalarStuff.AddDefaultI32(builder, default_i32); + ScalarStuff.AddMaybeI32(builder, maybe_i32); + ScalarStuff.AddJustI32(builder, just_i32); + ScalarStuff.AddDefaultU16(builder, default_u16); + ScalarStuff.AddMaybeU16(builder, maybe_u16); + ScalarStuff.AddJustU16(builder, just_u16); + ScalarStuff.AddDefaultI16(builder, default_i16); + ScalarStuff.AddMaybeI16(builder, maybe_i16); + ScalarStuff.AddJustI16(builder, just_i16); + ScalarStuff.AddDefaultEnum(builder, default_enum); + ScalarStuff.AddMaybeEnum(builder, maybe_enum); + ScalarStuff.AddJustEnum(builder, just_enum); + ScalarStuff.AddDefaultBool(builder, default_bool); + ScalarStuff.AddMaybeBool(builder, maybe_bool); + ScalarStuff.AddJustBool(builder, just_bool); + ScalarStuff.AddDefaultU8(builder, default_u8); + ScalarStuff.AddMaybeU8(builder, maybe_u8); + ScalarStuff.AddJustU8(builder, just_u8); + ScalarStuff.AddDefaultI8(builder, default_i8); + ScalarStuff.AddMaybeI8(builder, maybe_i8); + ScalarStuff.AddJustI8(builder, just_i8); + return ScalarStuff.EndScalarStuff(builder); + } + + public static void StartScalarStuff(FlatBufferBuilder builder) { builder.StartTable(36); } + public static void AddJustI8(FlatBufferBuilder builder, sbyte justI8) { builder.AddSbyte(0, justI8, 0); } + public static void AddMaybeI8(FlatBufferBuilder builder, sbyte? maybeI8) { builder.AddSbyte(1, maybeI8); } + public static void AddDefaultI8(FlatBufferBuilder builder, sbyte defaultI8) { builder.AddSbyte(2, defaultI8, 42); } + public static void AddJustU8(FlatBufferBuilder builder, byte justU8) { builder.AddByte(3, justU8, 0); } + public static void AddMaybeU8(FlatBufferBuilder builder, byte? maybeU8) { builder.AddByte(4, maybeU8); } + public static void AddDefaultU8(FlatBufferBuilder builder, byte defaultU8) { builder.AddByte(5, defaultU8, 42); } + public static void AddJustI16(FlatBufferBuilder builder, short justI16) { builder.AddShort(6, justI16, 0); } + public static void AddMaybeI16(FlatBufferBuilder builder, short? maybeI16) { builder.AddShort(7, maybeI16); } + public static void AddDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.AddShort(8, defaultI16, 42); } + public static void AddJustU16(FlatBufferBuilder builder, ushort justU16) { builder.AddUshort(9, justU16, 0); } + public static void AddMaybeU16(FlatBufferBuilder builder, ushort? maybeU16) { builder.AddUshort(10, maybeU16); } + public static void AddDefaultU16(FlatBufferBuilder builder, ushort defaultU16) { builder.AddUshort(11, defaultU16, 42); } + public static void AddJustI32(FlatBufferBuilder builder, int justI32) { builder.AddInt(12, justI32, 0); } + public static void AddMaybeI32(FlatBufferBuilder builder, int? maybeI32) { builder.AddInt(13, maybeI32); } + public static void AddDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.AddInt(14, defaultI32, 42); } + public static void AddJustU32(FlatBufferBuilder builder, uint justU32) { builder.AddUint(15, justU32, 0); } + public static void AddMaybeU32(FlatBufferBuilder builder, uint? maybeU32) { builder.AddUint(16, maybeU32); } + public static void AddDefaultU32(FlatBufferBuilder builder, uint defaultU32) { builder.AddUint(17, defaultU32, 42); } + public static void AddJustI64(FlatBufferBuilder builder, long justI64) { builder.AddLong(18, justI64, 0); } + public static void AddMaybeI64(FlatBufferBuilder builder, long? maybeI64) { builder.AddLong(19, maybeI64); } + public static void AddDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.AddLong(20, defaultI64, 42); } + public static void AddJustU64(FlatBufferBuilder builder, ulong justU64) { builder.AddUlong(21, justU64, 0); } + public static void AddMaybeU64(FlatBufferBuilder builder, ulong? maybeU64) { builder.AddUlong(22, maybeU64); } + public static void AddDefaultU64(FlatBufferBuilder builder, ulong defaultU64) { builder.AddUlong(23, defaultU64, 42); } + public static void AddJustF32(FlatBufferBuilder builder, float justF32) { builder.AddFloat(24, justF32, 0.0f); } + public static void AddMaybeF32(FlatBufferBuilder builder, float? maybeF32) { builder.AddFloat(25, maybeF32); } + public static void AddDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.AddFloat(26, defaultF32, 42.0f); } + public static void AddJustF64(FlatBufferBuilder builder, double justF64) { builder.AddDouble(27, justF64, 0.0); } + public static void AddMaybeF64(FlatBufferBuilder builder, double? maybeF64) { builder.AddDouble(28, maybeF64); } + public static void AddDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.AddDouble(29, defaultF64, 42.0); } + public static void AddJustBool(FlatBufferBuilder builder, bool justBool) { builder.AddBool(30, justBool, false); } + public static void AddMaybeBool(FlatBufferBuilder builder, bool? maybeBool) { builder.AddBool(31, maybeBool); } + public static void AddDefaultBool(FlatBufferBuilder builder, bool defaultBool) { builder.AddBool(32, defaultBool, true); } + public static void AddJustEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte justEnum) { builder.AddSbyte(33, (sbyte)justEnum, 0); } + public static void AddMaybeEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte? maybeEnum) { builder.AddSbyte(34, (sbyte)maybeEnum); } + public static void AddDefaultEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte defaultEnum) { builder.AddSbyte(35, (sbyte)defaultEnum, 1); } + public static Offset EndScalarStuff(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } + public static void FinishScalarStuffBuffer(FlatBufferBuilder builder, Offset offset) { builder.Finish(offset.Value, "NULL"); } + public static void FinishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, Offset offset) { builder.FinishSizePrefixed(offset.Value, "NULL"); } +}; + + +}