diff --git a/src/idl_gen_go.cpp b/src/idl_gen_go.cpp index 4a4029360..7a68e8aa9 100644 --- a/src/idl_gen_go.cpp +++ b/src/idl_gen_go.cpp @@ -620,6 +620,27 @@ class GoGenerator : public BaseGenerator { code += "}\n\n"; } + // Mutate an element of a vector of scalars. + void MutateElementOfVectorOfNonStruct(const StructDef &struct_def, + const FieldDef &field, + std::string *code_ptr) { + std::string &code = *code_ptr; + auto vectortype = field.value.type.VectorType(); + std::string type = MakeCamel(GenTypeBasic(vectortype)); + std::string setter = "rcv._tab.Mutate" + type; + GenReceiver(struct_def, code_ptr); + code += " Mutate" + MakeCamel(field.name); + code += "(j int, n " + TypeName(field) + ") bool "; + code += OffsetPrefix(field); + code += "\t\ta := rcv._tab.Vector(o)\n"; + code += "\t\treturn " + setter + "("; + code += "a+flatbuffers.UOffsetT(j*"; + code += NumToString(InlineSize(vectortype)) + "), n)\n"; + code += "\t}\n"; + code += "\treturn false\n"; + code += "}\n\n"; + } + // Generate a struct field setter, conditioned on its child type(s). void GenStructMutator(const StructDef &struct_def, const FieldDef &field, std::string *code_ptr) { @@ -630,6 +651,10 @@ class GoGenerator : public BaseGenerator { } else { MutateScalarFieldOfTable(struct_def, field, code_ptr); } + } else if (field.value.type.base_type == BASE_TYPE_VECTOR) { + if (IsScalar(field.value.type.element)) { + MutateElementOfVectorOfNonStruct(struct_def, field, code_ptr); + } } } diff --git a/tests/MyGame/Example/Monster.go b/tests/MyGame/Example/Monster.go index 30b64a08c..1eedc5ebb 100644 --- a/tests/MyGame/Example/Monster.go +++ b/tests/MyGame/Example/Monster.go @@ -99,6 +99,15 @@ func (rcv *Monster) InventoryBytes() []byte { return nil } +func (rcv *Monster) MutateInventory(j int, n byte) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func (rcv *Monster) Color() Color { o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) if o != 0 { @@ -230,6 +239,15 @@ func (rcv *Monster) TestnestedflatbufferBytes() []byte { return nil } +func (rcv *Monster) MutateTestnestedflatbuffer(j int, n byte) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(30)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func (rcv *Monster) Testempty(obj *Stat) *Stat { o := flatbuffers.UOffsetT(rcv._tab.Offset(32)) if o != 0 { @@ -368,6 +386,15 @@ func (rcv *Monster) TestarrayofboolsLength() int { return 0 } +func (rcv *Monster) MutateTestarrayofbools(j int, n bool) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(52)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateBool(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func (rcv *Monster) Testf() float32 { o := flatbuffers.UOffsetT(rcv._tab.Offset(54)) if o != 0 { @@ -465,6 +492,15 @@ func (rcv *Monster) FlexBytes() []byte { return nil } +func (rcv *Monster) MutateFlex(j int, n byte) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(64)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func (rcv *Monster) Test5(obj *Test, j int) bool { o := flatbuffers.UOffsetT(rcv._tab.Offset(66)) if o != 0 { @@ -501,6 +537,15 @@ func (rcv *Monster) VectorOfLongsLength() int { return 0 } +func (rcv *Monster) MutateVectorOfLongs(j int, n int64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(68)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateInt64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func (rcv *Monster) VectorOfDoubles(j int) float64 { o := flatbuffers.UOffsetT(rcv._tab.Offset(70)) if o != 0 { @@ -518,6 +563,15 @@ func (rcv *Monster) VectorOfDoublesLength() int { return 0 } +func (rcv *Monster) MutateVectorOfDoubles(j int, n float64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(70)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateFloat64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func (rcv *Monster) ParentNamespaceTest(obj *MyGame.InParentNamespace) *MyGame.InParentNamespace { o := flatbuffers.UOffsetT(rcv._tab.Offset(72)) if o != 0 { @@ -580,6 +634,15 @@ func (rcv *Monster) VectorOfWeakReferencesLength() int { return 0 } +func (rcv *Monster) MutateVectorOfWeakReferences(j int, n uint64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(78)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func (rcv *Monster) VectorOfStrongReferrables(obj *Referrable, j int) bool { o := flatbuffers.UOffsetT(rcv._tab.Offset(80)) if o != 0 { @@ -629,6 +692,15 @@ func (rcv *Monster) VectorOfCoOwningReferencesLength() int { return 0 } +func (rcv *Monster) MutateVectorOfCoOwningReferences(j int, n uint64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(84)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func (rcv *Monster) NonOwningReference() uint64 { o := flatbuffers.UOffsetT(rcv._tab.Offset(86)) if o != 0 { @@ -658,6 +730,15 @@ func (rcv *Monster) VectorOfNonOwningReferencesLength() int { return 0 } +func (rcv *Monster) MutateVectorOfNonOwningReferences(j int, n uint64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(88)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateUint64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func (rcv *Monster) AnyUniqueType() byte { o := flatbuffers.UOffsetT(rcv._tab.Offset(90)) if o != 0 { @@ -717,6 +798,15 @@ func (rcv *Monster) VectorOfEnumsLength() int { return 0 } +func (rcv *Monster) MutateVectorOfEnums(j int, n Color) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(98)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateInt8(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func MonsterStart(builder *flatbuffers.Builder) { builder.StartObject(48) } diff --git a/tests/MyGame/Example/TypeAliases.go b/tests/MyGame/Example/TypeAliases.go index f3d6b8451..d017b5bc3 100644 --- a/tests/MyGame/Example/TypeAliases.go +++ b/tests/MyGame/Example/TypeAliases.go @@ -163,6 +163,15 @@ func (rcv *TypeAliases) V8Length() int { return 0 } +func (rcv *TypeAliases) MutateV8(j int, n int8) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(24)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateInt8(a+flatbuffers.UOffsetT(j*1), n) + } + return false +} + func (rcv *TypeAliases) Vf64(j int) float64 { o := flatbuffers.UOffsetT(rcv._tab.Offset(26)) if o != 0 { @@ -180,6 +189,15 @@ func (rcv *TypeAliases) Vf64Length() int { return 0 } +func (rcv *TypeAliases) MutateVf64(j int, n float64) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(26)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.MutateFloat64(a+flatbuffers.UOffsetT(j*8), n) + } + return false +} + func TypeAliasesStart(builder *flatbuffers.Builder) { builder.StartObject(12) } diff --git a/tests/go_test.go b/tests/go_test.go index ec6aaeffa..0c16da911 100644 --- a/tests/go_test.go +++ b/tests/go_test.go @@ -334,6 +334,7 @@ func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, fail func(string testcase{"Pos.Test2'", func() bool { return monster.Pos(nil).Test2() == int8(2) }}, testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(5) }}, testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(6) }}, + testcase{"Inventory[2]", func() bool { return monster.Inventory(2) == byte(2) }}, } testMutability := []testcase{ @@ -347,6 +348,7 @@ func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, fail func(string testcase{"Pos.Test2", func() bool { return monster.Pos(nil).MutateTest2(20) }}, testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).MutateA(50) }}, testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).MutateB(60) }}, + testcase{"Inventory[2]", func() bool { return monster.MutateInventory(2, 200) }}, } testForMutatedValues := []testcase{ @@ -360,6 +362,7 @@ func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, fail func(string testcase{"Pos.Test2'", func() bool { return monster.Pos(nil).Test2() == int8(20) }}, testcase{"Pos.Test3.A", func() bool { return monster.Pos(nil).Test3(nil).A() == int16(50) }}, testcase{"Pos.Test3.B", func() bool { return monster.Pos(nil).Test3(nil).B() == int8(60) }}, + testcase{"Inventory[2]", func() bool { return monster.Inventory(2) == byte(200) }}, } // make sure original values are okay @@ -412,6 +415,7 @@ func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, fail func(string monster.Pos(nil).MutateTest2(2) monster.Pos(nil).Test3(nil).MutateA(5) monster.Pos(nil).Test3(nil).MutateB(6) + monster.MutateInventory(2, 2) for _, t := range testForOriginalValues { if !t.testfn() {