Commit bfa43030 authored by David Reiss's avatar David Reiss Committed by Robert

[Go] Add mutation functions for vector elements (#5221)

Fixes #5206
parent 1c7d91cc
......@@ -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);
}
}
}
......
......@@ -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)
}
......
......@@ -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)
}
......
......@@ -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() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment