diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 52d76345f15c3a92ef6acfc9c71c326097abe1e3..449676daa16da45cac7b266cef97b4b1660a097c 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -1367,7 +1367,9 @@ class CppGenerator : public BaseGenerator { field.value.type.element != BASE_TYPE_UTYPE)) { auto type = GenTypeNative(field.value.type, false, field); auto cpp_type = field.attributes.Lookup("cpp_type"); - auto full_type = (cpp_type ? cpp_type->constant + " *" : type + " "); + auto full_type = (cpp_type ? + (field.value.type.base_type == BASE_TYPE_VECTOR ? "std::vector<" + cpp_type->constant + "*> " : cpp_type->constant + " *") + : type + " "); code_.SetValue("FIELD_TYPE", full_type); code_.SetValue("FIELD_NAME", Name(field)); code_ += " {{FIELD_TYPE}}{{FIELD_NAME}};"; @@ -1400,7 +1402,7 @@ class CppGenerator : public BaseGenerator { Name(field) + "(" + native_default->constant + ")"; } } - } else if (cpp_type) { + } else if (cpp_type && field.value.type.base_type != BASE_TYPE_VECTOR) { if (!initializer_list.empty()) { initializer_list += ",\n "; } initializer_list += Name(field) + "(0)"; } @@ -2017,6 +2019,7 @@ class CppGenerator : public BaseGenerator { std::string code; switch (field.value.type.base_type) { case BASE_TYPE_VECTOR: { + auto cpp_type = field.attributes.Lookup("cpp_type"); std::string indexing; if (field.value.type.enum_def) { indexing += "(" + field.value.type.enum_def->name + ")"; @@ -2039,9 +2042,23 @@ class CppGenerator : public BaseGenerator { code += "{ _o->" + name + ".resize(_e->size()); "; code += "for (flatbuffers::uoffset_t _i = 0;"; code += " _i < _e->size(); _i++) { "; - code += "_o->" + name + "[_i]" + access + " = "; - code += + if (cpp_type) { + // Generate code that resolves the cpp pointer type, of the form: + // if (resolver) + // (*resolver)(&_o->field, (hash_value_t)(_e)); + // else + // _o->field = nullptr; + code += "if (_resolver) "; + code += "(*_resolver)"; + code += "(reinterpret_cast<void **>(&_o->" + name + "[_i]" + access + "), "; + code += "static_cast<flatbuffers::hash_value_t>(" + indexing + "));"; + code += " else "; + code += "_o->" + name + "[_i]" + access + " = nullptr"; + } else { + code += "_o->" + name + "[_i]" + access + " = "; + code += GenUnpackVal(field.value.type.VectorType(), indexing, true, field); + } code += "; } }"; break; } @@ -2094,7 +2111,7 @@ class CppGenerator : public BaseGenerator { } else { value += Name(field); } - if (field.attributes.Lookup("cpp_type")) { + if (field.value.type.base_type != BASE_TYPE_VECTOR && field.attributes.Lookup("cpp_type")) { auto type = GenTypeBasic(field.value.type, false); value = "_rehasher ? " @@ -2182,6 +2199,14 @@ class CppGenerator : public BaseGenerator { field.value.type.enum_def->underlying_type, false); code += "_fbb.CreateVector((const " + basetype + "*)" + value + ".data(), " + value + ".size())"; + } else if (field.attributes.Lookup("cpp_type")) { + auto type = GenTypeBasic(vector_type, false); + code += "_fbb.CreateVector<" + type + ">(" + value + ".size(), "; + code += "[](size_t i, _VectorArgs *__va) { "; + code += "return __va->__rehasher ? "; + code += "static_cast<" + type + ">((*__va->__rehasher)"; + code += "(__va->_" + value + "[i]" + ")) : 0"; + code += "; }, &_va )"; } else { code += "_fbb.CreateVector(" + value + ")"; } diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 6ebf7e9f559e1a54d3a4ea6c8a301960739740b6..f3e40f581c89501f7a23a3b320425f1d2ee751e2 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -680,7 +680,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 (type.base_type) { + switch ((type.base_type == BASE_TYPE_VECTOR) ? type.element : type.base_type) { case BASE_TYPE_INT: case BASE_TYPE_UINT: { if (FindHashFunction32(hash_name->constant.c_str()) == nullptr) diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj index 0afe6b11504e00a00d9b7358fc0fbe5f454a38fe..38d62d6110f65d5d3c0a9e18e4e736f1c3924747 100644 --- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj +++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj @@ -68,6 +68,9 @@ <Compile Include="..\MyGame\Example\Monster.cs"> <Link>MyGame\Example\Monster.cs</Link> </Compile> + <Compile Include="..\MyGame\Example\Referrable.cs"> + <Link>MyGame\Example\Referrable.cs</Link> + </Compile> <Compile Include="..\MyGame\Example\Stat.cs"> <Link>MyGame\Example\Stat.cs</Link> </Compile> diff --git a/tests/MyGame/Example/Monster.cs b/tests/MyGame/Example/Monster.cs index ed4365964a0b4dea24e8e713c64539c1221adf03..8138b268cefffaf86c8d5eceabfe547f0b4bf12b 100644 --- a/tests/MyGame/Example/Monster.cs +++ b/tests/MyGame/Example/Monster.cs @@ -98,8 +98,17 @@ public struct Monster : IFlatbufferObject public ArraySegment<byte>? GetVectorOfDoublesBytes() { return __p.__vector_as_arraysegment(70); } public bool MutateVectorOfDoubles(int j, double vector_of_doubles) { int o = __p.__offset(70); if (o != 0) { __p.bb.PutDouble(__p.__vector(o) + j * 8, vector_of_doubles); return true; } else { return false; } } public MyGame.InParentNamespace? ParentNamespaceTest { get { int o = __p.__offset(72); return o != 0 ? (MyGame.InParentNamespace?)(new MyGame.InParentNamespace()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } } + public Referrable? VectorOfReferrables(int j) { int o = __p.__offset(74); return o != 0 ? (Referrable?)(new Referrable()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; } + public int VectorOfReferrablesLength { get { int o = __p.__offset(74); return o != 0 ? __p.__vector_len(o) : 0; } } + public Referrable? VectorOfReferrablesByKey(ulong key) { int o = __p.__offset(74); return o != 0 ? Referrable.__lookup_by_key(__p.__vector(o), key, __p.bb) : null; } + public ulong SingleWeakReference { get { int o = __p.__offset(76); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } } + public bool MutateSingleWeakReference(ulong single_weak_reference) { int o = __p.__offset(76); if (o != 0) { __p.bb.PutUlong(o + __p.bb_pos, single_weak_reference); return true; } else { return false; } } + public ulong VectorOfWeakReferences(int j) { int o = __p.__offset(78); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; } + public int VectorOfWeakReferencesLength { get { int o = __p.__offset(78); return o != 0 ? __p.__vector_len(o) : 0; } } + public ArraySegment<byte>? GetVectorOfWeakReferencesBytes() { return __p.__vector_as_arraysegment(78); } + public bool MutateVectorOfWeakReferences(int j, ulong vector_of_weak_references) { int o = __p.__offset(78); if (o != 0) { __p.bb.PutUlong(__p.__vector(o) + j * 8, vector_of_weak_references); return true; } else { return false; } } - public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(35); } + public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(38); } public static void AddPos(FlatBufferBuilder builder, Offset<Vec3> 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); } @@ -155,6 +164,13 @@ public struct Monster : IFlatbufferObject public static VectorOffset CreateVectorOfDoublesVector(FlatBufferBuilder builder, double[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddDouble(data[i]); return builder.EndVector(); } public static void StartVectorOfDoublesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); } public static void AddParentNamespaceTest(FlatBufferBuilder builder, Offset<MyGame.InParentNamespace> parentNamespaceTestOffset) { builder.AddOffset(34, parentNamespaceTestOffset.Value, 0); } + public static void AddVectorOfReferrables(FlatBufferBuilder builder, VectorOffset vectorOfReferrablesOffset) { builder.AddOffset(35, vectorOfReferrablesOffset.Value, 0); } + public static VectorOffset CreateVectorOfReferrablesVector(FlatBufferBuilder builder, Offset<Referrable>[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); } + public static void StartVectorOfReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); } + public static void AddSingleWeakReference(FlatBufferBuilder builder, ulong singleWeakReference) { builder.AddUlong(36, singleWeakReference, 0); } + public static void AddVectorOfWeakReferences(FlatBufferBuilder builder, VectorOffset vectorOfWeakReferencesOffset) { builder.AddOffset(37, vectorOfWeakReferencesOffset.Value, 0); } + public static VectorOffset CreateVectorOfWeakReferencesVector(FlatBufferBuilder builder, ulong[] data) { builder.StartVector(8, data.Length, 8); for (int i = data.Length - 1; i >= 0; i--) builder.AddUlong(data[i]); return builder.EndVector(); } + public static void StartVectorOfWeakReferencesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(8, numElems, 8); } public static Offset<Monster> 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 04e58528c18bdceb9834ab7ed4d73a6bdbf8a0e0..ec6a50fa7f38d0f38e0387af6f93d1f2f186fe44 100644 --- a/tests/MyGame/Example/Monster.go +++ b/tests/MyGame/Example/Monster.go @@ -529,8 +529,57 @@ func (rcv *Monster) ParentNamespaceTest(obj *InParentNamespace) *InParentNamespa return nil } +func (rcv *Monster) VectorOfReferrables(obj *Referrable, j int) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(74)) + if o != 0 { + x := rcv._tab.Vector(o) + x += flatbuffers.UOffsetT(j) * 4 + x = rcv._tab.Indirect(x) + obj.Init(rcv._tab.Bytes, x) + return true + } + return false +} + +func (rcv *Monster) VectorOfReferrablesLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(74)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + +func (rcv *Monster) SingleWeakReference() uint64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(76)) + if o != 0 { + return rcv._tab.GetUint64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Monster) MutateSingleWeakReference(n uint64) bool { + return rcv._tab.MutateUint64Slot(76, n) +} + +func (rcv *Monster) VectorOfWeakReferences(j int) uint64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(78)) + if o != 0 { + a := rcv._tab.Vector(o) + return rcv._tab.GetUint64(a + flatbuffers.UOffsetT(j*8)) + } + return 0 +} + +func (rcv *Monster) VectorOfWeakReferencesLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(78)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + func MonsterStart(builder *flatbuffers.Builder) { - builder.StartObject(35) + builder.StartObject(38) } func MonsterAddPos(builder *flatbuffers.Builder, pos flatbuffers.UOffsetT) { builder.PrependStructSlot(0, flatbuffers.UOffsetT(pos), 0) @@ -670,6 +719,21 @@ func MonsterStartVectorOfDoublesVector(builder *flatbuffers.Builder, numElems in func MonsterAddParentNamespaceTest(builder *flatbuffers.Builder, parentNamespaceTest flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(34, flatbuffers.UOffsetT(parentNamespaceTest), 0) } +func MonsterAddVectorOfReferrables(builder *flatbuffers.Builder, vectorOfReferrables flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(35, flatbuffers.UOffsetT(vectorOfReferrables), 0) +} +func MonsterStartVectorOfReferrablesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(4, numElems, 4) +} +func MonsterAddSingleWeakReference(builder *flatbuffers.Builder, singleWeakReference uint64) { + builder.PrependUint64Slot(36, singleWeakReference, 0) +} +func MonsterAddVectorOfWeakReferences(builder *flatbuffers.Builder, vectorOfWeakReferences flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(37, flatbuffers.UOffsetT(vectorOfWeakReferences), 0) +} +func MonsterStartVectorOfWeakReferencesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(8, numElems, 8) +} 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 3d97b772a2258ab3fac8a274b8c4c3c1f9d5f13a..af262b8ef24b41c86e39617b070553bbd58297da 100644 --- a/tests/MyGame/Example/Monster.java +++ b/tests/MyGame/Example/Monster.java @@ -108,8 +108,18 @@ public final class Monster extends Table { public boolean mutateVectorOfDoubles(int j, double vector_of_doubles) { int o = __offset(70); if (o != 0) { bb.putDouble(__vector(o) + j * 8, vector_of_doubles); return true; } else { return false; } } public MyGame.InParentNamespace parentNamespaceTest() { return parentNamespaceTest(new MyGame.InParentNamespace()); } public MyGame.InParentNamespace parentNamespaceTest(MyGame.InParentNamespace obj) { int o = __offset(72); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; } + public Referrable vectorOfReferrables(int j) { return vectorOfReferrables(new Referrable(), j); } + public Referrable vectorOfReferrables(Referrable obj, int j) { int o = __offset(74); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; } + public int vectorOfReferrablesLength() { int o = __offset(74); return o != 0 ? __vector_len(o) : 0; } + public Referrable vectorOfReferrablesByKey(long key) { int o = __offset(74); return o != 0 ? Referrable.__lookup_by_key(__vector(o), key, bb) : null; } + public long singleWeakReference() { int o = __offset(76); return o != 0 ? bb.getLong(o + bb_pos) : 0L; } + public boolean mutateSingleWeakReference(long single_weak_reference) { int o = __offset(76); if (o != 0) { bb.putLong(o + bb_pos, single_weak_reference); return true; } else { return false; } } + public long vectorOfWeakReferences(int j) { int o = __offset(78); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; } + public int vectorOfWeakReferencesLength() { int o = __offset(78); return o != 0 ? __vector_len(o) : 0; } + public ByteBuffer vectorOfWeakReferencesAsByteBuffer() { return __vector_as_bytebuffer(78, 8); } + public boolean mutateVectorOfWeakReferences(int j, long vector_of_weak_references) { int o = __offset(78); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_weak_references); return true; } else { return false; } } - public static void startMonster(FlatBufferBuilder builder) { builder.startObject(35); } + public static void startMonster(FlatBufferBuilder builder) { builder.startObject(38); } 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); } @@ -165,6 +175,13 @@ public final class Monster extends Table { public static int createVectorOfDoublesVector(FlatBufferBuilder builder, double[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addDouble(data[i]); return builder.endVector(); } public static void startVectorOfDoublesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); } public static void addParentNamespaceTest(FlatBufferBuilder builder, int parentNamespaceTestOffset) { builder.addOffset(34, parentNamespaceTestOffset, 0); } + public static void addVectorOfReferrables(FlatBufferBuilder builder, int vectorOfReferrablesOffset) { builder.addOffset(35, vectorOfReferrablesOffset, 0); } + public static int createVectorOfReferrablesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); } + public static void startVectorOfReferrablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); } + public static void addSingleWeakReference(FlatBufferBuilder builder, long singleWeakReference) { builder.addLong(36, singleWeakReference, 0L); } + public static void addVectorOfWeakReferences(FlatBufferBuilder builder, int vectorOfWeakReferencesOffset) { builder.addOffset(37, vectorOfWeakReferencesOffset, 0); } + public static int createVectorOfWeakReferencesVector(FlatBufferBuilder builder, long[] data) { builder.startVector(8, data.length, 8); for (int i = data.length - 1; i >= 0; i--) builder.addLong(data[i]); return builder.endVector(); } + public static void startVectorOfWeakReferencesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 8); } 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 eb66de8720c2735729bb0ec115feebb6e3cd46b1..a327c3707de9d0fce3ecbc8fe5b6c2bd05fe0240 100644 --- a/tests/MyGame/Example/Monster.php +++ b/tests/MyGame/Example/Monster.php @@ -489,22 +489,69 @@ class Monster extends Table return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0; } + /** + * @returnVectorOffset + */ + public function getVectorOfReferrables($j) + { + $o = $this->__offset(74); + $obj = new Referrable(); + return $o != 0 ? $obj->init($this->__indirect($this->__vector($o) + $j * 4), $this->bb) : null; + } + + /** + * @return int + */ + public function getVectorOfReferrablesLength() + { + $o = $this->__offset(74); + return $o != 0 ? $this->__vector_len($o) : 0; + } + + /** + * @return ulong + */ + public function getSingleWeakReference() + { + $o = $this->__offset(76); + return $o != 0 ? $this->bb->getUlong($o + $this->bb_pos) : 0; + } + + /** + * @param int offset + * @return ulong + */ + public function getVectorOfWeakReferences($j) + { + $o = $this->__offset(78); + return $o != 0 ? $this->bb->getUlong($this->__vector($o) + $j * 8) : 0; + } + + /** + * @return int + */ + public function getVectorOfWeakReferencesLength() + { + $o = $this->__offset(78); + return $o != 0 ? $this->__vector_len($o) : 0; + } + /** * @param FlatBufferBuilder $builder * @return void */ public static function startMonster(FlatBufferBuilder $builder) { - $builder->StartObject(35); + $builder->StartObject(38); } /** * @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, $test5, $vector_of_longs, $vector_of_doubles, $parent_namespace_test) + 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, $vector_of_longs, $vector_of_doubles, $parent_namespace_test, $vector_of_referrables, $single_weak_reference, $vector_of_weak_references) { - $builder->startObject(35); + $builder->startObject(38); self::addPos($builder, $pos); self::addMana($builder, $mana); self::addHp($builder, $hp); @@ -539,6 +586,9 @@ class Monster extends Table self::addVectorOfLongs($builder, $vector_of_longs); self::addVectorOfDoubles($builder, $vector_of_doubles); self::addParentNamespaceTest($builder, $parent_namespace_test); + self::addVectorOfReferrables($builder, $vector_of_referrables); + self::addSingleWeakReference($builder, $single_weak_reference); + self::addVectorOfWeakReferences($builder, $vector_of_weak_references); $o = $builder->endObject(); $builder->required($o, 10); // name return $o; @@ -1167,6 +1217,84 @@ class Monster extends Table $builder->addOffsetX(34, $parentNamespaceTest, 0); } + /** + * @param FlatBufferBuilder $builder + * @param VectorOffset + * @return void + */ + public static function addVectorOfReferrables(FlatBufferBuilder $builder, $vectorOfReferrables) + { + $builder->addOffsetX(35, $vectorOfReferrables, 0); + } + + /** + * @param FlatBufferBuilder $builder + * @param array offset array + * @return int vector offset + */ + public static function createVectorOfReferrablesVector(FlatBufferBuilder $builder, array $data) + { + $builder->startVector(4, count($data), 4); + 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 startVectorOfReferrablesVector(FlatBufferBuilder $builder, $numElems) + { + $builder->startVector(4, $numElems, 4); + } + + /** + * @param FlatBufferBuilder $builder + * @param ulong + * @return void + */ + public static function addSingleWeakReference(FlatBufferBuilder $builder, $singleWeakReference) + { + $builder->addUlongX(36, $singleWeakReference, 0); + } + + /** + * @param FlatBufferBuilder $builder + * @param VectorOffset + * @return void + */ + public static function addVectorOfWeakReferences(FlatBufferBuilder $builder, $vectorOfWeakReferences) + { + $builder->addOffsetX(37, $vectorOfWeakReferences, 0); + } + + /** + * @param FlatBufferBuilder $builder + * @param array offset array + * @return int vector offset + */ + public static function createVectorOfWeakReferencesVector(FlatBufferBuilder $builder, array $data) + { + $builder->startVector(8, count($data), 8); + for ($i = count($data) - 1; $i >= 0; $i--) { + $builder->addUlong($data[$i]); + } + return $builder->endVector(); + } + + /** + * @param FlatBufferBuilder $builder + * @param int $numElems + * @return void + */ + public static function startVectorOfWeakReferencesVector(FlatBufferBuilder $builder, $numElems) + { + $builder->startVector(8, $numElems, 8); + } + /** * @param FlatBufferBuilder $builder * @return int table offset diff --git a/tests/MyGame/Example/Monster.py b/tests/MyGame/Example/Monster.py index fc834edb1b3e00502b396029ad6c898912973ac9..b99b55f87dee558ff93274a0a71671962025925e 100644 --- a/tests/MyGame/Example/Monster.py +++ b/tests/MyGame/Example/Monster.py @@ -433,7 +433,56 @@ class Monster(object): return obj return None -def MonsterStart(builder): builder.StartObject(35) + # Monster + def VectorOfReferrables(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + from .Referrable import Referrable + obj = Referrable() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Monster + def VectorOfReferrablesLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Monster + def SingleWeakReference(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(76)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Monster + def VectorOfWeakReferences(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint64Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 8)) + return 0 + + # Monster + def VectorOfWeakReferencesAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint64Flags, o) + return 0 + + # Monster + def VectorOfWeakReferencesLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def MonsterStart(builder): builder.StartObject(38) 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) @@ -480,4 +529,9 @@ def MonsterStartVectorOfLongsVector(builder, numElems): return builder.StartVect def MonsterAddVectorOfDoubles(builder, vectorOfDoubles): builder.PrependUOffsetTRelativeSlot(33, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfDoubles), 0) def MonsterStartVectorOfDoublesVector(builder, numElems): return builder.StartVector(8, numElems, 8) def MonsterAddParentNamespaceTest(builder, parentNamespaceTest): builder.PrependUOffsetTRelativeSlot(34, flatbuffers.number_types.UOffsetTFlags.py_type(parentNamespaceTest), 0) +def MonsterAddVectorOfReferrables(builder, vectorOfReferrables): builder.PrependUOffsetTRelativeSlot(35, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfReferrables), 0) +def MonsterStartVectorOfReferrablesVector(builder, numElems): return builder.StartVector(4, numElems, 4) +def MonsterAddSingleWeakReference(builder, singleWeakReference): builder.PrependUint64Slot(36, singleWeakReference, 0) +def MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences): builder.PrependUOffsetTRelativeSlot(37, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfWeakReferences), 0) +def MonsterStartVectorOfWeakReferencesVector(builder, numElems): return builder.StartVector(8, numElems, 8) def MonsterEnd(builder): return builder.EndObject() diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs index 53493a1ebc286108f4a218349e02a0bceedcc1df..de349e37028e47c749cef3c1dc89f09c379b7e22 100644 --- a/tests/monster_test.fbs +++ b/tests/monster_test.fbs @@ -44,6 +44,10 @@ table Stat { count:ushort; } +table Referrable { + id:ulong(key, hash:"fnv1a_64"); +} + /// an example documentation comment: monster object table Monster { pos:Vec3 (id: 0); @@ -82,6 +86,9 @@ table Monster { vector_of_longs:[long] (id:32); vector_of_doubles:[double] (id:33); parent_namespace_test:InParentNamespace (id:34); + vector_of_referrables:[Referrable](id:35); + single_weak_reference:ulong(id:36, hash:"fnv1a_64", cpp_type:"ReferrableT"); + vector_of_weak_references:[ulong](id:37, hash:"fnv1a_64", cpp_type:"ReferrableT"); } table TypeAliases { diff --git a/tests/monster_test.schema.json b/tests/monster_test.schema.json index 62880abbcf4a1ed6fe1c9aec7643ee55e300ed9e..ca8c22c4727de86d82696db68c3537f0dfb9ac10 100644 --- a/tests/monster_test.schema.json +++ b/tests/monster_test.schema.json @@ -89,6 +89,13 @@ }, "additionalProperties" : false }, + "MyGame_Example_Referrable" : { + "type" : "object", + "properties" : { + "id" : { "type" : "number" } + }, + "additionalProperties" : false + }, "MyGame_Example_Monster" : { "type" : "object", "description" : " an example documentation comment: monster object", @@ -127,7 +134,10 @@ "test5" : { "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" } }, "vector_of_longs" : { "type" : "array", "items" : { "type" : "number" } }, "vector_of_doubles" : { "type" : "array", "items" : { "type" : "number" } }, - "parent_namespace_test" : { "$ref" : "#/definitions/MyGame_InParentNamespace" } + "parent_namespace_test" : { "$ref" : "#/definitions/MyGame_InParentNamespace" }, + "vector_of_referrables" : { "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" } }, + "single_weak_reference" : { "type" : "number" }, + "vector_of_weak_references" : { "type" : "array", "items" : { "type" : "number" } } }, "required" : ["name"], "additionalProperties" : false diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 14a95ad703961978b6f0d9988d91ba2c44113c19..cc0d9d4a857e7cf9e8af7c9811e2facd1b86eecd 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -33,6 +33,9 @@ struct Ability; struct Stat; struct StatT; +struct Referrable; +struct ReferrableT; + struct Monster; struct MonsterT; @@ -604,6 +607,76 @@ inline flatbuffers::Offset<Stat> CreateStatDirect( flatbuffers::Offset<Stat> CreateStat(flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +struct ReferrableT : public flatbuffers::NativeTable { + typedef Referrable TableType; + uint64_t id; + ReferrableT() + : id(0) { + } +}; + +struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ReferrableT NativeTableType; + enum { + VT_ID = 4 + }; + uint64_t id() const { + return GetField<uint64_t>(VT_ID, 0); + } + bool mutate_id(uint64_t _id) { + return SetField<uint64_t>(VT_ID, _id, 0); + } + bool KeyCompareLessThan(const Referrable *o) const { + return id() < o->id(); + } + int KeyCompareWithValue(uint64_t val) const { + const auto key = id(); + if (key < val) { + return -1; + } else if (key > val) { + return 1; + } else { + return 0; + } + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField<uint64_t>(verifier, VT_ID) && + verifier.EndTable(); + } + ReferrableT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ReferrableT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset<Referrable> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ReferrableBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_id(uint64_t id) { + fbb_.AddElement<uint64_t>(Referrable::VT_ID, id, 0); + } + explicit ReferrableBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ReferrableBuilder &operator=(const ReferrableBuilder &); + flatbuffers::Offset<Referrable> Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset<Referrable>(end); + return o; + } +}; + +inline flatbuffers::Offset<Referrable> CreateReferrable( + flatbuffers::FlatBufferBuilder &_fbb, + uint64_t id = 0) { + ReferrableBuilder builder_(_fbb); + builder_.add_id(id); + return builder_.Finish(); +} + +flatbuffers::Offset<Referrable> CreateReferrable(flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + struct MonsterT : public flatbuffers::NativeTable { typedef Monster TableType; flatbuffers::unique_ptr<Vec3> pos; @@ -639,6 +712,9 @@ struct MonsterT : public flatbuffers::NativeTable { std::vector<int64_t> vector_of_longs; std::vector<double> vector_of_doubles; flatbuffers::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test; + std::vector<flatbuffers::unique_ptr<ReferrableT>> vector_of_referrables; + ReferrableT *single_weak_reference; + std::vector<ReferrableT*> vector_of_weak_references; MonsterT() : mana(150), hp(100), @@ -654,7 +730,8 @@ struct MonsterT : public flatbuffers::NativeTable { testhashu64_fnv1a(0), testf(3.14159f), testf2(3.0f), - testf3(0.0f) { + testf3(0.0f), + single_weak_reference(0) { } }; @@ -698,7 +775,10 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_TEST5 = 66, VT_VECTOR_OF_LONGS = 68, VT_VECTOR_OF_DOUBLES = 70, - VT_PARENT_NAMESPACE_TEST = 72 + VT_PARENT_NAMESPACE_TEST = 72, + VT_VECTOR_OF_REFERRABLES = 74, + VT_SINGLE_WEAK_REFERENCE = 76, + VT_VECTOR_OF_WEAK_REFERENCES = 78 }; const Vec3 *pos() const { return GetStruct<const Vec3 *>(VT_POS); @@ -929,6 +1009,24 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { MyGame::InParentNamespace *mutable_parent_namespace_test() { return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST); } + const flatbuffers::Vector<flatbuffers::Offset<Referrable>> *vector_of_referrables() const { + return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<Referrable>> *>(VT_VECTOR_OF_REFERRABLES); + } + flatbuffers::Vector<flatbuffers::Offset<Referrable>> *mutable_vector_of_referrables() { + return GetPointer<flatbuffers::Vector<flatbuffers::Offset<Referrable>> *>(VT_VECTOR_OF_REFERRABLES); + } + uint64_t single_weak_reference() const { + return GetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, 0); + } + bool mutate_single_weak_reference(uint64_t _single_weak_reference) { + return SetField<uint64_t>(VT_SINGLE_WEAK_REFERENCE, _single_weak_reference, 0); + } + const flatbuffers::Vector<uint64_t> *vector_of_weak_references() const { + return GetPointer<const flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES); + } + flatbuffers::Vector<uint64_t> *mutable_vector_of_weak_references() { + return GetPointer<flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_WEAK_REFERENCES); + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField<Vec3>(verifier, VT_POS) && @@ -985,6 +1083,12 @@ struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { verifier.Verify(vector_of_doubles()) && VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) && verifier.VerifyTable(parent_namespace_test()) && + VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) && + verifier.Verify(vector_of_referrables()) && + verifier.VerifyVectorOfTables(vector_of_referrables()) && + VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE) && + VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) && + verifier.Verify(vector_of_weak_references()) && verifier.EndTable(); } MonsterT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -1109,6 +1213,15 @@ struct MonsterBuilder { void add_parent_namespace_test(flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test) { fbb_.AddOffset(Monster::VT_PARENT_NAMESPACE_TEST, parent_namespace_test); } + void add_vector_of_referrables(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Referrable>>> vector_of_referrables) { + fbb_.AddOffset(Monster::VT_VECTOR_OF_REFERRABLES, vector_of_referrables); + } + void add_single_weak_reference(uint64_t single_weak_reference) { + fbb_.AddElement<uint64_t>(Monster::VT_SINGLE_WEAK_REFERENCE, single_weak_reference, 0); + } + void add_vector_of_weak_references(flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_weak_references) { + fbb_.AddOffset(Monster::VT_VECTOR_OF_WEAK_REFERENCES, vector_of_weak_references); + } explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -1157,12 +1270,18 @@ inline flatbuffers::Offset<Monster> CreateMonster( flatbuffers::Offset<flatbuffers::Vector<const Test *>> test5 = 0, flatbuffers::Offset<flatbuffers::Vector<int64_t>> vector_of_longs = 0, flatbuffers::Offset<flatbuffers::Vector<double>> vector_of_doubles = 0, - flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0) { + flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0, + flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Referrable>>> vector_of_referrables = 0, + uint64_t single_weak_reference = 0, + flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0) { MonsterBuilder builder_(_fbb); + builder_.add_single_weak_reference(single_weak_reference); 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_vector_of_weak_references(vector_of_weak_references); + builder_.add_vector_of_referrables(vector_of_referrables); builder_.add_parent_namespace_test(parent_namespace_test); builder_.add_vector_of_doubles(vector_of_doubles); builder_.add_vector_of_longs(vector_of_longs); @@ -1231,7 +1350,10 @@ inline flatbuffers::Offset<Monster> CreateMonsterDirect( const std::vector<Test> *test5 = nullptr, const std::vector<int64_t> *vector_of_longs = nullptr, const std::vector<double> *vector_of_doubles = nullptr, - flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0) { + flatbuffers::Offset<MyGame::InParentNamespace> parent_namespace_test = 0, + const std::vector<flatbuffers::Offset<Referrable>> *vector_of_referrables = nullptr, + uint64_t single_weak_reference = 0, + const std::vector<uint64_t> *vector_of_weak_references = nullptr) { return MyGame::Example::CreateMonster( _fbb, pos, @@ -1267,7 +1389,10 @@ inline flatbuffers::Offset<Monster> CreateMonsterDirect( test5 ? _fbb.CreateVectorOfStructs<Test>(*test5) : 0, vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0, vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0, - parent_namespace_test); + parent_namespace_test, + vector_of_referrables ? _fbb.CreateVector<flatbuffers::Offset<Referrable>>(*vector_of_referrables) : 0, + single_weak_reference, + vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0); } flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); @@ -1639,6 +1764,32 @@ inline flatbuffers::Offset<Stat> CreateStat(flatbuffers::FlatBufferBuilder &_fbb _count); } +inline ReferrableT *Referrable::UnPack(const flatbuffers::resolver_function_t *_resolver) const { + auto _o = new ReferrableT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Referrable::UnPackTo(ReferrableT *_o, const flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = id(); _o->id = _e; }; +} + +inline flatbuffers::Offset<Referrable> Referrable::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const flatbuffers::rehasher_function_t *_rehasher) { + return CreateReferrable(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset<Referrable> CreateReferrable(flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT *_o, const flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ReferrableT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _id = _o->id; + return MyGame::Example::CreateReferrable( + _fbb, + _id); +} + inline MonsterT *Monster::UnPack(const flatbuffers::resolver_function_t *_resolver) const { auto _o = new MonsterT(); UnPackTo(_o, _resolver); @@ -1682,6 +1833,9 @@ inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function { auto _e = vector_of_longs(); if (_e) { _o->vector_of_longs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_longs[_i] = _e->Get(_i); } } }; { auto _e = vector_of_doubles(); if (_e) { _o->vector_of_doubles.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_doubles[_i] = _e->Get(_i); } } }; { auto _e = parent_namespace_test(); if (_e) _o->parent_namespace_test = flatbuffers::unique_ptr<MyGame::InParentNamespaceT>(_e->UnPack(_resolver)); }; + { auto _e = vector_of_referrables(); if (_e) { _o->vector_of_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_referrables[_i] = flatbuffers::unique_ptr<ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } }; + { auto _e = single_weak_reference(); if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; }; + { auto _e = vector_of_weak_references(); if (_e) { _o->vector_of_weak_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_weak_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_weak_references[_i] = nullptr; } } }; } inline flatbuffers::Offset<Monster> Monster::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -1726,6 +1880,9 @@ inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder auto _vector_of_longs = _o->vector_of_longs.size() ? _fbb.CreateVector(_o->vector_of_longs) : 0; auto _vector_of_doubles = _o->vector_of_doubles.size() ? _fbb.CreateVector(_o->vector_of_doubles) : 0; auto _parent_namespace_test = _o->parent_namespace_test ? CreateInParentNamespace(_fbb, _o->parent_namespace_test.get(), _rehasher) : 0; + auto _vector_of_referrables = _o->vector_of_referrables.size() ? _fbb.CreateVector<flatbuffers::Offset<Referrable>> (_o->vector_of_referrables.size(), [](size_t i, _VectorArgs *__va) { return CreateReferrable(*__va->__fbb, __va->__o->vector_of_referrables[i].get(), __va->__rehasher); }, &_va ) : 0; + auto _single_weak_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->single_weak_reference)) : 0; + auto _vector_of_weak_references = _o->vector_of_weak_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_weak_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_weak_references[i])) : 0; }, &_va ) : 0; return MyGame::Example::CreateMonster( _fbb, _pos, @@ -1761,7 +1918,10 @@ inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder _test5, _vector_of_longs, _vector_of_doubles, - _parent_namespace_test); + _parent_namespace_test, + _vector_of_referrables, + _single_weak_reference, + _vector_of_weak_references); } inline TypeAliasesT *TypeAliases::UnPack(const flatbuffers::resolver_function_t *_resolver) const { @@ -1934,6 +2094,34 @@ inline void AnyUnion::Reset() { type = Any_NONE; } +} // namespace Example + +inline flatbuffers::TypeTable *InParentNamespaceTypeTable(); + +namespace Example2 { + +inline flatbuffers::TypeTable *MonsterTypeTable(); + +} // namespace Example2 + +namespace Example { + +inline flatbuffers::TypeTable *TestTypeTable(); + +inline flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable(); + +inline flatbuffers::TypeTable *Vec3TypeTable(); + +inline flatbuffers::TypeTable *AbilityTypeTable(); + +inline flatbuffers::TypeTable *StatTypeTable(); + +inline flatbuffers::TypeTable *ReferrableTypeTable(); + +inline flatbuffers::TypeTable *MonsterTypeTable(); + +inline flatbuffers::TypeTable *TypeAliasesTypeTable(); + inline flatbuffers::TypeTable *ColorTypeTable() { static flatbuffers::TypeCode type_codes[] = { { flatbuffers::ET_CHAR, 0, 0 }, @@ -2094,6 +2282,19 @@ inline flatbuffers::TypeTable *StatTypeTable() { return &tt; } +inline flatbuffers::TypeTable *ReferrableTypeTable() { + static flatbuffers::TypeCode type_codes[] = { + { flatbuffers::ET_ULONG, 0, -1 } + }; + static const char *names[] = { + "id" + }; + static flatbuffers::TypeTable tt = { + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + }; + return &tt; +} + inline flatbuffers::TypeTable *MonsterTypeTable() { static flatbuffers::TypeCode type_codes[] = { { flatbuffers::ET_SEQUENCE, 0, 0 }, @@ -2130,7 +2331,10 @@ inline flatbuffers::TypeTable *MonsterTypeTable() { { flatbuffers::ET_SEQUENCE, 1, 3 }, { flatbuffers::ET_LONG, 1, -1 }, { flatbuffers::ET_DOUBLE, 1, -1 }, - { flatbuffers::ET_SEQUENCE, 0, 7 } + { flatbuffers::ET_SEQUENCE, 0, 7 }, + { flatbuffers::ET_SEQUENCE, 1, 8 }, + { flatbuffers::ET_ULONG, 0, -1 }, + { flatbuffers::ET_ULONG, 1, -1 } }; static flatbuffers::TypeFunction type_refs[] = { Vec3TypeTable, @@ -2140,7 +2344,8 @@ inline flatbuffers::TypeTable *MonsterTypeTable() { MonsterTypeTable, StatTypeTable, AbilityTypeTable, - MyGame::InParentNamespaceTypeTable + MyGame::InParentNamespaceTypeTable, + ReferrableTypeTable }; static const char *names[] = { "pos", @@ -2177,10 +2382,13 @@ inline flatbuffers::TypeTable *MonsterTypeTable() { "test5", "vector_of_longs", "vector_of_doubles", - "parent_namespace_test" + "parent_namespace_test", + "vector_of_referrables", + "single_weak_reference", + "vector_of_weak_references" }; static flatbuffers::TypeTable tt = { - flatbuffers::ST_TABLE, 35, type_codes, type_refs, nullptr, names + flatbuffers::ST_TABLE, 38, type_codes, type_refs, nullptr, names }; return &tt; } diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js index e073b790c6041cdb94e544179e27d8afce62590a..774490b164e31d843e0805252669f30c4743cdac 100644 --- a/tests/monster_test_generated.js +++ b/tests/monster_test_generated.js @@ -696,6 +696,88 @@ MyGame.Example.Stat.endStat = function(builder) { return offset; }; +/** + * @constructor + */ +MyGame.Example.Referrable = function() { + /** + * @type {flatbuffers.ByteBuffer} + */ + this.bb = null; + + /** + * @type {number} + */ + this.bb_pos = 0; +}; + +/** + * @param {number} i + * @param {flatbuffers.ByteBuffer} bb + * @returns {MyGame.Example.Referrable} + */ +MyGame.Example.Referrable.prototype.__init = function(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; +}; + +/** + * @param {flatbuffers.ByteBuffer} bb + * @param {MyGame.Example.Referrable=} obj + * @returns {MyGame.Example.Referrable} + */ +MyGame.Example.Referrable.getRootAsReferrable = function(bb, obj) { + return (obj || new MyGame.Example.Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb); +}; + +/** + * @returns {flatbuffers.Long} + */ +MyGame.Example.Referrable.prototype.id = function() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.readUint64(this.bb_pos + offset) : this.bb.createLong(0, 0); +}; + +/** + * @param {flatbuffers.Long} value + * @returns {boolean} + */ +MyGame.Example.Referrable.prototype.mutate_id = function(value) { + var offset = this.bb.__offset(this.bb_pos, 4); + + if (offset === 0) { + return false; + } + + this.bb.writeUint64(this.bb_pos + offset, value); + return true; +}; + +/** + * @param {flatbuffers.Builder} builder + */ +MyGame.Example.Referrable.startReferrable = function(builder) { + builder.startObject(1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Long} id + */ +MyGame.Example.Referrable.addId = function(builder, id) { + builder.addFieldInt64(0, id, builder.createLong(0, 0)); +}; + +/** + * @param {flatbuffers.Builder} builder + * @returns {flatbuffers.Offset} + */ +MyGame.Example.Referrable.endReferrable = function(builder) { + var offset = builder.endObject(); + return offset; +}; + /** * an example documentation comment: monster object * @@ -1416,11 +1498,69 @@ MyGame.Example.Monster.prototype.parentNamespaceTest = function(obj) { return offset ? (obj || new MyGame.InParentNamespace).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null; }; +/** + * @param {number} index + * @param {MyGame.Example.Referrable=} obj + * @returns {MyGame.Example.Referrable} + */ +MyGame.Example.Monster.prototype.vectorOfReferrables = function(index, obj) { + var offset = this.bb.__offset(this.bb_pos, 74); + return offset ? (obj || new MyGame.Example.Referrable).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb) : null; +}; + +/** + * @returns {number} + */ +MyGame.Example.Monster.prototype.vectorOfReferrablesLength = function() { + var offset = this.bb.__offset(this.bb_pos, 74); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {flatbuffers.Long} + */ +MyGame.Example.Monster.prototype.singleWeakReference = function() { + var offset = this.bb.__offset(this.bb_pos, 76); + return offset ? this.bb.readUint64(this.bb_pos + offset) : this.bb.createLong(0, 0); +}; + +/** + * @param {flatbuffers.Long} value + * @returns {boolean} + */ +MyGame.Example.Monster.prototype.mutate_single_weak_reference = function(value) { + var offset = this.bb.__offset(this.bb_pos, 76); + + if (offset === 0) { + return false; + } + + this.bb.writeUint64(this.bb_pos + offset, value); + return true; +}; + +/** + * @param {number} index + * @returns {flatbuffers.Long} + */ +MyGame.Example.Monster.prototype.vectorOfWeakReferences = function(index) { + var offset = this.bb.__offset(this.bb_pos, 78); + return offset ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8) : this.bb.createLong(0, 0); +}; + +/** + * @returns {number} + */ +MyGame.Example.Monster.prototype.vectorOfWeakReferencesLength = function() { + var offset = this.bb.__offset(this.bb_pos, 78); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + /** * @param {flatbuffers.Builder} builder */ MyGame.Example.Monster.startMonster = function(builder) { - builder.startObject(35); + builder.startObject(38); }; /** @@ -1908,6 +2048,72 @@ MyGame.Example.Monster.addParentNamespaceTest = function(builder, parentNamespac builder.addFieldOffset(34, parentNamespaceTestOffset, 0); }; +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} vectorOfReferrablesOffset + */ +MyGame.Example.Monster.addVectorOfReferrables = function(builder, vectorOfReferrablesOffset) { + builder.addFieldOffset(35, vectorOfReferrablesOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.<flatbuffers.Offset>} data + * @returns {flatbuffers.Offset} + */ +MyGame.Example.Monster.createVectorOfReferrablesVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addOffset(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +MyGame.Example.Monster.startVectorOfReferrablesVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Long} singleWeakReference + */ +MyGame.Example.Monster.addSingleWeakReference = function(builder, singleWeakReference) { + builder.addFieldInt64(36, singleWeakReference, builder.createLong(0, 0)); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} vectorOfWeakReferencesOffset + */ +MyGame.Example.Monster.addVectorOfWeakReferences = function(builder, vectorOfWeakReferencesOffset) { + builder.addFieldOffset(37, vectorOfWeakReferencesOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.<flatbuffers.Long>} data + * @returns {flatbuffers.Offset} + */ +MyGame.Example.Monster.createVectorOfWeakReferencesVector = function(builder, data) { + builder.startVector(8, data.length, 8); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt64(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +MyGame.Example.Monster.startVectorOfWeakReferencesVector = function(builder, numElems) { + builder.startVector(8, numElems, 8); +}; + /** * @param {flatbuffers.Builder} builder * @returns {flatbuffers.Offset} diff --git a/tests/monster_test_generated.ts b/tests/monster_test_generated.ts index 98fc4c5e36433b4eb55091bfa5d9c6f2b57d6048..ed7271d2966c678f51062d6595d04fbbb2273e23 100644 --- a/tests/monster_test_generated.ts +++ b/tests/monster_test_generated.ts @@ -681,6 +681,89 @@ static endStat(builder:flatbuffers.Builder):flatbuffers.Offset { return offset; }; +} +} +/** + * @constructor + */ +export namespace MyGame.Example{ +export class Referrable { + /** + * @type {flatbuffers.ByteBuffer} + */ + bb: flatbuffers.ByteBuffer|null = null; + + /** + * @type {number} + */ + bb_pos:number = 0; +/** + * @param {number} i + * @param {flatbuffers.ByteBuffer} bb + * @returns {Referrable} + */ +__init(i:number, bb:flatbuffers.ByteBuffer):Referrable { + this.bb_pos = i; + this.bb = bb; + return this; +}; + +/** + * @param {flatbuffers.ByteBuffer} bb + * @param {Referrable=} obj + * @returns {Referrable} + */ +static getRootAsReferrable(bb:flatbuffers.ByteBuffer, obj?:Referrable):Referrable { + return (obj || new Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb); +}; + +/** + * @returns {flatbuffers.Long} + */ +id():flatbuffers.Long { + var offset = this.bb!.__offset(this.bb_pos, 4); + return offset ? this.bb!.readUint64(this.bb_pos + offset) : this.bb!.createLong(0, 0); +}; + +/** + * @param {flatbuffers.Long} value + * @returns {boolean} + */ +mutate_id(value:flatbuffers.Long):boolean { + var offset = this.bb!.__offset(this.bb_pos, 4); + + if (offset === 0) { + return false; + } + + this.bb!.writeUint64(this.bb_pos + offset, value); + return true; +}; + +/** + * @param {flatbuffers.Builder} builder + */ +static startReferrable(builder:flatbuffers.Builder) { + builder.startObject(1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Long} id + */ +static addId(builder:flatbuffers.Builder, id:flatbuffers.Long) { + builder.addFieldInt64(0, id, builder.createLong(0, 0)); +}; + +/** + * @param {flatbuffers.Builder} builder + * @returns {flatbuffers.Offset} + */ +static endReferrable(builder:flatbuffers.Builder):flatbuffers.Offset { + var offset = builder.endObject(); + return offset; +}; + } } /** @@ -1408,11 +1491,69 @@ parentNamespaceTest(obj?:MyGame.InParentNamespace):MyGame.InParentNamespace|null return offset ? (obj || new MyGame.InParentNamespace).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; }; +/** + * @param {number} index + * @param {MyGame.Example.Referrable=} obj + * @returns {MyGame.Example.Referrable} + */ +vectorOfReferrables(index: number, obj?:MyGame.Example.Referrable):MyGame.Example.Referrable|null { + var offset = this.bb!.__offset(this.bb_pos, 74); + return offset ? (obj || new MyGame.Example.Referrable).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null; +}; + +/** + * @returns {number} + */ +vectorOfReferrablesLength():number { + var offset = this.bb!.__offset(this.bb_pos, 74); + return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {flatbuffers.Long} + */ +singleWeakReference():flatbuffers.Long { + var offset = this.bb!.__offset(this.bb_pos, 76); + return offset ? this.bb!.readUint64(this.bb_pos + offset) : this.bb!.createLong(0, 0); +}; + +/** + * @param {flatbuffers.Long} value + * @returns {boolean} + */ +mutate_single_weak_reference(value:flatbuffers.Long):boolean { + var offset = this.bb!.__offset(this.bb_pos, 76); + + if (offset === 0) { + return false; + } + + this.bb!.writeUint64(this.bb_pos + offset, value); + return true; +}; + +/** + * @param {number} index + * @returns {flatbuffers.Long} + */ +vectorOfWeakReferences(index: number):flatbuffers.Long|null { + var offset = this.bb!.__offset(this.bb_pos, 78); + return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) : this.bb!.createLong(0, 0); +}; + +/** + * @returns {number} + */ +vectorOfWeakReferencesLength():number { + var offset = this.bb!.__offset(this.bb_pos, 78); + return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; +}; + /** * @param {flatbuffers.Builder} builder */ static startMonster(builder:flatbuffers.Builder) { - builder.startObject(35); + builder.startObject(38); }; /** @@ -1900,6 +2041,72 @@ static addParentNamespaceTest(builder:flatbuffers.Builder, parentNamespaceTestOf builder.addFieldOffset(34, parentNamespaceTestOffset, 0); }; +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} vectorOfReferrablesOffset + */ +static addVectorOfReferrables(builder:flatbuffers.Builder, vectorOfReferrablesOffset:flatbuffers.Offset) { + builder.addFieldOffset(35, vectorOfReferrablesOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.<flatbuffers.Offset>} data + * @returns {flatbuffers.Offset} + */ +static createVectorOfReferrablesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addOffset(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +static startVectorOfReferrablesVector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Long} singleWeakReference + */ +static addSingleWeakReference(builder:flatbuffers.Builder, singleWeakReference:flatbuffers.Long) { + builder.addFieldInt64(36, singleWeakReference, builder.createLong(0, 0)); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} vectorOfWeakReferencesOffset + */ +static addVectorOfWeakReferences(builder:flatbuffers.Builder, vectorOfWeakReferencesOffset:flatbuffers.Offset) { + builder.addFieldOffset(37, vectorOfWeakReferencesOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.<flatbuffers.Long>} data + * @returns {flatbuffers.Offset} + */ +static createVectorOfWeakReferencesVector(builder:flatbuffers.Builder, data:flatbuffers.Long[]):flatbuffers.Offset { + builder.startVector(8, data.length, 8); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt64(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +static startVectorOfWeakReferencesVector(builder:flatbuffers.Builder, numElems:number) { + builder.startVector(8, numElems, 8); +}; + /** * @param {flatbuffers.Builder} builder * @returns {flatbuffers.Offset}