diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 25a547986..6d512288f 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -1543,7 +1543,7 @@ class FlatBufferBuilder private: // Allocates space for a vector of structures. // Must be completed with EndVectorOfStructs(). - template const T* StartVectorOfStructs(size_t vector_size) { + template T* StartVectorOfStructs(size_t vector_size) { StartVector(vector_size * sizeof(T) / AlignOf(), AlignOf()); return reinterpret_cast(buf_.make_space(vector_size * sizeof(T))); } diff --git a/tests/MyGame/Example/Monster.cs b/tests/MyGame/Example/Monster.cs index 6828701bd..f4afb8b8e 100644 --- a/tests/MyGame/Example/Monster.cs +++ b/tests/MyGame/Example/Monster.cs @@ -87,8 +87,10 @@ public struct Monster : IFlatbufferObject public int FlexLength { get { int o = __p.__offset(64); return o != 0 ? __p.__vector_len(o) : 0; } } public ArraySegment? GetFlexBytes() { return __p.__vector_as_arraysegment(64); } public bool MutateFlex(int j, byte flex) { int o = __p.__offset(64); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, flex); return true; } else { return false; } } + public Test? Test5(int j) { int o = __p.__offset(66); return o != 0 ? (Test?)(new Test()).__assign(__p.__vector(o) + j * 4, __p.bb) : null; } + public int Test5Length { get { int o = __p.__offset(66); return o != 0 ? __p.__vector_len(o) : 0; } } - public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(31); } + public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(32); } public static void AddPos(FlatBufferBuilder builder, Offset posOffset) { builder.AddStruct(0, posOffset.Value, 0); } public static void AddMana(FlatBufferBuilder builder, short mana) { builder.AddShort(1, mana, 150); } public static void AddHp(FlatBufferBuilder builder, short hp) { builder.AddShort(2, hp, 100); } @@ -135,6 +137,8 @@ public struct Monster : IFlatbufferObject public static void AddFlex(FlatBufferBuilder builder, VectorOffset flexOffset) { builder.AddOffset(30, flexOffset.Value, 0); } public static VectorOffset CreateFlexVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); } public static void StartFlexVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); } + public static void AddTest5(FlatBufferBuilder builder, VectorOffset test5Offset) { builder.AddOffset(31, test5Offset.Value, 0); } + public static void StartTest5Vector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 2); } public static Offset EndMonster(FlatBufferBuilder builder) { int o = builder.EndObject(); builder.Required(o, 10); // name diff --git a/tests/MyGame/Example/Monster.go b/tests/MyGame/Example/Monster.go index 8b3ffa530..13413bfc7 100644 --- a/tests/MyGame/Example/Monster.go +++ b/tests/MyGame/Example/Monster.go @@ -463,8 +463,27 @@ func (rcv *Monster) FlexBytes() []byte { return nil } +func (rcv *Monster) Test5(obj *Test, j int) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(66)) + if o != 0 { + x := rcv._tab.Vector(o) + x += flatbuffers.UOffsetT(j) * 4 + obj.Init(rcv._tab.Bytes, x) + return true + } + return false +} + +func (rcv *Monster) Test5Length() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(66)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + func MonsterStart(builder *flatbuffers.Builder) { - builder.StartObject(31) + builder.StartObject(32) } func MonsterAddPos(builder *flatbuffers.Builder, pos flatbuffers.UOffsetT) { builder.PrependStructSlot(0, flatbuffers.UOffsetT(pos), 0) @@ -583,6 +602,12 @@ func MonsterAddFlex(builder *flatbuffers.Builder, flex flatbuffers.UOffsetT) { func MonsterStartFlexVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { return builder.StartVector(1, numElems, 1) } +func MonsterAddTest5(builder *flatbuffers.Builder, test5 flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(31, flatbuffers.UOffsetT(test5), 0) +} +func MonsterStartTest5Vector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(4, numElems, 2) +} func MonsterEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() } diff --git a/tests/MyGame/Example/Monster.java b/tests/MyGame/Example/Monster.java index 4989072f4..c86f53b97 100644 --- a/tests/MyGame/Example/Monster.java +++ b/tests/MyGame/Example/Monster.java @@ -95,8 +95,11 @@ public final class Monster extends Table { public int flexLength() { int o = __offset(64); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer flexAsByteBuffer() { return __vector_as_bytebuffer(64, 1); } public boolean mutateFlex(int j, int flex) { int o = __offset(64); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)flex); return true; } else { return false; } } + public Test test5(int j) { return test5(new Test(), j); } + public Test test5(Test obj, int j) { int o = __offset(66); return o != 0 ? obj.__assign(__vector(o) + j * 4, bb) : null; } + public int test5Length() { int o = __offset(66); return o != 0 ? __vector_len(o) : 0; } - public static void startMonster(FlatBufferBuilder builder) { builder.startObject(31); } + public static void startMonster(FlatBufferBuilder builder) { builder.startObject(32); } public static void addPos(FlatBufferBuilder builder, int posOffset) { builder.addStruct(0, posOffset, 0); } public static void addMana(FlatBufferBuilder builder, short mana) { builder.addShort(1, mana, 150); } public static void addHp(FlatBufferBuilder builder, short hp) { builder.addShort(2, hp, 100); } @@ -143,6 +146,8 @@ public final class Monster extends Table { public static void addFlex(FlatBufferBuilder builder, int flexOffset) { builder.addOffset(30, flexOffset, 0); } public static int createFlexVector(FlatBufferBuilder builder, byte[] data) { builder.startVector(1, data.length, 1); for (int i = data.length - 1; i >= 0; i--) builder.addByte(data[i]); return builder.endVector(); } public static void startFlexVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); } + public static void addTest5(FlatBufferBuilder builder, int test5Offset) { builder.addOffset(31, test5Offset, 0); } + public static void startTest5Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 2); } public static int endMonster(FlatBufferBuilder builder) { int o = builder.endObject(); builder.required(o, 10); // name diff --git a/tests/MyGame/Example/Monster.php b/tests/MyGame/Example/Monster.php index f2185ed4e..3d825e541 100644 --- a/tests/MyGame/Example/Monster.php +++ b/tests/MyGame/Example/Monster.php @@ -425,22 +425,41 @@ class Monster extends Table return $this->__vector_as_bytes(64); } + /** + * @returnVectorOffset + */ + public function getTest5($j) + { + $o = $this->__offset(66); + $obj = new Test(); + return $o != 0 ? $obj->init($this->__vector($o) + $j *4, $this->bb) : null; + } + + /** + * @return int + */ + public function getTest5Length() + { + $o = $this->__offset(66); + return $o != 0 ? $this->__vector_len($o) : 0; + } + /** * @param FlatBufferBuilder $builder * @return void */ public static function startMonster(FlatBufferBuilder $builder) { - $builder->StartObject(31); + $builder->StartObject(32); } /** * @param FlatBufferBuilder $builder * @return Monster */ - public static function createMonster(FlatBufferBuilder $builder, $pos, $mana, $hp, $name, $inventory, $color, $test_type, $test, $test4, $testarrayofstring, $testarrayoftables, $enemy, $testnestedflatbuffer, $testempty, $testbool, $testhashs32_fnv1, $testhashu32_fnv1, $testhashs64_fnv1, $testhashu64_fnv1, $testhashs32_fnv1a, $testhashu32_fnv1a, $testhashs64_fnv1a, $testhashu64_fnv1a, $testarrayofbools, $testf, $testf2, $testf3, $testarrayofstring2, $testarrayofsortedstruct, $flex) + public static function createMonster(FlatBufferBuilder $builder, $pos, $mana, $hp, $name, $inventory, $color, $test_type, $test, $test4, $testarrayofstring, $testarrayoftables, $enemy, $testnestedflatbuffer, $testempty, $testbool, $testhashs32_fnv1, $testhashu32_fnv1, $testhashs64_fnv1, $testhashu64_fnv1, $testhashs32_fnv1a, $testhashu32_fnv1a, $testhashs64_fnv1a, $testhashu64_fnv1a, $testarrayofbools, $testf, $testf2, $testf3, $testarrayofstring2, $testarrayofsortedstruct, $flex, $test5) { - $builder->startObject(31); + $builder->startObject(32); self::addPos($builder, $pos); self::addMana($builder, $mana); self::addHp($builder, $hp); @@ -471,6 +490,7 @@ class Monster extends Table self::addTestarrayofstring2($builder, $testarrayofstring2); self::addTestarrayofsortedstruct($builder, $testarrayofsortedstruct); self::addFlex($builder, $flex); + self::addTest5($builder, $test5); $o = $builder->endObject(); $builder->required($o, 10); // name return $o; @@ -987,6 +1007,40 @@ class Monster extends Table $builder->startVector(1, $numElems, 1); } + /** + * @param FlatBufferBuilder $builder + * @param VectorOffset + * @return void + */ + public static function addTest5(FlatBufferBuilder $builder, $test5) + { + $builder->addOffsetX(31, $test5, 0); + } + + /** + * @param FlatBufferBuilder $builder + * @param array offset array + * @return int vector offset + */ + public static function createTest5Vector(FlatBufferBuilder $builder, array $data) + { + $builder->startVector(4, count($data), 2); + for ($i = count($data) - 1; $i >= 0; $i--) { + $builder->addOffset($data[$i]); + } + return $builder->endVector(); + } + + /** + * @param FlatBufferBuilder $builder + * @param int $numElems + * @return void + */ + public static function startTest5Vector(FlatBufferBuilder $builder, $numElems) + { + $builder->startVector(4, $numElems, 2); + } + /** * @param FlatBufferBuilder $builder * @return int table offset diff --git a/tests/MyGame/Example/Monster.py b/tests/MyGame/Example/Monster.py index ff7e7da51..01b4b72d8 100644 --- a/tests/MyGame/Example/Monster.py +++ b/tests/MyGame/Example/Monster.py @@ -331,7 +331,26 @@ class Monster(object): return self._tab.VectorLen(o) return 0 -def MonsterStart(builder): builder.StartObject(31) + # Monster + def Test5(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + from .Test import Test + obj = Test() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Monster + def Test5Length(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def MonsterStart(builder): builder.StartObject(32) def MonsterAddPos(builder, pos): builder.PrependStructSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(pos), 0) def MonsterAddMana(builder, mana): builder.PrependInt16Slot(1, mana, 150) def MonsterAddHp(builder, hp): builder.PrependInt16Slot(2, hp, 100) @@ -371,4 +390,6 @@ def MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct): builder def MonsterStartTestarrayofsortedstructVector(builder, numElems): return builder.StartVector(8, numElems, 4) def MonsterAddFlex(builder, flex): builder.PrependUOffsetTRelativeSlot(30, flatbuffers.number_types.UOffsetTFlags.py_type(flex), 0) def MonsterStartFlexVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def MonsterAddTest5(builder, test5): builder.PrependUOffsetTRelativeSlot(31, flatbuffers.number_types.UOffsetTFlags.py_type(test5), 0) +def MonsterStartTest5Vector(builder, numElems): return builder.StartVector(4, numElems, 2) def MonsterEnd(builder): return builder.EndObject() diff --git a/tests/generate_code.sh b/tests/generate_code.sh index 221fafb09..ebc465e30 100755 --- a/tests/generate_code.sh +++ b/tests/generate_code.sh @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -../flatc --cpp --java --csharp --go --binary --python --js --ts --php --grpc --gen-mutable --gen-object-api --no-includes --no-fb-import -I include_test monster_test.fbs monsterdata_test.json -../flatc --cpp --java --csharp --go --binary --python --js --ts --php --gen-mutable --no-fb-import -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs -../flatc --cpp --gen-mutable --gen-object-api -o union_vector ./union_vector/union_vector.fbs +../flatc --cpp --java --csharp --go --binary --python --js --ts --php --grpc --gen-mutable --gen-object-api --no-includes --cpp-ptr-type flatbuffers::unique_ptr --no-fb-import -I include_test monster_test.fbs monsterdata_test.json +../flatc --cpp --java --csharp --go --binary --python --js --ts --php --gen-mutable --no-fb-import --cpp-ptr-type flatbuffers::unique_ptr -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs +../flatc --cpp --gen-mutable --gen-object-api --cpp-ptr-type flatbuffers::unique_ptr -o union_vector ./union_vector/union_vector.fbs ../flatc -b --schema --bfbs-comments -I include_test monster_test.fbs ../flatc --jsonschema --schema -I include_test monster_test.fbs cd ../samples -../flatc --cpp --gen-mutable --gen-object-api monster.fbs +../flatc --cpp --gen-mutable --gen-object-api --cpp-ptr-type flatbuffers::unique_ptr monster.fbs cd ../reflection diff --git a/tests/go_test.go b/tests/go_test.go index 2aa375a32..2fc651211 100644 --- a/tests/go_test.go +++ b/tests/go_test.go @@ -1085,6 +1085,7 @@ func CheckManualBuild(fail func(string, ...interface{})) ([]byte, flatbuffers.UO b.PrependByteSlot(7, 1, 0) b.PrependUOffsetTSlot(8, mon2, 0) b.PrependUOffsetTSlot(9, test4, 0) + b.PrependUOffsetTSlot(9, test5, 0) mon := b.EndObject() b.Finish(mon) diff --git a/tests/javatest.bin b/tests/javatest.bin index ee370099d..38702481f 100644 Binary files a/tests/javatest.bin and b/tests/javatest.bin differ diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs index 95f7c5e1c..a4d1592fc 100644 Binary files a/tests/monster_test.bfbs and b/tests/monster_test.bfbs differ diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs index c12390903..57ad0ac18 100755 --- a/tests/monster_test.fbs +++ b/tests/monster_test.fbs @@ -59,6 +59,7 @@ table Monster { enemy:MyGame.Example.Monster (id:12); // Test referring by full namespace. test:Any (id: 8); test4:[Test] (id: 9); + test5:[Test] (id: 31); testnestedflatbuffer:[ubyte] (id:13, nested_flatbuffer: "Monster"); testempty:Stat (id:14); testbool:bool (id:15); diff --git a/tests/monster_test.schema.json b/tests/monster_test.schema.json index 28bc11dd6..ab971e7c1 100644 --- a/tests/monster_test.schema.json +++ b/tests/monster_test.schema.json @@ -108,7 +108,8 @@ "testf3" : { "type" : "number" }, "testarrayofstring2" : { "type" : "array", "items" : { "type" : "string" } }, "testarrayofsortedstruct" : { "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Ability" } }, - "flex" : { "type" : "array", "items" : { "type" : "number" } } + "flex" : { "type" : "array", "items" : { "type" : "number" } }, + "test5" : { "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } } }, "required" : [ "name"] } diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index d61db621f..cf3103d5f 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -547,6 +547,7 @@ struct MonsterT : public flatbuffers::NativeTable { std::vector testarrayofstring2; std::vector testarrayofsortedstruct; std::vector flex; + std::vector test5; MonsterT() : mana(150), hp(100), @@ -599,7 +600,8 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_TESTF3 = 58, VT_TESTARRAYOFSTRING2 = 60, VT_TESTARRAYOFSORTEDSTRUCT = 62, - VT_FLEX = 64 + VT_FLEX = 64, + VT_TEST5 = 66 }; const Vec3 *pos() const { return GetStruct(VT_POS); @@ -807,6 +809,12 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { auto v = flex(); return flexbuffers::GetRoot(v->Data(), v->size()); } + const flatbuffers::Vector *test5() const { + return GetPointer *>(VT_TEST5); + } + flatbuffers::Vector *mutable_test5() { + return GetPointer *>(VT_TEST5); + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_POS) && @@ -855,6 +863,8 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { verifier.Verify(testarrayofsortedstruct()) && VerifyOffset(verifier, VT_FLEX) && verifier.Verify(flex()) && + VerifyOffset(verifier, VT_TEST5) && + verifier.Verify(test5()) && verifier.EndTable(); } MonsterT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -967,13 +977,16 @@ struct MonsterBuilder { void add_flex(flatbuffers::Offset> flex) { fbb_.AddOffset(Monster::VT_FLEX, flex); } + void add_test5(flatbuffers::Offset> test5) { + fbb_.AddOffset(Monster::VT_TEST5, test5); + } MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } MonsterBuilder &operator=(const MonsterBuilder &); flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_, 31); + const auto end = fbb_.EndTable(start_, 32); auto o = flatbuffers::Offset(end); fbb_.Required(o, Monster::VT_NAME); return o; @@ -1011,12 +1024,14 @@ inline flatbuffers::Offset CreateMonster( float testf3 = 0.0f, flatbuffers::Offset>> testarrayofstring2 = 0, flatbuffers::Offset> testarrayofsortedstruct = 0, - flatbuffers::Offset> flex = 0) { + flatbuffers::Offset> flex = 0, + flatbuffers::Offset> test5 = 0) { MonsterBuilder builder_(_fbb); builder_.add_testhashu64_fnv1a(testhashu64_fnv1a); builder_.add_testhashs64_fnv1a(testhashs64_fnv1a); builder_.add_testhashu64_fnv1(testhashu64_fnv1); builder_.add_testhashs64_fnv1(testhashs64_fnv1); + builder_.add_test5(test5); builder_.add_flex(flex); builder_.add_testarrayofsortedstruct(testarrayofsortedstruct); builder_.add_testarrayofstring2(testarrayofstring2); @@ -1077,7 +1092,8 @@ inline flatbuffers::Offset CreateMonsterDirect( float testf3 = 0.0f, const std::vector> *testarrayofstring2 = nullptr, const std::vector *testarrayofsortedstruct = nullptr, - const std::vector *flex = nullptr) { + const std::vector *flex = nullptr, + const std::vector *test5 = nullptr) { return MyGame::Example::CreateMonster( _fbb, pos, @@ -1109,7 +1125,8 @@ inline flatbuffers::Offset CreateMonsterDirect( testf3, testarrayofstring2 ? _fbb.CreateVector>(*testarrayofstring2) : 0, testarrayofsortedstruct ? _fbb.CreateVector(*testarrayofsortedstruct) : 0, - flex ? _fbb.CreateVector(*flex) : 0); + flex ? _fbb.CreateVector(*flex) : 0, + test5 ? _fbb.CreateVector(*test5) : 0); } flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); @@ -1242,6 +1259,7 @@ inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function { auto _e = testarrayofstring2(); if (_e) { _o->testarrayofstring2.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring2[_i] = _e->Get(_i)->str(); } } }; { auto _e = testarrayofsortedstruct(); if (_e) { _o->testarrayofsortedstruct.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofsortedstruct[_i] = *_e->Get(_i); } } }; { auto _e = flex(); if (_e) { _o->flex.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->flex[_i] = _e->Get(_i); } } }; + { auto _e = test5(); if (_e) { _o->test5.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test5[_i] = *_e->Get(_i); } } }; } inline flatbuffers::Offset Monster::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -1282,6 +1300,7 @@ inline flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder auto _testarrayofstring2 = _o->testarrayofstring2.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring2) : 0; auto _testarrayofsortedstruct = _o->testarrayofsortedstruct.size() ? _fbb.CreateVectorOfStructs(_o->testarrayofsortedstruct) : 0; auto _flex = _o->flex.size() ? _fbb.CreateVector(_o->flex) : 0; + auto _test5 = _o->test5.size() ? _fbb.CreateVectorOfStructs(_o->test5) : 0; return MyGame::Example::CreateMonster( _fbb, _pos, @@ -1313,7 +1332,8 @@ inline flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder _testf3, _testarrayofstring2, _testarrayofsortedstruct, - _flex); + _flex, + _test5); } inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *obj, Any type) { diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js index a647ea8fa..df00cb08a 100644 --- a/tests/monster_test_generated.js +++ b/tests/monster_test_generated.js @@ -1296,11 +1296,29 @@ MyGame.Example.Monster.prototype.flexArray = function() { return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; }; +/** + * @param {number} index + * @param {MyGame.Example.Test=} obj + * @returns {MyGame.Example.Test} + */ +MyGame.Example.Monster.prototype.test5 = function(index, obj) { + var offset = this.bb.__offset(this.bb_pos, 66); + return offset ? (obj || new MyGame.Example.Test).__init(this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) : null; +}; + +/** + * @returns {number} + */ +MyGame.Example.Monster.prototype.test5Length = function() { + var offset = this.bb.__offset(this.bb_pos, 66); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + /** * @param {flatbuffers.Builder} builder */ MyGame.Example.Monster.startMonster = function(builder) { - builder.startObject(31); + builder.startObject(32); }; /** @@ -1706,6 +1724,22 @@ MyGame.Example.Monster.startFlexVector = function(builder, numElems) { builder.startVector(1, numElems, 1); }; +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} test5Offset + */ +MyGame.Example.Monster.addTest5 = function(builder, test5Offset) { + builder.addFieldOffset(31, test5Offset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +MyGame.Example.Monster.startTest5Vector = function(builder, numElems) { + builder.startVector(4, numElems, 2); +}; + /** * @param {flatbuffers.Builder} builder * @returns {flatbuffers.Offset} diff --git a/tests/monster_test_generated.ts b/tests/monster_test_generated.ts index a05e586c9..f1d2f6603 100644 --- a/tests/monster_test_generated.ts +++ b/tests/monster_test_generated.ts @@ -1287,11 +1287,29 @@ flexArray():Uint8Array|null { return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; }; +/** + * @param {number} index + * @param {MyGame.Example.Test=} obj + * @returns {MyGame.Example.Test} + */ +test5(index: number, obj?:MyGame.Example.Test):MyGame.Example.Test|null { + var offset = this.bb.__offset(this.bb_pos, 66); + return offset ? (obj || new MyGame.Example.Test).__init(this.bb.__vector(this.bb_pos + offset) + index * 4, this.bb) : null; +}; + +/** + * @returns {number} + */ +test5Length():number { + var offset = this.bb.__offset(this.bb_pos, 66); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + /** * @param {flatbuffers.Builder} builder */ static startMonster(builder:flatbuffers.Builder) { - builder.startObject(31); + builder.startObject(32); }; /** @@ -1697,6 +1715,22 @@ static startFlexVector(builder:flatbuffers.Builder, numElems:number) { builder.startVector(1, numElems, 1); }; +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} test5Offset + */ +static addTest5(builder:flatbuffers.Builder, test5Offset:flatbuffers.Offset) { + builder.addFieldOffset(31, test5Offset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +static startTest5Vector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(4, numElems, 2); +}; + /** * @param {flatbuffers.Builder} builder * @returns {flatbuffers.Offset} diff --git a/tests/monsterdata_python_wire.mon b/tests/monsterdata_python_wire.mon index eb359bbdc..d66736b7c 100644 Binary files a/tests/monsterdata_python_wire.mon and b/tests/monsterdata_python_wire.mon differ diff --git a/tests/monsterdata_test.golden b/tests/monsterdata_test.golden index 2e32501d6..e6304b51a 100644 --- a/tests/monsterdata_test.golden +++ b/tests/monsterdata_test.golden @@ -64,5 +64,15 @@ testhashu32_fnv1a: 2390860913, testhashs64_fnv1a: 4898026182817603057, testhashu64_fnv1a: 4898026182817603057, - flex: 1234 + flex: 1234, + test5: [ + { + a: 10, + b: 20 + }, + { + a: 30, + b: 40 + } + ] } diff --git a/tests/monsterdata_test.json b/tests/monsterdata_test.json index e8e3e1d77..7d8822f68 100755 --- a/tests/monsterdata_test.json +++ b/tests/monsterdata_test.json @@ -34,6 +34,16 @@ a: 30 } ], + test5: [ + { + a: 10, + b: 20 + }, + { + b: "40", + a: 30 + } + ], testarrayofstring: [ "test1", "test2" diff --git a/tests/monsterdata_test.mon b/tests/monsterdata_test.mon index e5606e398..69a9c85cd 100644 Binary files a/tests/monsterdata_test.mon and b/tests/monsterdata_test.mon differ diff --git a/tests/namespace_test/namespace_test2_generated.ts b/tests/namespace_test/namespace_test2_generated.ts index 6fe10820c..8deae09c4 100644 --- a/tests/namespace_test/namespace_test2_generated.ts +++ b/tests/namespace_test/namespace_test2_generated.ts @@ -1,6 +1,6 @@ // automatically generated by the FlatBuffers compiler, do not modify -import * as NS3029350602 from "./namespace_test1_generated"; +import * as NS9459827973991502386 from "./namespace_test1_generated"; /** * @constructor */ @@ -39,24 +39,24 @@ static getRootAsTableInFirstNS(bb:flatbuffers.ByteBuffer, obj?:TableInFirstNS):T * @param {NamespaceA.NamespaceB.TableInNestedNS=} obj * @returns {NamespaceA.NamespaceB.TableInNestedNS|null} */ -fooTable(obj?:NS3029350602.NamespaceA.NamespaceB.TableInNestedNS):NS3029350602.NamespaceA.NamespaceB.TableInNestedNS|null { +fooTable(obj?:NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS|null { var offset = this.bb.__offset(this.bb_pos, 4); - return offset ? (obj || new NS3029350602.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null; + return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null; }; /** * @returns {NamespaceA.NamespaceB.EnumInNestedNS} */ -fooEnum():NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS { +fooEnum():NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS { var offset = this.bb.__offset(this.bb_pos, 6); - return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb.readInt8(this.bb_pos + offset)) : NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS.A; + return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb.readInt8(this.bb_pos + offset)) : NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A; }; /** * @param {NamespaceA.NamespaceB.EnumInNestedNS} value * @returns {boolean} */ -mutate_foo_enum(value:NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS):boolean { +mutate_foo_enum(value:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS):boolean { var offset = this.bb.__offset(this.bb_pos, 6); if (offset === 0) { @@ -71,9 +71,9 @@ mutate_foo_enum(value:NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS):boolean * @param {NamespaceA.NamespaceB.StructInNestedNS=} obj * @returns {NamespaceA.NamespaceB.StructInNestedNS|null} */ -fooStruct(obj?:NS3029350602.NamespaceA.NamespaceB.StructInNestedNS):NS3029350602.NamespaceA.NamespaceB.StructInNestedNS|null { +fooStruct(obj?:NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS|null { var offset = this.bb.__offset(this.bb_pos, 8); - return offset ? (obj || new NS3029350602.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb) : null; + return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb) : null; }; /** @@ -95,8 +95,8 @@ static addFooTable(builder:flatbuffers.Builder, fooTableOffset:flatbuffers.Offse * @param {flatbuffers.Builder} builder * @param {NamespaceA.NamespaceB.EnumInNestedNS} fooEnum */ -static addFooEnum(builder:flatbuffers.Builder, fooEnum:NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS) { - builder.addFieldInt8(1, fooEnum, NS3029350602.NamespaceA.NamespaceB.EnumInNestedNS.A); +static addFooEnum(builder:flatbuffers.Builder, fooEnum:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS) { + builder.addFieldInt8(1, fooEnum, NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A); }; /** diff --git a/tests/test.cpp b/tests/test.cpp index 576fcf292..c6cfcaec9 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -103,6 +103,21 @@ flatbuffers::DetachedBuffer CreateFlatBufferTest(std::string &buffer) { Test tests[] = { Test(10, 20), Test(30, 40) }; auto testv = builder.CreateVectorOfStructs(tests, 2); + +#ifndef FLATBUFFERS_CPP98_STL + // Create a vector of structures from a lambda. + auto testv2 = builder.CreateVectorOfStructs( + 2, [&](size_t i, Test* s) -> void { + *s = tests[i]; + }); +#else + // Create a vector of structures using a plain old C++ function. + auto testv2 = builder.CreateVectorOfStructs( + 2, [](size_t i, Test* s, void *state) -> void { + *s = (reinterpret_cast(state))[i]; + }, tests); +#endif // FLATBUFFERS_CPP98_STL + // create monster with very few fields set: // (same functionality as CreateMonster below, but sets fields manually) flatbuffers::Offset mlocs[3]; @@ -181,7 +196,7 @@ flatbuffers::DetachedBuffer CreateFlatBufferTest(std::string &buffer) { testv, vecofstrings, vecoftables, 0, nested_flatbuffer_vector, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.14159f, 3.0f, 0.0f, - vecofstrings2, vecofstructs, flex); + vecofstrings2, vecofstructs, flex, testv2); FinishMonsterBuffer(builder, mloc); @@ -323,16 +338,22 @@ void AccessFlatBufferTest(const uint8_t *flatbuf, size_t length, TEST_EQ(flatbuffers::AlignOf(), 2UL); TEST_EQ(sizeof(Test), 4UL); - auto tests = monster->test4(); - TEST_NOTNULL(tests); - auto test_0 = tests->Get(0); - auto test_1 = tests->Get(1); - TEST_EQ(test_0->a(), 10); - TEST_EQ(test_0->b(), 20); - TEST_EQ(test_1->a(), 30); - TEST_EQ(test_1->b(), 40); - for (auto it = tests->begin(); it != tests->end(); ++it) { - TEST_EQ(it->a() == 10 || it->a() == 30, true); // Just testing iterators. + const flatbuffers::Vector* tests_array[] = { + monster->test4(), + monster->test5(), + }; + for (size_t i = 0; i < sizeof(tests_array) / sizeof(tests_array[0]); ++i) { + auto tests = tests_array[i]; + TEST_NOTNULL(tests); + auto test_0 = tests->Get(0); + auto test_1 = tests->Get(1); + TEST_EQ(test_0->a(), 10); + TEST_EQ(test_0->b(), 20); + TEST_EQ(test_1->a(), 30); + TEST_EQ(test_1->b(), 40); + for (auto it = tests->begin(); it != tests->end(); ++it) { + TEST_EQ(it->a() == 10 || it->a() == 30, true); // Just testing iterators. + } } // Checking for presence of fields: