Squashed 'third_party/flatbuffers/' changes from acc9990ab..d6a8dbd26
d6a8dbd26 Experimental fix for failing oss-fuzz coverage build (#6259)
ed391e177 BREAKING: Rust flexbuffers serde human readable set to false (#6257)
a49531414 Update to flags in fuzzing-cmake file (#6256)
de1f0342c Remove _POSIX_C_SOURCE and _XOPEN_SOURCE definitions when compiling o… (#6205)
d0d51e2a5 flatc should support --binary --schema with optional scalar fields. (#6252)
33ab26017 Bump version of rules_go to 0.24.5 (#6234)
febb9d87c Union As Accessors for C# (#6251)
8778dc7c2 Resets buffer without deallocating current pointer (#6247)
aae376e9a Add GetBufferSpan() function to bufferbuilder (#6235)
0ff047148 Modernize android build and sample (#6229)
46a8c7e95 Added required-nested-flatbuffer to monster_test and fixed rust (#6236)
bc56c553e Notify based on Labelling issues and PR (#6241)
07d7cd78a Converted globs to use single quotes (#6240)
cdef70e24 More adjustments to the auto labeler (#6239)
9dd44df35 Updated Lua labeller glob (#6238)
c9b29d088 Support size-prefixed buffers and add tests for size-prefixed messages (#6232)
fba93e0ab Removes duplicate swift in labeler (#6228)
d1a545b1f Added more labels for auto labeler (#6227)
ea92a668d [C#] Optional Scalars (#6217)
6034de286 [Label Bot] Add Java and Kotlin support for the label bot (#6226)
b08b0a440 Implement `Debug` trait for Rust flatbuffers. (#6207)
17ae48dec [Label Bot] Adds some languages to labeler bot (#6222)
fc8097925 Auto Labeler Setup, Just C# for now (#6221)
55658f523 Auto Labeler Setup, Just C# for now (#6218)
14ecfe423 Updated comments and fixed a fundamental type error. (#6214)
a0182cdb1 optional scalars for ts/js (#6215)
0dfcc0a37 Adds NetTest.bat to run .NET Core tests on Windows (#6216)
f9a18ea63 [Java] Implement optional scalars (#6212)
c7586e85a Empties the sharedString map on reset on go and csharp (#6187)
914c64601 Removed C# references from java generator. Move annotations closer to definitions (#6204)
42d7c7997 Adds readable size to asserts in read functions (#6210)
e68e8d7de Refactor idl_gen_rust (#6206)
84809be7e Fix typo in flatbuffers::span declaration. (#6202)
1606fb637 Kotlin test optional enum (#6201)
fe8e3c7e5 Mass Refactoring to use `IsString` and other BASE_TYPE helpers (#6193)
8f6fa4b71 Updated SupportsAdvancedUnionFeatures to look out for string (#6190)
b46db38f5 [JS/TS] Rewrite flexbuffers JS to TS (#6148)
9fa1d2705 Rework enums in rust. (#6098)
a402b3aba idl_gen_json_schema Fix generation of arrays of enums (#6184)
0e1415b99 fix(go_test): remove deprecated grpc call (#6183)
5cd713710 Add generation of JSON Schema to library (#6165)
5be777e1d Bump junit from 4.12 to 4.13.1 in /grpc/tests (#6173)
a49d440ec Bump junit from 4.12 to 4.13.1 in /grpc (#6172)
4ec5e8db9 [C++] Add option to not generate direct copy methods. (#6166)
04bec23a3 Add Array initialization from struct constructor (#5865) (#6147)
77d57fd07 Cast to right type for reserved_ subtraction (#6167)
543c1bbeb Fixed rust nested flatbuffers for tables other than self (#6062)
cb971eece [C++] Fix -Wnarrowing and -Woverflow due to signed bitfields on G++ ARM (#6163)
7b9e61fcc [TS] GRPC Implementation (#6141)
3359e3042 Moved C++ to optional_scalars2 and added some tests. (#6162)
187a4787f [Rust] Upgrade flatbuffers library to 2018 edition (#6159)
08943aa26 Flatbuffer C++ UnpackTo optimization for vectors of non-bool bytes. (#6154)
5975658eb Enables optional enums in swift (#6160)
5d3cf440e Updated Lobster test for optional bools/enums
8ec8322f0 Ruopt enum (#6156)
bbcc85fd4 Fix generation of C++ code with Optional<Enum> (#6155)
0bdf2fa15 [C#] Fix and improve project files (#6142)
2eedc769d possibility to create a vector from an iterator (#6135)
ab01ae162 flatc should output a warning, when an attribute is attached more than once (#6146)
689bfafa7 [Python/JS/TS] Codegen SizeOf method for structs (#6136)
641309a5b unix2dos on tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj (#6133)
52e362879 SpanT is available in .Net Standard 2.0. (#6137)
dca12522a Add static cast to avoid implicit double promotion. (#6132)
e0bbaa6f9 [C#]Change to ENABLE_SPAN_T that doesn't require UNSAFE_BYTEBUFFER. (#6073)
ab139d6be Revert "[C#] Fix and improve project files (#6116)" (#6130)
34d67b425 Minireflect fixed array (#6129)
96d5e3597 [JS/TS] fix flatbuffers default export (#6123)
eb686a86f Add missed file generated by optional_scalar.fbs (#6125)
750281630 [C#] Fix and improve project files (#6116)
fb4e1c34f Add CharToLower and CharToUpper into util.s (#6126)
8c67b5b12 Add support of Optional<T> scalars to C++ code generator (#6092)
6228b66d3 [Kotlin] Support for optional scalars. (#6115)
e1be8aaad Bump version for latest swift version (#6121)
94873e595 [JS/TS] Modernize TypeScript / JavaScript flatbuffers support (#6095)
b8e87fafe [JS] Add getFullyQualifiedName() (#6119)
f96d1ef74 [Java] allowing larger buffer sizes when growing a byte buffer (#6118)
89435303b [Swift] Migrates struct write APIS to write directly to the buffer (#6093)
c75ae2429 Optional-ness in reflection (#6097)
338944d3d Rename Nullable scalars to Optional scalars (#6112)
f5ab24bc4 Avoid memcpy call for empty vectors (#6111)
92a8c1a0f [JS] FlexBuffers Fix for wrong type of offset and length values (#6107)
6cea45dcd fix c# json serializer commandline argument docs (#6104)
fec58aa12 Fix for issue 6100: incorrect shrinking logic in ResizeContext() (#6102)
71aca81ff [JS] FlexBuffers Support (#5973)
04d87ffec [C++] Small refactoring of the C++ code generator (#6091)
bb25956f0 Wrap verify file id condition in Check call (#6085)
49f4948f0 + Add `removable-media` plug to the snapcraft config (#6083)
eeacc53d2 Adds proper access types for swift object api & flatbuffers & grpc (#6081)
f3003e08d [Lobster] missed a test
d713a0084 [CMake] enabled multi-core builds in VS projects
77f966f89 [Lobster] optional scalars support
e86d5b8e9 [Kotlin] Attach JvmStatic annotation to each method in companion object (#6052)
db2aa9b4e [C#] Cleaned up .NET testing script for Mono (#6016)
63cc0eec4 Adds a serialize helper function to native table (#6059)
c30a87de6 [TS] Fix four bugs with imported types in TypeScript. (#6054)
a0fb30575 [Swift] Append namespace for Swift Grpc implementation (#6049)
77c18c1d6 export a __version__ variable for python module (#5309)
f1f23d08e adding fb import when no other imports are present (#6030)
f1025b284 [Feature] Checks for Nullable strings (#6050)
5d052f4e5 [Swift] RFC: Switch Swift namespace from public enum to ordinary concat with _ (#6045)
18b015d25 Rust codegen improvements and lint fixes (#6046)
d76e93f27 adds code gen for optional scalars in swift (#6038)
82fac326c [C++] Fix compiler error from deleted assignment operator (#6036) (#6047)
043b52bd4 Optional Scalars support for Rust (#6034)
c8fa0afdf Allow to run cpp tests under grpc/tests/ using bazel. (#6040)
6d0aae73c Fix git command executed in wrong folder when doing cmake superbuild (#6039)
ff1b73128 [Swift] Optional Scalars Preparation (#6028)
2e48c8dd3 tests: Check for both quiet and signaling NaN on mipsel/hppa (#6029)
6942704f2 support deprecated flag in json schema (#6022)
9ecd2e16c Flatc parser support for nullable scalars (#6026)
33e2d8079 [Dart] Generate constant values map for enums (#6025)
969d0f7a6 Using proper symbol name for reexport (#6021)
515a4052a Silence false positive "-Wstringop-overflow" on GCC 10.0 to 11.0 (#6020)
36fbe6f13 Updated FB import (#6019)
b69fc8cc9 [Java] Add support for shared strings on FlatBufferBuilder. (#6012)
ab6af18d9 Not using non-existent create method for obj api (#6015)
37a5dee10 Code cleanup + updates test and readme (#6004)
8a721f69a Serde with bytes maps to Blob (#6009)
e810635ea [Swift] FlatBuffers createMonster method doesn't treat struct properly (#5992)
4995e1527 Manage grpc dependency in Bazel's WORKSPACE file. (#5995)
60b6066fe Add warning to schema parser if field name is not snake_case. (#6005)
35d45cac7 [Rust] Flexbuffers dependency cleanup and fixes (#5998)
165a6e3d1 Re-added Evolution Schema Code Generation Command (#5999)
13d3fb2ea Fix RPM install conflict (#6003)
d64078eb2 [Swift] Initialize memory when clear ByteBuffer (#5982)
ca1190a3d [TS] Use proper TypedArray in create*Vector (#5991)
7571b2ac5 [C++] Updates real_path to be truly portable (#5787)
e5a8f76a4 [C++] Generate default member initializers for >= C++11 (#5989)
413bb9b55 [Kotlin] Fix Access to union of vector element (#5994)
f35184aef [Swift] Add parsing from unowned UnsafeMutableRawPointer for ByteBuffer (#5981)
b124b7625 Removed requirement that enums be declared in ascending order. (#5887)
0ec7600c6 Do not remove the last digit from float values (#5974)
14baf45c9 Mark GetBufferMinAlignment() const (#5985)
9abb2ec2c TypeScript/JavaScript docs improvements (#5984)
2e57d80b1 [Swift] Internal library improvements (#5965)
cfc7753a4 [Doc] Added missing letters to compiler options (#5976)
12ddc8a92 Rust Flexbuffers Documentation update (#5979)
24ad35709 [docs] typo: updates monsterdata.json to be valid json (#5978)
cc44a4442 [idl_parser] Mark typefield as deprecated (#5958)
9ab4a5c0e Deleted old stale bot
6682cfe87 Increased Operations per run in stale.yml
64922904b Adding Stale Action to clean up PR and Issues
8e505cb67 [C++] Fixed/Enabled --cpp-ptr-type std::shared_ptr [#5813] (#5959)
a28357d7a Propagate boolean default values from proto to fbs (#5964)
7cb4762a6 [Swift] Improving reallocation time by using memcpy and moving reallocation code to storage (#5960)
4e45f7c9e Fix error in SimpleQSort (#5955)
7ac026405 fix error on GRPC Python - ignore namespace tree if not specified (#5862) (#5922)
108e981db Required is now implemented in swift (#5952)
94a78e385 Fixed: Access violation and ASAN/UNSAN failures with sorted tables
53fb453e0 [rust] Add FlatBufferBuilder::force_defaults API (#5946)
17c1f35fa [FlexBuffer][Java] ReadWriteBuf and ReadBuf interface public (#5948)
2eaf57778 [Java] Grow ArrayReadWriteBuf enough to match requested capacity. (#5921)
666800da3 Adds bool support in structs + updates grpc support + CI upgrades (#5943)
38ed69eb3 fixed mutating inline values (#5942)
d026e6f07 Add static asserts to ensure that reflection API arrays are kept in sync (#5934)
988164f6e [C++] Got rid of memset's in constructors (#5938)
7179a5a8b General Codebase clean up (#5939)
a0da0c08c Add GetStringView like GetString, GetCstring (#5937)
ac203b209 [C#] Add file identifier to ObjectAPI Serialization Utility. (#5920)
8dd1bf25b not creating creation methods when using structs (#5919)
5aa443d98 [Dart] Adding FlexBuffers support (#5853)
0fa087657 [Dart] Getting tests/DartTest.sh to work on master. (#5915)
424a473e1 Schema parser: prohibit declaration of an array of pointers inside structs (#5907)
c3faa8346 Fix Cargo.toml dependencies (#5911)
91399ad05 fix union type names (#5902)
32782e4ad Update Rust Flexbuffers metadata before publishing (#5905)
e7f3b1690 [TS] Make Obj-API work with --short-names (#5898)
12ed1fe4a fixed invalid imports with --gen-all (#5895)
85ee4df7a [C#] Thread safe reads of Double and Float values from a ByteBuffer (#5900)
de89bd193 Implement flexbuffers in python (#5880)
8be05f6bd Rust Flexbuffers (#5669)
870ecbc09 [swift] Moves code to use VTablesStorage (#5888)
c2da8d5d8 [Java][FlexBuffers] Make FlexBuffersBuilder reusable by adding clear() (#5889) (#5890)
e84cbff67 Align package name to FindFlatBuffers.cmake (#5899)
f94e6c84e Small tutorial improvements - documentation only (#5894)
f12cca8bc Attempt at adding Github Actions CI
7e4124d6e Handle git program or .git folder absence (#5878)
a875d247a only add native_include_files if object based api is enabled (#5886)
6e9f5d981 Respect shared attribute in Parser (#5885)
ff1c78233 include/flatbuffers: typo fixes in comments (#5884)
2e9a19673 Updates swift docs for package management (#5883)
e3cb07d32 [Rust] idl_gen_rust.cpp: (Option/required-aware codegen for unions) (#5850)
712866d57 Propagate use_string_pooling in CopyTable (#5879)
44c919a9e Not using reexports with --gen-all (#5873)
99aa1ef21 Added INCLUDE_PREFIX option for flatbuffers_generate_headers (#5866)
40ba170c9 Fixed text in internals doc that implied structs can be root
cb4d0f72e [Swift] Object API support (#5826)
003e16405 [TS] Add Obj API (#5788)
21cf300f4 fix cpp usage markdown error (#5845)
9655e12d6 Upgraded swift implementation for grpc (#5843)
fb96fadc2 [C#] Fix nested structs and arrays in Object API (#5765)
408f11fbd [ts] Fix empty source/dest namespaces when reexporting. (#5841)
a83caf591 Improves performance for the swift library by using structs + a storage class (#5835)
925fab6b1 [Java][FlexBuffers] Optimize Map access (#5735)
d9fecc332 [CMake] : Add precompiled header support with FLATBUFFERS_ENABLE_PCH (#5827)
e9d453240 Added flatbuffers_generate_headers and flatbuffers_generate_binary_files cmake functions. (#5830)
c37c989ed Correct calculation of vector element size (#5831)
6b271b7ec Fix Clang-trunk warnings about special members deprecated in C++20. (#5829)
90f3b8e8c Fix `float_constant` definition in './doc/Grammar.md` (#5828)
3af735934 [csharp] flatc should generate a 'Create…' method for tables with struct field… (#5818)
c4231c3cb Updated doxyfile - added missing files (#5824)
9657df184 Update Grammar.md (#5820)
97ffc590e Include CPack only when explictly packaging (#5817)
8b52af65b [C++] Add max_depth and max_tables parameters to reflection::Verify (#5815)
9b034eee1 Fix interpretation of 'nan(number)' by the idl_parser (#5810)
3e9ac3cff [Scripts] Adds swift to generated code (#5806)
697147a2e updated maven build files
6df40a247 pre-tag version bump for 1.12
0dba63909 Removes the inner loop in the endtable check written tables (#5803)
0e3fdd0ee Escape characters in jsonschema descriptions (#5644)
45a2b07cb Remove `noexcept` qualifier copy-ctor of `union` type (#5800) (#5802)
d10c16314 Replace 'assert' by 'FLATBUFFERS_ASSERT' inside idl_parser.cpp (#5799)
35abb7f89 Add non-nullable modifier to return type of functions never returning null (#5797)
9954e09ab [C++] Generate code for vector force_align attribute. (#5796)
95a21327f rust: pub export the VectorIter type (#5736)
89b6183ee Fix Python min alignment
5a98d65e8 [Rust] Add gen-name-strings for Rust (#5757)
f73d205bc Removed assert that wasn't backwards compatible.
7c37abe92 [C#] add ObjectAPI Serialization Utility (#5785)
4749e77b0 Fixed docs on how to obtain parser error.
6ff189841 Added --filename-suffix and --filename-ext to flatc (#5778)
c9a30c9ca Fixed refractoring issue in reflection/generate_code.sh. Also, mv deletes the original file, so I don't need to clean it up manually in that case. (#5777)
8c02d17be Skip writing reflection_generated.h if not changed (#5776)
34305c4ce [Swift] Adds GRPC to Swift (#5758)
cd88e6b2a [Java][FlexBuffers] Abstract buffer access from ByteBuffer (#5743)
3ec7a53c6 Adds cocoapods and a readme of how to get the package (#5771)
6d44cede7 [snap] Fix versioning (#5727)
cc08c0835 [Python] Fixed potential allignment issue (#5768)
54f8b787c Fix memory leak on cpp object api (#5761)
17557f913 [Python] Fixed issue #5499 (#5764)
d54af8cd4 [C++] Use strong enum type for vectors when scoped-enums is on. (#5750)
173e10fdf [C#] support Json Serialization (#5752)
8f56990f6 FlexBuffers: C++: scalar-only typed vectors were not aligned.
6400c9b05 Bump Rust port to 0.6.1 (#5747)
7418d8587 [C#] support Object API (#5710)
c580fa284 Adds min and max, comments, and all of swift's keywords + fix docs (#5737)
f2a127230 Use VS 2017 and 2019 on CI, fix cast issue in dart_idl (#5740)
316d7c208 Creates a flatbuffers validation function + small fix (#5725)
47026ea6b Added the code to embed the binary schema to the source (--bfbs-gen-embed). (#5701)
3f677f241 [Java][FlexBuffers] Deprecate typed vector strings due to design flaw (#5722)
a593a11e5 [Go] Implements a SharedStrings function (#5733)
7cdfc8475 [Swift] Fix padding function overflow when bufSize is 0 (#5721)
bab2b0db4 Add vcpkg installation instructions (#5732)
89418eb84 [Dart] Fix deprecated field support, inf/nan (#5724)
9cadf05d8 [typescript] Size-prefixed root accessors not taking into account size prefix (#5717)
6da1cf79d [rust] Add use declarations to Rust-generated bindings for imported FB definitions (#5645)
bee1df96d [Go] Replace references to hardcoded ”Monster" etc with idiomatic go wherever possible (#5716)
01189d7ed [C++] Fix for printing of enum in case output_enum_identifiers=1. (#5706)
c4b2b0a25 [Swift] Support create long string (#5709)
a4b2884e4 Added create function for swift (#5707)
04d80f255 [Swift] Swift implementation 🎉🎉 (#5603)
55686100a Changed direct calls to strtod to use StringToNumber
718351831 Document JSON compatibility guarantees. (#5704)
d1b34f0f2 Add CMake 'generated_code' target to simplify resolution of build dependencies (#5697)
21b706196 (Optionally) add an additional suffix namespace to generated fbs files. (#5698)
35daaf83d [Java] Replace Table.UTF8_CHARSET with StandardCharsets.UTF_8 (#5696)
3b458f7a1 Rust: Temporarily disable 2 endianness unit tests (#5695)
a5d9d0f7d [C++17] Add Traits class for Tables and Factory function within it. (#5678)
3cd9b6434 Removed code_generators.cpp from library targets
355dfd48d [rust] Make enum names public (#5690)
bcd58a159 Correct inverted logic around include prefixes. (#5689)
a2c12900a Optimize Pack method using numpy (#5662)
901b89e73 [C++] Add Builder and Table typedefs (#5685)
31f879908 Minor doc updates: FlexBuffers C#, Discord, CppUsage.
8023d99e2 Upgrade rules_go (#5684)
b4154405d Fix --incompatible_load_cc_rules_from_bzl (#5683)
04c17c7a7 Add support for absl::string_view when available (#5682)
62ec7d52c [Bazel] Add support for compatible_with and restricted_to (#5681)
7de668053 CI: New Docker tests for Python with numpy (#5677)
3a70e0b30 Fixed struct initialization error on older versions of C#
9b1320135 Fixed warnings in FlexBuffers.java
5e3916050 Fixed out of date licenses on gRPC Python files.
c95755051 Removed test proto output.
44bf71988 Add flatc '--cpp_std' switch (#5656)
3e8f15df9 Fix for FlexBuffers FBT_VECTOR_STRING size bit-width.
602721a73 Added Check to VerifyAlignment (#5675)
13c05f4da Improve import handling for proto conversion (#5673)
ce3a1c43a [Dart] Fix prepare space for writeListInt64 and writeListUint64 (#5654)
aa75e5734 Make Rust constants public (#5659)
2790fee25 Add namespace qualification to union types (#5666)
eddebec1b Bugfix for Rust generation of union fields named with language keywords (#5592)
030fee36a wrap multiple statements in do {} while(!IsConstTrue(true)) (#5655)
f9724d1bd [gRPC] Uncomment MessageBuilder (#5658)
b20801ca4 Supress unsigned-integer-overflow for PaddingBytes (#5647)
a8e800bd7 Add --force-empty-vectors option (#5653)
d7530ae96 Fixed enum min/max values not properly escaped.
99d11e279 Split Bazel targets into multiple packages (#5640)
4fd8eb214 Remove a static_assert (#5643)
65f870357 Flatbuffers Python Object API (#5616)
75823cc27 [Clang 10]: definition of implicit copy constructor for 'TableKeyComparatoris deprecated #5649 (#5650)
58e279244 [docs]: add missing semicolon (#5648)
3c964e10a [GO] Fix support for enums with underscores and Unions with imported members (#5600)
c3c32ec94 Fix ambiguity of a type deduction in TEST_EQ macro if arguments have `enum class` type. (#5630)
075e8d676 Simplify declarations of x-macro FLATBUFFERS_TD (#5638)
bcf1bd5c9 read vtable size through ReadScalar() (#5636)
136d75fa6 Changed null checks in test. Removed verifier pointer usage (#5634)
091fa1fd1 Add testing of C++ with sanitizers (CI-Docker) (#5631)
ff3781dc2 add namespace prefix in FLATBUFFERS_MAX_BUFFER_SIZE (#5629)
6beb9f49c Support for python grpc - continuing the work from the pull request #4270 #4705 (#5613)
80988ea86 Removed idl_gen_general.cpp and move contents to code_generators.cpp (#5625)
0f2ff7eaa Lua cleanup (#5624)
dda095023 [C++] Adds basic schema evolution tests (#5611)
adbcbba5d [C++, C#, Java] Separated C# and Java generators into their own classes (#5618)
cbbd6aca0 add check for root_type specified for json schema generation (#5622)
405c64e07 [Rust] Bump smallvec version to 1.0 (#5621)
42c08cbca Ran src/clang-format-all.sh (#5617)
33d5dd9bd Improved pull request & clang-format instructions.
105dd528e Change monster_extra generation to use flatbuffers::unique_ptr (#5612)
f0f0efe7b [C++] Refactor to conform to Google C++ style guide (#5608)
e837d5a29 Fixed deprecated method in GRPC Java test.
9834ee978 Fixed Apache license not using canonical version.
44b2ab087 include/flatbuffers/base.h: fix no_sanitize issue with old clang (#5610)
46ae3f80a [C++, Java, C#, TypeScript, JavaScript] Skip generation of mutable union types (#5599)
7b38aa71e flatbuffers.h: fix documentation warning (#5607)
661bedd83 Add Lua FlatbufferBuilder Clean() method to enable reuseable builders (#5606)
8526e12d7 [Kotlin] Fix union vector accessor after change in Java API (#5605)
3c7b660d6 [flatc] Remove an always true condition for flexbuffers (#5604)
964365ba6 [Go] Add UnPackTo functions (#5598)
32254b7ac [Go] Object API support (#5339)
521e255ad Rust: Add idiomatic iterator for Vector type (#5579)
1b85292fd Fix typos in comments (#5590)
480815447 C++ verifier for evolved union fields should return true (#5586)
8d5e424c6 Add ByteBuffer copy for vector of bytes in Java (#5587)
b4774d235 Rust: Fix Copy and Clone impls for a few generic types (#5577)
26f238c24 Add `--clean-first` to the cmake-build command (travis) (#5574)
e93c8c46e Fix Follow implementation for bool (#5554)
e21516b9d Fix issue #5557 (#5573)
fbc11e8ae Avoid intentional unsigned integer overflow getting caught by sanitizers (#5572)
e9d29c21a Python: Add forceDefaults opt to python Builder (#5564)
8bfafc76d Java: Don't annotate vector-of-tables item getters with @nullable. (#5562)
df3e8bf4a Fixed warnings generated by recent JSON sorting feature.
5665cfe49 [Java] byte buffer factory returned buffer capcity is used instead of the requested size (#5558)
5797540ed #5544 Fix of Array of table is not sorted if Create<type>Direct() is used (#5546)
7f1af7cb0 Fix build with gcc version 7.4.0 (#5570)
32f47ad24 Fixed JSON parser not sorting vectors of tables/structs with key.
842f672ba [FlexBuffers][Java] Cache size of Sized objects in FlexBuffers (#5551)
d4cae0a62 Fix issue #5542 (#5543)
f1147f65b Fixed Android STLPort related error.
69d3fec48 Fix namespaced struct/field name collision detection (#5540) (#5545)
cfb4ecf6f [flac] Add FlexBuffers option for generating data (#5519)
a92039687 Update Rust versions under test from 1.30.1 to 1.37.0 (#5538)
625338d09 Adds XOPEN_SOURCE for PATH_MAX and POSIX 1993 for stat (#5529)
3f8ce99c5 [FlexBuffers][Java] Add override Key::toString (#5533)
0798b7b69 [FlexBuffers][Java] Fix wrong access to a string using Reference::asString(). (#5532)
cbdf82e2f Fix Mutate() methods of Array<scalar/struct> (override 5508) (#5526)
e365c502f Java: Added access object for vector of struct and vector of tables. (#5233)
97f3aa917 Fixed DetachedBuffer self move assignment (#5521)
2f5bb2eec Fix buildifier warnings found in new bazel (#5517)
917687c7a Fixed Reflection Verifier not handling vectors of unions.
f9277e691 Fixed GenerateText not handling vectors of unions.
2706381ee Add element size parameter to __vector_as_arraysegment [c#] (#5512)
b5560fcd5 [Java][FlexBuffers] Improve documentation for FlexBuffers in Java. (#5506)
782b865c5 Annotate getters with @Pure when --java-checkerframework is specified. (#5510)
3bfc86eaf [Dart]fix: segment fault with empty namespace when generating dart file (#5507)
c0282873f Rust: Fixed cargo clippy on non-generated code (#5485)
4b870aca9 [Javascript] Fix syntax error for signed enum (#5503)
d0e3870c0 [C#] Fix retrieving enumeration vectors as arrays (#5457)
fb25eb87f Doc typo fixes (#5505)
cb35d3a0e Use all of the available space in the buffer returned by ByteBufferFactory to allow the factory to keep a pool of larger than initialsize sized buffers. (#5500)
8e6cabb31 [FlexBuffers][Java] Implementation of FlexBuffers API (#5476)
bd31dd242 Clarified value reuse in FlexBuffers
65b67d213 Fixed test build invocation of arrays_test.fbs
1fbb71132 FlexBuffers: allow any values to be shared.
cd75a3658 Android: remove app_dummy() calls
ec6b0bf29 Fixed STLPort Android compile error
c11b5d744 [bugfix]flexbuffers isvector bugfix (#5488)
4525c91be Fix incorrect padding in arrays of structs (Issue #5484) (#5491)
b97b342f5 Fixed missing generated code.
c1058a903 C++ IDL generation adds superfluous semicolon in GenTablePost, causing (#5483)
303044934 [go]add Name() for ForceCodec interface (#5486)
a2485d4ec reflection: check for valid union enum value during object verification (#5475)
a20e71ac9 has_method support for primitive fields in java runtime. Changed: idl.h, FlatBufferBuilder.java , idl_gen_general.cpp, idl_parser.cpp, flatc.cpp (#5468)
Change-Id: I836f4b43e6818bb16425a87899e6234ac86242aa
git-subtree-dir: third_party/flatbuffers
git-subtree-split: d6a8dbd26ff08a8868e0d0c1b4b67d31b40e4a7f
diff --git a/tests/BUILD b/tests/BUILD
new file mode 100644
index 0000000..203a08c
--- /dev/null
+++ b/tests/BUILD
@@ -0,0 +1,152 @@
+load("@rules_cc//cc:defs.bzl", "cc_test")
+
+package(default_visibility = ["//visibility:private"])
+
+# Test binary.
+cc_test(
+ name = "flatbuffers_test",
+ testonly = 1,
+ srcs = [
+ "evolution_test/evolution_v1_generated.h",
+ "evolution_test/evolution_v2_generated.h",
+ "monster_test_bfbs_generated.h",
+ "namespace_test/namespace_test1_generated.h",
+ "namespace_test/namespace_test2_generated.h",
+ "native_type_test_impl.cpp",
+ "native_type_test_impl.h",
+ "test.cpp",
+ "test_assert.cpp",
+ "test_assert.h",
+ "test_builder.cpp",
+ "test_builder.h",
+ "union_vector/union_vector_generated.h",
+ "optional_scalars_generated.h",
+ ],
+ copts = [
+ "-DFLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE",
+ "-DBAZEL_TEST_DATA_PATH",
+ ],
+ data = [
+ ":arrays_test.bfbs",
+ ":arrays_test.fbs",
+ ":arrays_test.golden",
+ ":evolution_test/evolution_v1.fbs",
+ ":evolution_test/evolution_v1.json",
+ ":evolution_test/evolution_v2.fbs",
+ ":evolution_test/evolution_v2.json",
+ ":include_test/include_test1.fbs",
+ ":include_test/sub/include_test2.fbs",
+ ":monster_extra.fbs",
+ ":monster_test.bfbs",
+ ":monster_test.fbs",
+ ":monsterdata_extra.json",
+ ":monsterdata_test.golden",
+ ":monsterdata_test.json",
+ ":native_type_test.fbs",
+ ":prototest/imported.proto",
+ ":prototest/test.golden",
+ ":prototest/test.proto",
+ ":prototest/test_include.golden",
+ ":prototest/test_suffix.golden",
+ ":prototest/test_union.golden",
+ ":prototest/test_union_include.golden",
+ ":prototest/test_union_suffix.golden",
+ ":unicode_test.json",
+ ":union_vector/union_vector.fbs",
+ ":union_vector/union_vector.json",
+ ":optional_scalars.fbs",
+ ],
+ includes = [
+ "",
+ "include/",
+ ],
+ deps = [
+ ":arrays_test_cc_fbs",
+ ":monster_extra_cc_fbs",
+ ":monster_test_cc_fbs",
+ ":native_type_test_cc_fbs",
+ "//:flatbuffers",
+ ],
+)
+
+# Test bzl rules
+load("//:build_defs.bzl", "flatbuffer_cc_library")
+
+cc_library(
+ name = "test_assert",
+ srcs = ["test_assert.cpp"],
+ hdrs = ["test_assert.h"],
+ visibility = ["//grpc/tests:__subpackages__"],
+ deps = ["//:flatbuffers"],
+)
+
+cc_library(
+ name = "test_builder",
+ srcs = ["test_builder.cpp"],
+ hdrs = ["test_builder.h"],
+ visibility = ["//grpc/tests:__subpackages__"],
+ deps = [
+ ":monster_test_grpc",
+ ":test_assert",
+ "//:flatbuffers",
+ ],
+)
+
+cc_library(
+ name = "monster_test_grpc",
+ srcs = [
+ "monster_test.grpc.fb.cc",
+ "monster_test.grpc.fb.h",
+ "monster_test_generated.h",
+ ],
+ hdrs = [
+ "monster_test.grpc.fb.h",
+ "monster_test_generated.h",
+ ],
+ includes = ["."],
+ visibility = ["//grpc/tests:__subpackages__"],
+ deps = [
+ "//:flatbuffers",
+ "@com_github_grpc_grpc//:grpc++",
+ ],
+)
+
+flatbuffer_cc_library(
+ name = "monster_test_cc_fbs",
+ srcs = ["monster_test.fbs"],
+ include_paths = ["tests/include_test"],
+ includes = [
+ "include_test/include_test1.fbs",
+ "include_test/sub/include_test2.fbs",
+ ],
+ visibility = ["//grpc/tests:__subpackages__"],
+)
+
+flatbuffer_cc_library(
+ name = "monster_extra_cc_fbs",
+ srcs = ["monster_extra.fbs"],
+)
+
+flatbuffer_cc_library(
+ name = "arrays_test_cc_fbs",
+ srcs = ["arrays_test.fbs"],
+ flatc_args = [
+ "--gen-object-api",
+ "--gen-compare",
+ "--no-includes",
+ "--gen-mutable",
+ "--reflect-names",
+ "--cpp-ptr-type flatbuffers::unique_ptr",
+ "--scoped-enums",
+ ],
+)
+
+flatbuffer_cc_library(
+ name = "native_type_test_cc_fbs",
+ srcs = ["native_type_test.fbs"],
+ flatc_args = [
+ "--gen-object-api",
+ "--gen-mutable",
+ "--cpp-ptr-type flatbuffers::unique_ptr",
+ ],
+)
diff --git a/tests/DartTest.sh b/tests/DartTest.sh
index 6ce72cc..01d21d7 100755
--- a/tests/DartTest.sh
+++ b/tests/DartTest.sh
@@ -18,9 +18,9 @@
command -v pub >/dev/null 2>&1 || { echo >&2 "Dart tests require `pub` but it's not installed. Aborting."; exit 1; }
command -v dart >/dev/null 2>&1 || { echo >&2 "Dart tests require dart to be in path but it's not installed. Aborting."; exit 1; }
-# output required files to the dart folder so that pub will be able to
+# output required files to the dart folder so that pub will be able to
# distribute them and more people can more easily run the dart tests
-../flatc --dart -I include_test -o ../dart/test monster_test.fbs
+../flatc --dart -I include_test -o ../dart/test monster_test.fbs
cp monsterdata_test.mon ../dart/test
cd ../dart
diff --git a/tests/FlatBuffers.Benchmarks.swift/Package.swift b/tests/FlatBuffers.Benchmarks.swift/Package.swift
new file mode 100644
index 0000000..9360b10
--- /dev/null
+++ b/tests/FlatBuffers.Benchmarks.swift/Package.swift
@@ -0,0 +1,19 @@
+// swift-tools-version:5.1
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "FlatBuffers.Benchmarks.swift",
+ platforms: [
+ .macOS(.v10_14)
+ ],
+ dependencies: [
+ .package(path: "../../swift")
+ ],
+ targets: [
+ .target(
+ name: "FlatBuffers.Benchmarks.swift",
+ dependencies: ["FlatBuffers"]),
+ ]
+)
diff --git a/tests/FlatBuffers.Benchmarks.swift/Sources/FlatBuffers.Benchmarks.swift/main.swift b/tests/FlatBuffers.Benchmarks.swift/Sources/FlatBuffers.Benchmarks.swift/main.swift
new file mode 100644
index 0000000..e599c65
--- /dev/null
+++ b/tests/FlatBuffers.Benchmarks.swift/Sources/FlatBuffers.Benchmarks.swift/main.swift
@@ -0,0 +1,104 @@
+import CoreFoundation
+import FlatBuffers
+
+struct Benchmark {
+ var name: String
+ var value: Double
+
+ var description: String { "\(String(format: "|\t%@\t\t|\t\t%fs\t|", name, value))"}
+}
+
+func run(name: String, runs: Int, action: () -> Void) -> Benchmark {
+ action()
+ let start = CFAbsoluteTimeGetCurrent()
+ for _ in 0..<runs {
+ action()
+ }
+ let ends = CFAbsoluteTimeGetCurrent()
+ let value = Double(ends - start) / Double(runs)
+ print("done \(name): in \(value)")
+ return Benchmark(name: name, value: value)
+}
+
+
+func createDocument(Benchmarks: [Benchmark]) -> String {
+ let separator = "-------------------------------------"
+ var document = "\(separator)\n"
+ document += "\(String(format: "|\t%@\t\t|\t\t%@\t\t|", "Name", "Scores"))\n"
+ document += "\(separator)\n"
+ for i in Benchmarks {
+ document += "\(i.description) \n"
+ document += "\(separator)\n"
+ }
+ return document
+}
+
+@inlinable func create10Strings() {
+ var fb = FlatBufferBuilder(initialSize: 1<<20)
+ for _ in 0..<10_000 {
+ _ = fb.create(string: "foobarbaz")
+ }
+}
+
+@inlinable func create100Strings(str: String) {
+ var fb = FlatBufferBuilder(initialSize: 1<<20)
+ for _ in 0..<10_000 {
+ _ = fb.create(string: str)
+ }
+}
+
+@inlinable func benchmarkFiveHundredAdds() {
+ var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)
+ for _ in 0..<500_000 {
+ let off = fb.create(string: "T")
+ let s = fb.startTable(with: 4)
+ fb.add(element: 3.2, def: 0, at: 2)
+ fb.add(element: 4.2, def: 0, at: 4)
+ fb.add(element: 5.2, def: 0, at: 6)
+ fb.add(offset: off, at: 8)
+ _ = fb.endTable(at: s)
+ }
+}
+
+@inlinable func benchmarkThreeMillionStructs() {
+ let structCount = 3_000_000
+
+ let rawSize = ((16 * 5) * structCount) / 1024
+
+ var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))
+
+ var offsets: [Offset<UOffset>] = []
+ for _ in 0..<structCount {
+ fb.startVectorOfStructs(count: 5, size: 16, alignment: 8)
+ for _ in 0..<5 {
+ fb.createStructOf(size: 16, alignment: 8)
+ fb.reverseAdd(v: 2.4, postion: 0)
+ fb.reverseAdd(v: 2.4, postion: 8)
+ fb.endStruct()
+ }
+ let vector = fb.endVectorOfStructs(count: 5)
+ let start = fb.startTable(with: 1)
+ fb.add(offset: vector, at: 4)
+ offsets.append(Offset<UOffset>(offset: fb.endTable(at: start)))
+ }
+ let vector = fb.createVector(ofOffsets: offsets)
+ let start = fb.startTable(with: 1)
+ fb.add(offset: vector, at: 4)
+ let root = Offset<UOffset>(offset: fb.endTable(at: start))
+ fb.finish(offset: root)
+}
+
+func benchmark(numberOfRuns runs: Int) {
+ var benchmarks: [Benchmark] = []
+ let str = (0...99).map { _ -> String in return "x" }.joined()
+ benchmarks.append(run(name: "500_000", runs: runs, action: benchmarkFiveHundredAdds))
+ benchmarks.append(run(name: "10 str", runs: runs, action: create10Strings))
+ let hundredStr = run(name: "100 str", runs: runs) {
+ create100Strings(str: str)
+ }
+ benchmarks.append(run(name: "3M strc", runs: 1, action: benchmarkThreeMillionStructs))
+ benchmarks.append(hundredStr)
+ print(createDocument(Benchmarks: benchmarks))
+}
+
+benchmark(numberOfRuns: 20)
diff --git a/tests/FlatBuffers.GRPC.Swift/Package.swift b/tests/FlatBuffers.GRPC.Swift/Package.swift
new file mode 100644
index 0000000..f68c241
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Package.swift
@@ -0,0 +1,48 @@
+// swift-tools-version:5.1
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "FlatBuffers.GRPC.Swift",
+ platforms: [
+ .iOS(.v11),
+ .macOS(.v10_14),
+ ],
+ dependencies: [
+ .package(path: "../../swift"),
+ .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.19")
+ ],
+ targets: [
+ // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+ // Targets can depend on other targets in this package, and on products in packages which this package depends on.
+ .target(
+ name: "Model",
+ dependencies: [
+ "GRPC",
+ "FlatBuffers"
+ ],
+ path: "Sources/Model"
+ ),
+
+ // Client for the Greeter example
+ .target(
+ name: "Client",
+ dependencies: [
+ "GRPC",
+ "Model",
+ ],
+ path: "Sources/client"
+ ),
+
+ // Server for the Greeter example
+ .target(
+ name: "Server",
+ dependencies: [
+ "GRPC",
+ "Model",
+ ],
+ path: "Sources/server"
+ ),
+ ]
+)
diff --git a/tests/FlatBuffers.GRPC.Swift/README.md b/tests/FlatBuffers.GRPC.Swift/README.md
new file mode 100644
index 0000000..1632b78
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/README.md
@@ -0,0 +1,7 @@
+# FlatBuffers.GRPC.Swift
+
+The following is Swift example on how GRPC would be with Swift Flatbuffers, you can simply run the following commands:
+
+`swift run Server`
+
+`swift run Client {port} {name}`
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs
new file mode 100644
index 0000000..811303c
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.fbs
@@ -0,0 +1,17 @@
+table HelloReply {
+ message:string;
+}
+
+table HelloRequest {
+ name:string;
+}
+
+table ManyHellosRequest {
+ name:string;
+ num_greetings:int;
+}
+
+rpc_service Greeter {
+ SayHello(HelloRequest):HelloReply;
+ SayManyHellos(ManyHellosRequest):HelloReply (streaming: "server");
+}
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift
new file mode 100644
index 0000000..f3c4b67
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter.grpc.swift
@@ -0,0 +1,75 @@
+// Generated GRPC code for FlatBuffers swift!
+/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift
+/// in case of an issue please open github issue, though it would be maintained
+import Foundation
+import GRPC
+import NIO
+import NIOHTTP1
+import FlatBuffers
+
+public protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}
+public extension GRPCFlatBufPayload {
+ init(serializedByteBuffer: inout NIO.ByteBuffer) throws {
+ self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))
+ }
+ func serialize(into buffer: inout NIO.ByteBuffer) throws {
+ let buf = UnsafeRawBufferPointer(start: self.rawPointer, count: Int(self.size))
+ buffer.writeBytes(buf)
+ }
+}
+extension Message: GRPCFlatBufPayload {}
+
+/// Usage: instantiate GreeterServiceClient, then call methods of this protocol to make API calls.
+public protocol GreeterService {
+ func SayHello(_ request: Message<HelloRequest>, callOptions: CallOptions?) -> UnaryCall<Message<HelloRequest>,Message<HelloReply>>
+ func SayManyHellos(_ request: Message<ManyHellosRequest>, callOptions: CallOptions?, handler: @escaping (Message<HelloReply>) -> Void) -> ServerStreamingCall<Message<ManyHellosRequest>, Message<HelloReply>>
+}
+
+public final class GreeterServiceClient: GRPCClient, GreeterService {
+ public let channel: GRPCChannel
+ public var defaultCallOptions: CallOptions
+
+ public init(channel: GRPCChannel, defaultCallOptions: CallOptions = CallOptions()) {
+ self.channel = channel
+ self.defaultCallOptions = defaultCallOptions
+ }
+
+ public func SayHello(_ request: Message<HelloRequest>, callOptions: CallOptions? = nil) -> UnaryCall<Message<HelloRequest>,Message<HelloReply>> {
+ return self.makeUnaryCall(path: "/Greeter/SayHello", request: request, callOptions: callOptions ?? self.defaultCallOptions)
+ }
+
+ public func SayManyHellos(_ request: Message<ManyHellosRequest>, callOptions: CallOptions? = nil, handler: @escaping (Message<HelloReply>) -> Void) -> ServerStreamingCall<Message<ManyHellosRequest>, Message<HelloReply>> {
+ return self.makeServerStreamingCall(path: "/Greeter/SayManyHellos", request: request, callOptions: callOptions ?? self.defaultCallOptions, handler: handler)
+ }
+}
+
+public protocol GreeterProvider: CallHandlerProvider {
+ func SayHello(_ request: Message<HelloRequest>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<HelloReply>>
+ func SayManyHellos(request: Message<ManyHellosRequest>, context: StreamingResponseCallContext<Message<HelloReply>>) -> EventLoopFuture<GRPCStatus>
+}
+
+public extension GreeterProvider {
+
+ var serviceName: Substring { return "Greeter" }
+
+ func handleMethod(_ methodName: Substring, callHandlerContext: CallHandlerContext) -> GRPCCallHandler? {
+ switch methodName {
+ case "SayHello":
+ return CallHandlerFactory.makeUnary(callHandlerContext: callHandlerContext) { context in
+ return { request in
+ self.SayHello(request, context: context)
+ }
+ }
+ case "SayManyHellos":
+ return CallHandlerFactory.makeServerStreaming(callHandlerContext: callHandlerContext) { context in
+ return { request in
+ self.SayManyHellos(request: request, context: context)
+ }
+ }
+ default: return nil;
+ }
+ }
+
+}
+
+
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift
new file mode 100644
index 0000000..7cb5761
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Sources/Model/greeter_generated.swift
@@ -0,0 +1,106 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// swiftlint:disable all
+
+import FlatBuffers
+
+public struct HelloReply: FlatBufferObject {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func getRootAsHelloReply(bb: ByteBuffer) -> HelloReply { return HelloReply(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case message = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var message: String? { let o = _accessor.offset(VTOFFSET.message.v); return o == 0 ? nil : _accessor.string(at: o) }
+ public var messageSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.message.v) }
+ public static func startHelloReply(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ public static func add(message: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: message, at: VTOFFSET.message.p) }
+ public static func endHelloReply(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createHelloReply(
+ _ fbb: inout FlatBufferBuilder,
+ offsetOfMessage message: Offset<String> = Offset()
+ ) -> Offset<UOffset> {
+ let __start = HelloReply.startHelloReply(&fbb)
+ HelloReply.add(message: message, &fbb)
+ return HelloReply.endHelloReply(&fbb, start: __start)
+ }
+}
+
+public struct HelloRequest: FlatBufferObject {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func getRootAsHelloRequest(bb: ByteBuffer) -> HelloRequest { return HelloRequest(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case name = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
+ public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
+ public static func startHelloRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
+ public static func endHelloRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createHelloRequest(
+ _ fbb: inout FlatBufferBuilder,
+ offsetOfName name: Offset<String> = Offset()
+ ) -> Offset<UOffset> {
+ let __start = HelloRequest.startHelloRequest(&fbb)
+ HelloRequest.add(name: name, &fbb)
+ return HelloRequest.endHelloRequest(&fbb, start: __start)
+ }
+}
+
+public struct ManyHellosRequest: FlatBufferObject {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func getRootAsManyHellosRequest(bb: ByteBuffer) -> ManyHellosRequest { return ManyHellosRequest(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case name = 4
+ case numGreetings = 6
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var name: String? { let o = _accessor.offset(VTOFFSET.name.v); return o == 0 ? nil : _accessor.string(at: o) }
+ public var nameSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.name.v) }
+ public var numGreetings: Int32 { let o = _accessor.offset(VTOFFSET.numGreetings.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ public static func startManyHellosRequest(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 2) }
+ public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
+ public static func add(numGreetings: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: numGreetings, def: 0, at: VTOFFSET.numGreetings.p) }
+ public static func endManyHellosRequest(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createManyHellosRequest(
+ _ fbb: inout FlatBufferBuilder,
+ offsetOfName name: Offset<String> = Offset(),
+ numGreetings: Int32 = 0
+ ) -> Offset<UOffset> {
+ let __start = ManyHellosRequest.startManyHellosRequest(&fbb)
+ ManyHellosRequest.add(name: name, &fbb)
+ ManyHellosRequest.add(numGreetings: numGreetings, &fbb)
+ return ManyHellosRequest.endManyHellosRequest(&fbb, start: __start)
+ }
+}
+
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift b/tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift
new file mode 100644
index 0000000..74729e7
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Sources/client/main.swift
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2020, gRPC Authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import GRPC
+import Model
+import NIO
+import Logging
+import FlatBuffers
+
+// Quieten the logs.
+LoggingSystem.bootstrap {
+ var handler = StreamLogHandler.standardOutput(label: $0)
+ handler.logLevel = .critical
+ return handler
+}
+
+func greet(name: String, client greeter: GreeterServiceClient) {
+ // Form the request with the name, if one was provided.
+ var builder = FlatBufferBuilder()
+ let name = builder.create(string: name)
+ let root = HelloRequest.createHelloRequest(&builder, offsetOfName: name)
+ builder.finish(offset: root)
+
+ // Make the RPC call to the server.
+ let sayHello = greeter.SayHello(Message<HelloRequest>(builder: &builder))
+
+ // wait() on the response to stop the program from exiting before the response is received.
+ do {
+ let response = try sayHello.response.wait()
+ print("Greeter received: \(response.object.message)")
+ } catch {
+ print("Greeter failed: \(error)")
+ }
+
+ let surname = builder.create(string: "Name")
+ let manyRoot = ManyHellosRequest.createManyHellosRequest(&builder, offsetOfName: surname, numGreetings: 2)
+ builder.finish(offset: manyRoot)
+
+ let call = greeter.SayManyHellos(Message(builder: &builder)) { message in
+ print(message.object.message)
+ }
+
+ let status = try! call.status.recover { _ in .processingError }.wait()
+ if status.code != .ok {
+ print("RPC failed: \(status)")
+ }
+}
+
+func main(args: [String]) {
+ // arg0 (dropped) is the program name. We expect arg1 to be the port, and arg2 (optional) to be
+ // the name sent in the request.
+ let arg1 = args.dropFirst(1).first
+ let arg2 = args.dropFirst(2).first
+
+ switch (arg1.flatMap(Int.init), arg2) {
+ case (.none, _):
+ print("Usage: PORT [NAME]")
+ exit(1)
+
+ case let (.some(port), name):
+ // Setup an `EventLoopGroup` for the connection to run on.
+ //
+ // See: https://github.com/apple/swift-nio#eventloops-and-eventloopgroups
+ let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
+
+ // Make sure the group is shutdown when we're done with it.
+ defer {
+ try! group.syncShutdownGracefully()
+ }
+
+ // Configure the channel, we're not using TLS so the connection is `insecure`.
+ let channel = ClientConnection.insecure(group: group)
+ .connect(host: "localhost", port: port)
+
+ // Close the connection when we're done with it.
+ defer {
+ try! channel.close().wait()
+ }
+
+ // Provide the connection to the generated client.
+ let greeter = GreeterServiceClient(channel: channel)
+
+ // Do the greeting.
+ greet(name: name ?? "Hello FlatBuffers!", client: greeter)
+ }
+}
+
+main(args: CommandLine.arguments)
diff --git a/tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift b/tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift
new file mode 100644
index 0000000..396c151
--- /dev/null
+++ b/tests/FlatBuffers.GRPC.Swift/Sources/server/main.swift
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2020, gRPC Authors All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import GRPC
+import NIO
+import FlatBuffers
+import Logging
+import Model
+
+class Greeter: GreeterProvider {
+
+ var hellos: [Message<HelloReply>] = []
+
+ init() {
+ let names = ["Stranger1", "Stranger2", "Stranger4", "Stranger3", "Stranger5", "Stranger6"]
+ for name in names {
+ var builder = FlatBufferBuilder()
+ let off = builder.create(string: name)
+ let root = HelloReply.createHelloReply(&builder, offsetOfMessage: off)
+ builder.finish(offset: root)
+ hellos.append(Message(builder: &builder))
+ }
+ }
+
+ func SayHello(
+ _ request: Message<HelloRequest>,
+ context: StatusOnlyCallContext
+ ) -> EventLoopFuture<Message<HelloReply>> {
+ let recipient = request.object.name ?? "Stranger"
+
+ var builder = FlatBufferBuilder()
+ let off = builder.create(string: recipient)
+ let root = HelloReply.createHelloReply(&builder, offsetOfMessage: off)
+ builder.finish(offset: root)
+ return context.eventLoop.makeSucceededFuture(Message<HelloReply>(builder: &builder))
+ }
+
+ func SayManyHellos(
+ request: Message<ManyHellosRequest>,
+ context: StreamingResponseCallContext<Message<HelloReply>>
+ ) -> EventLoopFuture<GRPCStatus> {
+ for _ in 0..<Int(request.object.numGreetings) {
+ let index = Int.random(in: 0..<hellos.count)
+ _ = context.sendResponse(hellos[index])
+ }
+ return context.eventLoop.makeSucceededFuture(.ok)
+ }
+}
+
+// Quieten the logs.
+LoggingSystem.bootstrap {
+ var handler = StreamLogHandler.standardOutput(label: $0)
+ handler.logLevel = .critical
+ return handler
+}
+
+let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
+defer {
+ try! group.syncShutdownGracefully()
+}
+
+// Create some configuration for the server:
+let configuration = Server.Configuration(
+ target: .hostAndPort("localhost", 0),
+ eventLoopGroup: group,
+ serviceProviders: [Greeter()]
+)
+
+// Start the server and print its address once it has started.
+let server = Server.start(configuration: configuration)
+server.map {
+ $0.channel.localAddress
+}.whenSuccess { address in
+ print("server started on port \(address!.port!)")
+}
+
+// Wait on the server's `onClose` future to stop the program from exiting.
+_ = try server.flatMap {
+ $0.onClose
+}.wait()
diff --git a/tests/FlatBuffers.Test.Swift/Package.swift b/tests/FlatBuffers.Test.Swift/Package.swift
new file mode 100644
index 0000000..6c17443
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Package.swift
@@ -0,0 +1,22 @@
+// swift-tools-version:5.1
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "FlatBuffers.Test.Swift",
+ platforms: [
+ .iOS(.v11),
+ .macOS(.v10_14),
+ ],
+ dependencies: [
+ .package(path: "../../swift/"),
+ .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.19")
+ ],
+ targets: [
+ .target(name: "SwiftFlatBuffers"),
+ .testTarget(
+ name: "FlatBuffers.Test.SwiftTests",
+ dependencies: ["FlatBuffers", "GRPC"]),
+ ]
+)
diff --git a/tests/FlatBuffers.Test.Swift/Sources/SwiftFlatBuffers/main.swift b/tests/FlatBuffers.Test.Swift/Sources/SwiftFlatBuffers/main.swift
new file mode 100644
index 0000000..12bfbb3
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Sources/SwiftFlatBuffers/main.swift
@@ -0,0 +1,2 @@
+import Foundation
+print("Flatbuffers")
diff --git a/tests/FlatBuffers.Test.Swift/SwiftTest.sh b/tests/FlatBuffers.Test.Swift/SwiftTest.sh
new file mode 100755
index 0000000..2779d90
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/SwiftTest.sh
@@ -0,0 +1,10 @@
+swift_dir=`pwd`
+cd ..
+test_dir=`pwd`
+
+cd ${swift_dir}/Tests/FlatBuffers.Test.SwiftTests
+${test_dir}/../flatc --swift --gen-mutable --grpc --gen-object-api -I ${test_dir}/include_test ${test_dir}/monster_test.fbs ${test_dir}/union_vector/union_vector.fbs
+${test_dir}/../flatc --swift ${test_dir}/optional_scalars.fbs
+cd ${swift_dir}
+swift build --build-tests
+swift test
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift
new file mode 100644
index 0000000..dcd0aa9
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersMonsterWriterTests.swift
@@ -0,0 +1,282 @@
+import XCTest
+import Foundation
+@testable import FlatBuffers
+
+typealias Test = MyGame_Example_Test
+typealias Monster = MyGame_Example_Monster
+typealias Vec3 = MyGame_Example_Vec3
+typealias Stat = MyGame_Example_Stat
+
+class FlatBuffersMonsterWriterTests: XCTestCase {
+
+ func testData() {
+ let data = Data([48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
+ let _data = ByteBuffer(data: data)
+ readMonster(fb: _data)
+ }
+
+ func testReadFromOtherLanguages() {
+ let path = FileManager.default.currentDirectoryPath
+ let url = URL(fileURLWithPath: path, isDirectory: true).appendingPathComponent("monsterdata_test").appendingPathExtension("mon")
+ guard let data = try? Data(contentsOf: url) else { return }
+ let _data = ByteBuffer(data: data)
+ readMonster(fb: _data)
+ }
+
+ func testCreateMonster() {
+ let bytes = createMonster(withPrefix: false)
+ XCTAssertEqual(bytes.sizedByteArray, [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
+ readMonster(fb: bytes.buffer)
+ mutateMonster(fb: bytes.buffer)
+ readMonster(fb: bytes.buffer)
+ }
+
+ func testCreateMonsterResizedBuffer() {
+ let bytes = createMonster(withPrefix: false)
+ XCTAssertEqual(bytes.sizedByteArray, [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
+ readMonster(fb: bytes.sizedBuffer)
+ }
+
+ func testCreateMonsterPrefixed() {
+ let bytes = createMonster(withPrefix: true)
+ XCTAssertEqual(bytes.sizedByteArray, [44, 1, 0, 0, 44, 0, 0, 0, 77, 79, 78, 83, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0])
+
+ let newBuf = FlatBuffersUtils.removeSizePrefix(bb: bytes.buffer)
+ readMonster(fb: newBuf)
+ }
+
+ func testCreateMonsterUsingCreateMonsterMethodWithNilPos() {
+ var fbb = FlatBufferBuilder(initialSize: 1)
+ let name = fbb.create(string: "Frodo")
+ let mStart = Monster.startMonster(&fbb)
+ Monster.add(name: name, &fbb)
+ let root = Monster.endMonster(&fbb, start: mStart)
+ fbb.finish(offset: root)
+ let newMonster = Monster.getRootAsMonster(bb: fbb.sizedBuffer)
+ XCTAssertNil(newMonster.pos)
+ XCTAssertEqual(newMonster.name, "Frodo")
+ }
+
+ func testCreateMonsterUsingCreateMonsterMethodWithPosX() {
+ var fbb = FlatBufferBuilder(initialSize: 1)
+ let name = fbb.create(string: "Barney")
+ let mStart = Monster.startMonster(&fbb)
+ Monster.add(pos: MyGame_Example_Vec3.createVec3(builder: &fbb, x: 10, test2: .blue), &fbb)
+ Monster.add(name: name, &fbb)
+ let root = Monster.endMonster(&fbb, start: mStart)
+ fbb.finish(offset: root)
+
+ let newMonster = Monster.getRootAsMonster(bb: fbb.sizedBuffer)
+ XCTAssertEqual(newMonster.pos!.x, 10)
+ XCTAssertEqual(newMonster.name, "Barney")
+ }
+
+ func testReadMonsterFromUnsafePointerWithoutCopying() {
+ var array: [UInt8] = [48, 0, 0, 0, 77, 79, 78, 83, 0, 0, 0, 0, 36, 0, 72, 0, 40, 0, 0, 0, 38, 0, 32, 0, 0, 0, 28, 0, 0, 0, 27, 0, 20, 0, 16, 0, 12, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 36, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 68, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, 0, 120, 0, 0, 0, 0, 0, 80, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 0, 0, 64, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, 0, 30, 0, 40, 0, 10, 0, 20, 0, 152, 255, 255, 255, 4, 0, 0, 0, 4, 0, 0, 0, 70, 114, 101, 100, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 50, 0, 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 49, 0, 0, 0, 9, 0, 0, 0, 77, 121, 77, 111, 110, 115, 116, 101, 114, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 240, 255, 255, 255, 32, 0, 0, 0, 248, 255, 255, 255, 36, 0, 0, 0, 12, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 28, 0, 0, 0, 5, 0, 0, 0, 87, 105, 108, 109, 97, 0, 0, 0, 6, 0, 0, 0, 66, 97, 114, 110, 101, 121, 0, 0, 5, 0, 0, 0, 70, 114, 111, 100, 111, 0, 0, 0]
+ let unpacked = array.withUnsafeMutableBytes { (memory) -> MyGame_Example_MonsterT in
+ let bytes = ByteBuffer(assumingMemoryBound: memory.baseAddress!, capacity: memory.count)
+ var monster = Monster.getRootAsMonster(bb: bytes)
+ readFlatbufferMonster(monster: &monster)
+ let unpacked = monster.unpack()
+ return unpacked
+ }
+ readObjectApi(monster: unpacked)
+ }
+
+ func readMonster(fb: ByteBuffer) {
+ var monster = Monster.getRootAsMonster(bb: fb)
+ readFlatbufferMonster(monster: &monster)
+ let unpacked: MyGame_Example_MonsterT? = monster.unpack()
+ readObjectApi(monster: unpacked!)
+ guard let buffer = unpacked?.serialize() else { fatalError("Couldnt generate bytebuffer") }
+ var newMonster = Monster.getRootAsMonster(bb: buffer)
+ readFlatbufferMonster(monster: &newMonster)
+ }
+
+ func createMonster(withPrefix prefix: Bool) -> FlatBufferBuilder {
+ var fbb = FlatBufferBuilder(initialSize: 1)
+ let names = [fbb.create(string: "Frodo"), fbb.create(string: "Barney"), fbb.create(string: "Wilma")]
+ var offsets: [Offset<UOffset>] = []
+ let start1 = Monster.startMonster(&fbb)
+ Monster.add(name: names[0], &fbb)
+ offsets.append(Monster.endMonster(&fbb, start: start1))
+ let start2 = Monster.startMonster(&fbb)
+ Monster.add(name: names[1], &fbb)
+ offsets.append(Monster.endMonster(&fbb, start: start2))
+ let start3 = Monster.startMonster(&fbb)
+ Monster.add(name: names[2], &fbb)
+ offsets.append(Monster.endMonster(&fbb, start: start3))
+
+ let sortedArray = Monster.sortVectorOfMonster(offsets: offsets, &fbb)
+
+ let str = fbb.create(string: "MyMonster")
+ let test1 = fbb.create(string: "test1")
+ let test2 = fbb.create(string: "test2")
+ let _inv: [Byte] = [0, 1, 2, 3, 4]
+ let inv = fbb.createVector(_inv)
+
+ let fred = fbb.create(string: "Fred")
+ let mon1Start = Monster.startMonster(&fbb)
+ Monster.add(name: fred, &fbb)
+ let mon2 = Monster.endMonster(&fbb, start: mon1Start)
+
+ let size = 2
+ Monster.startVectorOfTest4(size, in: &fbb)
+ MyGame_Example_Test.createTest(builder: &fbb, a: 10, b: 20)
+ MyGame_Example_Test.createTest(builder: &fbb, a: 30, b: 40)
+ let test4 = fbb.endVectorOfStructs(count: size)
+
+ let stringTestVector = fbb.createVector(ofOffsets: [test1, test2])
+ let mStart = Monster.startMonster(&fbb)
+ let posStruct = MyGame_Example_Vec3.createVec3(builder: &fbb, x: 1, y: 2, z: 3, test1: 3, test2: .green, test3a: 5, test3b: 6)
+ Monster.add(pos: posStruct, &fbb)
+ Monster.add(hp: 80, &fbb)
+ Monster.add(name: str, &fbb)
+ Monster.addVectorOf(inventory: inv, &fbb)
+ Monster.add(testType: .monster, &fbb)
+ Monster.add(test: mon2, &fbb)
+ Monster.addVectorOf(test4: test4, &fbb)
+ Monster.addVectorOf(testarrayofstring: stringTestVector, &fbb)
+ Monster.add(testbool: true, &fbb)
+ Monster.addVectorOf(testarrayoftables: sortedArray, &fbb)
+ let end = Monster.endMonster(&fbb, start: mStart)
+ Monster.finish(&fbb, end: end, prefix: prefix)
+ return fbb
+ }
+
+ func mutateMonster(fb: ByteBuffer) {
+ let monster = Monster.getRootAsMonster(bb: fb)
+ XCTAssertFalse(monster.mutate(mana: 10))
+ XCTAssertEqual(monster.testarrayoftables(at: 0)?.name, "Barney")
+ XCTAssertEqual(monster.testarrayoftables(at: 1)?.name, "Frodo")
+ XCTAssertEqual(monster.testarrayoftables(at: 2)?.name, "Wilma")
+
+ // Example of searching for a table by the key
+ XCTAssertNotNil(monster.testarrayoftablesBy(key: "Frodo"))
+ XCTAssertNotNil(monster.testarrayoftablesBy(key: "Barney"))
+ XCTAssertNotNil(monster.testarrayoftablesBy(key: "Wilma"))
+
+ XCTAssertEqual(monster.testType, .monster)
+
+ XCTAssertEqual(monster.mutate(inventory: 1, at: 0), true)
+ XCTAssertEqual(monster.mutate(inventory: 2, at: 1), true)
+ XCTAssertEqual(monster.mutate(inventory: 3, at: 2), true)
+ XCTAssertEqual(monster.mutate(inventory: 4, at: 3), true)
+ XCTAssertEqual(monster.mutate(inventory: 5, at: 4), true)
+
+ for i in 0..<monster.inventoryCount {
+ XCTAssertEqual(monster.inventory(at: i), Byte(i + 1))
+ }
+
+ XCTAssertEqual(monster.mutate(inventory: 0, at: 0), true)
+ XCTAssertEqual(monster.mutate(inventory: 1, at: 1), true)
+ XCTAssertEqual(monster.mutate(inventory: 2, at: 2), true)
+ XCTAssertEqual(monster.mutate(inventory: 3, at: 3), true)
+ XCTAssertEqual(monster.mutate(inventory: 4, at: 4), true)
+
+ let vec = monster.pos
+ XCTAssertEqual(vec?.x, 1)
+ XCTAssertTrue(vec?.mutate(x: 55.0) ?? false)
+ XCTAssertTrue(vec?.mutate(test1: 55) ?? false)
+ XCTAssertEqual(vec?.x, 55.0)
+ XCTAssertEqual(vec?.test1, 55.0)
+ XCTAssertTrue(vec?.mutate(x: 1) ?? false)
+ XCTAssertEqual(vec?.x, 1)
+ XCTAssertTrue(vec?.mutate(test1: 3) ?? false)
+ }
+
+ func readFlatbufferMonster(monster: inout MyGame_Example_Monster) {
+ XCTAssertEqual(monster.hp, 80)
+ XCTAssertEqual(monster.mana, 150)
+ XCTAssertEqual(monster.name, "MyMonster")
+ let pos = monster.pos
+ XCTAssertEqual(pos?.x, 1)
+ XCTAssertEqual(pos?.y, 2)
+ XCTAssertEqual(pos?.z, 3)
+ XCTAssertEqual(pos?.test1, 3)
+ XCTAssertEqual(pos?.test2, .green)
+ let test = pos?.test3
+ XCTAssertEqual(test?.a, 5)
+ XCTAssertEqual(test?.b, 6)
+ XCTAssertEqual(monster.testType, .monster)
+ let monster2 = monster.test(type: Monster.self)
+ XCTAssertEqual(monster2?.name, "Fred")
+
+ XCTAssertEqual(monster.mutate(mana: 10), false)
+
+ XCTAssertEqual(monster.mana, 150)
+ XCTAssertEqual(monster.inventoryCount, 5)
+ var sum: Byte = 0
+ for i in 0...monster.inventoryCount {
+ sum += monster.inventory(at: i)
+ }
+ XCTAssertEqual(sum, 10)
+ XCTAssertEqual(monster.test4Count, 2)
+ let test0 = monster.test4(at: 0)
+ let test1 = monster.test4(at: 1)
+ var sum0 = 0
+ var sum1 = 0
+ if let a = test0?.a, let b = test0?.b {
+ sum0 = Int(a) + Int(b)
+ }
+ if let a = test1?.a, let b = test1?.b {
+ sum1 = Int(a) + Int(b)
+ }
+ XCTAssertEqual(sum0 + sum1, 100)
+ XCTAssertEqual(monster.testarrayofstringCount, 2)
+ XCTAssertEqual(monster.testarrayofstring(at: 0), "test1")
+ XCTAssertEqual(monster.testarrayofstring(at: 1), "test2")
+ XCTAssertEqual(monster.testbool, true)
+
+ let array = monster.nameSegmentArray
+ XCTAssertEqual(String(bytes: array ?? [], encoding: .utf8), "MyMonster")
+
+ if 0 == monster.testarrayofboolsCount {
+ XCTAssertEqual(monster.testarrayofbools.isEmpty, true)
+ } else {
+ XCTAssertEqual(monster.testarrayofbools.isEmpty, false)
+ }
+ }
+
+ func readObjectApi(monster: MyGame_Example_MonsterT) {
+ XCTAssertEqual(monster.hp, 80)
+ XCTAssertEqual(monster.mana, 150)
+ XCTAssertEqual(monster.name, "MyMonster")
+ let pos = monster.pos
+ XCTAssertEqual(pos?.x, 1)
+ XCTAssertEqual(pos?.y, 2)
+ XCTAssertEqual(pos?.z, 3)
+ XCTAssertEqual(pos?.test1, 3)
+ XCTAssertEqual(pos?.test2, .green)
+ let test = pos?.test3
+ XCTAssertEqual(test?.a, 5)
+ XCTAssertEqual(test?.b, 6)
+ let monster2 = monster.test?.value as? MyGame_Example_MonsterT
+ XCTAssertEqual(monster2?.name, "Fred")
+ XCTAssertEqual(monster.mana, 150)
+ monster.mana = 10
+ XCTAssertEqual(monster.mana, 10)
+ monster.mana = 150
+ XCTAssertEqual(monster.mana, 150)
+
+ XCTAssertEqual(monster.inventory.count, 5)
+ var sum: Byte = 0
+ for i in monster.inventory {
+ sum += i
+ }
+ XCTAssertEqual(sum, 10)
+ XCTAssertEqual(monster.test4.count, 2)
+ let test0 = monster.test4[0]
+ let test1 = monster.test4[1]
+ var sum0 = 0
+ var sum1 = 0
+ if let a = test0?.a, let b = test0?.b {
+ sum0 = Int(a) + Int(b)
+ }
+ if let a = test1?.a, let b = test1?.b {
+ sum1 = Int(a) + Int(b)
+ }
+ XCTAssertEqual(sum0 + sum1, 100)
+ XCTAssertEqual(monster.testbool, true)
+ }
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersStructsTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersStructsTests.swift
new file mode 100644
index 0000000..b19813f
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersStructsTests.swift
@@ -0,0 +1,43 @@
+import XCTest
+@testable import FlatBuffers
+
+final class FlatBuffersStructsTests: XCTestCase {
+
+ func testWritingAndMutatingBools() {
+ var fbb = FlatBufferBuilder()
+ let start = TestMutatingBool.startTestMutatingBool(&fbb)
+ TestMutatingBool.add(b: createProperty(builder: &fbb), &fbb)
+ let root = TestMutatingBool.endTestMutatingBool(&fbb, start: start)
+ fbb.finish(offset: root)
+
+ let testMutatingBool = TestMutatingBool.getRootAsTestMutatingBool(bb: fbb.sizedBuffer)
+ let property = testMutatingBool.b
+ XCTAssertEqual(property?.property, false)
+ property?.mutate(property: false)
+ XCTAssertEqual(property?.property, false)
+ property?.mutate(property: true)
+ XCTAssertEqual(property?.property, true)
+ }
+
+}
+
+struct Vec: Readable {
+ var __buffer: ByteBuffer! { __p.bb }
+
+ static var size = 12
+ static var alignment = 4
+ private var __p: Struct
+ init(_ fb: ByteBuffer, o: Int32) { __p = Struct(bb: fb, position: o) }
+ var x: Float32 { return __p.readBuffer(of: Float32.self, at: 0)}
+ var y: Float32 { return __p.readBuffer(of: Float32.self, at: 4)}
+ var z: Float32 { return __p.readBuffer(of: Float32.self, at: 8)}
+}
+
+@discardableResult
+func createVecWrite(builder: inout FlatBufferBuilder, x: Float32, y: Float32, z: Float32) -> Offset<UOffset> {
+ builder.createStructOf(size: Vec.size, alignment: Vec.alignment)
+ builder.reverseAdd(v: x, postion: 0)
+ builder.reverseAdd(v: y, postion: 4)
+ builder.reverseAdd(v: z, postion: 8)
+ return builder.endStruct()
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersTests.swift
new file mode 100644
index 0000000..cac1740
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersTests.swift
@@ -0,0 +1,141 @@
+import XCTest
+@testable import FlatBuffers
+
+final class FlatBuffersTests: XCTestCase {
+
+ let country = "Norway"
+
+ func testEndian() { XCTAssertEqual(isLitteEndian, true) }
+
+ func testOffset() {
+ let o = Offset<Int>()
+ let b = Offset<Int>(offset: 1)
+ XCTAssertEqual(o.isEmpty, true)
+ XCTAssertEqual(b.isEmpty, false)
+ }
+
+ func testCreateString() {
+ let helloWorld = "Hello, world!"
+ var b = FlatBufferBuilder(initialSize: 16)
+ XCTAssertEqual(b.create(string: country).o, 12)
+ XCTAssertEqual(b.create(string: helloWorld).o, 32)
+ b.clear()
+ XCTAssertEqual(b.create(string: helloWorld).o, 20)
+ XCTAssertEqual(b.create(string: country).o, 32)
+ b.clear()
+ XCTAssertEqual(b.create(string: String(repeating: "a", count: 257)).o, 264)
+ }
+
+ func testStartTable() {
+ var b = FlatBufferBuilder(initialSize: 16)
+ XCTAssertNoThrow(b.startTable(with: 0))
+ b.clear()
+ XCTAssertEqual(b.create(string: country).o, 12)
+ XCTAssertEqual(b.startTable(with: 0), 12)
+ }
+
+ func testCreateFinish() {
+ var b = FlatBufferBuilder(initialSize: 16)
+ let countryOff = Country.createCountry(builder: &b, name: country, log: 200, lan: 100)
+ b.finish(offset: countryOff)
+ let v: [UInt8] = [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]
+ XCTAssertEqual(b.sizedByteArray, v)
+ }
+
+ func testCreateFinishWithPrefix() {
+ var b = FlatBufferBuilder(initialSize: 16)
+ let countryOff = Country.createCountry(builder: &b, name: country, log: 200, lan: 100)
+ b.finish(offset: countryOff, addPrefix: true)
+ let v: [UInt8] = [44, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]
+ XCTAssertEqual(b.sizedByteArray, v)
+ }
+
+ func testReadCountry() {
+ let v: [UInt8] = [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 12, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]
+ let buffer = ByteBuffer(bytes: v)
+ let c = Country.getRootAsCountry(buffer)
+ XCTAssertEqual(c.lan, 100)
+ XCTAssertEqual(c.log, 200)
+ XCTAssertEqual(c.nameVector, [78, 111, 114, 119, 97, 121])
+ XCTAssertEqual(c.name, country)
+ }
+
+ func testWriteNullableStrings() {
+ var b = FlatBufferBuilder()
+ XCTAssertTrue(b.create(string: nil).isEmpty)
+ XCTAssertTrue(b.createShared(string: nil).isEmpty)
+ }
+
+ func testWriteOptionalValues() {
+ var b = FlatBufferBuilder()
+ let root = optional_scalars_ScalarStuff.createScalarStuff(&b,
+ justI8: 80,
+ maybeI8: nil,
+ justU8: 100,
+ maybeU8: 10,
+ maybeBool: true,
+ justEnum: .one,
+ maybeEnum: nil)
+ b.finish(offset: root)
+ let scalarTable = optional_scalars_ScalarStuff.getRootAsScalarStuff(bb: b.sizedBuffer)
+ XCTAssertEqual(scalarTable.justI8, 80)
+ XCTAssertNil(scalarTable.maybeI8)
+ XCTAssertEqual(scalarTable.maybeBool, true)
+ XCTAssertEqual(scalarTable.defaultI8, 42)
+ XCTAssertEqual(scalarTable.justU8, 100)
+ XCTAssertEqual(scalarTable.maybeU8, 10)
+ XCTAssertEqual(scalarTable.justEnum, .one)
+ XCTAssertNil(scalarTable.maybeEnum)
+ }
+}
+
+class Country {
+
+ static let offsets: (name: VOffset, lan: VOffset, lng: VOffset) = (4, 6, 8)
+ private var __t: Table
+
+ private init(_ t: Table) {
+ __t = t
+ }
+
+ var lan: Int32 { let o = __t.offset(6); return o == 0 ? 0 : __t.readBuffer(of: Int32.self, at: o) }
+ var log: Int32 { let o = __t.offset(8); return o == 0 ? 0 : __t.readBuffer(of: Int32.self, at: o) }
+ var nameVector: [UInt8]? { return __t.getVector(at: 4) }
+ var name: String? { let o = __t.offset(4); return o == 0 ? nil : __t.string(at: o) }
+
+ @inlinable static func getRootAsCountry(_ bb: ByteBuffer) -> Country {
+ return Country(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: 0))))
+ }
+
+ @inlinable static func createCountry(builder: inout FlatBufferBuilder, name: String, log: Int32, lan: Int32) -> Offset<Country> {
+ return createCountry(builder: &builder, offset: builder.create(string: name), log: log, lan: lan)
+ }
+
+ @inlinable static func createCountry(builder: inout FlatBufferBuilder, offset: Offset<String>, log: Int32, lan: Int32) -> Offset<Country> {
+ let _start = builder.startTable(with: 3)
+ Country.add(builder: &builder, lng: log)
+ Country.add(builder: &builder, lan: lan)
+ Country.add(builder: &builder, name: offset)
+ return Country.end(builder: &builder, startOffset: _start)
+ }
+
+ @inlinable static func end(builder: inout FlatBufferBuilder, startOffset: UOffset) -> Offset<Country> {
+ return Offset(offset: builder.endTable(at: startOffset))
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, name: String) {
+ add(builder: &builder, name: builder.create(string: name))
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, name: Offset<String>) {
+ builder.add(offset: name, at: Country.offsets.name)
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, lan: Int32) {
+ builder.add(element: lan, def: 0, at: Country.offsets.lan)
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, lng: Int32) {
+ builder.add(element: lng, def: 0, at: Country.offsets.lng)
+ }
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift
new file mode 100644
index 0000000..a90baae
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersUnionTests.swift
@@ -0,0 +1,242 @@
+import XCTest
+@testable import FlatBuffers
+
+final class FlatBuffersUnionTests: XCTestCase {
+
+ func testCreateMonstor() {
+
+ var b = FlatBufferBuilder(initialSize: 20)
+ let dmg: Int16 = 5
+ let str = "Axe"
+ let axe = b.create(string: str)
+ let weapon = Weapon.createWeapon(builder: &b, offset: axe, dmg: dmg)
+ let weapons = b.createVector(ofOffsets: [weapon])
+ let root = LocalMonster.createMonster(builder: &b,
+ offset: weapons,
+ equipment: .Weapon,
+ equippedOffset: weapon.o)
+ b.finish(offset: root)
+ let buffer = b.sizedByteArray
+ XCTAssertEqual(buffer, [16, 0, 0, 0, 0, 0, 10, 0, 16, 0, 8, 0, 7, 0, 12, 0, 10, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 20, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0, 3, 0, 0, 0, 65, 120, 101, 0])
+ let monster = LocalMonster.getRootAsMonster(bb: ByteBuffer(bytes: buffer))
+ XCTAssertEqual(monster.weapon(at: 0)?.dmg, dmg)
+ XCTAssertEqual(monster.weapon(at: 0)?.name, str)
+ XCTAssertEqual(monster.weapon(at: 0)?.nameVector, [65, 120, 101])
+ let p: Weapon? = monster.equiped()
+ XCTAssertEqual(p?.dmg, dmg)
+ XCTAssertEqual(p?.name, str)
+ XCTAssertEqual(p?.nameVector, [65, 120, 101])
+ }
+
+ func testEndTableFinish() {
+ var builder = FlatBufferBuilder(initialSize: 20)
+ let sword = builder.create(string: "Sword")
+ let axe = builder.create(string: "Axe")
+ let weaponOne = Weapon.createWeapon(builder: &builder, offset: sword, dmg: 3)
+ let weaponTwo = Weapon.createWeapon(builder: &builder, offset: axe, dmg: 5)
+ let name = builder.create(string: "Orc")
+ let inventory: [UInt8] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ let inv = builder.createVector(inventory, size: 10)
+ let weapons = builder.createVector(ofOffsets: [weaponOne, weaponTwo])
+ builder.startVectorOfStructs(count: 2, size: Vec.size, alignment: Vec.alignment)
+ createVecWrite(builder: &builder, x: 1.0, y: 2.0, z: 3.0)
+ createVecWrite(builder: &builder, x: 4.0, y: 5.0, z: 6.0)
+ let path = builder.endVectorOfStructs(count: 2)
+ let orc = FinalMonster.createMonster(builder: &builder,
+ position: createVecWrite(builder: &builder, x: 1.0, y: 2.0, z: 3.0),
+ hp: 300,
+ name: name,
+ inventory: inv,
+ color: .red,
+ weapons: weapons,
+ equipment: .Weapon,
+ equippedOffset: weaponTwo,
+ path: path)
+ builder.finish(offset: orc)
+ XCTAssertEqual(builder.sizedByteArray, [32, 0, 0, 0, 0, 0, 26, 0, 36, 0, 36, 0, 0, 0, 34, 0, 28, 0, 0, 0, 24, 0, 23, 0, 16, 0, 15, 0, 8, 0, 4, 0, 26, 0, 0, 0, 44, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 76, 0, 0, 0, 0, 0, 44, 1, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 0, 0, 0, 0, 128, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 0, 0, 52, 0, 0, 0, 28, 0, 0, 0, 10, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 3, 0, 0, 0, 79, 114, 99, 0, 244, 255, 255, 255, 0, 0, 5, 0, 24, 0, 0, 0, 8, 0, 12, 0, 8, 0, 6, 0, 8, 0, 0, 0, 0, 0, 3, 0, 12, 0, 0, 0, 3, 0, 0, 0, 65, 120, 101, 0, 5, 0, 0, 0, 83, 119, 111, 114, 100, 0, 0, 0])
+ }
+
+ func testEnumVector() {
+ let vectorOfEnums: [ColorsNameSpace.RGB] = [.blue, .green]
+
+ var builder = FlatBufferBuilder(initialSize: 1)
+ let off = builder.createVector(vectorOfEnums)
+ let start = ColorsNameSpace.Monster.startMonster(&builder)
+ ColorsNameSpace.Monster.add(colors: off, &builder)
+ let end = ColorsNameSpace.Monster.endMonster(&builder, start: start)
+ builder.finish(offset: end)
+ XCTAssertEqual(builder.sizedByteArray, [12, 0, 0, 0, 0, 0, 6, 0, 8, 0, 4, 0, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0])
+ let monster = ColorsNameSpace.Monster.getRootAsMonster(bb: builder.buffer)
+ XCTAssertEqual(monster.colorsCount, 2)
+ XCTAssertEqual(monster.colors(at: 0), .blue)
+ XCTAssertEqual(monster.colors(at: 1), .green)
+ }
+
+ func testUnionVector() {
+ var fb = FlatBufferBuilder()
+
+ let swordDmg: Int32 = 8
+ let attackStart = Attacker.startAttacker(&fb)
+ Attacker.add(swordAttackDamage: swordDmg, &fb)
+ let attack = Attacker.endAttacker(&fb, start: attackStart)
+
+ let characterType: [Character] = [.belle, .mulan, .bookfan]
+
+ let characters = [
+ BookReader.createBookReader(builder: &fb, booksRead: 7),
+ attack,
+ BookReader.createBookReader(builder: &fb, booksRead: 2)
+ ]
+ let types = fb.createVector(characterType)
+ let characterVector = fb.createVector(ofOffsets: characters)
+ let end = Movie.createMovie(&fb, vectorOfCharactersType: types, vectorOfCharacters: characterVector)
+ Movie.finish(&fb, end: end)
+
+ var movie = Movie.getRootAsMovie(bb: fb.buffer)
+ XCTAssertEqual(movie.charactersTypeCount, Int32(characterType.count))
+ XCTAssertEqual(movie.charactersCount, Int32(characters.count))
+
+ for i in 0..<movie.charactersTypeCount {
+ XCTAssertEqual(movie.charactersType(at: i), characterType[Int(i)])
+ }
+
+ XCTAssertEqual(movie.characters(at: 0, type: BookReader.self)?.booksRead, 7)
+ XCTAssertEqual(movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage, swordDmg)
+ XCTAssertEqual(movie.characters(at: 2, type: BookReader.self)?.booksRead, 2)
+
+ var objc: MovieT? = movie.unpack()
+ XCTAssertEqual(movie.charactersTypeCount, Int32(objc?.characters.count ?? 0))
+ XCTAssertEqual(movie.characters(at: 0, type: BookReader.self)?.booksRead, (objc?.characters[0]?.value as? BookReaderT)?.booksRead)
+ fb.clear()
+ let newMovie = Movie.pack(&fb, obj: &objc)
+ fb.finish(offset: newMovie)
+
+ let packedMovie = Movie.getRootAsMovie(bb: fb.buffer)
+
+ XCTAssertEqual(packedMovie.characters(at: 0, type: BookReader.self)?.booksRead, movie.characters(at: 0, type: BookReader.self)?.booksRead)
+ XCTAssertEqual(packedMovie.characters(at: 1, type: Attacker.self)?.swordAttackDamage, movie.characters(at: 1, type: Attacker.self)?.swordAttackDamage)
+ XCTAssertEqual(packedMovie.characters(at: 2, type: BookReader.self)?.booksRead, movie.characters(at: 2, type: BookReader.self)?.booksRead)
+ }
+}
+
+public enum ColorsNameSpace {
+
+ enum RGB: Int32, Enum {
+ typealias T = Int32
+ static var byteSize: Int { return MemoryLayout<Int32>.size }
+ var value: Int32 { return self.rawValue }
+ case red = 0, green = 1, blue = 2
+ }
+
+ struct Monster: FlatBufferObject {
+ var __buffer: ByteBuffer! { _accessor.bb }
+
+ private var _accessor: Table
+ static func getRootAsMonster(bb: ByteBuffer) -> Monster { return Monster(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ init(_ t: Table) { _accessor = t }
+ init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ public var colorsCount: Int32 { let o = _accessor.offset(4); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func colors(at index: Int32) -> ColorsNameSpace.RGB? { let o = _accessor.offset(4); return o == 0 ? ColorsNameSpace.RGB(rawValue: 0)! : ColorsNameSpace.RGB(rawValue: _accessor.directRead(of: Int32.self, offset: _accessor.vector(at: o) + index * 4)) }
+ static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ static func add(colors: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: colors, at: 4) }
+ static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ }
+}
+
+
+enum Equipment: Byte { case none, Weapon }
+
+enum Color3: Int8 { case red = 0, green, blue }
+
+struct FinalMonster {
+
+ @inlinable static func createMonster(builder: inout FlatBufferBuilder,
+ position: Offset<UOffset>,
+ hp: Int16,
+ name: Offset<String>,
+ inventory: Offset<UOffset>,
+ color: Color3,
+ weapons: Offset<UOffset>,
+ equipment: Equipment = .none,
+ equippedOffset: Offset<Weapon>,
+ path: Offset<UOffset>) -> Offset<LocalMonster> {
+ let start = builder.startTable(with: 11)
+ builder.add(structOffset: 4)
+ builder.add(element: hp, def: 100, at: 8)
+ builder.add(offset: name, at: 10)
+ builder.add(offset: inventory, at: 14)
+ builder.add(element: color.rawValue, def: Color3.green.rawValue, at: 16)
+ builder.add(offset: weapons, at: 18)
+ builder.add(element: equipment.rawValue, def: Equipment.none.rawValue, at: 20)
+ builder.add(offset: equippedOffset, at: 22)
+ builder.add(offset: path, at: 24)
+ return Offset(offset: builder.endTable(at: start))
+ }
+}
+
+struct LocalMonster {
+
+ private var __t: Table
+
+ init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o) }
+ init(_ t: Table) { __t = t }
+
+ func weapon(at index: Int32) -> Weapon? { let o = __t.offset(4); return o == 0 ? nil : Weapon.assign(__t.indirect(__t.vector(at: o) + (index * 4)), __t.bb) }
+
+ func equiped<T: FlatBufferObject>() -> T? {
+ let o = __t.offset(8); return o == 0 ? nil : __t.union(o)
+ }
+
+ static func getRootAsMonster(bb: ByteBuffer) -> LocalMonster {
+ return LocalMonster(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: 0))))
+ }
+
+ @inlinable static func createMonster(builder: inout FlatBufferBuilder,
+ offset: Offset<UOffset>,
+ equipment: Equipment = .none,
+ equippedOffset: UOffset) -> Offset<LocalMonster> {
+ let start = builder.startTable(with: 3)
+ builder.add(element: equippedOffset, def: 0, at: 8)
+ builder.add(offset: offset, at: 4)
+ builder.add(element: equipment.rawValue, def: Equipment.none.rawValue, at: 6)
+ return Offset(offset: builder.endTable(at: start))
+ }
+}
+
+struct Weapon: FlatBufferObject {
+
+ var __buffer: ByteBuffer! { __t.bb }
+
+ static let offsets: (name: VOffset, dmg: VOffset) = (4, 6)
+ private var __t: Table
+
+ init(_ t: Table) { __t = t }
+ init(_ fb: ByteBuffer, o: Int32) { __t = Table(bb: fb, position: o)}
+
+ var dmg: Int16 { let o = __t.offset(6); return o == 0 ? 0 : __t.readBuffer(of: Int16.self, at: o) }
+ var nameVector: [UInt8]? { return __t.getVector(at: 4) }
+ var name: String? { let o = __t.offset(4); return o == 0 ? nil : __t.string(at: o) }
+
+ static func assign(_ i: Int32, _ bb: ByteBuffer) -> Weapon { return Weapon(Table(bb: bb, position: i)) }
+
+ @inlinable static func createWeapon(builder: inout FlatBufferBuilder, offset: Offset<String>, dmg: Int16) -> Offset<Weapon> {
+ let _start = builder.startTable(with: 2)
+ Weapon.add(builder: &builder, name: offset)
+ Weapon.add(builder: &builder, dmg: dmg)
+ return Weapon.end(builder: &builder, startOffset: _start)
+ }
+
+ @inlinable static func end(builder: inout FlatBufferBuilder, startOffset: UOffset) -> Offset<Weapon> {
+ return Offset(offset: builder.endTable(at: startOffset))
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, name: Offset<String>) {
+ builder.add(offset: name, at: Weapon.offsets.name)
+ }
+
+ @inlinable static func add(builder: inout FlatBufferBuilder, dmg: Int16) {
+ builder.add(element: dmg, def: 0, at: Weapon.offsets.dmg)
+ }
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersVectorsTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersVectorsTests.swift
new file mode 100644
index 0000000..9d63e80
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatBuffersVectorsTests.swift
@@ -0,0 +1,116 @@
+import XCTest
+@testable import FlatBuffers
+
+final class FlatBuffersVectors: XCTestCase {
+
+ func testCreatingTwoCountries() {
+ let norway = "Norway"
+ let denmark = "Denmark"
+ var b = FlatBufferBuilder(initialSize: 20)
+ let noStr = b.create(string: norway)
+ let deStr = b.create(string: denmark)
+ let n = Country.createCountry(builder: &b, offset: noStr, log: 888, lan: 700)
+ let d = Country.createCountry(builder: &b, offset: deStr, log: 200, lan: 100)
+ let vector = [n, d]
+ let vectorOffset = b.createVector(ofOffsets: vector)
+ b.finish(offset: vectorOffset)
+ XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 2, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 10, 0, 18, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 40, 0, 0, 0, 100, 0, 0, 0, 200, 0, 0, 0, 0, 0, 10, 0, 16, 0, 4, 0, 8, 0, 12, 0, 10, 0, 0, 0, 24, 0, 0, 0, 188, 2, 0, 0, 120, 3, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0])
+ }
+
+ func testCreateIntArray() {
+ let numbers: [Int32] = [1, 2, 3, 4, 5]
+ var b = FlatBufferBuilder(initialSize: 20)
+ let o = b.createVector(numbers, size: numbers.count)
+ b.finish(offset: o)
+ XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0])
+ }
+
+ func testCreateEmptyIntArray() {
+ let numbers: [Int32] = []
+ var b = FlatBufferBuilder(initialSize: 20)
+ let o = b.createVector(numbers, size: numbers.count)
+ b.finish(offset: o)
+ XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 0, 0, 0, 0])
+ }
+
+ func testCreateVectorOfStrings() {
+ let strs = ["Denmark", "Norway"]
+ var b = FlatBufferBuilder(initialSize: 20)
+ let o = b.createVector(ofStrings: strs)
+ b.finish(offset: o)
+ XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 2, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0])
+ }
+ func testCreateSharedStringVector() {
+ let norway = "Norway"
+ let denmark = "Denmark"
+ var b = FlatBufferBuilder(initialSize: 20)
+ let noStr = b.createShared(string: norway)
+ let deStr = b.createShared(string: denmark)
+ let _noStr = b.createShared(string: norway)
+ let _deStr = b.createShared(string: denmark)
+ let v = [noStr, deStr, _noStr, _deStr]
+ let end = b.createVector(ofOffsets: v)
+ b.finish(offset: end)
+ XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 4, 0, 0, 0, 28, 0, 0, 0, 12, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 68, 101, 110, 109, 97, 114, 107, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0])
+ }
+
+ func testReadInt32Array() {
+ let data: [Int32] = [1, 2, 3, 4, 5]
+ var b = FlatBufferBuilder(initialSize: 20)
+ let v = Numbers.createNumbersVector(b: &b, array: data)
+ let end = Numbers.createNumbers(b: &b, o: v)
+ b.finish(offset: end)
+ let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray))
+ XCTAssertEqual(number.vArrayInt32, [1, 2, 3, 4, 5])
+ }
+
+ func testReadDoubleArray() {
+ let data: [Double] = [1, 2, 3, 4, 5]
+ var b = FlatBufferBuilder(initialSize: 20)
+ let v = Numbers.createNumbersVector(b: &b, array: data)
+ let end = Numbers.createNumbers(b: &b, o: v)
+ b.finish(offset: end)
+ let number = Numbers.getRootAsNumbers(ByteBuffer(bytes: b.sizedByteArray))
+ XCTAssertEqual(number.vArrayDouble, [1, 2, 3, 4, 5])
+ }
+}
+
+struct Numbers {
+
+ private var __t: Table
+
+ private init(_ t: Table) {
+ __t = t
+ }
+
+ @inlinable static func getRootAsNumbers(_ bb: ByteBuffer) -> Numbers {
+ return Numbers(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: 0))))
+ }
+
+ var vArrayInt: [Int]? { return __t.getVector(at: 4) }
+ var vArrayInt32: [Int32]? { return __t.getVector(at: 4) }
+ var vArrayDouble: [Double]? { return __t.getVector(at: 4) }
+ var vArrayFloat: [Float32]? { return __t.getVector(at: 4) }
+
+ static func createNumbersVector(b: inout FlatBufferBuilder, array: [Int]) -> Offset<UOffset> {
+ return b.createVector(array, size: array.count)
+ }
+
+ static func createNumbersVector(b: inout FlatBufferBuilder, array: [Int32]) -> Offset<UOffset> {
+ return b.createVector(array, size: array.count)
+ }
+
+ static func createNumbersVector(b: inout FlatBufferBuilder, array: [Double]) -> Offset<UOffset> {
+ return b.createVector(array, size: array.count)
+ }
+
+ static func createNumbersVector(b: inout FlatBufferBuilder, array: [Float32]) -> Offset<UOffset> {
+ return b.createVector(array, size: array.count)
+ }
+
+ static func createNumbers(b: inout FlatBufferBuilder, o: Offset<UOffset>) -> Offset<UOffset> {
+ let start = b.startTable(with: 1)
+ b.add(offset: o, at: 4)
+ return Offset(offset: b.endTable(at: start))
+ }
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersDoubleTests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersDoubleTests.swift
new file mode 100644
index 0000000..6f61ec6
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/FlatbuffersDoubleTests.swift
@@ -0,0 +1,69 @@
+import XCTest
+@testable import FlatBuffers
+
+final class FlatBuffersDoubleTests: XCTestCase {
+
+ let country = "Norway"
+
+ func testCreateFinish() {
+ var b = FlatBufferBuilder(initialSize: 16)
+ let countryOff = CountryDouble.createCountry(builder: &b, name: country, log: 200, lan: 100)
+ b.finish(offset: countryOff)
+ let v: [UInt8] = [16, 0, 0, 0, 0, 0, 10, 0, 28, 0, 4, 0, 8, 0, 16, 0, 10, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 64, 0, 0, 0, 0, 0, 0, 105, 64, 0, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]
+ XCTAssertEqual(b.sizedByteArray, v)
+ }
+
+ func testCreateFinishWithPrefix() {
+ var b = FlatBufferBuilder(initialSize: 16)
+ let countryOff = CountryDouble.createCountry(builder: &b, name: country, log: 200, lan: 100)
+ b.finish(offset: countryOff, addPrefix: true)
+ let v: [UInt8] = [60, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 28, 0, 4, 0, 8, 0, 16, 0, 10, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 64, 0, 0, 0, 0, 0, 0, 105, 64, 0, 0, 0, 0, 6, 0, 0, 0, 78, 111, 114, 119, 97, 121, 0, 0]
+ XCTAssertEqual(b.sizedByteArray, v)
+ }
+}
+
+class CountryDouble {
+
+ static let offsets: (name: VOffset, lan: VOffset, lng: VOffset) = (4, 6, 8)
+
+ private var table: Table
+
+ private init(table t: Table) { table = t }
+
+ static func getRootAsCountry(_ bb: ByteBuffer) -> CountryDouble {
+ let pos = bb.read(def: Int32.self, position: Int(bb.size))
+ return CountryDouble(table: Table(bb: bb, position: Int32(pos)))
+ }
+
+ static func createCountry(builder: inout FlatBufferBuilder, name: String, log: Double, lan: Double) -> Offset<Country> {
+ return createCountry(builder: &builder, offset: builder.create(string: name), log: log, lan: lan)
+ }
+
+ static func createCountry(builder: inout FlatBufferBuilder, offset: Offset<String>, log: Double, lan: Double) -> Offset<Country> {
+ let _start = builder.startTable(with: 3)
+ CountryDouble.add(builder: &builder, lng: log)
+ CountryDouble.add(builder: &builder, lan: lan)
+ CountryDouble.add(builder: &builder, name: offset)
+ return CountryDouble.end(builder: &builder, startOffset: _start)
+ }
+
+ static func end(builder: inout FlatBufferBuilder, startOffset: UOffset) -> Offset<Country> {
+ return Offset(offset: builder.endTable(at: startOffset))
+ }
+
+ static func add(builder: inout FlatBufferBuilder, name: String) {
+ add(builder: &builder, name: builder.create(string: name))
+ }
+
+ static func add(builder: inout FlatBufferBuilder, name: Offset<String>) {
+ builder.add(offset: name, at: Country.offsets.name)
+ }
+
+ static func add(builder: inout FlatBufferBuilder, lan: Double) {
+ builder.add(element: lan, def: 0, at: Country.offsets.lan)
+ }
+
+ static func add(builder: inout FlatBufferBuilder, lng: Double) {
+ builder.add(element: lng, def: 0, at: Country.offsets.lng)
+ }
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/MutatingBool_generated.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/MutatingBool_generated.swift
new file mode 100644
index 0000000..d51f3d9
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/MutatingBool_generated.swift
@@ -0,0 +1,47 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+import FlatBuffers
+
+public struct Property: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 1
+ public static var alignment = 1
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var property: Bool { return _accessor.readBuffer(of: Bool.self, at: 0) }
+ @discardableResult public func mutate(property: Bool) -> Bool { return _accessor.mutate(property, index: 0) }
+}
+
+public func createProperty(builder: inout FlatBufferBuilder, property: Bool = false) -> Offset<UOffset> {
+ builder.createStructOf(size: Property.size, alignment: Property.alignment)
+ builder.reverseAdd(v: property, postion: 0)
+ return builder.endStruct()
+}
+
+public struct TestMutatingBool: FlatBufferObject {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func getRootAsTestMutatingBool(bb: ByteBuffer) -> TestMutatingBool { return TestMutatingBool(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ enum VTOFFSET: VOffset {
+ case b = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var b: Property? { let o = _accessor.offset(VTOFFSET.b.v); return o == 0 ? nil : Property(_accessor.bb, o: o + _accessor.postion) }
+ public static func startTestMutatingBool(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ public static func add(b: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(structOffset: VTOFFSET.b.p) }
+ public static func endTestMutatingBool(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+}
+
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift
new file mode 100644
index 0000000..e1d52cd
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/XCTestManifests.swift
@@ -0,0 +1,93 @@
+#if !canImport(ObjectiveC)
+import XCTest
+
+extension FlatBuffersDoubleTests {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersDoubleTests = [
+ ("testCreateFinish", testCreateFinish),
+ ("testCreateFinishWithPrefix", testCreateFinishWithPrefix),
+ ]
+}
+
+extension FlatBuffersMonsterWriterTests {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersMonsterWriterTests = [
+ ("testCreateMonster", testCreateMonster),
+ ("testCreateMonsterPrefixed", testCreateMonsterPrefixed),
+ ("testCreateMonsterResizedBuffer", testCreateMonsterResizedBuffer),
+ ("testCreateMonsterUsingCreateMonsterMethodWithNilPos", testCreateMonsterUsingCreateMonsterMethodWithNilPos),
+ ("testCreateMonsterUsingCreateMonsterMethodWithPosX", testCreateMonsterUsingCreateMonsterMethodWithPosX),
+ ("testData", testData),
+ ("testReadFromOtherLanguages", testReadFromOtherLanguages),
+ ("testReadMonsterFromUnsafePointerWithoutCopying", testReadMonsterFromUnsafePointerWithoutCopying),
+ ]
+}
+
+extension FlatBuffersStructsTests {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersStructsTests = [
+ ("testWritingAndMutatingBools", testWritingAndMutatingBools),
+ ]
+}
+
+extension FlatBuffersTests {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersTests = [
+ ("testCreateFinish", testCreateFinish),
+ ("testCreateFinishWithPrefix", testCreateFinishWithPrefix),
+ ("testCreateString", testCreateString),
+ ("testEndian", testEndian),
+ ("testOffset", testOffset),
+ ("testReadCountry", testReadCountry),
+ ("testStartTable", testStartTable),
+ ("testWriteNullableStrings", testWriteNullableStrings),
+ ("testWriteOptionalValues", testWriteOptionalValues),
+ ]
+}
+
+extension FlatBuffersUnionTests {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersUnionTests = [
+ ("testCreateMonstor", testCreateMonstor),
+ ("testEndTableFinish", testEndTableFinish),
+ ("testEnumVector", testEnumVector),
+ ("testUnionVector", testUnionVector),
+ ]
+}
+
+extension FlatBuffersVectors {
+ // DO NOT MODIFY: This is autogenerated, use:
+ // `swift test --generate-linuxmain`
+ // to regenerate.
+ static let __allTests__FlatBuffersVectors = [
+ ("testCreateEmptyIntArray", testCreateEmptyIntArray),
+ ("testCreateIntArray", testCreateIntArray),
+ ("testCreateSharedStringVector", testCreateSharedStringVector),
+ ("testCreateVectorOfStrings", testCreateVectorOfStrings),
+ ("testCreatingTwoCountries", testCreatingTwoCountries),
+ ("testReadDoubleArray", testReadDoubleArray),
+ ("testReadInt32Array", testReadInt32Array),
+ ]
+}
+
+public func __allTests() -> [XCTestCaseEntry] {
+ return [
+ testCase(FlatBuffersDoubleTests.__allTests__FlatBuffersDoubleTests),
+ testCase(FlatBuffersMonsterWriterTests.__allTests__FlatBuffersMonsterWriterTests),
+ testCase(FlatBuffersStructsTests.__allTests__FlatBuffersStructsTests),
+ testCase(FlatBuffersTests.__allTests__FlatBuffersTests),
+ testCase(FlatBuffersUnionTests.__allTests__FlatBuffersUnionTests),
+ testCase(FlatBuffersVectors.__allTests__FlatBuffersVectors),
+ ]
+}
+#endif
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test.grpc.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test.grpc.swift
new file mode 100644
index 0000000..b2f3ff2
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test.grpc.swift
@@ -0,0 +1,95 @@
+// Generated GRPC code for FlatBuffers swift!
+/// The following code is generated by the Flatbuffers library which might not be in sync with grpc-swift
+/// in case of an issue please open github issue, though it would be maintained
+import Foundation
+import GRPC
+import NIO
+import NIOHTTP1
+import FlatBuffers
+
+public protocol GRPCFlatBufPayload: GRPCPayload, FlatBufferGRPCMessage {}
+public extension GRPCFlatBufPayload {
+ init(serializedByteBuffer: inout NIO.ByteBuffer) throws {
+ self.init(byteBuffer: FlatBuffers.ByteBuffer(contiguousBytes: serializedByteBuffer.readableBytesView, count: serializedByteBuffer.readableBytes))
+ }
+ func serialize(into buffer: inout NIO.ByteBuffer) throws {
+ let buf = UnsafeRawBufferPointer(start: self.rawPointer, count: Int(self.size))
+ buffer.writeBytes(buf)
+ }
+}
+extension Message: GRPCFlatBufPayload {}
+
+/// Usage: instantiate MyGame_Example_MonsterStorageServiceClient, then call methods of this protocol to make API calls.
+public protocol MyGame_Example_MonsterStorageService {
+ func Store(_ request: Message<MyGame_Example_Monster>, callOptions: CallOptions?) -> UnaryCall<Message<MyGame_Example_Monster>,Message<MyGame_Example_Stat>>
+ func Retrieve(_ request: Message<MyGame_Example_Stat>, callOptions: CallOptions?, handler: @escaping (Message<MyGame_Example_Monster>) -> Void) -> ServerStreamingCall<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>>
+ func GetMaxHitPoint(callOptions: CallOptions?) -> ClientStreamingCall<Message<MyGame_Example_Monster>,Message<MyGame_Example_Stat>>
+ func GetMinMaxHitPoints(callOptions: CallOptions?, handler: @escaping (Message<MyGame_Example_Stat>) -> Void) -> BidirectionalStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>>
+}
+
+public final class MyGame_Example_MonsterStorageServiceClient: GRPCClient, MyGame_Example_MonsterStorageService {
+ public let channel: GRPCChannel
+ public var defaultCallOptions: CallOptions
+
+ public init(channel: GRPCChannel, defaultCallOptions: CallOptions = CallOptions()) {
+ self.channel = channel
+ self.defaultCallOptions = defaultCallOptions
+ }
+
+ public func Store(_ request: Message<MyGame_Example_Monster>, callOptions: CallOptions? = nil) -> UnaryCall<Message<MyGame_Example_Monster>,Message<MyGame_Example_Stat>> {
+ return self.makeUnaryCall(path: "/MyGame.Example.MonsterStorage/Store", request: request, callOptions: callOptions ?? self.defaultCallOptions)
+ }
+
+ public func Retrieve(_ request: Message<MyGame_Example_Stat>, callOptions: CallOptions? = nil, handler: @escaping (Message<MyGame_Example_Monster>) -> Void) -> ServerStreamingCall<Message<MyGame_Example_Stat>, Message<MyGame_Example_Monster>> {
+ return self.makeServerStreamingCall(path: "/MyGame.Example.MonsterStorage/Retrieve", request: request, callOptions: callOptions ?? self.defaultCallOptions, handler: handler)
+ }
+
+ public func GetMaxHitPoint(callOptions: CallOptions? = nil) -> ClientStreamingCall<Message<MyGame_Example_Monster>,Message<MyGame_Example_Stat>> {
+ return self.makeClientStreamingCall(path: "/MyGame.Example.MonsterStorage/GetMaxHitPoint", callOptions: callOptions ?? self.defaultCallOptions)
+ }
+
+ public func GetMinMaxHitPoints(callOptions: CallOptions? = nil, handler: @escaping (Message<MyGame_Example_Stat>) -> Void) -> BidirectionalStreamingCall<Message<MyGame_Example_Monster>, Message<MyGame_Example_Stat>> {
+ return self.makeBidirectionalStreamingCall(path: "/MyGame.Example.MonsterStorage/GetMinMaxHitPoints", callOptions: callOptions ?? self.defaultCallOptions, handler: handler)
+ }
+}
+
+public protocol MyGame_Example_MonsterStorageProvider: CallHandlerProvider {
+ func Store(_ request: Message<MyGame_Example_Monster>, context: StatusOnlyCallContext) -> EventLoopFuture<Message<MyGame_Example_Stat>>
+ func Retrieve(request: Message<MyGame_Example_Stat>, context: StreamingResponseCallContext<Message<MyGame_Example_Monster>>) -> EventLoopFuture<GRPCStatus>
+ func GetMaxHitPoint(context: UnaryResponseCallContext<Message<MyGame_Example_Stat>>) -> EventLoopFuture<(StreamEvent<Message<MyGame_Example_Monster>>) -> Void>
+ func GetMinMaxHitPoints(context: StreamingResponseCallContext<Message<MyGame_Example_Stat>>) -> EventLoopFuture<(StreamEvent<Message<MyGame_Example_Monster>>) -> Void>
+}
+
+public extension MyGame_Example_MonsterStorageProvider {
+
+ var serviceName: Substring { return "MyGame.Example.MonsterStorage" }
+
+ func handleMethod(_ methodName: Substring, callHandlerContext: CallHandlerContext) -> GRPCCallHandler? {
+ switch methodName {
+ case "Store":
+ return CallHandlerFactory.makeUnary(callHandlerContext: callHandlerContext) { context in
+ return { request in
+ self.Store(request, context: context)
+ }
+ }
+ case "Retrieve":
+ return CallHandlerFactory.makeServerStreaming(callHandlerContext: callHandlerContext) { context in
+ return { request in
+ self.Retrieve(request: request, context: context)
+ }
+ }
+ case "GetMaxHitPoint":
+ return CallHandlerFactory.makeClientStreaming(callHandlerContext: callHandlerContext) { context in
+ self.GetMaxHitPoint(context: context)
+ }
+ case "GetMinMaxHitPoints":
+ return CallHandlerFactory.makeBidirectionalStreaming(callHandlerContext: callHandlerContext) { context in
+ self.GetMinMaxHitPoints(context: context)
+ }
+ default: return nil;
+ }
+ }
+
+}
+
+
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test_generated.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test_generated.swift
new file mode 100644
index 0000000..987f078
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/monster_test_generated.swift
@@ -0,0 +1,1484 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// swiftlint:disable all
+
+import FlatBuffers
+
+/// Composite components of Monster color.
+public enum MyGame_Example_Color: UInt8, Enum {
+ public typealias T = UInt8
+ public static var byteSize: Int { return MemoryLayout<UInt8>.size }
+ public var value: UInt8 { return self.rawValue }
+ case red = 1
+ /// \brief color Green
+ /// Green is bit_flag with value (1u << 1)
+ case green = 2
+ /// \brief color Blue (1u << 3)
+ case blue = 8
+
+
+ public static var max: MyGame_Example_Color { return .blue }
+ public static var min: MyGame_Example_Color { return .red }
+}
+
+public enum MyGame_Example_Race: Int8, Enum {
+ public typealias T = Int8
+ public static var byteSize: Int { return MemoryLayout<Int8>.size }
+ public var value: Int8 { return self.rawValue }
+ case none_ = -1
+ case human = 0
+ case dwarf = 1
+ case elf = 2
+
+
+ public static var max: MyGame_Example_Race { return .elf }
+ public static var min: MyGame_Example_Race { return .none_ }
+}
+
+public enum MyGame_Example_Any_: UInt8, Enum {
+ public typealias T = UInt8
+ public static var byteSize: Int { return MemoryLayout<UInt8>.size }
+ public var value: UInt8 { return self.rawValue }
+ case none_ = 0
+ case monster = 1
+ case testsimpletablewithenum = 2
+ case mygameExample2Monster = 3
+
+
+ public static var max: MyGame_Example_Any_ { return .mygameExample2Monster }
+ public static var min: MyGame_Example_Any_ { return .none_ }
+}
+
+public struct MyGame_Example_Any_Union {
+ public var type: MyGame_Example_Any_
+ public var value: NativeTable?
+ public init(_ v: NativeTable?, type: MyGame_Example_Any_) {
+ self.type = type
+ self.value = v
+ }
+ public func pack(builder: inout FlatBufferBuilder) -> Offset<UOffset> {
+ switch type {
+ case .monster:
+ var __obj = value as? MyGame_Example_MonsterT
+ return MyGame_Example_Monster.pack(&builder, obj: &__obj)
+ case .testsimpletablewithenum:
+ var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT
+ return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)
+ case .mygameExample2Monster:
+ var __obj = value as? MyGame_Example2_MonsterT
+ return MyGame_Example2_Monster.pack(&builder, obj: &__obj)
+ default: return Offset()
+ }
+ }
+}
+public enum MyGame_Example_AnyUniqueAliases: UInt8, Enum {
+ public typealias T = UInt8
+ public static var byteSize: Int { return MemoryLayout<UInt8>.size }
+ public var value: UInt8 { return self.rawValue }
+ case none_ = 0
+ case m = 1
+ case ts = 2
+ case m2 = 3
+
+
+ public static var max: MyGame_Example_AnyUniqueAliases { return .m2 }
+ public static var min: MyGame_Example_AnyUniqueAliases { return .none_ }
+}
+
+public struct MyGame_Example_AnyUniqueAliasesUnion {
+ public var type: MyGame_Example_AnyUniqueAliases
+ public var value: NativeTable?
+ public init(_ v: NativeTable?, type: MyGame_Example_AnyUniqueAliases) {
+ self.type = type
+ self.value = v
+ }
+ public func pack(builder: inout FlatBufferBuilder) -> Offset<UOffset> {
+ switch type {
+ case .m:
+ var __obj = value as? MyGame_Example_MonsterT
+ return MyGame_Example_Monster.pack(&builder, obj: &__obj)
+ case .ts:
+ var __obj = value as? MyGame_Example_TestSimpleTableWithEnumT
+ return MyGame_Example_TestSimpleTableWithEnum.pack(&builder, obj: &__obj)
+ case .m2:
+ var __obj = value as? MyGame_Example2_MonsterT
+ return MyGame_Example2_Monster.pack(&builder, obj: &__obj)
+ default: return Offset()
+ }
+ }
+}
+public enum MyGame_Example_AnyAmbiguousAliases: UInt8, Enum {
+ public typealias T = UInt8
+ public static var byteSize: Int { return MemoryLayout<UInt8>.size }
+ public var value: UInt8 { return self.rawValue }
+ case none_ = 0
+ case m1 = 1
+ case m2 = 2
+ case m3 = 3
+
+
+ public static var max: MyGame_Example_AnyAmbiguousAliases { return .m3 }
+ public static var min: MyGame_Example_AnyAmbiguousAliases { return .none_ }
+}
+
+public struct MyGame_Example_AnyAmbiguousAliasesUnion {
+ public var type: MyGame_Example_AnyAmbiguousAliases
+ public var value: NativeTable?
+ public init(_ v: NativeTable?, type: MyGame_Example_AnyAmbiguousAliases) {
+ self.type = type
+ self.value = v
+ }
+ public func pack(builder: inout FlatBufferBuilder) -> Offset<UOffset> {
+ switch type {
+ case .m1:
+ var __obj = value as? MyGame_Example_MonsterT
+ return MyGame_Example_Monster.pack(&builder, obj: &__obj)
+ case .m2:
+ var __obj = value as? MyGame_Example_MonsterT
+ return MyGame_Example_Monster.pack(&builder, obj: &__obj)
+ case .m3:
+ var __obj = value as? MyGame_Example_MonsterT
+ return MyGame_Example_Monster.pack(&builder, obj: &__obj)
+ default: return Offset()
+ }
+ }
+}
+public struct MyGame_Example_Test: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 4
+ public static var alignment = 2
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var a: Int16 { return _accessor.readBuffer(of: Int16.self, at: 0) }
+ @discardableResult public func mutate(a: Int16) -> Bool { return _accessor.mutate(a, index: 0) }
+ public var b: Int8 { return _accessor.readBuffer(of: Int8.self, at: 2) }
+ @discardableResult public func mutate(b: Int8) -> Bool { return _accessor.mutate(b, index: 2) }
+
+
+ public mutating func unpack() -> MyGame_Example_TestT {
+ return MyGame_Example_TestT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestT) -> Offset<UOffset> {
+ return createTest(builder: &builder, a: obj.a, b: obj.b)
+ }
+}
+
+public class MyGame_Example_TestT: NativeTable {
+
+ public var a: Int16
+ public var b: Int8
+
+ public init(_ _t: inout MyGame_Example_Test) {
+ a = _t.a
+ b = _t.b
+ }
+
+ public init() {
+ a = 0
+ b = 0
+ }
+
+}
+public struct MyGame_Example_Vec3: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 32
+ public static var alignment = 8
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var x: Float32 { return _accessor.readBuffer(of: Float32.self, at: 0) }
+ @discardableResult public func mutate(x: Float32) -> Bool { return _accessor.mutate(x, index: 0) }
+ public var y: Float32 { return _accessor.readBuffer(of: Float32.self, at: 4) }
+ @discardableResult public func mutate(y: Float32) -> Bool { return _accessor.mutate(y, index: 4) }
+ public var z: Float32 { return _accessor.readBuffer(of: Float32.self, at: 8) }
+ @discardableResult public func mutate(z: Float32) -> Bool { return _accessor.mutate(z, index: 8) }
+ public var test1: Double { return _accessor.readBuffer(of: Double.self, at: 16) }
+ @discardableResult public func mutate(test1: Double) -> Bool { return _accessor.mutate(test1, index: 16) }
+ public var test2: MyGame_Example_Color { return MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: 24)) ?? .red }
+ public var test3: MyGame_Example_Test { return MyGame_Example_Test(_accessor.bb, o: _accessor.postion + 26) }
+
+
+ public mutating func unpack() -> MyGame_Example_Vec3T {
+ return MyGame_Example_Vec3T(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3T?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_Vec3T) -> Offset<UOffset> {
+ return createVec3(builder: &builder, x: obj.x, y: obj.y, z: obj.z, test1: obj.test1, test2: obj.test2, test3a: obj.test3.a, test3b: obj.test3.b)
+ }
+}
+
+public class MyGame_Example_Vec3T: NativeTable {
+
+ public var x: Float32
+ public var y: Float32
+ public var z: Float32
+ public var test1: Double
+ public var test2: MyGame_Example_Color
+ public var test3: MyGame_Example_TestT
+
+ public init(_ _t: inout MyGame_Example_Vec3) {
+ x = _t.x
+ y = _t.y
+ z = _t.z
+ test1 = _t.test1
+ test2 = _t.test2
+ var __test3 = _t.test3
+ test3 = __test3.unpack()
+ }
+
+ public init() {
+ x = 0.0
+ y = 0.0
+ z = 0.0
+ test1 = 0.0
+ test2 = .red
+ test3 = MyGame_Example_TestT()
+ }
+
+}
+public struct MyGame_Example_Ability: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 8
+ public static var alignment = 4
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var id: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 0) }
+ @discardableResult public func mutate(id: UInt32) -> Bool { return _accessor.mutate(id, index: 0) }
+ public var distance: UInt32 { return _accessor.readBuffer(of: UInt32.self, at: 4) }
+ @discardableResult public func mutate(distance: UInt32) -> Bool { return _accessor.mutate(distance, index: 4) }
+
+
+ public mutating func unpack() -> MyGame_Example_AbilityT {
+ return MyGame_Example_AbilityT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_AbilityT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_AbilityT) -> Offset<UOffset> {
+ return createAbility(builder: &builder, id: obj.id, distance: obj.distance)
+ }
+}
+
+public class MyGame_Example_AbilityT: NativeTable {
+
+ public var id: UInt32
+ public var distance: UInt32
+
+ public init(_ _t: inout MyGame_Example_Ability) {
+ id = _t.id
+ distance = _t.distance
+ }
+
+ public init() {
+ id = 0
+ distance = 0
+ }
+
+}
+extension MyGame_Example_Test {
+ @discardableResult
+ public static func createTest(builder: inout FlatBufferBuilder, a: Int16 = 0, b: Int8 = 0) -> Offset<UOffset> {
+ builder.createStructOf(size: MyGame_Example_Test.size, alignment: MyGame_Example_Test.alignment)
+ builder.reverseAdd(v: a, postion: 0)
+ builder.reverseAdd(v: b, postion: 2)
+ return builder.endStruct()
+ }
+
+}
+
+extension MyGame_Example_Vec3 {
+ @discardableResult
+ public static func createVec3(builder: inout FlatBufferBuilder, x: Float32 = 0.0, y: Float32 = 0.0, z: Float32 = 0.0, test1: Double = 0.0, test2: MyGame_Example_Color, test3a: Int16 = 0, test3b: Int8 = 0) -> Offset<UOffset> {
+ builder.createStructOf(size: MyGame_Example_Vec3.size, alignment: MyGame_Example_Vec3.alignment)
+ builder.reverseAdd(v: x, postion: 0)
+ builder.reverseAdd(v: y, postion: 4)
+ builder.reverseAdd(v: z, postion: 8)
+ builder.reverseAdd(v: test1, postion: 16)
+ builder.reverseAdd(v: test2.rawValue, postion: 24)
+ builder.reverseAdd(v: test3a, postion: 26)
+ builder.reverseAdd(v: test3b, postion: 28)
+ return builder.endStruct()
+ }
+
+}
+
+extension MyGame_Example_Ability {
+ @discardableResult
+ public static func createAbility(builder: inout FlatBufferBuilder, id: UInt32 = 0, distance: UInt32 = 0) -> Offset<UOffset> {
+ builder.createStructOf(size: MyGame_Example_Ability.size, alignment: MyGame_Example_Ability.alignment)
+ builder.reverseAdd(v: id, postion: 0)
+ builder.reverseAdd(v: distance, postion: 4)
+ return builder.endStruct()
+ }
+
+}
+
+public struct MyGame_InParentNamespace: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsInParentNamespace(bb: ByteBuffer) -> MyGame_InParentNamespace { return MyGame_InParentNamespace(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ public static func startInParentNamespace(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }
+ public static func endInParentNamespace(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+
+
+ public mutating func unpack() -> MyGame_InParentNamespaceT {
+ return MyGame_InParentNamespaceT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_InParentNamespaceT) -> Offset<UOffset> {
+ let __root = MyGame_InParentNamespace.startInParentNamespace(&builder)
+ return MyGame_InParentNamespace.endInParentNamespace(&builder, start: __root)
+ }
+}
+
+public class MyGame_InParentNamespaceT: NativeTable {
+
+
+ public init(_ _t: inout MyGame_InParentNamespace) {
+ }
+
+ public init() {
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_InParentNamespace.self) }
+
+}
+public struct MyGame_Example2_Monster: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsMonster(bb: ByteBuffer) -> MyGame_Example2_Monster { return MyGame_Example2_Monster(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 0) }
+ public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+
+
+ public mutating func unpack() -> MyGame_Example2_MonsterT {
+ return MyGame_Example2_MonsterT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example2_MonsterT) -> Offset<UOffset> {
+ let __root = MyGame_Example2_Monster.startMonster(&builder)
+ return MyGame_Example2_Monster.endMonster(&builder, start: __root)
+ }
+}
+
+public class MyGame_Example2_MonsterT: NativeTable {
+
+
+ public init(_ _t: inout MyGame_Example2_Monster) {
+ }
+
+ public init() {
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example2_Monster.self) }
+
+}
+internal struct MyGame_Example_TestSimpleTableWithEnum: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ internal var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ internal static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ internal static func getRootAsTestSimpleTableWithEnum(bb: ByteBuffer) -> MyGame_Example_TestSimpleTableWithEnum { return MyGame_Example_TestSimpleTableWithEnum(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ internal init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case color = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ internal var color: MyGame_Example_Color { let o = _accessor.offset(VTOFFSET.color.v); return o == 0 ? .green : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .green }
+ @discardableResult internal func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VTOFFSET.color.v); return _accessor.mutate(color.rawValue, index: o) }
+ internal static func startTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ internal static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 2, at: VTOFFSET.color.p) }
+ internal static func endTestSimpleTableWithEnum(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ internal static func createTestSimpleTableWithEnum(
+ _ fbb: inout FlatBufferBuilder,
+ color: MyGame_Example_Color = .green
+ ) -> Offset<UOffset> {
+ let __start = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&fbb)
+ MyGame_Example_TestSimpleTableWithEnum.add(color: color, &fbb)
+ return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&fbb, start: __start)
+ }
+
+
+ internal mutating func unpack() -> MyGame_Example_TestSimpleTableWithEnumT {
+ return MyGame_Example_TestSimpleTableWithEnumT(&self)
+ }
+ internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ internal static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TestSimpleTableWithEnumT) -> Offset<UOffset> {
+ let __root = MyGame_Example_TestSimpleTableWithEnum.startTestSimpleTableWithEnum(&builder)
+ MyGame_Example_TestSimpleTableWithEnum.add(color: obj.color, &builder)
+ return MyGame_Example_TestSimpleTableWithEnum.endTestSimpleTableWithEnum(&builder, start: __root)
+ }
+}
+
+internal class MyGame_Example_TestSimpleTableWithEnumT: NativeTable {
+
+ internal var color: MyGame_Example_Color
+
+ internal init(_ _t: inout MyGame_Example_TestSimpleTableWithEnum) {
+ color = _t.color
+ }
+
+ internal init() {
+ color = .green
+ }
+
+ internal func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TestSimpleTableWithEnum.self) }
+
+}
+public struct MyGame_Example_Stat: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsStat(bb: ByteBuffer) -> MyGame_Example_Stat { return MyGame_Example_Stat(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case id = 4
+ case val = 6
+ case count = 8
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var id: String? { let o = _accessor.offset(VTOFFSET.id.v); return o == 0 ? nil : _accessor.string(at: o) }
+ public var idSegmentArray: [UInt8]? { return _accessor.getVector(at: VTOFFSET.id.v) }
+ public var val: Int64 { let o = _accessor.offset(VTOFFSET.val.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
+ @discardableResult public func mutate(val: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.val.v); return _accessor.mutate(val, index: o) }
+ public var count: UInt16 { let o = _accessor.offset(VTOFFSET.count.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }
+ @discardableResult public func mutate(count: UInt16) -> Bool {let o = _accessor.offset(VTOFFSET.count.v); return _accessor.mutate(count, index: o) }
+ public static func startStat(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 3) }
+ public static func add(id: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: id, at: VTOFFSET.id.p) }
+ public static func add(val: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: val, def: 0, at: VTOFFSET.val.p) }
+ public static func add(count: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: count, def: 0, at: VTOFFSET.count.p) }
+ public static func endStat(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createStat(
+ _ fbb: inout FlatBufferBuilder,
+ offsetOfId id: Offset<String> = Offset(),
+ val: Int64 = 0,
+ count: UInt16 = 0
+ ) -> Offset<UOffset> {
+ let __start = MyGame_Example_Stat.startStat(&fbb)
+ MyGame_Example_Stat.add(id: id, &fbb)
+ MyGame_Example_Stat.add(val: val, &fbb)
+ MyGame_Example_Stat.add(count: count, &fbb)
+ return MyGame_Example_Stat.endStat(&fbb, start: __start)
+ }
+
+
+ public mutating func unpack() -> MyGame_Example_StatT {
+ return MyGame_Example_StatT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_StatT) -> Offset<UOffset> {
+ let __id: Offset<String>
+ if let s = obj.id {
+ __id = builder.create(string: s)
+ } else {
+ __id = Offset<String>()
+ }
+
+ let __root = MyGame_Example_Stat.startStat(&builder)
+ MyGame_Example_Stat.add(id: __id, &builder)
+ MyGame_Example_Stat.add(val: obj.val, &builder)
+ MyGame_Example_Stat.add(count: obj.count, &builder)
+ return MyGame_Example_Stat.endStat(&builder, start: __root)
+ }
+}
+
+public class MyGame_Example_StatT: NativeTable {
+
+ public var id: String?
+ public var val: Int64
+ public var count: UInt16
+
+ public init(_ _t: inout MyGame_Example_Stat) {
+ id = _t.id
+ val = _t.val
+ count = _t.count
+ }
+
+ public init() {
+ val = 0
+ count = 0
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Stat.self) }
+
+}
+public struct MyGame_Example_Referrable: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsReferrable(bb: ByteBuffer) -> MyGame_Example_Referrable { return MyGame_Example_Referrable(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case id = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var id: UInt64 { let o = _accessor.offset(VTOFFSET.id.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(id: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.id.v); return _accessor.mutate(id, index: o) }
+ public static func startReferrable(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ public static func add(id: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: id, def: 0, at: VTOFFSET.id.p) }
+ public static func endReferrable(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createReferrable(
+ _ fbb: inout FlatBufferBuilder,
+ id: UInt64 = 0
+ ) -> Offset<UOffset> {
+ let __start = MyGame_Example_Referrable.startReferrable(&fbb)
+ MyGame_Example_Referrable.add(id: id, &fbb)
+ return MyGame_Example_Referrable.endReferrable(&fbb, start: __start)
+ }
+ public static func sortVectorOfReferrable(offsets:[Offset<UOffset>], _ fbb: inout FlatBufferBuilder) -> Offset<UOffset> {
+ var off = offsets
+ off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 4, fbb: fbb.buffer), Table.offset(Int32($0.o), vOffset: 4, fbb: fbb.buffer), fbb: fbb.buffer) < 0 }
+ return fbb.createVector(ofOffsets: off)
+ }
+ fileprivate static func lookupByKey(vector: Int32, key: UInt64, fbb: ByteBuffer) -> MyGame_Example_Referrable? {
+ var span = fbb.read(def: Int32.self, position: Int(vector - 4))
+ var start: Int32 = 0
+ while span != 0 {
+ var middle = span / 2
+ let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)
+ let comp = fbb.read(def: UInt64.self, position: Int(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 4, fbb: fbb)))
+ if comp > 0 {
+ span = middle
+ } else if comp < 0 {
+ middle += 1
+ start += middle
+ span -= middle
+ } else {
+ return MyGame_Example_Referrable(fbb, o: tableOffset)
+ }
+ }
+ return nil
+ }
+
+
+ public mutating func unpack() -> MyGame_Example_ReferrableT {
+ return MyGame_Example_ReferrableT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_ReferrableT) -> Offset<UOffset> {
+ let __root = MyGame_Example_Referrable.startReferrable(&builder)
+ MyGame_Example_Referrable.add(id: obj.id, &builder)
+ return MyGame_Example_Referrable.endReferrable(&builder, start: __root)
+ }
+}
+
+public class MyGame_Example_ReferrableT: NativeTable {
+
+ public var id: UInt64
+
+ public init(_ _t: inout MyGame_Example_Referrable) {
+ id = _t.id
+ }
+
+ public init() {
+ id = 0
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Referrable.self) }
+
+}
+/// an example documentation comment: "monster object"
+public struct MyGame_Example_Monster: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsMonster(bb: ByteBuffer) -> MyGame_Example_Monster { return MyGame_Example_Monster(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case pos = 4
+ case mana = 6
+ case hp = 8
+ case name = 10
+ case inventory = 14
+ case color = 16
+ case testType = 18
+ case test = 20
+ case test4 = 22
+ case testarrayofstring = 24
+ case testarrayoftables = 26
+ case enemy = 28
+ case testnestedflatbuffer = 30
+ case testempty = 32
+ case testbool = 34
+ case testhashs32Fnv1 = 36
+ case testhashu32Fnv1 = 38
+ case testhashs64Fnv1 = 40
+ case testhashu64Fnv1 = 42
+ case testhashs32Fnv1a = 44
+ case testhashu32Fnv1a = 46
+ case testhashs64Fnv1a = 48
+ case testhashu64Fnv1a = 50
+ case testarrayofbools = 52
+ case testf = 54
+ case testf2 = 56
+ case testf3 = 58
+ case testarrayofstring2 = 60
+ case testarrayofsortedstruct = 62
+ case flex = 64
+ case test5 = 66
+ case vectorOfLongs = 68
+ case vectorOfDoubles = 70
+ case parentNamespaceTest = 72
+ case vectorOfReferrables = 74
+ case singleWeakReference = 76
+ case vectorOfWeakReferences = 78
+ case vectorOfStrongReferrables = 80
+ case coOwningReference = 82
+ case vectorOfCoOwningReferences = 84
+ case nonOwningReference = 86
+ case vectorOfNonOwningReferences = 88
+ case anyUniqueType = 90
+ case anyUnique = 92
+ case anyAmbiguousType = 94
+ case anyAmbiguous = 96
+ case vectorOfEnums = 98
+ case signedEnum = 100
+ case testrequirednestedflatbuffer = 102
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var pos: MyGame_Example_Vec3? { let o = _accessor.offset(VTOFFSET.pos.v); return o == 0 ? nil : MyGame_Example_Vec3(_accessor.bb, o: o + _accessor.postion) }
+ public var mana: Int16 { let o = _accessor.offset(VTOFFSET.mana.v); return o == 0 ? 150 : _accessor.readBuffer(of: Int16.self, at: o) }
+ @discardableResult public func mutate(mana: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.mana.v); return _accessor.mutate(mana, index: o) }
+ public var hp: Int16 { let o = _accessor.offset(VTOFFSET.hp.v); return o == 0 ? 100 : _accessor.readBuffer(of: Int16.self, at: o) }
+ @discardableResult public func mutate(hp: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.hp.v); return _accessor.mutate(hp, index: o) }
+ public var name: String! { let o = _accessor.offset(VTOFFSET.name.v); return _accessor.string(at: o) }
+ public var nameSegmentArray: [UInt8]! { return _accessor.getVector(at: VTOFFSET.name.v) }
+ public var inventoryCount: Int32 { let o = _accessor.offset(VTOFFSET.inventory.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func inventory(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.inventory.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var inventory: [UInt8] { return _accessor.getVector(at: VTOFFSET.inventory.v) ?? [] }
+ public func mutate(inventory: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.inventory.v); return _accessor.directMutate(inventory, index: _accessor.vector(at: o) + index * 1) }
+ public var color: MyGame_Example_Color { let o = _accessor.offset(VTOFFSET.color.v); return o == 0 ? .blue : MyGame_Example_Color(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .blue }
+ @discardableResult public func mutate(color: MyGame_Example_Color) -> Bool {let o = _accessor.offset(VTOFFSET.color.v); return _accessor.mutate(color.rawValue, index: o) }
+ public var testType: MyGame_Example_Any_ { let o = _accessor.offset(VTOFFSET.testType.v); return o == 0 ? .none_ : MyGame_Example_Any_(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
+ public func test<T: FlatBufferObject>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.test.v); return o == 0 ? nil : _accessor.union(o) }
+ public var test4Count: Int32 { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func test4(at index: Int32) -> MyGame_Example_Test? { let o = _accessor.offset(VTOFFSET.test4.v); return o == 0 ? nil : MyGame_Example_Test(_accessor.bb, o: _accessor.vector(at: o) + index * 4) }
+ public var testarrayofstringCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofstring.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testarrayofstring(at index: Int32) -> String? { let o = _accessor.offset(VTOFFSET.testarrayofstring.v); return o == 0 ? nil : _accessor.directString(at: _accessor.vector(at: o) + index * 4) }
+ /// an example documentation comment: this will end up in the generated code
+ /// multiline too
+ public var testarrayoftablesCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testarrayoftables(at index: Int32) -> MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
+ public func testarrayoftablesBy(key: String) -> MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.testarrayoftables.v); return o == 0 ? nil : MyGame_Example_Monster.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
+ public var enemy: MyGame_Example_Monster? { let o = _accessor.offset(VTOFFSET.enemy.v); return o == 0 ? nil : MyGame_Example_Monster(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
+ public var testnestedflatbufferCount: Int32 { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testnestedflatbuffer(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var testnestedflatbuffer: [UInt8] { return _accessor.getVector(at: VTOFFSET.testnestedflatbuffer.v) ?? [] }
+ public func mutate(testnestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testnestedflatbuffer.v); return _accessor.directMutate(testnestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }
+ public var testempty: MyGame_Example_Stat? { let o = _accessor.offset(VTOFFSET.testempty.v); return o == 0 ? nil : MyGame_Example_Stat(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
+ public var testbool: Bool { let o = _accessor.offset(VTOFFSET.testbool.v); return o == 0 ? false : 0 != _accessor.readBuffer(of: Byte.self, at: o) }
+ @discardableResult public func mutate(testbool: Byte) -> Bool {let o = _accessor.offset(VTOFFSET.testbool.v); return _accessor.mutate(testbool, index: o) }
+ public var testhashs32Fnv1: Int32 { let o = _accessor.offset(VTOFFSET.testhashs32Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ @discardableResult public func mutate(testhashs32Fnv1: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs32Fnv1.v); return _accessor.mutate(testhashs32Fnv1, index: o) }
+ public var testhashu32Fnv1: UInt32 { let o = _accessor.offset(VTOFFSET.testhashu32Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
+ @discardableResult public func mutate(testhashu32Fnv1: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu32Fnv1.v); return _accessor.mutate(testhashu32Fnv1, index: o) }
+ public var testhashs64Fnv1: Int64 { let o = _accessor.offset(VTOFFSET.testhashs64Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
+ @discardableResult public func mutate(testhashs64Fnv1: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs64Fnv1.v); return _accessor.mutate(testhashs64Fnv1, index: o) }
+ public var testhashu64Fnv1: UInt64 { let o = _accessor.offset(VTOFFSET.testhashu64Fnv1.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(testhashu64Fnv1: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu64Fnv1.v); return _accessor.mutate(testhashu64Fnv1, index: o) }
+ public var testhashs32Fnv1a: Int32 { let o = _accessor.offset(VTOFFSET.testhashs32Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ @discardableResult public func mutate(testhashs32Fnv1a: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs32Fnv1a.v); return _accessor.mutate(testhashs32Fnv1a, index: o) }
+ public var testhashu32Fnv1a: UInt32 { let o = _accessor.offset(VTOFFSET.testhashu32Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
+ @discardableResult public func mutate(testhashu32Fnv1a: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu32Fnv1a.v); return _accessor.mutate(testhashu32Fnv1a, index: o) }
+ public var testhashs64Fnv1a: Int64 { let o = _accessor.offset(VTOFFSET.testhashs64Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
+ @discardableResult public func mutate(testhashs64Fnv1a: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashs64Fnv1a.v); return _accessor.mutate(testhashs64Fnv1a, index: o) }
+ public var testhashu64Fnv1a: UInt64 { let o = _accessor.offset(VTOFFSET.testhashu64Fnv1a.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(testhashu64Fnv1a: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.testhashu64Fnv1a.v); return _accessor.mutate(testhashu64Fnv1a, index: o) }
+ public var testarrayofboolsCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testarrayofbools(at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return o == 0 ? true : 0 != _accessor.directRead(of: Byte.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var testarrayofbools: [Byte] { return _accessor.getVector(at: VTOFFSET.testarrayofbools.v) ?? [] }
+ public func mutate(testarrayofbools: Byte, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testarrayofbools.v); return _accessor.directMutate(testarrayofbools, index: _accessor.vector(at: o) + index * 1) }
+ public var testf: Float32 { let o = _accessor.offset(VTOFFSET.testf.v); return o == 0 ? 3.14159 : _accessor.readBuffer(of: Float32.self, at: o) }
+ @discardableResult public func mutate(testf: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf.v); return _accessor.mutate(testf, index: o) }
+ public var testf2: Float32 { let o = _accessor.offset(VTOFFSET.testf2.v); return o == 0 ? 3.0 : _accessor.readBuffer(of: Float32.self, at: o) }
+ @discardableResult public func mutate(testf2: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf2.v); return _accessor.mutate(testf2, index: o) }
+ public var testf3: Float32 { let o = _accessor.offset(VTOFFSET.testf3.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }
+ @discardableResult public func mutate(testf3: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.testf3.v); return _accessor.mutate(testf3, index: o) }
+ public var testarrayofstring2Count: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofstring2.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testarrayofstring2(at index: Int32) -> String? { let o = _accessor.offset(VTOFFSET.testarrayofstring2.v); return o == 0 ? nil : _accessor.directString(at: _accessor.vector(at: o) + index * 4) }
+ public var testarrayofsortedstructCount: Int32 { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testarrayofsortedstruct(at index: Int32) -> MyGame_Example_Ability? { let o = _accessor.offset(VTOFFSET.testarrayofsortedstruct.v); return o == 0 ? nil : MyGame_Example_Ability(_accessor.bb, o: _accessor.vector(at: o) + index * 8) }
+ public var flexCount: Int32 { let o = _accessor.offset(VTOFFSET.flex.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func flex(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.flex.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var flex: [UInt8] { return _accessor.getVector(at: VTOFFSET.flex.v) ?? [] }
+ public func mutate(flex: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.flex.v); return _accessor.directMutate(flex, index: _accessor.vector(at: o) + index * 1) }
+ public var test5Count: Int32 { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func test5(at index: Int32) -> MyGame_Example_Test? { let o = _accessor.offset(VTOFFSET.test5.v); return o == 0 ? nil : MyGame_Example_Test(_accessor.bb, o: _accessor.vector(at: o) + index * 4) }
+ public var vectorOfLongsCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfLongs(at index: Int32) -> Int64 { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return o == 0 ? 0 : _accessor.directRead(of: Int64.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfLongs: [Int64] { return _accessor.getVector(at: VTOFFSET.vectorOfLongs.v) ?? [] }
+ public func mutate(vectorOfLongs: Int64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfLongs.v); return _accessor.directMutate(vectorOfLongs, index: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfDoublesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfDoubles(at index: Int32) -> Double { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return o == 0 ? 0 : _accessor.directRead(of: Double.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfDoubles: [Double] { return _accessor.getVector(at: VTOFFSET.vectorOfDoubles.v) ?? [] }
+ public func mutate(vectorOfDoubles: Double, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfDoubles.v); return _accessor.directMutate(vectorOfDoubles, index: _accessor.vector(at: o) + index * 8) }
+ public var parentNamespaceTest: MyGame_InParentNamespace? { let o = _accessor.offset(VTOFFSET.parentNamespaceTest.v); return o == 0 ? nil : MyGame_InParentNamespace(_accessor.bb, o: _accessor.indirect(o + _accessor.postion)) }
+ public var vectorOfReferrablesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfReferrables(at index: Int32) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
+ public func vectorOfReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
+ public var singleWeakReference: UInt64 { let o = _accessor.offset(VTOFFSET.singleWeakReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(singleWeakReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.singleWeakReference.v); return _accessor.mutate(singleWeakReference, index: o) }
+ public var vectorOfWeakReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfWeakReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfWeakReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfWeakReferences.v) ?? [] }
+ public func mutate(vectorOfWeakReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfWeakReferences.v); return _accessor.directMutate(vectorOfWeakReferences, index: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfStrongReferrablesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfStrongReferrables(at index: Int32) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable(_accessor.bb, o: _accessor.indirect(_accessor.vector(at: o) + index * 4)) }
+ public func vectorOfStrongReferrablesBy(key: UInt64) -> MyGame_Example_Referrable? { let o = _accessor.offset(VTOFFSET.vectorOfStrongReferrables.v); return o == 0 ? nil : MyGame_Example_Referrable.lookupByKey(vector: _accessor.vector(at: o), key: key, fbb: _accessor.bb) }
+ public var coOwningReference: UInt64 { let o = _accessor.offset(VTOFFSET.coOwningReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(coOwningReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.coOwningReference.v); return _accessor.mutate(coOwningReference, index: o) }
+ public var vectorOfCoOwningReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfCoOwningReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfCoOwningReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfCoOwningReferences.v) ?? [] }
+ public func mutate(vectorOfCoOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfCoOwningReferences.v); return _accessor.directMutate(vectorOfCoOwningReferences, index: _accessor.vector(at: o) + index * 8) }
+ public var nonOwningReference: UInt64 { let o = _accessor.offset(VTOFFSET.nonOwningReference.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(nonOwningReference: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.nonOwningReference.v); return _accessor.mutate(nonOwningReference, index: o) }
+ public var vectorOfNonOwningReferencesCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfNonOwningReferences(at index: Int32) -> UInt64 { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return o == 0 ? 0 : _accessor.directRead(of: UInt64.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vectorOfNonOwningReferences: [UInt64] { return _accessor.getVector(at: VTOFFSET.vectorOfNonOwningReferences.v) ?? [] }
+ public func mutate(vectorOfNonOwningReferences: UInt64, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vectorOfNonOwningReferences.v); return _accessor.directMutate(vectorOfNonOwningReferences, index: _accessor.vector(at: o) + index * 8) }
+ public var anyUniqueType: MyGame_Example_AnyUniqueAliases { let o = _accessor.offset(VTOFFSET.anyUniqueType.v); return o == 0 ? .none_ : MyGame_Example_AnyUniqueAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
+ public func anyUnique<T: FlatBufferObject>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.anyUnique.v); return o == 0 ? nil : _accessor.union(o) }
+ public var anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases { let o = _accessor.offset(VTOFFSET.anyAmbiguousType.v); return o == 0 ? .none_ : MyGame_Example_AnyAmbiguousAliases(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
+ public func anyAmbiguous<T: FlatBufferObject>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.anyAmbiguous.v); return o == 0 ? nil : _accessor.union(o) }
+ public var vectorOfEnumsCount: Int32 { let o = _accessor.offset(VTOFFSET.vectorOfEnums.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vectorOfEnums(at index: Int32) -> MyGame_Example_Color? { let o = _accessor.offset(VTOFFSET.vectorOfEnums.v); return o == 0 ? MyGame_Example_Color.red : MyGame_Example_Color(rawValue: _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1)) }
+ public var signedEnum: MyGame_Example_Race { let o = _accessor.offset(VTOFFSET.signedEnum.v); return o == 0 ? .none_ : MyGame_Example_Race(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }
+ @discardableResult public func mutate(signedEnum: MyGame_Example_Race) -> Bool {let o = _accessor.offset(VTOFFSET.signedEnum.v); return _accessor.mutate(signedEnum.rawValue, index: o) }
+ public var testrequirednestedflatbufferCount: Int32 { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func testrequirednestedflatbuffer(at index: Int32) -> UInt8 { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return o == 0 ? 0 : _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var testrequirednestedflatbuffer: [UInt8] { return _accessor.getVector(at: VTOFFSET.testrequirednestedflatbuffer.v) ?? [] }
+ public func mutate(testrequirednestedflatbuffer: UInt8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.testrequirednestedflatbuffer.v); return _accessor.directMutate(testrequirednestedflatbuffer, index: _accessor.vector(at: o) + index * 1) }
+ public static func startMonster(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 50) }
+ public static func add(pos: Offset<UOffset>?, _ fbb: inout FlatBufferBuilder) { guard pos != nil else { return }; fbb.add(structOffset: VTOFFSET.pos.p) }
+ public static func add(mana: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mana, def: 150, at: VTOFFSET.mana.p) }
+ public static func add(hp: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: hp, def: 100, at: VTOFFSET.hp.p) }
+ public static func add(name: Offset<String>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: name, at: VTOFFSET.name.p) }
+ public static func addVectorOf(inventory: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: inventory, at: VTOFFSET.inventory.p) }
+ public static func add(color: MyGame_Example_Color, _ fbb: inout FlatBufferBuilder) { fbb.add(element: color.rawValue, def: 8, at: VTOFFSET.color.p) }
+ public static func add(testType: MyGame_Example_Any_, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testType.rawValue, def: 0, at: VTOFFSET.testType.p) }
+ public static func add(test: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test, at: VTOFFSET.test.p) }
+ public static func addVectorOf(test4: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test4, at: VTOFFSET.test4.p) }
+ public static func startVectorOfTest4(_ size: Int, in builder: inout FlatBufferBuilder) {
+ builder.startVectorOfStructs(count: size, size: MyGame_Example_Test.size, alignment: MyGame_Example_Test.alignment)
+ }
+ public static func addVectorOf(testarrayofstring: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring, at: VTOFFSET.testarrayofstring.p) }
+ public static func addVectorOf(testarrayoftables: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayoftables, at: VTOFFSET.testarrayoftables.p) }
+ public static func add(enemy: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: enemy, at: VTOFFSET.enemy.p) }
+ public static func addVectorOf(testnestedflatbuffer: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testnestedflatbuffer, at: VTOFFSET.testnestedflatbuffer.p) }
+ public static func add(testempty: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testempty, at: VTOFFSET.testempty.p) }
+ public static func add(testbool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testbool, def: false,
+ at: VTOFFSET.testbool.p) }
+ public static func add(testhashs32Fnv1: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1, def: 0, at: VTOFFSET.testhashs32Fnv1.p) }
+ public static func add(testhashu32Fnv1: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1, def: 0, at: VTOFFSET.testhashu32Fnv1.p) }
+ public static func add(testhashs64Fnv1: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1, def: 0, at: VTOFFSET.testhashs64Fnv1.p) }
+ public static func add(testhashu64Fnv1: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1, def: 0, at: VTOFFSET.testhashu64Fnv1.p) }
+ public static func add(testhashs32Fnv1a: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs32Fnv1a, def: 0, at: VTOFFSET.testhashs32Fnv1a.p) }
+ public static func add(testhashu32Fnv1a: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu32Fnv1a, def: 0, at: VTOFFSET.testhashu32Fnv1a.p) }
+ public static func add(testhashs64Fnv1a: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashs64Fnv1a, def: 0, at: VTOFFSET.testhashs64Fnv1a.p) }
+ public static func add(testhashu64Fnv1a: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testhashu64Fnv1a, def: 0, at: VTOFFSET.testhashu64Fnv1a.p) }
+ public static func addVectorOf(testarrayofbools: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofbools, at: VTOFFSET.testarrayofbools.p) }
+ public static func add(testf: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf, def: 3.14159, at: VTOFFSET.testf.p) }
+ public static func add(testf2: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf2, def: 3.0, at: VTOFFSET.testf2.p) }
+ public static func add(testf3: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: testf3, def: 0.0, at: VTOFFSET.testf3.p) }
+ public static func addVectorOf(testarrayofstring2: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofstring2, at: VTOFFSET.testarrayofstring2.p) }
+ public static func addVectorOf(testarrayofsortedstruct: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testarrayofsortedstruct, at: VTOFFSET.testarrayofsortedstruct.p) }
+ public static func startVectorOfTestarrayofsortedstruct(_ size: Int, in builder: inout FlatBufferBuilder) {
+ builder.startVectorOfStructs(count: size, size: MyGame_Example_Ability.size, alignment: MyGame_Example_Ability.alignment)
+ }
+ public static func addVectorOf(flex: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: flex, at: VTOFFSET.flex.p) }
+ public static func addVectorOf(test5: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: test5, at: VTOFFSET.test5.p) }
+ public static func startVectorOfTest5(_ size: Int, in builder: inout FlatBufferBuilder) {
+ builder.startVectorOfStructs(count: size, size: MyGame_Example_Test.size, alignment: MyGame_Example_Test.alignment)
+ }
+ public static func addVectorOf(vectorOfLongs: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfLongs, at: VTOFFSET.vectorOfLongs.p) }
+ public static func addVectorOf(vectorOfDoubles: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfDoubles, at: VTOFFSET.vectorOfDoubles.p) }
+ public static func add(parentNamespaceTest: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: parentNamespaceTest, at: VTOFFSET.parentNamespaceTest.p) }
+ public static func addVectorOf(vectorOfReferrables: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfReferrables, at: VTOFFSET.vectorOfReferrables.p) }
+ public static func add(singleWeakReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: singleWeakReference, def: 0, at: VTOFFSET.singleWeakReference.p) }
+ public static func addVectorOf(vectorOfWeakReferences: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfWeakReferences, at: VTOFFSET.vectorOfWeakReferences.p) }
+ public static func addVectorOf(vectorOfStrongReferrables: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfStrongReferrables, at: VTOFFSET.vectorOfStrongReferrables.p) }
+ public static func add(coOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: coOwningReference, def: 0, at: VTOFFSET.coOwningReference.p) }
+ public static func addVectorOf(vectorOfCoOwningReferences: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfCoOwningReferences, at: VTOFFSET.vectorOfCoOwningReferences.p) }
+ public static func add(nonOwningReference: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: nonOwningReference, def: 0, at: VTOFFSET.nonOwningReference.p) }
+ public static func addVectorOf(vectorOfNonOwningReferences: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfNonOwningReferences, at: VTOFFSET.vectorOfNonOwningReferences.p) }
+ public static func add(anyUniqueType: MyGame_Example_AnyUniqueAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyUniqueType.rawValue, def: 0, at: VTOFFSET.anyUniqueType.p) }
+ public static func add(anyUnique: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyUnique, at: VTOFFSET.anyUnique.p) }
+ public static func add(anyAmbiguousType: MyGame_Example_AnyAmbiguousAliases, _ fbb: inout FlatBufferBuilder) { fbb.add(element: anyAmbiguousType.rawValue, def: 0, at: VTOFFSET.anyAmbiguousType.p) }
+ public static func add(anyAmbiguous: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: anyAmbiguous, at: VTOFFSET.anyAmbiguous.p) }
+ public static func addVectorOf(vectorOfEnums: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vectorOfEnums, at: VTOFFSET.vectorOfEnums.p) }
+ public static func add(signedEnum: MyGame_Example_Race, _ fbb: inout FlatBufferBuilder) { fbb.add(element: signedEnum.rawValue, def: -1, at: VTOFFSET.signedEnum.p) }
+ public static func addVectorOf(testrequirednestedflatbuffer: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: testrequirednestedflatbuffer, at: VTOFFSET.testrequirednestedflatbuffer.p) }
+ public static func endMonster(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); fbb.require(table: end, fields: [10]); return end }
+ public static func sortVectorOfMonster(offsets:[Offset<UOffset>], _ fbb: inout FlatBufferBuilder) -> Offset<UOffset> {
+ var off = offsets
+ off.sort { Table.compare(Table.offset(Int32($1.o), vOffset: 10, fbb: fbb.buffer), Table.offset(Int32($0.o), vOffset: 10, fbb: fbb.buffer), fbb: fbb.buffer) < 0 }
+ return fbb.createVector(ofOffsets: off)
+ }
+ fileprivate static func lookupByKey(vector: Int32, key: String, fbb: ByteBuffer) -> MyGame_Example_Monster? {
+ let key = key.utf8.map { $0 }
+ var span = fbb.read(def: Int32.self, position: Int(vector - 4))
+ var start: Int32 = 0
+ while span != 0 {
+ var middle = span / 2
+ let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)
+ let comp = Table.compare(Table.offset(Int32(fbb.capacity) - tableOffset, vOffset: 10, fbb: fbb), key, fbb: fbb)
+ if comp > 0 {
+ span = middle
+ } else if comp < 0 {
+ middle += 1
+ start += middle
+ span -= middle
+ } else {
+ return MyGame_Example_Monster(fbb, o: tableOffset)
+ }
+ }
+ return nil
+ }
+
+
+ public mutating func unpack() -> MyGame_Example_MonsterT {
+ return MyGame_Example_MonsterT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_MonsterT) -> Offset<UOffset> {
+ let __name = builder.create(string: obj.name)
+ let __inventory = builder.createVector(obj.inventory)
+ let __test = obj.test?.pack(builder: &builder) ?? Offset()
+ MyGame_Example_Monster.startVectorOfTest4(obj.test4.count, in: &builder)
+ for i in obj.test4 {
+ guard let _o = i else { continue }
+ MyGame_Example_Test.createTest(builder: &builder, a: _o.a, b: _o.b)
+ }
+ let __test4 = builder.endVectorOfStructs(count: obj.test4.count)
+ let __testarrayofstring = builder.createVector(ofStrings: obj.testarrayofstring.compactMap({ $0 }) )
+ var __testarrayoftables__: [Offset<UOffset>] = []
+ for var i in obj.testarrayoftables {
+ __testarrayoftables__.append(MyGame_Example_Monster.pack(&builder, obj: &i))
+ }
+ let __testarrayoftables = builder.createVector(ofOffsets: __testarrayoftables__)
+ let __enemy = MyGame_Example_Monster.pack(&builder, obj: &obj.enemy)
+ let __testnestedflatbuffer = builder.createVector(obj.testnestedflatbuffer)
+ let __testempty = MyGame_Example_Stat.pack(&builder, obj: &obj.testempty)
+ let __testarrayofbools = builder.createVector(obj.testarrayofbools)
+ let __testarrayofstring2 = builder.createVector(ofStrings: obj.testarrayofstring2.compactMap({ $0 }) )
+ MyGame_Example_Monster.startVectorOfTestarrayofsortedstruct(obj.testarrayofsortedstruct.count, in: &builder)
+ for i in obj.testarrayofsortedstruct {
+ guard let _o = i else { continue }
+ MyGame_Example_Ability.createAbility(builder: &builder, id: _o.id, distance: _o.distance)
+ }
+ let __testarrayofsortedstruct = builder.endVectorOfStructs(count: obj.testarrayofsortedstruct.count)
+ let __flex = builder.createVector(obj.flex)
+ MyGame_Example_Monster.startVectorOfTest5(obj.test5.count, in: &builder)
+ for i in obj.test5 {
+ guard let _o = i else { continue }
+ MyGame_Example_Test.createTest(builder: &builder, a: _o.a, b: _o.b)
+ }
+ let __test5 = builder.endVectorOfStructs(count: obj.test5.count)
+ let __vectorOfLongs = builder.createVector(obj.vectorOfLongs)
+ let __vectorOfDoubles = builder.createVector(obj.vectorOfDoubles)
+ let __parentNamespaceTest = MyGame_InParentNamespace.pack(&builder, obj: &obj.parentNamespaceTest)
+ var __vectorOfReferrables__: [Offset<UOffset>] = []
+ for var i in obj.vectorOfReferrables {
+ __vectorOfReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))
+ }
+ let __vectorOfReferrables = builder.createVector(ofOffsets: __vectorOfReferrables__)
+ let __vectorOfWeakReferences = builder.createVector(obj.vectorOfWeakReferences)
+ var __vectorOfStrongReferrables__: [Offset<UOffset>] = []
+ for var i in obj.vectorOfStrongReferrables {
+ __vectorOfStrongReferrables__.append(MyGame_Example_Referrable.pack(&builder, obj: &i))
+ }
+ let __vectorOfStrongReferrables = builder.createVector(ofOffsets: __vectorOfStrongReferrables__)
+ let __vectorOfCoOwningReferences = builder.createVector(obj.vectorOfCoOwningReferences)
+ let __vectorOfNonOwningReferences = builder.createVector(obj.vectorOfNonOwningReferences)
+ let __anyUnique = obj.anyUnique?.pack(builder: &builder) ?? Offset()
+ let __anyAmbiguous = obj.anyAmbiguous?.pack(builder: &builder) ?? Offset()
+ let __vectorOfEnums = builder.createVector(obj.vectorOfEnums)
+ let __testrequirednestedflatbuffer = builder.createVector(obj.testrequirednestedflatbuffer)
+ let __root = MyGame_Example_Monster.startMonster(&builder)
+ MyGame_Example_Monster.add(pos: obj.pos.map { MyGame_Example_Vec3.createVec3(builder: &builder, x: $0.x, y: $0.y, z: $0.z, test1: $0.test1, test2: $0.test2, test3a: $0.test3.a, test3b: $0.test3.b) }, &builder)
+ MyGame_Example_Monster.add(mana: obj.mana, &builder)
+ MyGame_Example_Monster.add(hp: obj.hp, &builder)
+ MyGame_Example_Monster.add(name: __name, &builder)
+ MyGame_Example_Monster.addVectorOf(inventory: __inventory, &builder)
+ MyGame_Example_Monster.add(color: obj.color, &builder)
+ if let o = obj.test?.type {
+ MyGame_Example_Monster.add(testType: o, &builder)
+ MyGame_Example_Monster.add(test: __test, &builder)
+ }
+
+ MyGame_Example_Monster.addVectorOf(test4: __test4, &builder)
+ MyGame_Example_Monster.addVectorOf(testarrayofstring: __testarrayofstring, &builder)
+ MyGame_Example_Monster.addVectorOf(testarrayoftables: __testarrayoftables, &builder)
+ MyGame_Example_Monster.add(enemy: __enemy, &builder)
+ MyGame_Example_Monster.addVectorOf(testnestedflatbuffer: __testnestedflatbuffer, &builder)
+ MyGame_Example_Monster.add(testempty: __testempty, &builder)
+ MyGame_Example_Monster.add(testbool: obj.testbool, &builder)
+ MyGame_Example_Monster.add(testhashs32Fnv1: obj.testhashs32Fnv1, &builder)
+ MyGame_Example_Monster.add(testhashu32Fnv1: obj.testhashu32Fnv1, &builder)
+ MyGame_Example_Monster.add(testhashs64Fnv1: obj.testhashs64Fnv1, &builder)
+ MyGame_Example_Monster.add(testhashu64Fnv1: obj.testhashu64Fnv1, &builder)
+ MyGame_Example_Monster.add(testhashs32Fnv1a: obj.testhashs32Fnv1a, &builder)
+ MyGame_Example_Monster.add(testhashu32Fnv1a: obj.testhashu32Fnv1a, &builder)
+ MyGame_Example_Monster.add(testhashs64Fnv1a: obj.testhashs64Fnv1a, &builder)
+ MyGame_Example_Monster.add(testhashu64Fnv1a: obj.testhashu64Fnv1a, &builder)
+ MyGame_Example_Monster.addVectorOf(testarrayofbools: __testarrayofbools, &builder)
+ MyGame_Example_Monster.add(testf: obj.testf, &builder)
+ MyGame_Example_Monster.add(testf2: obj.testf2, &builder)
+ MyGame_Example_Monster.add(testf3: obj.testf3, &builder)
+ MyGame_Example_Monster.addVectorOf(testarrayofstring2: __testarrayofstring2, &builder)
+ MyGame_Example_Monster.addVectorOf(testarrayofsortedstruct: __testarrayofsortedstruct, &builder)
+ MyGame_Example_Monster.addVectorOf(flex: __flex, &builder)
+ MyGame_Example_Monster.addVectorOf(test5: __test5, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfLongs: __vectorOfLongs, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfDoubles: __vectorOfDoubles, &builder)
+ MyGame_Example_Monster.add(parentNamespaceTest: __parentNamespaceTest, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfReferrables: __vectorOfReferrables, &builder)
+ MyGame_Example_Monster.add(singleWeakReference: obj.singleWeakReference, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfWeakReferences: __vectorOfWeakReferences, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfStrongReferrables: __vectorOfStrongReferrables, &builder)
+ MyGame_Example_Monster.add(coOwningReference: obj.coOwningReference, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfCoOwningReferences: __vectorOfCoOwningReferences, &builder)
+ MyGame_Example_Monster.add(nonOwningReference: obj.nonOwningReference, &builder)
+ MyGame_Example_Monster.addVectorOf(vectorOfNonOwningReferences: __vectorOfNonOwningReferences, &builder)
+ if let o = obj.anyUnique?.type {
+ MyGame_Example_Monster.add(anyUniqueType: o, &builder)
+ MyGame_Example_Monster.add(anyUnique: __anyUnique, &builder)
+ }
+
+ if let o = obj.anyAmbiguous?.type {
+ MyGame_Example_Monster.add(anyAmbiguousType: o, &builder)
+ MyGame_Example_Monster.add(anyAmbiguous: __anyAmbiguous, &builder)
+ }
+
+ MyGame_Example_Monster.addVectorOf(vectorOfEnums: __vectorOfEnums, &builder)
+ MyGame_Example_Monster.add(signedEnum: obj.signedEnum, &builder)
+ MyGame_Example_Monster.addVectorOf(testrequirednestedflatbuffer: __testrequirednestedflatbuffer, &builder)
+ return MyGame_Example_Monster.endMonster(&builder, start: __root)
+ }
+}
+
+public class MyGame_Example_MonsterT: NativeTable {
+
+ public var pos: MyGame_Example_Vec3T?
+ public var mana: Int16
+ public var hp: Int16
+ public var name: String
+ public var inventory: [UInt8]
+ public var color: MyGame_Example_Color
+ public var test: MyGame_Example_Any_Union?
+ public var test4: [MyGame_Example_TestT?]
+ public var testarrayofstring: [String?]
+ public var testarrayoftables: [MyGame_Example_MonsterT?]
+ public var enemy: MyGame_Example_MonsterT?
+ public var testnestedflatbuffer: [UInt8]
+ public var testempty: MyGame_Example_StatT?
+ public var testbool: Bool
+ public var testhashs32Fnv1: Int32
+ public var testhashu32Fnv1: UInt32
+ public var testhashs64Fnv1: Int64
+ public var testhashu64Fnv1: UInt64
+ public var testhashs32Fnv1a: Int32
+ public var testhashu32Fnv1a: UInt32
+ public var testhashs64Fnv1a: Int64
+ public var testhashu64Fnv1a: UInt64
+ public var testarrayofbools: [Bool]
+ public var testf: Float32
+ public var testf2: Float32
+ public var testf3: Float32
+ public var testarrayofstring2: [String?]
+ public var testarrayofsortedstruct: [MyGame_Example_AbilityT?]
+ public var flex: [UInt8]
+ public var test5: [MyGame_Example_TestT?]
+ public var vectorOfLongs: [Int64]
+ public var vectorOfDoubles: [Double]
+ public var parentNamespaceTest: MyGame_InParentNamespaceT?
+ public var vectorOfReferrables: [MyGame_Example_ReferrableT?]
+ public var singleWeakReference: UInt64
+ public var vectorOfWeakReferences: [UInt64]
+ public var vectorOfStrongReferrables: [MyGame_Example_ReferrableT?]
+ public var coOwningReference: UInt64
+ public var vectorOfCoOwningReferences: [UInt64]
+ public var nonOwningReference: UInt64
+ public var vectorOfNonOwningReferences: [UInt64]
+ public var anyUnique: MyGame_Example_AnyUniqueAliasesUnion?
+ public var anyAmbiguous: MyGame_Example_AnyAmbiguousAliasesUnion?
+ public var vectorOfEnums: [MyGame_Example_Color]
+ public var signedEnum: MyGame_Example_Race
+ public var testrequirednestedflatbuffer: [UInt8]
+
+ public init(_ _t: inout MyGame_Example_Monster) {
+ var __pos = _t.pos
+ pos = __pos?.unpack()
+ mana = _t.mana
+ hp = _t.hp
+ name = _t.name
+ inventory = []
+ for index in 0..<_t.inventoryCount {
+ inventory.append(_t.inventory(at: index))
+ }
+ color = _t.color
+ switch _t.testType {
+ case .monster:
+ var _v = _t.test(type: MyGame_Example_Monster.self)
+ test = MyGame_Example_Any_Union(_v?.unpack(), type: .monster)
+ case .testsimpletablewithenum:
+ var _v = _t.test(type: MyGame_Example_TestSimpleTableWithEnum.self)
+ test = MyGame_Example_Any_Union(_v?.unpack(), type: .testsimpletablewithenum)
+ case .mygameExample2Monster:
+ var _v = _t.test(type: MyGame_Example2_Monster.self)
+ test = MyGame_Example_Any_Union(_v?.unpack(), type: .mygameExample2Monster)
+ default: break
+ }
+ test4 = []
+ for index in 0..<_t.test4Count {
+ var __v_ = _t.test4(at: index)
+ test4.append(__v_?.unpack())
+ }
+ testarrayofstring = []
+ for index in 0..<_t.testarrayofstringCount {
+ testarrayofstring.append(_t.testarrayofstring(at: index))
+ }
+ testarrayoftables = []
+ for index in 0..<_t.testarrayoftablesCount {
+ var __v_ = _t.testarrayoftables(at: index)
+ testarrayoftables.append(__v_?.unpack())
+ }
+ var __enemy = _t.enemy
+ enemy = __enemy?.unpack()
+ testnestedflatbuffer = []
+ for index in 0..<_t.testnestedflatbufferCount {
+ testnestedflatbuffer.append(_t.testnestedflatbuffer(at: index))
+ }
+ var __testempty = _t.testempty
+ testempty = __testempty?.unpack()
+ testbool = _t.testbool
+ testhashs32Fnv1 = _t.testhashs32Fnv1
+ testhashu32Fnv1 = _t.testhashu32Fnv1
+ testhashs64Fnv1 = _t.testhashs64Fnv1
+ testhashu64Fnv1 = _t.testhashu64Fnv1
+ testhashs32Fnv1a = _t.testhashs32Fnv1a
+ testhashu32Fnv1a = _t.testhashu32Fnv1a
+ testhashs64Fnv1a = _t.testhashs64Fnv1a
+ testhashu64Fnv1a = _t.testhashu64Fnv1a
+ testarrayofbools = []
+ for index in 0..<_t.testarrayofboolsCount {
+ testarrayofbools.append(_t.testarrayofbools(at: index))
+ }
+ testf = _t.testf
+ testf2 = _t.testf2
+ testf3 = _t.testf3
+ testarrayofstring2 = []
+ for index in 0..<_t.testarrayofstring2Count {
+ testarrayofstring2.append(_t.testarrayofstring2(at: index))
+ }
+ testarrayofsortedstruct = []
+ for index in 0..<_t.testarrayofsortedstructCount {
+ var __v_ = _t.testarrayofsortedstruct(at: index)
+ testarrayofsortedstruct.append(__v_?.unpack())
+ }
+ flex = []
+ for index in 0..<_t.flexCount {
+ flex.append(_t.flex(at: index))
+ }
+ test5 = []
+ for index in 0..<_t.test5Count {
+ var __v_ = _t.test5(at: index)
+ test5.append(__v_?.unpack())
+ }
+ vectorOfLongs = []
+ for index in 0..<_t.vectorOfLongsCount {
+ vectorOfLongs.append(_t.vectorOfLongs(at: index))
+ }
+ vectorOfDoubles = []
+ for index in 0..<_t.vectorOfDoublesCount {
+ vectorOfDoubles.append(_t.vectorOfDoubles(at: index))
+ }
+ var __parentNamespaceTest = _t.parentNamespaceTest
+ parentNamespaceTest = __parentNamespaceTest?.unpack()
+ vectorOfReferrables = []
+ for index in 0..<_t.vectorOfReferrablesCount {
+ var __v_ = _t.vectorOfReferrables(at: index)
+ vectorOfReferrables.append(__v_?.unpack())
+ }
+ singleWeakReference = _t.singleWeakReference
+ vectorOfWeakReferences = []
+ for index in 0..<_t.vectorOfWeakReferencesCount {
+ vectorOfWeakReferences.append(_t.vectorOfWeakReferences(at: index))
+ }
+ vectorOfStrongReferrables = []
+ for index in 0..<_t.vectorOfStrongReferrablesCount {
+ var __v_ = _t.vectorOfStrongReferrables(at: index)
+ vectorOfStrongReferrables.append(__v_?.unpack())
+ }
+ coOwningReference = _t.coOwningReference
+ vectorOfCoOwningReferences = []
+ for index in 0..<_t.vectorOfCoOwningReferencesCount {
+ vectorOfCoOwningReferences.append(_t.vectorOfCoOwningReferences(at: index))
+ }
+ nonOwningReference = _t.nonOwningReference
+ vectorOfNonOwningReferences = []
+ for index in 0..<_t.vectorOfNonOwningReferencesCount {
+ vectorOfNonOwningReferences.append(_t.vectorOfNonOwningReferences(at: index))
+ }
+ switch _t.anyUniqueType {
+ case .m:
+ var _v = _t.anyUnique(type: MyGame_Example_Monster.self)
+ anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m)
+ case .ts:
+ var _v = _t.anyUnique(type: MyGame_Example_TestSimpleTableWithEnum.self)
+ anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .ts)
+ case .m2:
+ var _v = _t.anyUnique(type: MyGame_Example2_Monster.self)
+ anyUnique = MyGame_Example_AnyUniqueAliasesUnion(_v?.unpack(), type: .m2)
+ default: break
+ }
+ switch _t.anyAmbiguousType {
+ case .m1:
+ var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
+ anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m1)
+ case .m2:
+ var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
+ anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m2)
+ case .m3:
+ var _v = _t.anyAmbiguous(type: MyGame_Example_Monster.self)
+ anyAmbiguous = MyGame_Example_AnyAmbiguousAliasesUnion(_v?.unpack(), type: .m3)
+ default: break
+ }
+ vectorOfEnums = []
+ for index in 0..<_t.vectorOfEnumsCount {
+ vectorOfEnums.append(_t.vectorOfEnums(at: index)!)
+ }
+ signedEnum = _t.signedEnum
+ testrequirednestedflatbuffer = []
+ for index in 0..<_t.testrequirednestedflatbufferCount {
+ testrequirednestedflatbuffer.append(_t.testrequirednestedflatbuffer(at: index))
+ }
+ }
+
+ public init() {
+ pos = MyGame_Example_Vec3T()
+ mana = 150
+ hp = 100
+ name = ""
+ inventory = []
+ color = .blue
+ test4 = []
+ testarrayofstring = []
+ testarrayoftables = []
+ enemy = MyGame_Example_MonsterT()
+ testnestedflatbuffer = []
+ testempty = MyGame_Example_StatT()
+ testbool = false
+ testhashs32Fnv1 = 0
+ testhashu32Fnv1 = 0
+ testhashs64Fnv1 = 0
+ testhashu64Fnv1 = 0
+ testhashs32Fnv1a = 0
+ testhashu32Fnv1a = 0
+ testhashs64Fnv1a = 0
+ testhashu64Fnv1a = 0
+ testarrayofbools = []
+ testf = 3.14159
+ testf2 = 3.0
+ testf3 = 0.0
+ testarrayofstring2 = []
+ testarrayofsortedstruct = []
+ flex = []
+ test5 = []
+ vectorOfLongs = []
+ vectorOfDoubles = []
+ parentNamespaceTest = MyGame_InParentNamespaceT()
+ vectorOfReferrables = []
+ singleWeakReference = 0
+ vectorOfWeakReferences = []
+ vectorOfStrongReferrables = []
+ coOwningReference = 0
+ vectorOfCoOwningReferences = []
+ nonOwningReference = 0
+ vectorOfNonOwningReferences = []
+ vectorOfEnums = []
+ signedEnum = .none_
+ testrequirednestedflatbuffer = []
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_Monster.self) }
+
+}
+public struct MyGame_Example_TypeAliases: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MONS", addPrefix: prefix) }
+ public static func getRootAsTypeAliases(bb: ByteBuffer) -> MyGame_Example_TypeAliases { return MyGame_Example_TypeAliases(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case i8 = 4
+ case u8 = 6
+ case i16 = 8
+ case u16 = 10
+ case i32 = 12
+ case u32 = 14
+ case i64 = 16
+ case u64 = 18
+ case f32 = 20
+ case f64 = 22
+ case v8 = 24
+ case vf64 = 26
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var i8: Int8 { let o = _accessor.offset(VTOFFSET.i8.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }
+ @discardableResult public func mutate(i8: Int8) -> Bool {let o = _accessor.offset(VTOFFSET.i8.v); return _accessor.mutate(i8, index: o) }
+ public var u8: UInt8 { let o = _accessor.offset(VTOFFSET.u8.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }
+ @discardableResult public func mutate(u8: UInt8) -> Bool {let o = _accessor.offset(VTOFFSET.u8.v); return _accessor.mutate(u8, index: o) }
+ public var i16: Int16 { let o = _accessor.offset(VTOFFSET.i16.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }
+ @discardableResult public func mutate(i16: Int16) -> Bool {let o = _accessor.offset(VTOFFSET.i16.v); return _accessor.mutate(i16, index: o) }
+ public var u16: UInt16 { let o = _accessor.offset(VTOFFSET.u16.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }
+ @discardableResult public func mutate(u16: UInt16) -> Bool {let o = _accessor.offset(VTOFFSET.u16.v); return _accessor.mutate(u16, index: o) }
+ public var i32: Int32 { let o = _accessor.offset(VTOFFSET.i32.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ @discardableResult public func mutate(i32: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.i32.v); return _accessor.mutate(i32, index: o) }
+ public var u32: UInt32 { let o = _accessor.offset(VTOFFSET.u32.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
+ @discardableResult public func mutate(u32: UInt32) -> Bool {let o = _accessor.offset(VTOFFSET.u32.v); return _accessor.mutate(u32, index: o) }
+ public var i64: Int64 { let o = _accessor.offset(VTOFFSET.i64.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
+ @discardableResult public func mutate(i64: Int64) -> Bool {let o = _accessor.offset(VTOFFSET.i64.v); return _accessor.mutate(i64, index: o) }
+ public var u64: UInt64 { let o = _accessor.offset(VTOFFSET.u64.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ @discardableResult public func mutate(u64: UInt64) -> Bool {let o = _accessor.offset(VTOFFSET.u64.v); return _accessor.mutate(u64, index: o) }
+ public var f32: Float32 { let o = _accessor.offset(VTOFFSET.f32.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }
+ @discardableResult public func mutate(f32: Float32) -> Bool {let o = _accessor.offset(VTOFFSET.f32.v); return _accessor.mutate(f32, index: o) }
+ public var f64: Double { let o = _accessor.offset(VTOFFSET.f64.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }
+ @discardableResult public func mutate(f64: Double) -> Bool {let o = _accessor.offset(VTOFFSET.f64.v); return _accessor.mutate(f64, index: o) }
+ public var v8Count: Int32 { let o = _accessor.offset(VTOFFSET.v8.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func v8(at index: Int32) -> Int8 { let o = _accessor.offset(VTOFFSET.v8.v); return o == 0 ? 0 : _accessor.directRead(of: Int8.self, offset: _accessor.vector(at: o) + index * 1) }
+ public var v8: [Int8] { return _accessor.getVector(at: VTOFFSET.v8.v) ?? [] }
+ public func mutate(v8: Int8, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.v8.v); return _accessor.directMutate(v8, index: _accessor.vector(at: o) + index * 1) }
+ public var vf64Count: Int32 { let o = _accessor.offset(VTOFFSET.vf64.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func vf64(at index: Int32) -> Double { let o = _accessor.offset(VTOFFSET.vf64.v); return o == 0 ? 0 : _accessor.directRead(of: Double.self, offset: _accessor.vector(at: o) + index * 8) }
+ public var vf64: [Double] { return _accessor.getVector(at: VTOFFSET.vf64.v) ?? [] }
+ public func mutate(vf64: Double, at index: Int32) -> Bool { let o = _accessor.offset(VTOFFSET.vf64.v); return _accessor.directMutate(vf64, index: _accessor.vector(at: o) + index * 8) }
+ public static func startTypeAliases(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 12) }
+ public static func add(i8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i8, def: 0, at: VTOFFSET.i8.p) }
+ public static func add(u8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u8, def: 0, at: VTOFFSET.u8.p) }
+ public static func add(i16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i16, def: 0, at: VTOFFSET.i16.p) }
+ public static func add(u16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u16, def: 0, at: VTOFFSET.u16.p) }
+ public static func add(i32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i32, def: 0, at: VTOFFSET.i32.p) }
+ public static func add(u32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u32, def: 0, at: VTOFFSET.u32.p) }
+ public static func add(i64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: i64, def: 0, at: VTOFFSET.i64.p) }
+ public static func add(u64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: u64, def: 0, at: VTOFFSET.u64.p) }
+ public static func add(f32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f32, def: 0.0, at: VTOFFSET.f32.p) }
+ public static func add(f64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: f64, def: 0.0, at: VTOFFSET.f64.p) }
+ public static func addVectorOf(v8: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: v8, at: VTOFFSET.v8.p) }
+ public static func addVectorOf(vf64: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: vf64, at: VTOFFSET.vf64.p) }
+ public static func endTypeAliases(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createTypeAliases(
+ _ fbb: inout FlatBufferBuilder,
+ i8: Int8 = 0,
+ u8: UInt8 = 0,
+ i16: Int16 = 0,
+ u16: UInt16 = 0,
+ i32: Int32 = 0,
+ u32: UInt32 = 0,
+ i64: Int64 = 0,
+ u64: UInt64 = 0,
+ f32: Float32 = 0.0,
+ f64: Double = 0.0,
+ vectorOfV8 v8: Offset<UOffset> = Offset(),
+ vectorOfVf64 vf64: Offset<UOffset> = Offset()
+ ) -> Offset<UOffset> {
+ let __start = MyGame_Example_TypeAliases.startTypeAliases(&fbb)
+ MyGame_Example_TypeAliases.add(i8: i8, &fbb)
+ MyGame_Example_TypeAliases.add(u8: u8, &fbb)
+ MyGame_Example_TypeAliases.add(i16: i16, &fbb)
+ MyGame_Example_TypeAliases.add(u16: u16, &fbb)
+ MyGame_Example_TypeAliases.add(i32: i32, &fbb)
+ MyGame_Example_TypeAliases.add(u32: u32, &fbb)
+ MyGame_Example_TypeAliases.add(i64: i64, &fbb)
+ MyGame_Example_TypeAliases.add(u64: u64, &fbb)
+ MyGame_Example_TypeAliases.add(f32: f32, &fbb)
+ MyGame_Example_TypeAliases.add(f64: f64, &fbb)
+ MyGame_Example_TypeAliases.addVectorOf(v8: v8, &fbb)
+ MyGame_Example_TypeAliases.addVectorOf(vf64: vf64, &fbb)
+ return MyGame_Example_TypeAliases.endTypeAliases(&fbb, start: __start)
+ }
+
+
+ public mutating func unpack() -> MyGame_Example_TypeAliasesT {
+ return MyGame_Example_TypeAliasesT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MyGame_Example_TypeAliasesT) -> Offset<UOffset> {
+ let __v8 = builder.createVector(obj.v8)
+ let __vf64 = builder.createVector(obj.vf64)
+ let __root = MyGame_Example_TypeAliases.startTypeAliases(&builder)
+ MyGame_Example_TypeAliases.add(i8: obj.i8, &builder)
+ MyGame_Example_TypeAliases.add(u8: obj.u8, &builder)
+ MyGame_Example_TypeAliases.add(i16: obj.i16, &builder)
+ MyGame_Example_TypeAliases.add(u16: obj.u16, &builder)
+ MyGame_Example_TypeAliases.add(i32: obj.i32, &builder)
+ MyGame_Example_TypeAliases.add(u32: obj.u32, &builder)
+ MyGame_Example_TypeAliases.add(i64: obj.i64, &builder)
+ MyGame_Example_TypeAliases.add(u64: obj.u64, &builder)
+ MyGame_Example_TypeAliases.add(f32: obj.f32, &builder)
+ MyGame_Example_TypeAliases.add(f64: obj.f64, &builder)
+ MyGame_Example_TypeAliases.addVectorOf(v8: __v8, &builder)
+ MyGame_Example_TypeAliases.addVectorOf(vf64: __vf64, &builder)
+ return MyGame_Example_TypeAliases.endTypeAliases(&builder, start: __root)
+ }
+}
+
+public class MyGame_Example_TypeAliasesT: NativeTable {
+
+ public var i8: Int8
+ public var u8: UInt8
+ public var i16: Int16
+ public var u16: UInt16
+ public var i32: Int32
+ public var u32: UInt32
+ public var i64: Int64
+ public var u64: UInt64
+ public var f32: Float32
+ public var f64: Double
+ public var v8: [Int8]
+ public var vf64: [Double]
+
+ public init(_ _t: inout MyGame_Example_TypeAliases) {
+ i8 = _t.i8
+ u8 = _t.u8
+ i16 = _t.i16
+ u16 = _t.u16
+ i32 = _t.i32
+ u32 = _t.u32
+ i64 = _t.i64
+ u64 = _t.u64
+ f32 = _t.f32
+ f64 = _t.f64
+ v8 = []
+ for index in 0..<_t.v8Count {
+ v8.append(_t.v8(at: index))
+ }
+ vf64 = []
+ for index in 0..<_t.vf64Count {
+ vf64.append(_t.vf64(at: index))
+ }
+ }
+
+ public init() {
+ i8 = 0
+ u8 = 0
+ i16 = 0
+ u16 = 0
+ i32 = 0
+ u32 = 0
+ i64 = 0
+ u64 = 0
+ f32 = 0.0
+ f64 = 0.0
+ v8 = []
+ vf64 = []
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: MyGame_Example_TypeAliases.self) }
+
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/optional_scalars_generated.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/optional_scalars_generated.swift
new file mode 100644
index 0000000..6098397
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/optional_scalars_generated.swift
@@ -0,0 +1,227 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// swiftlint:disable all
+
+import FlatBuffers
+
+public enum optional_scalars_OptionalByte: Int8, Enum {
+ public typealias T = Int8
+ public static var byteSize: Int { return MemoryLayout<Int8>.size }
+ public var value: Int8 { return self.rawValue }
+ case none_ = 0
+ case one = 1
+ case two = 2
+
+
+ public static var max: optional_scalars_OptionalByte { return .two }
+ public static var min: optional_scalars_OptionalByte { return .none_ }
+}
+
+public struct optional_scalars_ScalarStuff: FlatBufferObject {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "NULL", addPrefix: prefix) }
+ public static func getRootAsScalarStuff(bb: ByteBuffer) -> optional_scalars_ScalarStuff { return optional_scalars_ScalarStuff(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case justI8 = 4
+ case maybeI8 = 6
+ case defaultI8 = 8
+ case justU8 = 10
+ case maybeU8 = 12
+ case defaultU8 = 14
+ case justI16 = 16
+ case maybeI16 = 18
+ case defaultI16 = 20
+ case justU16 = 22
+ case maybeU16 = 24
+ case defaultU16 = 26
+ case justI32 = 28
+ case maybeI32 = 30
+ case defaultI32 = 32
+ case justU32 = 34
+ case maybeU32 = 36
+ case defaultU32 = 38
+ case justI64 = 40
+ case maybeI64 = 42
+ case defaultI64 = 44
+ case justU64 = 46
+ case maybeU64 = 48
+ case defaultU64 = 50
+ case justF32 = 52
+ case maybeF32 = 54
+ case defaultF32 = 56
+ case justF64 = 58
+ case maybeF64 = 60
+ case defaultF64 = 62
+ case justBool = 64
+ case maybeBool = 66
+ case defaultBool = 68
+ case justEnum = 70
+ case maybeEnum = 72
+ case defaultEnum = 74
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var justI8: Int8 { let o = _accessor.offset(VTOFFSET.justI8.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int8.self, at: o) }
+ public var maybeI8: Int8? { let o = _accessor.offset(VTOFFSET.maybeI8.v); return o == 0 ? nil : _accessor.readBuffer(of: Int8.self, at: o) }
+ public var defaultI8: Int8 { let o = _accessor.offset(VTOFFSET.defaultI8.v); return o == 0 ? 42 : _accessor.readBuffer(of: Int8.self, at: o) }
+ public var justU8: UInt8 { let o = _accessor.offset(VTOFFSET.justU8.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt8.self, at: o) }
+ public var maybeU8: UInt8? { let o = _accessor.offset(VTOFFSET.maybeU8.v); return o == 0 ? nil : _accessor.readBuffer(of: UInt8.self, at: o) }
+ public var defaultU8: UInt8 { let o = _accessor.offset(VTOFFSET.defaultU8.v); return o == 0 ? 42 : _accessor.readBuffer(of: UInt8.self, at: o) }
+ public var justI16: Int16 { let o = _accessor.offset(VTOFFSET.justI16.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int16.self, at: o) }
+ public var maybeI16: Int16? { let o = _accessor.offset(VTOFFSET.maybeI16.v); return o == 0 ? nil : _accessor.readBuffer(of: Int16.self, at: o) }
+ public var defaultI16: Int16 { let o = _accessor.offset(VTOFFSET.defaultI16.v); return o == 0 ? 42 : _accessor.readBuffer(of: Int16.self, at: o) }
+ public var justU16: UInt16 { let o = _accessor.offset(VTOFFSET.justU16.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt16.self, at: o) }
+ public var maybeU16: UInt16? { let o = _accessor.offset(VTOFFSET.maybeU16.v); return o == 0 ? nil : _accessor.readBuffer(of: UInt16.self, at: o) }
+ public var defaultU16: UInt16 { let o = _accessor.offset(VTOFFSET.defaultU16.v); return o == 0 ? 42 : _accessor.readBuffer(of: UInt16.self, at: o) }
+ public var justI32: Int32 { let o = _accessor.offset(VTOFFSET.justI32.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ public var maybeI32: Int32? { let o = _accessor.offset(VTOFFSET.maybeI32.v); return o == 0 ? nil : _accessor.readBuffer(of: Int32.self, at: o) }
+ public var defaultI32: Int32 { let o = _accessor.offset(VTOFFSET.defaultI32.v); return o == 0 ? 42 : _accessor.readBuffer(of: Int32.self, at: o) }
+ public var justU32: UInt32 { let o = _accessor.offset(VTOFFSET.justU32.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt32.self, at: o) }
+ public var maybeU32: UInt32? { let o = _accessor.offset(VTOFFSET.maybeU32.v); return o == 0 ? nil : _accessor.readBuffer(of: UInt32.self, at: o) }
+ public var defaultU32: UInt32 { let o = _accessor.offset(VTOFFSET.defaultU32.v); return o == 0 ? 42 : _accessor.readBuffer(of: UInt32.self, at: o) }
+ public var justI64: Int64 { let o = _accessor.offset(VTOFFSET.justI64.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int64.self, at: o) }
+ public var maybeI64: Int64? { let o = _accessor.offset(VTOFFSET.maybeI64.v); return o == 0 ? nil : _accessor.readBuffer(of: Int64.self, at: o) }
+ public var defaultI64: Int64 { let o = _accessor.offset(VTOFFSET.defaultI64.v); return o == 0 ? 42 : _accessor.readBuffer(of: Int64.self, at: o) }
+ public var justU64: UInt64 { let o = _accessor.offset(VTOFFSET.justU64.v); return o == 0 ? 0 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ public var maybeU64: UInt64? { let o = _accessor.offset(VTOFFSET.maybeU64.v); return o == 0 ? nil : _accessor.readBuffer(of: UInt64.self, at: o) }
+ public var defaultU64: UInt64 { let o = _accessor.offset(VTOFFSET.defaultU64.v); return o == 0 ? 42 : _accessor.readBuffer(of: UInt64.self, at: o) }
+ public var justF32: Float32 { let o = _accessor.offset(VTOFFSET.justF32.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Float32.self, at: o) }
+ public var maybeF32: Float32? { let o = _accessor.offset(VTOFFSET.maybeF32.v); return o == 0 ? nil : _accessor.readBuffer(of: Float32.self, at: o) }
+ public var defaultF32: Float32 { let o = _accessor.offset(VTOFFSET.defaultF32.v); return o == 0 ? 42.0 : _accessor.readBuffer(of: Float32.self, at: o) }
+ public var justF64: Double { let o = _accessor.offset(VTOFFSET.justF64.v); return o == 0 ? 0.0 : _accessor.readBuffer(of: Double.self, at: o) }
+ public var maybeF64: Double? { let o = _accessor.offset(VTOFFSET.maybeF64.v); return o == 0 ? nil : _accessor.readBuffer(of: Double.self, at: o) }
+ public var defaultF64: Double { let o = _accessor.offset(VTOFFSET.defaultF64.v); return o == 0 ? 42.0 : _accessor.readBuffer(of: Double.self, at: o) }
+ public var justBool: Bool { let o = _accessor.offset(VTOFFSET.justBool.v); return o == 0 ? false : 0 != _accessor.readBuffer(of: Byte.self, at: o) }
+ public var maybeBool: Bool? { let o = _accessor.offset(VTOFFSET.maybeBool.v); return o == 0 ? true : 0 != _accessor.readBuffer(of: Byte.self, at: o) }
+ public var defaultBool: Bool { let o = _accessor.offset(VTOFFSET.defaultBool.v); return o == 0 ? true : 0 != _accessor.readBuffer(of: Byte.self, at: o) }
+ public var justEnum: optional_scalars_OptionalByte { let o = _accessor.offset(VTOFFSET.justEnum.v); return o == 0 ? .none_ : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .none_ }
+ public var maybeEnum: optional_scalars_OptionalByte? { let o = _accessor.offset(VTOFFSET.maybeEnum.v); return o == 0 ? nil : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? nil }
+ public var defaultEnum: optional_scalars_OptionalByte { let o = _accessor.offset(VTOFFSET.defaultEnum.v); return o == 0 ? .one : optional_scalars_OptionalByte(rawValue: _accessor.readBuffer(of: Int8.self, at: o)) ?? .one }
+ public static func startScalarStuff(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 36) }
+ public static func add(justI8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI8, def: 0, at: VTOFFSET.justI8.p) }
+ public static func add(maybeI8: Int8?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI8, at: VTOFFSET.maybeI8.p) }
+ public static func add(defaultI8: Int8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI8, def: 42, at: VTOFFSET.defaultI8.p) }
+ public static func add(justU8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU8, def: 0, at: VTOFFSET.justU8.p) }
+ public static func add(maybeU8: UInt8?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU8, at: VTOFFSET.maybeU8.p) }
+ public static func add(defaultU8: UInt8, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU8, def: 42, at: VTOFFSET.defaultU8.p) }
+ public static func add(justI16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI16, def: 0, at: VTOFFSET.justI16.p) }
+ public static func add(maybeI16: Int16?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI16, at: VTOFFSET.maybeI16.p) }
+ public static func add(defaultI16: Int16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI16, def: 42, at: VTOFFSET.defaultI16.p) }
+ public static func add(justU16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU16, def: 0, at: VTOFFSET.justU16.p) }
+ public static func add(maybeU16: UInt16?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU16, at: VTOFFSET.maybeU16.p) }
+ public static func add(defaultU16: UInt16, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU16, def: 42, at: VTOFFSET.defaultU16.p) }
+ public static func add(justI32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI32, def: 0, at: VTOFFSET.justI32.p) }
+ public static func add(maybeI32: Int32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI32, at: VTOFFSET.maybeI32.p) }
+ public static func add(defaultI32: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI32, def: 42, at: VTOFFSET.defaultI32.p) }
+ public static func add(justU32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU32, def: 0, at: VTOFFSET.justU32.p) }
+ public static func add(maybeU32: UInt32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU32, at: VTOFFSET.maybeU32.p) }
+ public static func add(defaultU32: UInt32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU32, def: 42, at: VTOFFSET.defaultU32.p) }
+ public static func add(justI64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justI64, def: 0, at: VTOFFSET.justI64.p) }
+ public static func add(maybeI64: Int64?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeI64, at: VTOFFSET.maybeI64.p) }
+ public static func add(defaultI64: Int64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultI64, def: 42, at: VTOFFSET.defaultI64.p) }
+ public static func add(justU64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justU64, def: 0, at: VTOFFSET.justU64.p) }
+ public static func add(maybeU64: UInt64?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeU64, at: VTOFFSET.maybeU64.p) }
+ public static func add(defaultU64: UInt64, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultU64, def: 42, at: VTOFFSET.defaultU64.p) }
+ public static func add(justF32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justF32, def: 0.0, at: VTOFFSET.justF32.p) }
+ public static func add(maybeF32: Float32?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeF32, at: VTOFFSET.maybeF32.p) }
+ public static func add(defaultF32: Float32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultF32, def: 42.0, at: VTOFFSET.defaultF32.p) }
+ public static func add(justF64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justF64, def: 0.0, at: VTOFFSET.justF64.p) }
+ public static func add(maybeF64: Double?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeF64, at: VTOFFSET.maybeF64.p) }
+ public static func add(defaultF64: Double, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultF64, def: 42.0, at: VTOFFSET.defaultF64.p) }
+ public static func add(justBool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justBool, def: false,
+ at: VTOFFSET.justBool.p) }
+ public static func add(maybeBool: Bool?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeBool, at: VTOFFSET.maybeBool.p) }
+ public static func add(defaultBool: Bool, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultBool, def: true,
+ at: VTOFFSET.defaultBool.p) }
+ public static func add(justEnum: optional_scalars_OptionalByte, _ fbb: inout FlatBufferBuilder) { fbb.add(element: justEnum.rawValue, def: 0, at: VTOFFSET.justEnum.p) }
+ public static func add(maybeEnum: optional_scalars_OptionalByte?, _ fbb: inout FlatBufferBuilder) { fbb.add(element: maybeEnum?.rawValue, at: VTOFFSET.maybeEnum.p) }
+ public static func add(defaultEnum: optional_scalars_OptionalByte, _ fbb: inout FlatBufferBuilder) { fbb.add(element: defaultEnum.rawValue, def: 1, at: VTOFFSET.defaultEnum.p) }
+ public static func endScalarStuff(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createScalarStuff(
+ _ fbb: inout FlatBufferBuilder,
+ justI8: Int8 = 0,
+ maybeI8: Int8? = nil,
+ defaultI8: Int8 = 42,
+ justU8: UInt8 = 0,
+ maybeU8: UInt8? = nil,
+ defaultU8: UInt8 = 42,
+ justI16: Int16 = 0,
+ maybeI16: Int16? = nil,
+ defaultI16: Int16 = 42,
+ justU16: UInt16 = 0,
+ maybeU16: UInt16? = nil,
+ defaultU16: UInt16 = 42,
+ justI32: Int32 = 0,
+ maybeI32: Int32? = nil,
+ defaultI32: Int32 = 42,
+ justU32: UInt32 = 0,
+ maybeU32: UInt32? = nil,
+ defaultU32: UInt32 = 42,
+ justI64: Int64 = 0,
+ maybeI64: Int64? = nil,
+ defaultI64: Int64 = 42,
+ justU64: UInt64 = 0,
+ maybeU64: UInt64? = nil,
+ defaultU64: UInt64 = 42,
+ justF32: Float32 = 0.0,
+ maybeF32: Float32? = nil,
+ defaultF32: Float32 = 42.0,
+ justF64: Double = 0.0,
+ maybeF64: Double? = nil,
+ defaultF64: Double = 42.0,
+ justBool: Bool = false,
+ maybeBool: Bool? = nil,
+ defaultBool: Bool = true,
+ justEnum: optional_scalars_OptionalByte = .none_,
+ maybeEnum: optional_scalars_OptionalByte? = nil,
+ defaultEnum: optional_scalars_OptionalByte = .one
+ ) -> Offset<UOffset> {
+ let __start = optional_scalars_ScalarStuff.startScalarStuff(&fbb)
+ optional_scalars_ScalarStuff.add(justI8: justI8, &fbb)
+ optional_scalars_ScalarStuff.add(maybeI8: maybeI8, &fbb)
+ optional_scalars_ScalarStuff.add(defaultI8: defaultI8, &fbb)
+ optional_scalars_ScalarStuff.add(justU8: justU8, &fbb)
+ optional_scalars_ScalarStuff.add(maybeU8: maybeU8, &fbb)
+ optional_scalars_ScalarStuff.add(defaultU8: defaultU8, &fbb)
+ optional_scalars_ScalarStuff.add(justI16: justI16, &fbb)
+ optional_scalars_ScalarStuff.add(maybeI16: maybeI16, &fbb)
+ optional_scalars_ScalarStuff.add(defaultI16: defaultI16, &fbb)
+ optional_scalars_ScalarStuff.add(justU16: justU16, &fbb)
+ optional_scalars_ScalarStuff.add(maybeU16: maybeU16, &fbb)
+ optional_scalars_ScalarStuff.add(defaultU16: defaultU16, &fbb)
+ optional_scalars_ScalarStuff.add(justI32: justI32, &fbb)
+ optional_scalars_ScalarStuff.add(maybeI32: maybeI32, &fbb)
+ optional_scalars_ScalarStuff.add(defaultI32: defaultI32, &fbb)
+ optional_scalars_ScalarStuff.add(justU32: justU32, &fbb)
+ optional_scalars_ScalarStuff.add(maybeU32: maybeU32, &fbb)
+ optional_scalars_ScalarStuff.add(defaultU32: defaultU32, &fbb)
+ optional_scalars_ScalarStuff.add(justI64: justI64, &fbb)
+ optional_scalars_ScalarStuff.add(maybeI64: maybeI64, &fbb)
+ optional_scalars_ScalarStuff.add(defaultI64: defaultI64, &fbb)
+ optional_scalars_ScalarStuff.add(justU64: justU64, &fbb)
+ optional_scalars_ScalarStuff.add(maybeU64: maybeU64, &fbb)
+ optional_scalars_ScalarStuff.add(defaultU64: defaultU64, &fbb)
+ optional_scalars_ScalarStuff.add(justF32: justF32, &fbb)
+ optional_scalars_ScalarStuff.add(maybeF32: maybeF32, &fbb)
+ optional_scalars_ScalarStuff.add(defaultF32: defaultF32, &fbb)
+ optional_scalars_ScalarStuff.add(justF64: justF64, &fbb)
+ optional_scalars_ScalarStuff.add(maybeF64: maybeF64, &fbb)
+ optional_scalars_ScalarStuff.add(defaultF64: defaultF64, &fbb)
+ optional_scalars_ScalarStuff.add(justBool: justBool, &fbb)
+ optional_scalars_ScalarStuff.add(maybeBool: maybeBool, &fbb)
+ optional_scalars_ScalarStuff.add(defaultBool: defaultBool, &fbb)
+ optional_scalars_ScalarStuff.add(justEnum: justEnum, &fbb)
+ optional_scalars_ScalarStuff.add(maybeEnum: maybeEnum, &fbb)
+ optional_scalars_ScalarStuff.add(defaultEnum: defaultEnum, &fbb)
+ return optional_scalars_ScalarStuff.endScalarStuff(&fbb, start: __start)
+ }
+}
+
diff --git a/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/union_vector_generated.swift b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/union_vector_generated.swift
new file mode 100644
index 0000000..10f2448
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests/union_vector_generated.swift
@@ -0,0 +1,336 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// swiftlint:disable all
+
+import FlatBuffers
+
+public enum Character: UInt8, Enum {
+ public typealias T = UInt8
+ public static var byteSize: Int { return MemoryLayout<UInt8>.size }
+ public var value: UInt8 { return self.rawValue }
+ case none_ = 0
+ case mulan = 1
+ case rapunzel = 2
+ case belle = 3
+ case bookfan = 4
+ case other = 5
+ case unused = 6
+
+
+ public static var max: Character { return .unused }
+ public static var min: Character { return .none_ }
+}
+
+public struct CharacterUnion {
+ public var type: Character
+ public var value: NativeTable?
+ public init(_ v: NativeTable?, type: Character) {
+ self.type = type
+ self.value = v
+ }
+ public func pack(builder: inout FlatBufferBuilder) -> Offset<UOffset> {
+ switch type {
+ case .mulan:
+ var __obj = value as? AttackerT
+ return Attacker.pack(&builder, obj: &__obj)
+ case .rapunzel:
+ var __obj = value as? RapunzelT
+ return Rapunzel.pack(&builder, obj: &__obj)
+ case .belle:
+ var __obj = value as? BookReaderT
+ return BookReader.pack(&builder, obj: &__obj)
+ case .bookfan:
+ var __obj = value as? BookReaderT
+ return BookReader.pack(&builder, obj: &__obj)
+ default: return Offset()
+ }
+ }
+}
+public struct Rapunzel: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 4
+ public static var alignment = 4
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var hairLength: Int32 { return _accessor.readBuffer(of: Int32.self, at: 0) }
+ @discardableResult public func mutate(hairLength: Int32) -> Bool { return _accessor.mutate(hairLength, index: 0) }
+
+
+ public mutating func unpack() -> RapunzelT {
+ return RapunzelT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout RapunzelT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout RapunzelT) -> Offset<UOffset> {
+ return createRapunzel(builder: &builder, hairLength: obj.hairLength)
+ }
+}
+
+public class RapunzelT: NativeTable {
+
+ public var hairLength: Int32
+
+ public init(_ _t: inout Rapunzel) {
+ hairLength = _t.hairLength
+ }
+
+ public init() {
+ hairLength = 0
+ }
+
+}
+public struct BookReader: Readable {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Struct
+
+ public static var size = 4
+ public static var alignment = 4
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Struct(bb: bb, position: o) }
+
+ public var booksRead: Int32 { return _accessor.readBuffer(of: Int32.self, at: 0) }
+ @discardableResult public func mutate(booksRead: Int32) -> Bool { return _accessor.mutate(booksRead, index: 0) }
+
+
+ public mutating func unpack() -> BookReaderT {
+ return BookReaderT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BookReaderT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout BookReaderT) -> Offset<UOffset> {
+ return createBookReader(builder: &builder, booksRead: obj.booksRead)
+ }
+}
+
+public class BookReaderT: NativeTable {
+
+ public var booksRead: Int32
+
+ public init(_ _t: inout BookReader) {
+ booksRead = _t.booksRead
+ }
+
+ public init() {
+ booksRead = 0
+ }
+
+}
+extension Rapunzel {
+ @discardableResult
+ public static func createRapunzel(builder: inout FlatBufferBuilder, hairLength: Int32 = 0) -> Offset<UOffset> {
+ builder.createStructOf(size: Rapunzel.size, alignment: Rapunzel.alignment)
+ builder.reverseAdd(v: hairLength, postion: 0)
+ return builder.endStruct()
+ }
+
+}
+
+extension BookReader {
+ @discardableResult
+ public static func createBookReader(builder: inout FlatBufferBuilder, booksRead: Int32 = 0) -> Offset<UOffset> {
+ builder.createStructOf(size: BookReader.size, alignment: BookReader.alignment)
+ builder.reverseAdd(v: booksRead, postion: 0)
+ return builder.endStruct()
+ }
+
+}
+
+public struct Attacker: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MOVI", addPrefix: prefix) }
+ public static func getRootAsAttacker(bb: ByteBuffer) -> Attacker { return Attacker(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case swordAttackDamage = 4
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var swordAttackDamage: Int32 { let o = _accessor.offset(VTOFFSET.swordAttackDamage.v); return o == 0 ? 0 : _accessor.readBuffer(of: Int32.self, at: o) }
+ @discardableResult public func mutate(swordAttackDamage: Int32) -> Bool {let o = _accessor.offset(VTOFFSET.swordAttackDamage.v); return _accessor.mutate(swordAttackDamage, index: o) }
+ public static func startAttacker(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 1) }
+ public static func add(swordAttackDamage: Int32, _ fbb: inout FlatBufferBuilder) { fbb.add(element: swordAttackDamage, def: 0, at: VTOFFSET.swordAttackDamage.p) }
+ public static func endAttacker(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createAttacker(
+ _ fbb: inout FlatBufferBuilder,
+ swordAttackDamage: Int32 = 0
+ ) -> Offset<UOffset> {
+ let __start = Attacker.startAttacker(&fbb)
+ Attacker.add(swordAttackDamage: swordAttackDamage, &fbb)
+ return Attacker.endAttacker(&fbb, start: __start)
+ }
+
+
+ public mutating func unpack() -> AttackerT {
+ return AttackerT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout AttackerT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout AttackerT) -> Offset<UOffset> {
+ let __root = Attacker.startAttacker(&builder)
+ Attacker.add(swordAttackDamage: obj.swordAttackDamage, &builder)
+ return Attacker.endAttacker(&builder, start: __root)
+ }
+}
+
+public class AttackerT: NativeTable {
+
+ public var swordAttackDamage: Int32
+
+ public init(_ _t: inout Attacker) {
+ swordAttackDamage = _t.swordAttackDamage
+ }
+
+ public init() {
+ swordAttackDamage = 0
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: Attacker.self) }
+
+}
+public struct Movie: FlatBufferObject, ObjectAPI {
+
+ static func validateVersion() { FlatBuffersVersion_1_12_0() }
+ public var __buffer: ByteBuffer! { return _accessor.bb }
+ private var _accessor: Table
+
+ public static func finish(_ fbb: inout FlatBufferBuilder, end: Offset<UOffset>, prefix: Bool = false) { fbb.finish(offset: end, fileId: "MOVI", addPrefix: prefix) }
+ public static func getRootAsMovie(bb: ByteBuffer) -> Movie { return Movie(Table(bb: bb, position: Int32(bb.read(def: UOffset.self, position: bb.reader)) + Int32(bb.reader))) }
+
+ private init(_ t: Table) { _accessor = t }
+ public init(_ bb: ByteBuffer, o: Int32) { _accessor = Table(bb: bb, position: o) }
+
+ private enum VTOFFSET: VOffset {
+ case mainCharacterType = 4
+ case mainCharacter = 6
+ case charactersType = 8
+ case characters = 10
+ var v: Int32 { Int32(self.rawValue) }
+ var p: VOffset { self.rawValue }
+ }
+
+ public var mainCharacterType: Character { let o = _accessor.offset(VTOFFSET.mainCharacterType.v); return o == 0 ? .none_ : Character(rawValue: _accessor.readBuffer(of: UInt8.self, at: o)) ?? .none_ }
+ public func mainCharacter<T: FlatBufferObject>(type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.mainCharacter.v); return o == 0 ? nil : _accessor.union(o) }
+ public var charactersTypeCount: Int32 { let o = _accessor.offset(VTOFFSET.charactersType.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func charactersType(at index: Int32) -> Character? { let o = _accessor.offset(VTOFFSET.charactersType.v); return o == 0 ? Character.none_ : Character(rawValue: _accessor.directRead(of: UInt8.self, offset: _accessor.vector(at: o) + index * 1)) }
+ public var charactersCount: Int32 { let o = _accessor.offset(VTOFFSET.characters.v); return o == 0 ? 0 : _accessor.vector(count: o) }
+ public func characters<T: FlatBufferObject>(at index: Int32, type: T.Type) -> T? { let o = _accessor.offset(VTOFFSET.characters.v); return o == 0 ? nil : _accessor.directUnion(_accessor.vector(at: o) + index * 4) }
+ public static func startMovie(_ fbb: inout FlatBufferBuilder) -> UOffset { fbb.startTable(with: 4) }
+ public static func add(mainCharacterType: Character, _ fbb: inout FlatBufferBuilder) { fbb.add(element: mainCharacterType.rawValue, def: 0, at: VTOFFSET.mainCharacterType.p) }
+ public static func add(mainCharacter: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: mainCharacter, at: VTOFFSET.mainCharacter.p) }
+ public static func addVectorOf(charactersType: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: charactersType, at: VTOFFSET.charactersType.p) }
+ public static func addVectorOf(characters: Offset<UOffset>, _ fbb: inout FlatBufferBuilder) { fbb.add(offset: characters, at: VTOFFSET.characters.p) }
+ public static func endMovie(_ fbb: inout FlatBufferBuilder, start: UOffset) -> Offset<UOffset> { let end = Offset<UOffset>(offset: fbb.endTable(at: start)); return end }
+ public static func createMovie(
+ _ fbb: inout FlatBufferBuilder,
+ mainCharacterType: Character = .none_,
+ offsetOfMainCharacter mainCharacter: Offset<UOffset> = Offset(),
+ vectorOfCharactersType charactersType: Offset<UOffset> = Offset(),
+ vectorOfCharacters characters: Offset<UOffset> = Offset()
+ ) -> Offset<UOffset> {
+ let __start = Movie.startMovie(&fbb)
+ Movie.add(mainCharacterType: mainCharacterType, &fbb)
+ Movie.add(mainCharacter: mainCharacter, &fbb)
+ Movie.addVectorOf(charactersType: charactersType, &fbb)
+ Movie.addVectorOf(characters: characters, &fbb)
+ return Movie.endMovie(&fbb, start: __start)
+ }
+
+
+ public mutating func unpack() -> MovieT {
+ return MovieT(&self)
+ }
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MovieT?) -> Offset<UOffset> {
+ guard var obj = obj else { return Offset<UOffset>() }
+ return pack(&builder, obj: &obj)
+ }
+
+ public static func pack(_ builder: inout FlatBufferBuilder, obj: inout MovieT) -> Offset<UOffset> {
+ let __mainCharacter = obj.mainCharacter?.pack(builder: &builder) ?? Offset()
+ var __characters__: [Offset<UOffset>] = []
+ for i in obj.characters {
+ guard let off = i?.pack(builder: &builder) else { continue }
+ __characters__.append(off)
+ }
+ let __characters = builder.createVector(ofOffsets: __characters__)
+ let __charactersType = builder.createVector(obj.characters.compactMap { $0?.type })
+ let __root = Movie.startMovie(&builder)
+ if let o = obj.mainCharacter?.type {
+ Movie.add(mainCharacterType: o, &builder)
+ Movie.add(mainCharacter: __mainCharacter, &builder)
+ }
+
+ Movie.addVectorOf(charactersType: __charactersType, &builder)
+ Movie.addVectorOf(characters: __characters, &builder)
+ return Movie.endMovie(&builder, start: __root)
+ }
+}
+
+public class MovieT: NativeTable {
+
+ public var mainCharacter: CharacterUnion?
+ public var characters: [CharacterUnion?]
+
+ public init(_ _t: inout Movie) {
+ switch _t.mainCharacterType {
+ case .mulan:
+ var _v = _t.mainCharacter(type: Attacker.self)
+ mainCharacter = CharacterUnion(_v?.unpack(), type: .mulan)
+ case .rapunzel:
+ var _v = _t.mainCharacter(type: Rapunzel.self)
+ mainCharacter = CharacterUnion(_v?.unpack(), type: .rapunzel)
+ case .belle:
+ var _v = _t.mainCharacter(type: BookReader.self)
+ mainCharacter = CharacterUnion(_v?.unpack(), type: .belle)
+ case .bookfan:
+ var _v = _t.mainCharacter(type: BookReader.self)
+ mainCharacter = CharacterUnion(_v?.unpack(), type: .bookfan)
+ default: break
+ }
+ characters = []
+ for index in 0..<_t.charactersCount {
+ switch _t.charactersType(at: index) {
+ case .mulan:
+ var _v = _t.characters(at: index, type: Attacker.self)
+ characters.append(CharacterUnion(_v?.unpack(), type: .mulan))
+ case .rapunzel:
+ var _v = _t.characters(at: index, type: Rapunzel.self)
+ characters.append(CharacterUnion(_v?.unpack(), type: .rapunzel))
+ case .belle:
+ var _v = _t.characters(at: index, type: BookReader.self)
+ characters.append(CharacterUnion(_v?.unpack(), type: .belle))
+ case .bookfan:
+ var _v = _t.characters(at: index, type: BookReader.self)
+ characters.append(CharacterUnion(_v?.unpack(), type: .bookfan))
+ default: break
+ }
+ }
+ }
+
+ public init() {
+ characters = []
+ }
+
+ public func serialize() -> ByteBuffer { return serialize(type: Movie.self) }
+
+}
diff --git a/tests/FlatBuffers.Test.Swift/Tests/LinuxMain.swift b/tests/FlatBuffers.Test.Swift/Tests/LinuxMain.swift
new file mode 100644
index 0000000..1b16a78
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/Tests/LinuxMain.swift
@@ -0,0 +1,8 @@
+import XCTest
+
+import FlatBuffers_Test_SwiftTests
+
+var tests = [XCTestCaseEntry]()
+tests += FlatBuffers_Test_SwiftTests.__allTests()
+
+XCTMain(tests)
diff --git a/tests/FlatBuffers.Test.Swift/monsterdata_test.mon b/tests/FlatBuffers.Test.Swift/monsterdata_test.mon
new file mode 100644
index 0000000..ba6cf27
--- /dev/null
+++ b/tests/FlatBuffers.Test.Swift/monsterdata_test.mon
Binary files differ
diff --git a/tests/FlatBuffers.Test/.gitignore b/tests/FlatBuffers.Test/.gitignore
new file mode 100644
index 0000000..badc827
--- /dev/null
+++ b/tests/FlatBuffers.Test/.gitignore
@@ -0,0 +1,4 @@
+dotnet-install.sh
+.dotnet_tmp/
+.tmp/
+packages/
\ No newline at end of file
diff --git a/tests/FlatBuffers.Test/ByteBufferTests.cs b/tests/FlatBuffers.Test/ByteBufferTests.cs
index 1c33a2f..98e917c 100644
--- a/tests/FlatBuffers.Test/ByteBufferTests.cs
+++ b/tests/FlatBuffers.Test/ByteBufferTests.cs
@@ -591,11 +591,14 @@
Assert.Throws<ArgumentException>(() => uut.Put(1024, data));
}
+ #pragma warning disable 0169
+ // These are purposely not used and the warning is suppress
private struct dummyStruct
{
int a;
float b;
}
+ #pragma warning restore 0169
[FlatBuffersTestMethod]
public void ByteBuffer_Put_Array_IncorrectType_Throws()
@@ -608,5 +611,25 @@
var data = new dummyStruct[10];
Assert.Throws<ArgumentException>(() => uut.Put(1024, data));
}
+
+ [FlatBuffersTestMethod]
+ public void ByteBuffer_Get_Double()
+ {
+ var uut = new ByteBuffer(1024);
+ double value = 3.14159265;
+ uut.PutDouble(900, value);
+ double getValue = uut.GetDouble(900);
+ Assert.AreEqual(value, getValue);
+ }
+
+ [FlatBuffersTestMethod]
+ public void ByteBuffer_Get_Float()
+ {
+ var uut = new ByteBuffer(1024);
+ float value = 3.14159265F;
+ uut.PutFloat(900, value);
+ double getValue = uut.GetFloat(900);
+ Assert.AreEqual(value, getValue);
+ }
}
}
diff --git a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
index d2f49f7..e2b72c7 100644
--- a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
+++ b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
@@ -249,6 +249,226 @@
}
[FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddBool(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddSbyte(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddByte(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddShort(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUshort(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddInt(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUint(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddLong(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUlong(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddFloat(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsUnchanged()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddDouble(0, null);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(endOffset, storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableBool_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddBool(0, true);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(bool), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableSbyte_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddSbyte(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(sbyte), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableByte_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddByte(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(byte), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableShort_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddShort(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(short), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableUShort_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUshort(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(ushort), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableInt_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddInt(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(int), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableUInt_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUint(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(uint), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableLong_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddLong(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(long), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableULong_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddUlong(0, 1);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(ulong), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableFloat_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddFloat(0, 1.0F);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(float), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_WhenAddNullableDouble_OffsetIsChangedBySize()
+ {
+ var fbb = CreateBuffer(false);
+ var storedOffset = fbb.Offset;
+ fbb.AddDouble(0, 1.0);
+ var endOffset = fbb.Offset;
+ Assert.AreEqual(sizeof(double), endOffset - storedOffset);
+ }
+
+ [FlatBuffersTestMethod]
public void FlatBufferBuilder_Add_Array_Float()
{
var fbb = CreateBuffer(false);
@@ -350,5 +570,29 @@
var endOffset = fbb.Offset;
Assert.AreEqual(endOffset, storedOffset);
}
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_Add_null_String()
+ {
+ var fbb = new FlatBufferBuilder(16);
+ string s = null;
+ Assert.AreEqual(fbb.CreateSharedString(s).Value, 0);
+ Assert.AreEqual(fbb.CreateString(s).Value, 0);
+ }
+
+ [FlatBuffersTestMethod]
+ public void FlatBufferBuilder_Empty_Builder()
+ {
+ var fbb = new FlatBufferBuilder(16);
+ var str = "Hello";
+ var flatbuffer = "Flatbuffers!";
+ var strOffset = fbb.CreateSharedString(str);
+ var flatbufferOffset = fbb.CreateSharedString(flatbuffer);
+ fbb.Clear();
+ var flatbufferOffset2 = fbb.CreateSharedString(flatbuffer);
+ var strOffset2 = fbb.CreateSharedString(str);
+ Assert.IsFalse(strOffset.Value == strOffset2.Value);
+ Assert.IsFalse(flatbufferOffset.Value == flatbufferOffset2.Value);
+ }
}
}
diff --git a/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj
new file mode 100644
index 0000000..bbbd7d8
--- /dev/null
+++ b/tests/FlatBuffers.Test/FlatBuffers.Core.Test.csproj
@@ -0,0 +1,162 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <TargetFramework>netcoreapp3.1</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Remove="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+
+ <PropertyGroup Condition="'$(UnsafeByteBuffer)' == 'true'">
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <DefineConstants>$(DefineConstants);UNSAFE_BYTEBUFFER</DefineConstants>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(EnableSpanT)' == 'true'">
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <DefineConstants>$(DefineConstants);ENABLE_SPAN_T</DefineConstants>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="..\..\net\FlatBuffers\ByteBuffer.cs">
+ <Link>FlatBuffers\ByteBuffer.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\ByteBufferUtil.cs">
+ <Link>FlatBuffers\ByteBufferUtil.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\IFlatbufferObject.cs">
+ <Link>FlatBuffers\IFlatbufferObject.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\Offset.cs">
+ <Link>FlatBuffers\Offset.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\FlatBufferBuilder.cs">
+ <Link>FlatBuffers\FlatBufferBuilder.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\FlatBufferConstants.cs">
+ <Link>FlatBuffers\FlatBufferConstants.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\Struct.cs">
+ <Link>FlatBuffers\Struct.cs</Link>
+ </Compile>
+ <Compile Include="..\..\net\FlatBuffers\Table.cs">
+ <Link>FlatBuffers\Table.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example2\Monster.cs">
+ <Link>MyGame\Example2\Monster.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\Any.cs">
+ <Link>MyGame\Example\Any.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\AnyAmbiguousAliases.cs">
+ <Link>MyGame\Example\AnyAmbiguousAliases.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\AnyUniqueAliases.cs">
+ <Link>MyGame\Example\AnyUniqueAliases.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\Color.cs">
+ <Link>MyGame\Example\Color.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\Race.cs">
+ <Link>MyGame\Example\Race.cs</Link>
+ </Compile>
+ <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>
+ <Compile Include="..\MyGame\Example\Test.cs">
+ <Link>MyGame\Example\Test.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\TestSimpleTableWithEnum.cs">
+ <Link>MyGame\Example\TestSimpleTableWithEnum.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\TypeAliases.cs">
+ <Link>MyGame\Example\TypeAliases.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\Vec3.cs">
+ <Link>MyGame\Example\Vec3.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\Ability.cs">
+ <Link>MyGame\Example\Ability.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\ArrayTable.cs">
+ <Link>MyGame\Example\ArrayTable.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\ArrayStruct.cs">
+ <Link>MyGame\Example\ArrayStruct.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\NestedStruct.cs">
+ <Link>MyGame\Example\NestedStruct.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\Example\TestEnum.cs">
+ <Link>MyGame\Example\TestEnum.cs</Link>
+ </Compile>
+ <Compile Include="..\MyGame\InParentNamespace.cs">
+ <Link>MyGame\InParentNamespace.cs</Link>
+ </Compile>
+ <Compile Include="..\namespace_test\NamespaceA\NamespaceB\EnumInNestedNS.cs">
+ <Link>NamespaceA\NamespaceB\EnumInNestedNS.cs</Link>
+ </Compile>
+ <Compile Include="..\namespace_test\NamespaceA\NamespaceB\StructInNestedNS.cs">
+ <Link>NamespaceA\NamespaceB\StructInNestedNS.cs</Link>
+ </Compile>
+ <Compile Include="..\namespace_test\NamespaceA\NamespaceB\TableInNestedNS.cs">
+ <Link>NamespaceA\NamespaceB\TableInNestedNS.cs</Link>
+ </Compile>
+ <Compile Include="..\namespace_test\NamespaceA\TableInFirstNS.cs">
+ <Link>NamespaceA\TableInFirstNS.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Attacker.cs">
+ <Link>union_vector\Attacker.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\BookReader.cs">
+ <Link>union_vector\BookReader.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Character.cs">
+ <Link>union_vector\Character.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Movie.cs">
+ <Link>union_vector\Movie.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Rapunzel.cs">
+ <Link>union_vector\Rapunzel.cs</Link>
+ </Compile>
+ <Compile Include="..\optional_scalars\OptionalByte.cs">
+ <Link>optional_scalars\OptionalByte.cs</Link>
+ </Compile>
+ <Compile Include="..\optional_scalars\ScalarStuff.cs">
+ <Link>optional_scalars\ScalarStuff.cs</Link>
+ </Compile>
+ </ItemGroup>
+
+ <ItemGroup>
+ <None Remove=".gitignore" />
+ <None Remove="clean.sh" />
+ <None Remove="NetTest.sh" />
+ <None Remove="packages.config" />
+ <None Remove="README.md" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Content Include="..\monsterdata_test.mon">
+ <Link>Resources\monsterdata_test.mon</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="..\monsterdata_test.json">
+ <Link>Resources\monsterdata_test.json</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+ </ItemGroup>
+
+</Project>
diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
index d698d20..616ab19 100644
--- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
+++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -9,6 +9,8 @@
<RootNamespace>FlatBuffers.Test</RootNamespace>
<AssemblyName>FlatBuffers.Test</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+ <RuntimeIdentifier>win</RuntimeIdentifier>
+ <LangVersion>4</LangVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -16,7 +18,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DefineConstants>TRACE;DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
@@ -36,9 +38,16 @@
<DefineConstants>$(DefineConstants);UNSAFE_BYTEBUFFER</DefineConstants>
</PropertyGroup>
<ItemGroup>
+ <PackageReference Include="Newtonsoft.Json">
+ <Version>12.0.3</Version>
+ </PackageReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+ <HintPath>packages\Newtonsoft.Json.12.0.3\lib\net35\Newtonsoft.Json.dll</HintPath>
+ </Reference>
<Reference Include="System" />
<Reference Include="System.Core">
- <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
@@ -66,6 +75,9 @@
<Compile Include="..\..\net\FlatBuffers\Table.cs">
<Link>FlatBuffers\Table.cs</Link>
</Compile>
+ <Compile Include="..\MyGame\Example2\Monster.cs">
+ <Link>MyGame\Example2\Monster.cs</Link>
+ </Compile>
<Compile Include="..\MyGame\Example\Any.cs">
<Link>MyGame\Example\Any.cs</Link>
</Compile>
@@ -78,6 +90,9 @@
<Compile Include="..\MyGame\Example\Color.cs">
<Link>MyGame\Example\Color.cs</Link>
</Compile>
+ <Compile Include="..\MyGame\Example\Race.cs">
+ <Link>MyGame\Example\Race.cs</Link>
+ </Compile>
<Compile Include="..\MyGame\Example\Monster.cs">
<Link>MyGame\Example\Monster.cs</Link>
</Compile>
@@ -93,6 +108,9 @@
<Compile Include="..\MyGame\Example\TestSimpleTableWithEnum.cs">
<Link>MyGame\Example\TestSimpleTableWithEnum.cs</Link>
</Compile>
+ <Compile Include="..\MyGame\Example\TypeAliases.cs">
+ <Link>MyGame\Example\TypeAliases.cs</Link>
+ </Compile>
<Compile Include="..\MyGame\Example\Vec3.cs">
<Link>MyGame\Example\Vec3.cs</Link>
</Compile>
@@ -126,6 +144,27 @@
<Compile Include="..\namespace_test\NamespaceA\TableInFirstNS.cs">
<Link>NamespaceA\TableInFirstNS.cs</Link>
</Compile>
+ <Compile Include="..\union_vector\Attacker.cs">
+ <Link>union_vector\Attacker.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\BookReader.cs">
+ <Link>union_vector\BookReader.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Character.cs">
+ <Link>union_vector\Character.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Movie.cs">
+ <Link>union_vector\Movie.cs</Link>
+ </Compile>
+ <Compile Include="..\union_vector\Rapunzel.cs">
+ <Link>union_vector\Rapunzel.cs</Link>
+ </Compile>
+ <Compile Include="..\optional_scalars\OptionalByte.cs">
+ <Link>optional_scalars\OptionalByte.cs</Link>
+ </Compile>
+ <Compile Include="..\optional_scalars\ScalarStuff.cs">
+ <Link>optional_scalars\ScalarStuff.cs</Link>
+ </Compile>
<Compile Include="Assert.cs" />
<Compile Include="ByteBufferTests.cs" />
<Compile Include="FlatBufferBuilderTests.cs" />
@@ -144,6 +183,13 @@
<Link>Resources\monsterdata_test.mon</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="..\monsterdata_test.json">
+ <Link>Resources\monsterdata_test.json</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -153,4 +199,4 @@
<Target Name="AfterBuild">
</Target>
-->
-</Project>
+</Project>
\ No newline at end of file
diff --git a/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs b/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs
index b09119c..b4093d4 100644
--- a/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs
+++ b/tests/FlatBuffers.Test/FlatBuffersExampleTests.cs
@@ -16,7 +16,9 @@
using System.IO;
using System.Text;
+using System.Threading;
using MyGame.Example;
+using optional_scalars;
namespace FlatBuffers.Test
{
@@ -111,18 +113,18 @@
}
// Dump to output directory so we can inspect later, if needed
-#if ENABLE_SPAN_T
+ #if ENABLE_SPAN_T
var data = fbb.DataBuffer.ToSizedArray();
- string filename = @"Resources/monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
+ string filename = @".tmp/monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
File.WriteAllBytes(filename, data);
-#else
+ #else
using (var ms = fbb.DataBuffer.ToMemoryStream(fbb.DataBuffer.Position, fbb.Offset))
{
var data = ms.ToArray();
- string filename = @"Resources/monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
+ string filename = @".tmp/monsterdata_cstest" + (sizePrefix ? "_sp" : "") + ".mon";
File.WriteAllBytes(filename, data);
}
-#endif
+ #endif
// Remove the size prefix if necessary for further testing
ByteBuffer dataBuffer = fbb.DataBuffer;
@@ -156,11 +158,7 @@
Assert.IsTrue(monster.TestarrayoftablesByKey("Barney") != null);
Assert.IsTrue(monster.TestarrayoftablesByKey("Wilma") != null);
- // testType is an existing field and mutating it should succeed
- Assert.AreEqual(monster.TestType, Any.Monster);
- Assert.AreEqual(monster.MutateTestType(Any.NONE), true);
- Assert.AreEqual(monster.TestType, Any.NONE);
- Assert.AreEqual(monster.MutateTestType(Any.Monster), true);
+ // testType is an existing field
Assert.AreEqual(monster.TestType, Any.Monster);
//mutate the inventory vector
@@ -191,6 +189,7 @@
Assert.AreEqual(pos.X, 1.0f);
TestBuffer(dataBuffer);
+ TestObjectAPI(Monster.GetRootAsMonster(dataBuffer));
}
private void TestBuffer(ByteBuffer bb)
@@ -248,7 +247,7 @@
Assert.AreEqual(true, monster.Testbool);
-#if ENABLE_SPAN_T
+ #if ENABLE_SPAN_T
var nameBytes = monster.GetNameBytes();
Assert.AreEqual("MyMonster", Encoding.UTF8.GetString(nameBytes.ToArray(), 0, nameBytes.Length));
@@ -260,7 +259,13 @@
{
Assert.IsTrue(monster.GetTestarrayofboolsBytes().Length != 0);
}
-#else
+
+ var longArrayBytes = monster.GetVectorOfLongsBytes();
+ Assert.IsTrue(monster.VectorOfLongsLength * 8 == longArrayBytes.Length);
+
+ var doubleArrayBytes = monster.GetVectorOfDoublesBytes();
+ Assert.IsTrue(monster.VectorOfDoublesLength * 8 == doubleArrayBytes.Length);
+ #else
var nameBytes = monster.GetNameBytes().Value;
Assert.AreEqual("MyMonster", Encoding.UTF8.GetString(nameBytes.Array, nameBytes.Offset, nameBytes.Count));
@@ -272,15 +277,26 @@
{
Assert.IsTrue(monster.GetTestarrayofboolsBytes().HasValue);
}
-#endif
+ #endif
}
[FlatBuffersTestMethod]
public void CanReadCppGeneratedWireFile()
{
- var data = File.ReadAllBytes(@"Resources/monsterdata_test.mon");
+ var data = File.ReadAllBytes(@"../monsterdata_test.mon");
var bb = new ByteBuffer(data);
TestBuffer(bb);
+ TestObjectAPI(Monster.GetRootAsMonster(bb));
+ }
+
+ [FlatBuffersTestMethod]
+ public void CanReadJsonFile()
+ {
+ var jsonText = File.ReadAllText(@"../monsterdata_test.json");
+ var mon = MonsterT.DeserializeFromJson(jsonText);
+ var fbb = new FlatBufferBuilder(1);
+ fbb.Finish(Monster.Pack(fbb, mon).Value);
+ TestBuffer(fbb.DataBuffer);
}
[FlatBuffersTestMethod]
@@ -293,6 +309,27 @@
}
[FlatBuffersTestMethod]
+ public void TestVectorOfEnums()
+ {
+ const string monsterName = "TestVectorOfEnumsMonster";
+ var colorVec = new Color[] { Color.Red, Color.Green, Color.Blue };
+ var fbb = new FlatBufferBuilder(32);
+ var str1 = fbb.CreateString(monsterName);
+ var vec1 = Monster.CreateVectorOfEnumsVector(fbb, colorVec);
+ Monster.StartMonster(fbb);
+ Monster.AddName(fbb, str1);
+ Monster.AddVectorOfEnums(fbb, vec1);
+ var monster1 = Monster.EndMonster(fbb);
+ Monster.FinishMonsterBuffer(fbb, monster1);
+
+ var mons = Monster.GetRootAsMonster(fbb.DataBuffer);
+ var colors = mons.GetVectorOfEnumsArray();
+ Assert.ArrayEqual(colorVec, colors);
+
+ TestObjectAPI(mons);
+ }
+
+ [FlatBuffersTestMethod]
public void TestNestedFlatBuffer()
{
const string nestedMonsterName = "NestedMonsterName";
@@ -329,6 +366,9 @@
Assert.AreEqual(nestedMonsterMana, nestedMonster.Mana);
Assert.AreEqual(nestedMonsterHp, nestedMonster.Hp);
Assert.AreEqual(nestedMonsterName, nestedMonster.Name);
+
+ TestObjectAPI(mons);
+ TestObjectAPI(nestedMonster);
}
[FlatBuffersTestMethod]
@@ -342,6 +382,9 @@
int[,] d_a = new int[2, 2];
TestEnum[] d_b = new TestEnum[2];
TestEnum[,] d_c = new TestEnum[2, 2];
+ long[,] d_d = new long[2, 2];
+ int e;
+ long[] f = new long[2];
a = 0.5f;
for (int i = 0; i < 15; i++) b[i] = i;
@@ -356,9 +399,16 @@
d_c[0, 1] = TestEnum.B;
d_c[1, 0] = TestEnum.C;
d_c[1, 1] = TestEnum.B;
+ d_d[0, 0] = -1;
+ d_d[0, 1] = 1;
+ d_d[1, 0] = -2;
+ d_d[1, 1] = 2;
+ e = 2;
+ f[0] = -1;
+ f[1] = 1;
Offset<ArrayStruct> arrayOffset = ArrayStruct.CreateArrayStruct(
- builder, a, b, c, d_a, d_b, d_c);
+ builder, a, b, c, d_a, d_b, d_c, d_d, e, f);
// Create a table with the ArrayStruct.
ArrayTable.StartArrayTable(builder);
@@ -369,19 +419,683 @@
ArrayTable table = ArrayTable.GetRootAsArrayTable(builder.DataBuffer);
- Assert.AreEqual(table.A?.A, 0.5f);
- for (int i = 0; i < 15; i++) Assert.AreEqual(table.A?.B(i), i);
- Assert.AreEqual(table.A?.C, (sbyte)1);
- Assert.AreEqual(table.A?.D(0).A(0), 1);
- Assert.AreEqual(table.A?.D(0).A(1), 2);
- Assert.AreEqual(table.A?.D(1).A(0), 3);
- Assert.AreEqual(table.A?.D(1).A(1), 4);
- Assert.AreEqual(table.A?.D(0).B, TestEnum.B);
- Assert.AreEqual(table.A?.D(1).B, TestEnum.C);
- Assert.AreEqual(table.A?.D(0).C(0), TestEnum.A);
- Assert.AreEqual(table.A?.D(0).C(1), TestEnum.B);
- Assert.AreEqual(table.A?.D(1).C(0), TestEnum.C);
- Assert.AreEqual(table.A?.D(1).C(1), TestEnum.B);
+ Assert.AreEqual(table.A.Value.A, 0.5f);
+ for (int i = 0; i < 15; i++) Assert.AreEqual(table.A.Value.B(i), i);
+ Assert.AreEqual(table.A.Value.C, (sbyte)1);
+ Assert.AreEqual(table.A.Value.D(0).A(0), 1);
+ Assert.AreEqual(table.A.Value.D(0).A(1), 2);
+ Assert.AreEqual(table.A.Value.D(1).A(0), 3);
+ Assert.AreEqual(table.A.Value.D(1).A(1), 4);
+ Assert.AreEqual(table.A.Value.D(0).B, TestEnum.B);
+ Assert.AreEqual(table.A.Value.D(1).B, TestEnum.C);
+ Assert.AreEqual(table.A.Value.D(0).C(0), TestEnum.A);
+ Assert.AreEqual(table.A.Value.D(0).C(1), TestEnum.B);
+ Assert.AreEqual(table.A.Value.D(1).C(0), TestEnum.C);
+ Assert.AreEqual(table.A.Value.D(1).C(1), TestEnum.B);
+ Assert.AreEqual(table.A.Value.D(0).D(0), -1);
+ Assert.AreEqual(table.A.Value.D(0).D(1), 1);
+ Assert.AreEqual(table.A.Value.D(1).D(0), -2);
+ Assert.AreEqual(table.A.Value.D(1).D(1), 2);
+ Assert.AreEqual(table.A.Value.E, 2);
+ Assert.AreEqual(table.A.Value.F(0), -1);
+ Assert.AreEqual(table.A.Value.F(1), 1);
+
+ TestObjectAPI(table);
+ }
+
+ [FlatBuffersTestMethod]
+ public void TestUnionVector()
+ {
+ var fbb = new FlatBufferBuilder(100);
+ var rapunzel = Rapunzel.CreateRapunzel(fbb, 40).Value;
+
+ var characterTypes = new[]
+ {
+ Character.MuLan,
+ Character.Belle,
+ Character.Other,
+ };
+ var characterTypesOffset = Movie.CreateCharactersTypeVector(fbb, characterTypes);
+
+ var characters = new[]
+ {
+ Attacker.CreateAttacker(fbb, 10).Value,
+ BookReader.CreateBookReader(fbb, 20).Value,
+ fbb.CreateSharedString("Chip").Value,
+ };
+ var charactersOffset = Movie.CreateCharactersVector(fbb, characters);
+
+ var movieOffset = Movie.CreateMovie(
+ fbb,
+ Character.Rapunzel,
+ rapunzel,
+ characterTypesOffset,
+ charactersOffset);
+ Movie.FinishMovieBuffer(fbb, movieOffset);
+
+ var movie = Movie.GetRootAsMovie(fbb.DataBuffer);
+ Assert.AreEqual(Character.Rapunzel, movie.MainCharacterType);
+ Assert.AreEqual(40, movie.MainCharacter<Rapunzel>().Value.HairLength);
+
+ Assert.AreEqual(3, movie.CharactersLength);
+ Assert.AreEqual(Character.MuLan, movie.CharactersType(0));
+ Assert.AreEqual(10, movie.Characters<Attacker>(0).Value.SwordAttackDamage);
+ Assert.AreEqual(Character.Belle, movie.CharactersType(1));
+ Assert.AreEqual(20, movie.Characters<BookReader>(1).Value.BooksRead);
+ Assert.AreEqual(Character.Other, movie.CharactersType(2));
+ Assert.AreEqual("Chip", movie.CharactersAsString(2));
+
+ TestObjectAPI(movie);
+ }
+
+ private void AreEqual(Monster a, MonsterT b)
+ {
+ Assert.AreEqual(a.Hp, b.Hp);
+ Assert.AreEqual(a.Mana, b.Mana);
+ Assert.AreEqual(a.Name, b.Name);
+
+ var posA = a.Pos;
+ var posB = b.Pos;
+ if (posA != null)
+ {
+ Assert.AreEqual(posA.Value.X, posB.X);
+ Assert.AreEqual(posA.Value.Y, posB.Y);
+ Assert.AreEqual(posA.Value.Z, posB.Z);
+
+ Assert.AreEqual(posA.Value.Test1, posB.Test1);
+ Assert.AreEqual(posA.Value.Test2, posB.Test2);
+ var tA = posA.Value.Test3;
+ var tB = posB.Test3;
+ Assert.AreEqual(tA.A, tB.A);
+ Assert.AreEqual(tA.B, tB.B);
+ }
+
+ Assert.AreEqual(a.TestType, b.Test.Type);
+ if (a.TestType == Any.Monster)
+ {
+ var monster2A = a.Test<Monster>().Value;
+ var monster2B = b.Test.AsMonster();
+ Assert.AreEqual(monster2A.Name, monster2B.Name);
+ }
+
+ Assert.AreEqual(a.InventoryLength, b.Inventory.Count);
+ for (var i = 0; i < a.InventoryLength; ++i)
+ {
+ Assert.AreEqual(a.Inventory(i), b.Inventory[i]);
+ }
+
+ var inventoryArray = a.GetInventoryArray();
+ var inventoryArrayLength = inventoryArray == null ? 0 : inventoryArray.Length;
+ Assert.AreEqual(inventoryArrayLength, b.Inventory.Count);
+ for (var i = 0; i < inventoryArrayLength; ++i)
+ {
+ Assert.AreEqual(inventoryArray[i], b.Inventory[i]);
+ }
+
+ Assert.AreEqual(a.Test4Length, b.Test4.Count);
+ for (var i = 0; i < a.Test4Length; ++i)
+ {
+ var t4A = a.Test4(i);
+ var t4B = b.Test4[i];
+ Assert.AreEqual(t4A.Value.A, t4B.A);
+ Assert.AreEqual(t4A.Value.B, t4B.B);
+ }
+
+ Assert.AreEqual(a.TestarrayofstringLength, b.Testarrayofstring.Count);
+ for (var i = 0; i < a.TestarrayofstringLength; ++i)
+ {
+ Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring[i]);
+ }
+
+ Assert.AreEqual(a.Testbool, b.Testbool);
+
+ Assert.AreEqual(a.TestarrayofboolsLength, b.Testarrayofbools.Count);
+ for (var i = 0; i < a.TestarrayofboolsLength; ++i)
+ {
+ Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools[i]);
+ }
+
+ Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongs.Count);
+ for (var i = 0; i < a.VectorOfLongsLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs[i]);
+ }
+
+ Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoubles.Count);
+ for (var i = 0; i < a.VectorOfDoublesLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles[i]);
+ }
+
+ Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnums.Count);
+ for (var i = 0; i < a.VectorOfEnumsLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums[i]);
+ }
+ }
+
+ private void AreEqual(Monster a, Monster b)
+ {
+ Assert.AreEqual(a.Hp, b.Hp);
+ Assert.AreEqual(a.Mana, b.Mana);
+ Assert.AreEqual(a.Name, b.Name);
+
+ var posA = a.Pos;
+ var posB = b.Pos;
+ if (posA != null)
+ {
+ Assert.AreEqual(posA.Value.X, posB.Value.X);
+ Assert.AreEqual(posA.Value.Y, posB.Value.Y);
+ Assert.AreEqual(posA.Value.Z, posB.Value.Z);
+
+ Assert.AreEqual(posA.Value.Test1, posB.Value.Test1);
+ Assert.AreEqual(posA.Value.Test2, posB.Value.Test2);
+ var tA = posA.Value.Test3;
+ var tB = posB.Value.Test3;
+ Assert.AreEqual(tA.A, tB.A);
+ Assert.AreEqual(tA.B, tB.B);
+ }
+
+ Assert.AreEqual(a.TestType, b.TestType);
+ if (a.TestType == Any.Monster)
+ {
+ var monster2A = a.Test<Monster>().Value;
+ var monster2B = b.Test<Monster>().Value;
+ Assert.AreEqual(monster2A.Name, monster2B.Name);
+ }
+
+ Assert.AreEqual(a.InventoryLength, b.InventoryLength);
+ for (var i = 0; i < a.InventoryLength; ++i)
+ {
+ Assert.AreEqual(a.Inventory(i), b.Inventory(i));
+ }
+
+ var inventoryArrayA = a.GetInventoryArray();
+ var inventoryArrayALength = inventoryArrayA == null ? 0 : inventoryArrayA.Length;
+ var inventoryArrayB = b.GetInventoryArray();
+ var inventoryArrayBLength = inventoryArrayB == null ? 0 : inventoryArrayB.Length;
+ Assert.AreEqual(inventoryArrayALength, inventoryArrayBLength);
+ for (var i = 0; i < inventoryArrayALength; ++i)
+ {
+ Assert.AreEqual(inventoryArrayA[i], inventoryArrayB[i]);
+ }
+
+ Assert.AreEqual(a.Test4Length, b.Test4Length);
+ for (var i = 0; i < a.Test4Length; ++i)
+ {
+ var t4A = a.Test4(i);
+ var t4B = b.Test4(i);
+ Assert.AreEqual(t4A.Value.A, t4B.Value.A);
+ Assert.AreEqual(t4A.Value.B, t4B.Value.B);
+ }
+
+ Assert.AreEqual(a.TestarrayofstringLength, b.TestarrayofstringLength);
+ for (var i = 0; i < a.TestarrayofstringLength; ++i)
+ {
+ Assert.AreEqual(a.Testarrayofstring(i), b.Testarrayofstring(i));
+ }
+
+ Assert.AreEqual(a.Testbool, b.Testbool);
+
+ Assert.AreEqual(a.TestarrayofboolsLength, b.TestarrayofboolsLength);
+ for (var i = 0; i < a.TestarrayofboolsLength; ++i)
+ {
+ Assert.AreEqual(a.Testarrayofbools(i), b.Testarrayofbools(i));
+ }
+
+ Assert.AreEqual(a.VectorOfLongsLength, b.VectorOfLongsLength);
+ for (var i = 0; i < a.VectorOfLongsLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfLongs(i), b.VectorOfLongs(i));
+ }
+
+ Assert.AreEqual(a.VectorOfDoublesLength, b.VectorOfDoublesLength);
+ for (var i = 0; i < a.VectorOfDoublesLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfDoubles(i), b.VectorOfDoubles(i));
+ }
+
+ Assert.AreEqual(a.VectorOfEnumsLength, b.VectorOfEnumsLength);
+ for (var i = 0; i < a.VectorOfEnumsLength; ++i)
+ {
+ Assert.AreEqual(a.VectorOfEnums(i), b.VectorOfEnums(i));
+ }
+ }
+
+ private void TestObjectAPI(Monster a)
+ {
+ var b = a.UnPack();
+ AreEqual(a, b);
+
+ var fbb = new FlatBufferBuilder(1);
+ fbb.Finish(Monster.Pack(fbb, b).Value);
+ var c = Monster.GetRootAsMonster(fbb.DataBuffer);
+ AreEqual(a, c);
+
+ var jsonText = b.SerializeToJson();
+ var d = MonsterT.DeserializeFromJson(jsonText);
+ AreEqual(a, d);
+
+ var fbBuffer = b.SerializeToBinary();
+ Assert.IsTrue(Monster.MonsterBufferHasIdentifier(new ByteBuffer(fbBuffer)));
+ var e = MonsterT.DeserializeFromBinary(fbBuffer);
+ AreEqual(a, e);
+ }
+
+ private void AreEqual(ArrayTable a, ArrayTableT b)
+ {
+ Assert.AreEqual(a.A.Value.A, b.A.A);
+
+ for (int i = 0; i < 15; ++i)
+ {
+ Assert.AreEqual(a.A.Value.B(i), b.A.B[i]);
+ }
+
+ Assert.AreEqual(a.A.Value.C, b.A.C);
+
+ for (int i = 0; i < 2; ++i)
+ {
+ var ad = a.A.Value.D(i);
+ var bd = b.A.D[i];
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.A(j), bd.A[j]);
+ }
+
+ Assert.AreEqual(ad.B, bd.B);
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.C(j), bd.C[j]);
+ }
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.D(j), bd.D[j]);
+ }
+ }
+
+ Assert.AreEqual(a.A.Value.E, b.A.E);
+
+ for (int i = 0; i < 2; ++i)
+ {
+ Assert.AreEqual(a.A.Value.F(i), b.A.F[i]);
+ }
+ }
+
+ private void AreEqual(ArrayTable a, ArrayTable b)
+ {
+ Assert.AreEqual(a.A.Value.A, b.A.Value.A);
+
+ for (int i = 0; i < 15; ++i)
+ {
+ Assert.AreEqual(a.A.Value.B(i), b.A.Value.B(i));
+ }
+
+ Assert.AreEqual(a.A.Value.C, b.A.Value.C);
+
+ for (int i = 0; i < 2; ++i)
+ {
+ var ad = a.A.Value.D(i);
+ var bd = b.A.Value.D(i);
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.A(j), bd.A(j));
+ }
+
+ Assert.AreEqual(ad.B, bd.B);
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.C(j), bd.C(j));
+ }
+
+ for (int j = 0; j < 2; ++j)
+ {
+ Assert.AreEqual(ad.D(j), bd.D(j));
+ }
+ }
+
+ Assert.AreEqual(a.A.Value.E, b.A.Value.E);
+
+ for (int i = 0; i < 2; ++i)
+ {
+ Assert.AreEqual(a.A.Value.F(i), b.A.Value.F(i));
+ }
+ }
+
+ private void TestObjectAPI(ArrayTable a)
+ {
+ var b = a.UnPack();
+ AreEqual(a, b);
+
+ var fbb = new FlatBufferBuilder(1);
+ fbb.Finish(ArrayTable.Pack(fbb, b).Value);
+ var c = ArrayTable.GetRootAsArrayTable(fbb.DataBuffer);
+ AreEqual(a, c);
+
+ var jsonText = b.SerializeToJson();
+ var d = ArrayTableT.DeserializeFromJson(jsonText);
+ AreEqual(a, d);
+
+ var fbBuffer = b.SerializeToBinary();
+ Assert.IsTrue(ArrayTable.ArrayTableBufferHasIdentifier(new ByteBuffer(fbBuffer)));
+ var e = ArrayTableT.DeserializeFromBinary(fbBuffer);
+ AreEqual(a, e);
+ }
+
+ private void AreEqual(Movie a, MovieT b)
+ {
+ Assert.AreEqual(a.MainCharacterType, b.MainCharacter.Type);
+ Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter.AsRapunzel().HairLength);
+
+ Assert.AreEqual(a.CharactersLength, b.Characters.Count);
+ Assert.AreEqual(a.CharactersType(0), b.Characters[0].Type);
+ Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters[0].AsMuLan().SwordAttackDamage);
+ Assert.AreEqual(a.CharactersType(1), b.Characters[1].Type);
+ Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters[1].AsBelle().BooksRead);
+ Assert.AreEqual(a.CharactersType(2), b.Characters[2].Type);
+ Assert.AreEqual(a.CharactersAsString(2), b.Characters[2].AsOther());
+ }
+
+ private void AreEqual(Movie a, Movie b)
+ {
+ Assert.AreEqual(a.MainCharacterType, b.MainCharacterType);
+ Assert.AreEqual(a.MainCharacter<Rapunzel>().Value.HairLength, b.MainCharacter<Rapunzel>().Value.HairLength);
+
+ Assert.AreEqual(a.CharactersLength, b.CharactersLength);
+ Assert.AreEqual(a.CharactersType(0), b.CharactersType(0));
+ Assert.AreEqual(a.Characters<Attacker>(0).Value.SwordAttackDamage, b.Characters<Attacker>(0).Value.SwordAttackDamage);
+ Assert.AreEqual(a.CharactersType(1), b.CharactersType(1));
+ Assert.AreEqual(a.Characters<BookReader>(1).Value.BooksRead, b.Characters<BookReader>(1).Value.BooksRead);
+ Assert.AreEqual(a.CharactersType(2), b.CharactersType(2));
+ Assert.AreEqual(a.CharactersAsString(2), b.CharactersAsString(2));
+ }
+
+ private void TestObjectAPI(Movie a)
+ {
+ var b = a.UnPack();
+ AreEqual(a, b);
+
+ var fbb = new FlatBufferBuilder(1);
+ fbb.Finish(Movie.Pack(fbb, b).Value);
+ var c = Movie.GetRootAsMovie(fbb.DataBuffer);
+ AreEqual(a, c);
+
+ var jsonText = b.SerializeToJson();
+ var d = MovieT.DeserializeFromJson(jsonText);
+ AreEqual(a, d);
+
+ var fbBuffer = b.SerializeToBinary();
+ Assert.IsTrue(Movie.MovieBufferHasIdentifier(new ByteBuffer(fbBuffer)));
+ var e = MovieT.DeserializeFromBinary(fbBuffer);
+ AreEqual(a, e);
+ }
+
+ // For use in TestParallelAccess test case.
+ static private int _comparisons = 0;
+ static private int _failures = 0;
+ static private void KeepComparing(Monster mon, int count, float floatValue, double doubleValue)
+ {
+ int i = 0;
+ while (++i <= count)
+ {
+ Interlocked.Add(ref _comparisons, 1);
+ if(mon.Pos.Value.Test1 != doubleValue || mon.Pos.Value.Z != floatValue) {
+ Interlocked.Add(ref _failures, 1);
+ }
+ }
+ }
+
+ [FlatBuffersTestMethod]
+ public void TestParallelAccess() {
+ // Tests that reading from a flatbuffer over multiple threads is thread-safe in regard to double and float
+ // values, since they previously were non-thread safe
+ const float floatValue = 3.141592F;
+ const double doubleValue = 1.618033988;
+
+ var fbb = new FlatBufferBuilder(1);
+ var str = fbb.CreateString("ParallelTest");
+ Monster.StartMonster(fbb);
+ Monster.AddPos(fbb, Vec3.CreateVec3(fbb, 1.0f, 2.0f, floatValue, doubleValue,
+ Color.Green, (short)5, (sbyte)6));
+
+ Monster.AddName(fbb, str);
+ Monster.FinishMonsterBuffer(fbb, Monster.EndMonster(fbb));
+
+ var mon = Monster.GetRootAsMonster(fbb.DataBuffer);
+
+ var pos = mon.Pos.Value;
+ Assert.AreEqual(pos.Test1, doubleValue);
+ Assert.AreEqual(pos.Z, floatValue);
+
+ const int thread_count = 10;
+ const int reps = 1000000;
+
+ // Need to use raw Threads since Tasks are not supported in .NET 3.5
+ Thread[] threads = new Thread[thread_count];
+ for(int i = 0; i < thread_count; i++) {
+ threads[i] = new Thread(() => KeepComparing(mon, reps, floatValue, doubleValue));
+ }
+ for(int i = 0; i < thread_count; i++) {
+ threads[i].Start();
+ }
+ for(int i = 0; i < thread_count; i++) {
+ threads[i].Join();
+ }
+
+ // Make sure the threads actually did the comparisons.
+ Assert.AreEqual(thread_count * reps, _comparisons);
+
+ // Make sure we never read the values incorrectly.
+ Assert.AreEqual(0, _failures);
+ }
+
+ [FlatBuffersTestMethod]
+ public void TestScalarOptional_EmptyBuffer() {
+ var fbb = new FlatBufferBuilder(1);
+ ScalarStuff.StartScalarStuff(fbb);
+ var offset = ScalarStuff.EndScalarStuff(fbb);
+ ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
+
+ ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
+ Assert.AreEqual((sbyte)0, scalarStuff.JustI8);
+ Assert.AreEqual(null, scalarStuff.MaybeI8);
+ Assert.AreEqual((sbyte)42, scalarStuff.DefaultI8);
+ Assert.AreEqual((byte)0, scalarStuff.JustU8);
+ Assert.AreEqual(null, scalarStuff.MaybeU8);
+ Assert.AreEqual((byte)42, scalarStuff.DefaultU8);
+
+ Assert.AreEqual((short)0, scalarStuff.JustI16);
+ Assert.AreEqual(null, scalarStuff.MaybeI16);
+ Assert.AreEqual((short)42, scalarStuff.DefaultI16);
+ Assert.AreEqual((ushort)0, scalarStuff.JustU16);
+ Assert.AreEqual(null, scalarStuff.MaybeU16);
+ Assert.AreEqual((ushort)42, scalarStuff.DefaultU16);
+
+ Assert.AreEqual((int)0, scalarStuff.JustI32);
+ Assert.AreEqual(null, scalarStuff.MaybeI32);
+ Assert.AreEqual((int)42, scalarStuff.DefaultI32);
+ Assert.AreEqual((uint)0, scalarStuff.JustU32);
+ Assert.AreEqual(null, scalarStuff.MaybeU32);
+ Assert.AreEqual((uint)42, scalarStuff.DefaultU32);
+
+ Assert.AreEqual((long)0, scalarStuff.JustI64);
+ Assert.AreEqual(null, scalarStuff.MaybeI64);
+ Assert.AreEqual((long)42, scalarStuff.DefaultI64);
+ Assert.AreEqual((ulong)0, scalarStuff.JustU64);
+ Assert.AreEqual(null, scalarStuff.MaybeU64);
+ Assert.AreEqual((ulong)42, scalarStuff.DefaultU64);
+
+ Assert.AreEqual((float)0.0F, scalarStuff.JustF32);
+ Assert.AreEqual(null, scalarStuff.MaybeF32);
+ Assert.AreEqual((float)42.0F, scalarStuff.DefaultF32);
+
+ Assert.AreEqual((double)0.0, scalarStuff.JustF64);
+ Assert.AreEqual(null, scalarStuff.MaybeF64);
+ Assert.AreEqual((double)42.0, scalarStuff.DefaultF64);
+
+ Assert.AreEqual(false, scalarStuff.JustBool);
+ Assert.AreEqual(null, scalarStuff.MaybeBool);
+ Assert.AreEqual(true, scalarStuff.DefaultBool);
+
+ Assert.AreEqual(OptionalByte.None, scalarStuff.JustEnum);
+ Assert.AreEqual(null, scalarStuff.MaybeEnum);
+ Assert.AreEqual(OptionalByte.One, scalarStuff.DefaultEnum);
+ }
+
+ [FlatBuffersTestMethod]
+ public void TestScalarOptional_Construction() {
+ var fbb = new FlatBufferBuilder(1);
+ ScalarStuff.StartScalarStuff(fbb);
+ ScalarStuff.AddJustI8(fbb, 5);
+ ScalarStuff.AddMaybeI8(fbb, 5);
+ ScalarStuff.AddDefaultI8(fbb, 5);
+ ScalarStuff.AddJustU8(fbb, 6);
+ ScalarStuff.AddMaybeU8(fbb, 6);
+ ScalarStuff.AddDefaultU8(fbb, 6);
+
+ ScalarStuff.AddJustI16(fbb, 7);
+ ScalarStuff.AddMaybeI16(fbb, 7);
+ ScalarStuff.AddDefaultI16(fbb, 7);
+ ScalarStuff.AddJustU16(fbb, 8);
+ ScalarStuff.AddMaybeU16(fbb, 8);
+ ScalarStuff.AddDefaultU16(fbb, 8);
+
+ ScalarStuff.AddJustI32(fbb, 9);
+ ScalarStuff.AddMaybeI32(fbb, 9);
+ ScalarStuff.AddDefaultI32(fbb, 9);
+ ScalarStuff.AddJustU32(fbb, 10);
+ ScalarStuff.AddMaybeU32(fbb, 10);
+ ScalarStuff.AddDefaultU32(fbb, 10);
+
+ ScalarStuff.AddJustI64(fbb, 11);
+ ScalarStuff.AddMaybeI64(fbb, 11);
+ ScalarStuff.AddDefaultI64(fbb, 11);
+ ScalarStuff.AddJustU64(fbb, 12);
+ ScalarStuff.AddMaybeU64(fbb, 12);
+ ScalarStuff.AddDefaultU64(fbb, 12);
+
+ ScalarStuff.AddJustF32(fbb, 13.0f);
+ ScalarStuff.AddMaybeF32(fbb, 13.0f);
+ ScalarStuff.AddDefaultF32(fbb, 13.0f);
+ ScalarStuff.AddJustF64(fbb, 14.0);
+ ScalarStuff.AddMaybeF64(fbb, 14.0);
+ ScalarStuff.AddDefaultF64(fbb, 14.0);
+
+ ScalarStuff.AddJustBool(fbb, true);
+ ScalarStuff.AddMaybeBool(fbb, true);
+ ScalarStuff.AddDefaultBool(fbb, false); // note this is the opposite
+
+ ScalarStuff.AddJustEnum(fbb, OptionalByte.Two);
+ ScalarStuff.AddMaybeEnum(fbb, OptionalByte.Two);
+ ScalarStuff.AddDefaultEnum(fbb, OptionalByte.Two);
+
+ var offset = ScalarStuff.EndScalarStuff(fbb);
+ ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
+
+ ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
+ Assert.AreEqual((sbyte)5, scalarStuff.JustI8);
+ Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);
+ Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);
+ Assert.AreEqual((byte)6, scalarStuff.JustU8);
+ Assert.AreEqual((byte)6, scalarStuff.MaybeU8);
+ Assert.AreEqual((byte)6, scalarStuff.DefaultU8);
+
+ Assert.AreEqual((short)7, scalarStuff.JustI16);
+ Assert.AreEqual((short)7, scalarStuff.MaybeI16);
+ Assert.AreEqual((short)7, scalarStuff.DefaultI16);
+ Assert.AreEqual((ushort)8, scalarStuff.JustU16);
+ Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);
+ Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);
+
+ Assert.AreEqual((int)9, scalarStuff.JustI32);
+ Assert.AreEqual((int)9, scalarStuff.MaybeI32);
+ Assert.AreEqual((int)9, scalarStuff.DefaultI32);
+ Assert.AreEqual((uint)10, scalarStuff.JustU32);
+ Assert.AreEqual((uint)10, scalarStuff.MaybeU32);
+ Assert.AreEqual((uint)10, scalarStuff.DefaultU32);
+
+ Assert.AreEqual((long)11, scalarStuff.JustI64);
+ Assert.AreEqual((long)11, scalarStuff.MaybeI64);
+ Assert.AreEqual((long)11, scalarStuff.DefaultI64);
+ Assert.AreEqual((ulong)12, scalarStuff.JustU64);
+ Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);
+ Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);
+
+ Assert.AreEqual((float)13.0F, scalarStuff.JustF32);
+ Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);
+ Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);
+
+ Assert.AreEqual((double)14.0, scalarStuff.JustF64);
+ Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);
+ Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);
+
+ Assert.AreEqual(true, scalarStuff.JustBool);
+ Assert.AreEqual(true, scalarStuff.MaybeBool);
+ Assert.AreEqual(false, scalarStuff.DefaultBool);
+
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);
+ }
+
+ [FlatBuffersTestMethod]
+ public void TestScalarOptional_Construction_CreatorMethod() {
+ var fbb = new FlatBufferBuilder(1);
+
+ var offset = ScalarStuff.CreateScalarStuff(fbb,5,5,5,6,6,6,7,7,7,
+ 8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13.0f,13.0f,13.0f,14.0,
+ 14.0,14.0,true,true,false,OptionalByte.Two,OptionalByte.Two,
+ OptionalByte.Two);
+ ScalarStuff.FinishScalarStuffBuffer(fbb, offset);
+
+ ScalarStuff scalarStuff = ScalarStuff.GetRootAsScalarStuff(fbb.DataBuffer);
+ Assert.AreEqual((sbyte)5, scalarStuff.JustI8);
+ Assert.AreEqual((sbyte)5, scalarStuff.MaybeI8);
+ Assert.AreEqual((sbyte)5, scalarStuff.DefaultI8);
+ Assert.AreEqual((byte)6, scalarStuff.JustU8);
+ Assert.AreEqual((byte)6, scalarStuff.MaybeU8);
+ Assert.AreEqual((byte)6, scalarStuff.DefaultU8);
+
+ Assert.AreEqual((short)7, scalarStuff.JustI16);
+ Assert.AreEqual((short)7, scalarStuff.MaybeI16);
+ Assert.AreEqual((short)7, scalarStuff.DefaultI16);
+ Assert.AreEqual((ushort)8, scalarStuff.JustU16);
+ Assert.AreEqual((ushort)8, scalarStuff.MaybeU16);
+ Assert.AreEqual((ushort)8, scalarStuff.DefaultU16);
+
+ Assert.AreEqual((int)9, scalarStuff.JustI32);
+ Assert.AreEqual((int)9, scalarStuff.MaybeI32);
+ Assert.AreEqual((int)9, scalarStuff.DefaultI32);
+ Assert.AreEqual((uint)10, scalarStuff.JustU32);
+ Assert.AreEqual((uint)10, scalarStuff.MaybeU32);
+ Assert.AreEqual((uint)10, scalarStuff.DefaultU32);
+
+ Assert.AreEqual((long)11, scalarStuff.JustI64);
+ Assert.AreEqual((long)11, scalarStuff.MaybeI64);
+ Assert.AreEqual((long)11, scalarStuff.DefaultI64);
+ Assert.AreEqual((ulong)12, scalarStuff.JustU64);
+ Assert.AreEqual((ulong)12, scalarStuff.MaybeU64);
+ Assert.AreEqual((ulong)12, scalarStuff.DefaultU64);
+
+ Assert.AreEqual((float)13.0F, scalarStuff.JustF32);
+ Assert.AreEqual((float)13.0F, scalarStuff.MaybeF32);
+ Assert.AreEqual((float)13.0F, scalarStuff.DefaultF32);
+
+ Assert.AreEqual((double)14.0, scalarStuff.JustF64);
+ Assert.AreEqual((double)14.0, scalarStuff.MaybeF64);
+ Assert.AreEqual((double)14.0, scalarStuff.DefaultF64);
+
+ Assert.AreEqual(true, scalarStuff.JustBool);
+ Assert.AreEqual(true, scalarStuff.MaybeBool);
+ Assert.AreEqual(false, scalarStuff.DefaultBool);
+
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.JustEnum);
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.MaybeEnum);
+ Assert.AreEqual(OptionalByte.Two, scalarStuff.DefaultEnum);
}
}
}
diff --git a/tests/FlatBuffers.Test/NetTest.bat b/tests/FlatBuffers.Test/NetTest.bat
new file mode 100644
index 0000000..3b88b53
--- /dev/null
+++ b/tests/FlatBuffers.Test/NetTest.bat
@@ -0,0 +1,20 @@
+@echo off
+@REM Builds a .NET solution file, adds the project, builds it
+@REM and executes it. Cleans up all generated files and directories.
+
+set TEMP_BIN=.tmp
+
+@REM Run the .NET Core tests
+set CORE_FILE=FlatBuffers.Core.Test
+set CORE_PROJ_FILE=%CORE_FILE%.csproj
+set CORE_SLN_FILE=%CORE_FILE%.sln
+dotnet new sln --force --name %CORE_FILE%
+dotnet sln %CORE_SLN_FILE% add %CORE_PROJ_FILE%
+dotnet build -c Release -o %TEMP_BIN% -v quiet %CORE_PROJ_FILE%
+%TEMP_BIN%\%CORE_FILE%.exe
+del /f %CORE_SLN_FILE%
+
+@REM TODO(dbaileychess): Support the other configurations in NetTest.sh
+
+@REM remove the temp bin directory, with files (/S) and quietly (/Q)
+RD /S /Q %TEMP_BIN%
diff --git a/tests/FlatBuffers.Test/NetTest.sh b/tests/FlatBuffers.Test/NetTest.sh
old mode 100644
new mode 100755
index 3822b49..f8adf29
--- a/tests/FlatBuffers.Test/NetTest.sh
+++ b/tests/FlatBuffers.Test/NetTest.sh
@@ -1,23 +1,54 @@
#!/bin/sh
-# Testing C# on Linux using Mono.
+PROJ_FILE=FlatBuffers.Test.csproj
+CORE_PROJ_FILE=FlatBuffers.Core.Test.csproj
-mcs -debug -out:./fbnettest.exe \
- ../../net/FlatBuffers/*.cs ../MyGame/Example/*.cs ../MyGame/*.cs ../union_vector/*.cs \
- FlatBuffersTestClassAttribute.cs FlatBuffersTestMethodAttribute.cs Assert.cs FlatBuffersExampleTests.cs Program.cs ByteBufferTests.cs FlatBufferBuilderTests.cs FlatBuffersFuzzTests.cs FuzzTestData.cs Lcg.cs TestTable.cs
-mono --debug ./fbnettest.exe
-rm fbnettest.exe
-rm Resources/monsterdata_cstest.mon
-rm Resources/monsterdata_cstest_sp.mon
+TEMP_DOTNET_DIR=.dotnet_tmp
+TEMP_BIN=.tmp
+
+[ -d $TEMP_DOTNET_DIR ] || mkdir $TEMP_DOTNET_DIR
+
+[ -f dotnet-install.sh ] || curl -OL https://dot.net/v1/dotnet-install.sh
+
+./dotnet-install.sh --version latest --install-dir $TEMP_DOTNET_DIR
+
+DOTNET=$TEMP_DOTNET_DIR/dotnet
+
+$DOTNET new sln
+$DOTNET sln add $PROJ_FILE
+$DOTNET restore -r linux-x64 $PROJ_FILE
+
+# Testing C# on Linux using Mono.
+msbuild -property:Configuration=Release,OutputPath=$TEMP_BIN -verbosity:minimal $PROJ_FILE
+mono $TEMP_BIN/FlatBuffers.Test.exe
+rm -fr $TEMP_BIN
# Repeat with unsafe versions
+msbuild -property:Configuration=Release,UnsafeByteBuffer=true,OutputPath=$TEMP_BIN -verbosity:minimal $PROJ_FILE
+mono $TEMP_BIN/FlatBuffers.Test.exe
+rm -fr $TEMP_BIN
-mcs -debug -out:./fbnettest.exe \
- -unsafe -d:UNSAFE_BYTEBUFFER \
- ../../net/FlatBuffers/*.cs ../MyGame/Example/*.cs ../MyGame/*.cs ../union_vector/*.cs\
- FlatBuffersTestClassAttribute.cs FlatBuffersTestMethodAttribute.cs Assert.cs FlatBuffersExampleTests.cs Program.cs ByteBufferTests.cs FlatBufferBuilderTests.cs FlatBuffersFuzzTests.cs FuzzTestData.cs Lcg.cs TestTable.cs
-mono --debug ./fbnettest.exe
-rm fbnettest.exe
-rm Resources/monsterdata_cstest.mon
-rm Resources/monsterdata_cstest_sp.mon
+rm FlatBuffers.Test.sln
+rm -rf obj
+$DOTNET new sln
+$DOTNET sln add $CORE_PROJ_FILE
+$DOTNET restore -r linux-x64 $CORE_PROJ_FILE
+
+# Testing C# on Linux using .Net Core.
+msbuild -property:Configuration=Release,OutputPath=$TEMP_BIN -verbosity:minimal $CORE_PROJ_FILE
+$TEMP_BIN/FlatBuffers.Core.Test.exe
+rm -fr $TEMP_BIN
+
+# Repeat with unsafe versions
+msbuild -property:Configuration=Release,UnsafeByteBuffer=true,OutputPath=$TEMP_BIN -verbosity:minimal $CORE_PROJ_FILE
+$TEMP_BIN/FlatBuffers.Core.Test.exe
+rm -fr $TEMP_BIN
+
+# Repeat with SpanT versions
+msbuild -property:Configuration=Release,EnableSpanT=true,OutputPath=$TEMP_BIN -verbosity:minimal $CORE_PROJ_FILE
+$TEMP_BIN/FlatBuffers.Core.Test.exe
+rm -fr $TEMP_BIN
+
+rm FlatBuffers.Core.Test.sln
+rm -rf obj
diff --git a/tests/FlatBuffers.Test/README.md b/tests/FlatBuffers.Test/README.md
new file mode 100644
index 0000000..41b6983
--- /dev/null
+++ b/tests/FlatBuffers.Test/README.md
@@ -0,0 +1,38 @@
+# .NET Tests
+
+## Running on Linux
+
+### Prerequisites
+To run the tests on a Linux a few prerequisites are needed:
+
+1) mono
+2) msbuild
+
+### Running
+
+To run the tests:
+
+```
+./NetTest.sh
+```
+
+This will download the .NET installer and core SDK if those are not already
+installed. Then it will build the tests using `msbuild` and run the resulting
+test binary with `mono`.
+
+After running the tests, the downloaded .NET installer and SDK are *not* removed
+as they can be reused in subsequent invocations. The files are ignored by git by
+default, and can remain in the working directory.
+
+### Cleaning
+
+If you want to clean up the downloaded .NET installer and SDK, run:
+
+```
+./clean.sh
+```
+
+This will wipe away the downloaded files and directories. Those will be
+automatically re-downloaded when running `NetTest.sh`.
+
+
diff --git a/tests/FlatBuffers.Test/Resources/monsterdata_test.mon b/tests/FlatBuffers.Test/Resources/monsterdata_test.mon
deleted file mode 100644
index 3f83972..0000000
--- a/tests/FlatBuffers.Test/Resources/monsterdata_test.mon
+++ /dev/null
Binary files differ
diff --git a/tests/FlatBuffers.Test/clean.sh b/tests/FlatBuffers.Test/clean.sh
new file mode 100755
index 0000000..41f6a4a
--- /dev/null
+++ b/tests/FlatBuffers.Test/clean.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Remove files and directory that are needed to build and run the .NET tests.
+# The script NetTest.sh installs these as needed.
+
+[ -d .dotnet_tmp ] && rm -rf .dotnet_tmp
+[ -d packages ] && rm -rf packages
+[ -d .tmp ] && rm -rf .tmp
+[ -f nuget.exe ] && rm nuget.exe
+[ -f dotnet-intall.sh ] && rm dotnet-install.sh
diff --git a/tests/FlatBuffers.Test/packages.config b/tests/FlatBuffers.Test/packages.config
new file mode 100644
index 0000000..d766d04
--- /dev/null
+++ b/tests/FlatBuffers.Test/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net35" />
+</packages>
\ No newline at end of file
diff --git a/tests/GoTest.sh b/tests/GoTest.sh
index e69f0d8..60ef927 100755
--- a/tests/GoTest.sh
+++ b/tests/GoTest.sh
@@ -20,7 +20,7 @@
go_src=${go_path}/src
# Emit Go code for the example schema in the test dir:
-../flatc -g -I include_test monster_test.fbs
+../flatc -g --gen-object-api -I include_test monster_test.fbs
# Go requires a particular layout of files in order to link multiple packages.
# Copy flatbuffer Go files to their own package directories to compile the
diff --git a/tests/JavaScriptFlexBuffersTest.js b/tests/JavaScriptFlexBuffersTest.js
new file mode 100644
index 0000000..11c46c9
--- /dev/null
+++ b/tests/JavaScriptFlexBuffersTest.js
@@ -0,0 +1,389 @@
+// Run this using JavaScriptTest.sh
+var assert = require('assert');
+var fs = require('fs');
+
+var flexbuffers = require('../js/flexbuffers').flexbuffers;
+global.flexbuffers = flexbuffers;
+
+function main() {
+ testSingleValueBuffers();
+ testGoldBuffer();
+ testEncode();
+ testIndirectAdd();
+ testIndirectWithCache();
+ testMapBuilder();
+ testRoundTrip();
+ testRoundTripWithBuilder();
+ testDeduplicationOff();
+ testBugWhereOffestWereStoredAsIntInsteadOfUInt();
+}
+
+function testSingleValueBuffers() {
+ { // null
+ const ref = flexbuffers.toReference(new Uint8Array([0, 0, 1]).buffer);
+ assert.strictEqual(true, ref.isNull());
+ }
+
+ function _assert(object, buffer) {
+ assert.deepStrictEqual(flexbuffers.toObject(new Uint8Array(buffer).buffer), object);
+ }
+ _assert(true, [1, 104, 1]);
+ _assert(false, [0, 104, 1]);
+ _assert(25, [25, 4, 1]);
+ _assert(-25, [231, 4, 1]);
+ _assert(230, [230, 8, 1]);
+ _assert(230, [230, 0, 5, 2]);
+ _assert(-1025, [255, 251, 5, 2]);
+ _assert(1025, [1, 4, 9, 2]);
+ _assert(2147483647, [255, 255, 255, 127, 6, 4]);
+ _assert(-2147483648, [0, 0, 0, 128, 6, 4]);
+ _assert(4294967295n, [255, 255, 255, 255, 0, 0, 0, 0, 7, 8]);
+ _assert(9223372036854775807n, [255, 255, 255, 255, 255, 255, 255, 127, 7, 8]);
+ _assert(-9223372036854775808n, [0, 0, 0, 0, 0, 0, 0, 128, 7, 8]);
+ _assert(18446744073709551615n, [255, 255, 255, 255, 255, 255, 255, 255, 11, 8]);
+ _assert(4.5, [0, 0, 144, 64, 14, 4]);
+ _assert(0.10000000149011612, [205, 204, 204, 61, 14, 4]);
+ _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);
+ _assert(-1025, [255, 251, 5, 2]);
+ _assert("Maxim", [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);
+ _assert("hello 😱", [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);
+ _assert({a:12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);
+ _assert({"":45, "a": 12}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);
+}
+
+function testEncode() {
+ function _assert(value, buffer) {
+ assert.deepStrictEqual(flexbuffers.encode(value), new Uint8Array(buffer));
+ }
+ _assert(null, [0, 0, 1]);
+ _assert(true, [1, 104, 1]);
+ _assert(false, [0, 104, 1]);
+ _assert(1, [1, 4, 1]);
+ _assert(230, [230, 0, 5, 2]);
+ _assert(1025, [1, 4, 5, 2]);
+ _assert(-1025, [255, 251, 5, 2]);
+ _assert(0x100000001, [1, 0, 0, 0, 1, 0, 0, 0, 7, 8]);
+ _assert(0.1, [154, 153, 153, 153, 153, 153, 185, 63, 15, 8]);
+ _assert(0.5, [0, 0, 0, 63, 14, 4]);
+ _assert(new Uint8Array([1, 2, 3]), [3, 1, 2, 3, 3, 100, 1]);
+ _assert("Maxim", [5, 77, 97, 120, 105, 109, 0, 6, 20, 1]);
+ _assert("hello 😱", [10, 104, 101, 108, 108, 111, 32, 240, 159, 152, 177, 0, 11, 20, 1]);
+ _assert([1, 2], [1, 2, 2, 64, 1]);
+ _assert([-1, 256], [255, 255, 0, 1, 4, 65, 1]);
+ _assert([-45, 256000], [211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1]);
+ _assert([1.1, -256.0], [2, 0, 0, 0, 0, 0, 0, 0, 154, 153, 153, 153, 153, 153, 241, 63, 0, 255, 255, 255, 255, 255, 255, 255, 15, 5, 18, 43, 1]);
+ _assert([1, 2, 4], [1, 2, 4, 3, 76, 1]);
+ _assert([-1, 256, 4], [255, 255, 0, 1, 4, 0, 6, 77, 1]);
+ _assert([[61], 64], [1, 61, 2, 2, 64, 44, 4, 4, 40, 1]);
+ _assert(["foo", "bar", "baz"], [3, 102, 111, 111, 0, 3, 98, 97, 114, 0, 3, 98, 97, 122, 0, 3, 15, 11, 7, 3, 60, 1]);
+ _assert(["foo", "bar", "baz", "foo", "bar", "baz"], [3, 102, 111, 111, 0, 3, 98, 97, 114, 0, 3, 98, 97, 122, 0, 6, 15, 11, 7, 18, 14, 10, 6, 60, 1]);
+ _assert([true, false, true], [3, 1, 0, 1, 3, 144, 1]);
+ _assert(['foo', 1, -5, 1.3, true], [
+ 3, 102, 111, 111, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 251, 255, 255, 255, 255, 255, 255, 255,
+ 205, 204, 204, 204, 204, 204, 244, 63,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 20, 4, 4, 15, 104, 45, 43, 1
+ ]);
+ _assert([1, 3.3, 'max', true, null, false], [
+ 3, 109, 97, 120, 0, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 102, 102, 102, 102, 102, 102, 10, 64,
+ 31, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 15, 20, 104, 0, 104, 54, 43, 1
+ ]);
+ _assert({"a": 12}, [97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]);
+ _assert({"a": 12, "":45}, [0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]);
+ // JS currently does not support key vector offset sharing
+ _assert([{'something':12}, {'something': 45}], [
+ 115, 111, 109, 101, 116, 104, 105, 110, 103, 0,
+ 1, 11, 1, 1, 1, 12, 4, 6, 1, 1, 45, 4, 2, 8, 4, 36, 36, 4, 40, 1
+ ]);
+}
+
+function testDeduplicationOff() {
+ let buffer = flexbuffers.encode([{'something':12}, {'something': 45}], 1, true, true, false);
+ assert.deepStrictEqual(buffer, new Uint8Array([
+ 115, 111, 109, 101, 116, 104, 105, 110, 103,
+ 0, 1, 11, 1, 1, 1, 12, 4, 1,
+ 18, 1, 1, 1, 45, 4, 2, 10, 4,
+ 36, 36, 4, 40, 1
+ ]));
+
+ buffer = flexbuffers.encode([{'something':12}, {'something': 45}], 1, true, false, false);
+ assert.deepStrictEqual(buffer, new Uint8Array([
+ 115, 111, 109, 101, 116, 104, 105, 110, 103, 0,
+ 1, 11, 1, 1, 1, 12, 4, 115, 111, 109,
+ 101, 116, 104, 105, 110, 103, 0, 1, 11, 1,
+ 1, 1, 45, 4, 2, 20, 4, 36, 36, 4,
+ 40, 1
+ ]));
+
+ buffer = flexbuffers.encode(['something', 'something', 'dark'], 1, true, false, false);
+ assert.deepStrictEqual(buffer, new Uint8Array([
+ 9, 115, 111, 109, 101, 116, 104,
+ 105, 110, 103, 0, 4, 100, 97,
+ 114, 107, 0, 3, 17, 18, 8,
+ 3, 60, 1
+ ]));
+
+ buffer = flexbuffers.encode(['something', 'something', 'dark'], 1, false, false, false);
+ assert.deepStrictEqual(buffer, new Uint8Array([
+ 9, 115, 111, 109, 101, 116, 104, 105, 110,
+ 103, 0, 9, 115, 111, 109, 101, 116, 104,
+ 105, 110, 103, 0, 4, 100, 97, 114, 107,
+ 0, 3, 28, 18, 8, 3, 60, 1
+ ]));
+}
+
+function testIndirectAdd() {
+ function _assertInt(buffer, value, indirect = false, cache = false) {
+ const builder = flexbuffers.builder();
+ builder.addInt(value, indirect, cache);
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+ function _assertUInt(buffer, value, indirect = false, cache = false) {
+ const builder = flexbuffers.builder();
+ builder.addUInt(value, indirect, cache);
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+ function _assertFloat(buffer, value, indirect = false, cache = false) {
+ const builder = flexbuffers.builder();
+ builder.addFloat(value, indirect, cache);
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+ _assertInt([0, 4, 1], 0);
+ _assertInt([0, 1, 24, 1], 0, true);
+ _assertInt([255, 0, 5, 2], 255);
+
+ _assertUInt([0, 8, 1], 0);
+ _assertUInt([0, 1, 28, 1], 0, true);
+ _assertUInt([255, 8, 1], 255);
+
+ _assertUInt([185, 115, 175, 118, 250, 84, 8, 0, 11, 8], 2345234523452345);
+ _assertUInt([185, 115, 175, 118, 250, 84, 8, 0, 8, 31, 1], 2345234523452345, true);
+ _assertInt([185, 115, 175, 118, 250, 84, 8, 0, 7, 8], 2345234523452345);
+ _assertInt([185, 115, 175, 118, 250, 84, 8, 0, 8, 27, 1], 2345234523452345, true);
+
+ _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 15, 8], 0.1);
+ _assertFloat([154, 153, 153, 153, 153, 153, 185, 63, 8, 35, 1], 0.1, true);
+ _assertFloat([0, 0, 0, 0, 14, 4], 0);
+ _assertFloat([0, 0, 0, 0, 4, 34, 1], 0, true);
+}
+
+function testIndirectWithCache() {
+ function _assertInt(buffer, values) {
+ const builder = flexbuffers.builder();
+ builder.startVector();
+ values.forEach(v => {
+ builder.addInt(v, true, true)
+ });
+ builder.end();
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+
+ function _assertUInt(buffer, values) {
+ const builder = flexbuffers.builder();
+ builder.startVector();
+ values.forEach(v => {
+ builder.addUInt(v, true, true);
+ });
+ builder.end();
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+
+ function _assertFloat(buffer, values) {
+ const builder = flexbuffers.builder();
+ builder.startVector();
+ values.forEach(v => {
+ builder.addFloat(v, true, true);
+ });
+ builder.end();
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array(buffer));
+ }
+
+ _assertInt(
+ [185, 115, 175, 118, 250, 84, 8, 0, 4, 9, 10, 11, 12, 27, 27, 27, 27, 8, 40, 1],
+ [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]
+ );
+
+ _assertUInt(
+ [185, 115, 175, 118, 250, 84, 8, 0, 4, 9, 10, 11, 12, 31, 31, 31, 31, 8, 40, 1],
+ [2345234523452345, 2345234523452345, 2345234523452345, 2345234523452345]
+ );
+
+ _assertFloat(
+ [154, 153, 153, 153, 153, 153, 185, 63, 4, 9, 10, 11, 12, 35, 35, 35, 35, 8, 40, 1],
+ [0.1, 0.1, 0.1, 0.1]
+ );
+}
+
+function testMapBuilder() {
+ const builder = flexbuffers.builder();
+ builder.startMap();
+ builder.addKey('a');
+ builder.add(12);
+ builder.addKey('');
+ builder.add(45);
+ builder.end();
+ const data = builder.finish();
+ assert.deepStrictEqual(data, new Uint8Array([97, 0, 0, 2, 2, 5, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]));
+}
+
+function testRoundTrip() {
+ const example = {
+ "age": 35,
+ "flags": [true, false, true, true],
+ "weight": 72.5,
+ "name": "Maxim",
+ "address": {
+ "city": "Bla",
+ "zip": "12345",
+ "countryCode": "XX",
+ }
+ };
+
+ function _assert(value) {
+ let buffer = flexbuffers.encode(value, 1);
+ let o = flexbuffers.toObject(buffer.buffer);
+ assert.deepStrictEqual(o, value);
+ }
+
+ _assert(example);
+ _assert(0x100000001n);
+}
+
+function testRoundTripWithBuilder() {
+ const example = {
+ "age": 35,
+ "flags": [true, false, true, true],
+ "weight": 72.5,
+ "name": "Maxim",
+ "address": {
+ "city": "Bla",
+ "zip": "12345",
+ "countryCode": "XX",
+ }
+ };
+
+ const builder = flexbuffers.builder();
+ builder.startMap();
+
+ builder.addKey('age');
+ builder.add(35);
+
+ builder.addKey('flags');
+ builder.startVector();
+ builder.add(true);
+ builder.add(false);
+ builder.add(true);
+ builder.add(true);
+ builder.end();
+
+ builder.addKey("weight");
+ builder.add(72.5);
+
+ builder.addKey("name");
+ builder.add("Maxim");
+
+ builder.addKey("address");
+
+ builder.startMap();
+ builder.addKey("city");
+ builder.add("Bla");
+ builder.addKey("zip");
+ builder.add("12345");
+ builder.addKey("countryCode");
+ builder.add("XX");
+ builder.end();
+
+ builder.end();
+
+ const data = builder.finish();
+ let o = flexbuffers.toObject(data.buffer);
+ assert.deepStrictEqual(o, example);
+
+ let root = flexbuffers.toReference(data.buffer);
+ assert.strictEqual(root.isMap(), true);
+ assert.strictEqual(root.get("age").numericValue(), 35);
+ assert.strictEqual(root.get("age").intValue(), 35);
+ assert.strictEqual(root.get("name").stringValue(), "Maxim");
+ assert.strictEqual(root.get("weight").floatValue(), 72.5);
+ assert.strictEqual(root.get("weight").numericValue(), 72.5);
+ let flags = root.get("flags");
+ assert.strictEqual(flags.isVector(), true);
+ assert.strictEqual(flags.length(), 4);
+ assert.strictEqual(flags.get(0).boolValue(), true);
+ assert.strictEqual(flags.get(1).boolValue(), false);
+ assert.strictEqual(flags.get(2).boolValue(), true);
+ assert.strictEqual(flags.get(3).boolValue(), true);
+
+ let address = root.get("address");
+ assert.strictEqual(address.isMap(), true);
+ assert.strictEqual(address.length(), 3);
+ assert.strictEqual(address.get("city").stringValue(), "Bla");
+ assert.strictEqual(address.get("zip").stringValue(), "12345");
+ assert.strictEqual(address.get("countryCode").stringValue(), "XX");
+}
+
+function testGoldBuffer() {
+ const data = new Uint8Array(fs.readFileSync('gold_flexbuffer_example.bin')).buffer;
+ const b1 = flexbuffers.toReference(data).get("bools").get(1);
+ assert.strictEqual(b1.isBool(), true);
+ assert.strictEqual(b1.boolValue(), false);
+
+ const blob = flexbuffers.toReference(data).get("vec").get(3);
+ assert.strictEqual(blob.isBlob(), true);
+ assert.deepStrictEqual(blob.blobValue(), new Uint8Array([77]));
+
+ const o = flexbuffers.toObject(data);
+ assert.deepStrictEqual(o, {
+ bool: true,
+ bools: [true, false, true, false],
+ bar: [1, 2, 3],
+ bar3: [1, 2, 3],
+ foo: 100,
+ mymap: {foo:'Fred'},
+ vec: [-100, 'Fred', 4, new Uint8Array([77]), false, 4]
+ });
+}
+
+function testBugWhereOffestWereStoredAsIntInsteadOfUInt() {
+ // Reported in https://github.com/google/flatbuffers/issues/5949#issuecomment-688421193
+ const object = {'channels_in': 64, 'dilation_height_factor': 1, 'dilation_width_factor': 1, 'fused_activation_function': 1, 'pad_values': 1, 'padding': 0, 'stride_height': 1, 'stride_width': 1};
+ let data1 = flexbuffers.encode(object);
+ const data = [99, 104, 97, 110, 110, 101, 108, 115, 95, 105, 110, 0,
+ 100, 105, 108, 97, 116, 105, 111, 110, 95, 104, 101, 105, 103, 104, 116, 95, 102, 97, 99, 116, 111, 114, 0,
+ 100, 105, 108, 97, 116, 105, 111, 110, 95, 119, 105, 100, 116, 104, 95, 102, 97, 99, 116, 111, 114, 0,
+ 102, 117, 115, 101, 100, 95, 97, 99, 116, 105, 118, 97, 116, 105, 111, 110, 95, 102, 117, 110, 99, 116, 105, 111, 110, 0,
+ 112, 97, 100, 95, 118, 97, 108, 117, 101, 115, 0, 112, 97, 100, 100, 105, 110, 103, 0,
+ 115, 116, 114, 105, 100, 101, 95, 104, 101, 105, 103, 104, 116, 0,
+ 115, 116, 114, 105, 100, 101, 95, 119, 105, 100, 116, 104, 0,
+ 8, 130, 119, 97, 76, 51, 41, 34, 21, 8, 1, 8, 64, 1, 1, 1, 1, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 16, 36, 1];
+ let object2 = flexbuffers.toObject(new Uint8Array(data).buffer);
+ let object1 = flexbuffers.toObject(new Uint8Array(data1).buffer);
+ assert.deepStrictEqual(object, object2);
+ assert.deepStrictEqual(object, object1);
+ assert.strictEqual(data.length, data1.length);
+ let ref = flexbuffers.toReference(new Uint8Array(data).buffer);
+ assert.strictEqual(ref.isMap(), true);
+ assert.strictEqual(ref.length(), 8);
+ assert.strictEqual(ref.get("channels_in").numericValue(), 64);
+ assert.strictEqual(ref.get("padding").isNumber(), true);
+}
+
+main();
+
diff --git a/tests/JavaScriptTest.js b/tests/JavaScriptTest.js
index 7116daa..2d7afc5 100644
--- a/tests/JavaScriptTest.js
+++ b/tests/JavaScriptTest.js
@@ -3,8 +3,12 @@
var fs = require('fs');
var flatbuffers = require('../js/flatbuffers').flatbuffers;
+global.flatbuffers = flatbuffers;
+
var MyGame = require(process.argv[2]).MyGame;
+var isTsTest = !!process.env.FB_TS_TEST;
+
function main() {
// First, let's test reading a FlatBuffer generated by C++ code:
@@ -24,6 +28,10 @@
createMonster(fbb);
serializeAndTest(fbb);
+ if(isTsTest) {
+ testObjApiPack(fbb);
+ }
+
// clear the builder, repeat tests
var clearIterations = 100;
var startingCapacity = fbb.bb.capacity();
@@ -31,6 +39,10 @@
fbb.clear();
createMonster(fbb);
serializeAndTest(fbb);
+
+ if(isTsTest) {
+ testObjApiPack(fbb);
+ }
}
// the capacity of our buffer shouldn't increase with the same size payload
assert.strictEqual(fbb.bb.capacity(), startingCapacity);
@@ -38,7 +50,9 @@
test64bit();
testUnicode();
fuzzTest1();
-
+ testNullStrings();
+ testSharedStrings();
+
console.log('FlatBuffers test: completed successfully');
}
@@ -109,6 +123,56 @@
// TODO: There is not the availability to mutate structs or vectors.
}
+function testObjApiPack(fbb) {
+ fbb.clear();
+ createMonster(fbb);
+ let monster_t = MyGame.Example.Monster.getRootAsMonster(fbb.dataBuffer()).unpack();
+ fbb.clear();
+ MyGame.Example.Monster.finishMonsterBuffer(fbb, monster_t.pack(fbb));
+ serializeAndTest(fbb);
+}
+
+function testObjApiUnpack(monster) {
+ assert.strictEqual(monster.hp, 80);
+ assert.strictEqual(monster.mana, 150); // default
+
+ assert.strictEqual(monster.name, 'MyMonster');
+
+ let pos = monster.pos;
+ assert.strictEqual(pos.x, 1);
+ assert.strictEqual(pos.y, 2);
+ assert.strictEqual(pos.z, 3);
+ assert.strictEqual(pos.test1, 3);
+ assert.strictEqual(pos.test2, MyGame.Example.Color.Green);
+ let test3 = pos.test3;
+ assert.strictEqual(test3.a, 5);
+ assert.strictEqual(test3.b, 6);
+
+ assert.strictEqual(monster.testType, MyGame.Example.Any.Monster);
+ let monster2 = monster.test;
+ assert.strictEqual(monster2 != null, true);
+ assert.strictEqual(monster2 instanceof MyGame.Example.MonsterT, true);
+ assert.strictEqual(monster2.name, 'Fred');
+
+ assert.strictEqual(monster.inventory.length, 5);
+ let invsum = 0;
+ for (let i = 0; i < monster.inventory.length; i++) {
+ invsum += monster.inventory[i];
+ }
+ assert.strictEqual(invsum, 10);
+
+ let test_0 = monster.test4[0];
+ let test_1 = monster.test4[1];
+ assert.strictEqual(monster.test4.length, 2);
+ assert.strictEqual(test_0.a + test_0.b + test_1.a + test_1.b, 100);
+
+ assert.strictEqual(monster.testarrayofstring.length, 2);
+ assert.strictEqual(monster.testarrayofstring[0], 'test1');
+ assert.strictEqual(monster.testarrayofstring[1], 'test2');
+
+ assert.strictEqual(monster.testbool, true);
+}
+
function testBuffer(bb) {
assert.ok(MyGame.Example.Monster.bufferHasIdentifier(bb));
@@ -158,6 +222,15 @@
assert.strictEqual(monster.testarrayofstring(1), 'test2');
assert.strictEqual(monster.testbool(), true);
+
+ if(isTsTest) {
+ let monster_t = monster.unpack();
+ testObjApiUnpack(monster_t);
+
+ let monster2_t = new MyGame.Example.MonsterT();
+ monster.unpackTo(monster2_t);
+ testObjApiUnpack(monster2_t);
+ }
}
function test64bit() {
@@ -366,4 +439,19 @@
}
}
+function testSharedStrings() {
+ var shared_string = "Hello world";
+ var builder = new flatbuffers.Builder();
+ let mainOffset = builder.createSharedString(shared_string);
+ assert.strictEqual(builder.createSharedString(shared_string), mainOffset);
+}
+
+function testNullStrings() {
+ var builder = new flatbuffers.Builder();
+ assert.strictEqual(builder.createString(null), 0);
+ assert.strictEqual(builder.createSharedString(null), 0);
+ assert.strictEqual(builder.createString(undefined), 0);
+ assert.strictEqual(builder.createSharedString(undefined), 0);
+}
+
main();
diff --git a/tests/JavaScriptTest.sh b/tests/JavaScriptTest.sh
index c0286a0..707af71 100755
--- a/tests/JavaScriptTest.sh
+++ b/tests/JavaScriptTest.sh
@@ -16,4 +16,9 @@
pushd "$(dirname $0)" >/dev/null
../flatc -b -I include_test monster_test.fbs unicode_test.json
-node JavaScriptTest ./monster_test_generated
+../flatc --js -o js --gen-name-strings --gen-mutable --no-fb-import -I include_test monster_test.fbs
+node JavaScriptTest ./js/monster_test_generated
+
+../flatc --js --gen-name-strings -o js --no-fb-import union_vector/union_vector.fbs
+node JavaScriptUnionVectorTest ./js/union_vector_generated
+node JavaScriptFlexBuffersTest
diff --git a/tests/JavaScriptUnionVectorTest.js b/tests/JavaScriptUnionVectorTest.js
index d79669f..f03a327 100644
--- a/tests/JavaScriptUnionVectorTest.js
+++ b/tests/JavaScriptUnionVectorTest.js
@@ -3,38 +3,16 @@
var flatbuffers = require('../js/flatbuffers').flatbuffers;
var Test = require(process.argv[2]);
-function main() {
- var fbb = new flatbuffers.Builder();
+var isTsTest = !!process.env.FB_TS_TEST;
- var charTypes = [
- Test.Character.Belle,
- Test.Character.MuLan,
- Test.Character.BookFan,
- ];
+var charTypes = [
+ Test.Character.Belle,
+ Test.Character.MuLan,
+ Test.Character.BookFan,
+];
+if(isTsTest) { charTypes.push(Test.Character.Other); }
- Test.Attacker.startAttacker(fbb);
- Test.Attacker.addSwordAttackDamage(fbb, 5);
- var attackerOffset = Test.Attacker.endAttacker(fbb);
-
- var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
- var charsOffset = Test.Movie.createCharactersVector(
- fbb,
- [
- Test.BookReader.createBookReader(fbb, 7),
- attackerOffset,
- Test.BookReader.createBookReader(fbb, 2),
- ]
- );
-
- Test.Movie.startMovie(fbb);
- Test.Movie.addCharactersType(fbb, charTypesOffset);
- Test.Movie.addCharacters(fbb, charsOffset);
- Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb));
-
- var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
-
- var movie = Test.Movie.getRootAsMovie(buf);
-
+function testMovieBuf(movie) {
assert.strictEqual(movie.charactersTypeLength(), charTypes.length);
assert.strictEqual(movie.charactersLength(), movie.charactersTypeLength());
@@ -51,6 +29,98 @@
var bookReader2 = movie.characters(2, new Test.BookReader());
assert.strictEqual(bookReader2.booksRead(), 2);
+ if(isTsTest) {
+ var other = movie.characters(3, '');
+ assert.strictEqual(other, "I am other");
+ }
+}
+
+function testMovieUnpack(movie) {
+ assert.strictEqual(movie.charactersType.length, charTypes.length);
+ assert.strictEqual(movie.characters.length, movie.charactersType.length);
+
+ for (var i = 0; i < charTypes.length; ++i) {
+ assert.strictEqual(movie.charactersType[i], charTypes[i]);
+ }
+
+ var bookReader7 = movie.characters[0];
+ assert.strictEqual(bookReader7 instanceof Test.BookReaderT, true);
+ assert.strictEqual(bookReader7.booksRead, 7);
+
+ var attacker = movie.characters[1];
+ assert.strictEqual(attacker instanceof Test.AttackerT, true);
+ assert.strictEqual(attacker.swordAttackDamage, 5);
+
+ var bookReader2 = movie.characters[2];
+ assert.strictEqual(bookReader2 instanceof Test.BookReaderT, true);
+ assert.strictEqual(bookReader2.booksRead, 2);
+
+ if(isTsTest) {
+ var other = movie.characters[3];
+ assert.strictEqual(other, "I am other");
+ }
+}
+
+function createMovie(fbb) {
+ Test.Attacker.startAttacker(fbb);
+ Test.Attacker.addSwordAttackDamage(fbb, 5);
+ var attackerOffset = Test.Attacker.endAttacker(fbb);
+
+ var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
+ var charsOffset = 0;
+
+ if(isTsTest) {
+ let otherOffset = fbb.createString("I am other");
+
+ charsOffset = Test.Movie.createCharactersVector(
+ fbb,
+ [
+ Test.BookReader.createBookReader(fbb, 7),
+ attackerOffset,
+ Test.BookReader.createBookReader(fbb, 2),
+ otherOffset
+ ]
+ );
+ } else {
+ charsOffset = Test.Movie.createCharactersVector(
+ fbb,
+ [
+ Test.BookReader.createBookReader(fbb, 7),
+ attackerOffset,
+ Test.BookReader.createBookReader(fbb, 2)
+ ]
+ );
+ }
+
+ Test.Movie.startMovie(fbb);
+ Test.Movie.addCharactersType(fbb, charTypesOffset);
+ Test.Movie.addCharacters(fbb, charsOffset);
+ Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb))
+}
+
+function main() {
+ var fbb = new flatbuffers.Builder();
+
+ createMovie(fbb);
+
+ var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
+
+ var movie = Test.Movie.getRootAsMovie(buf);
+ testMovieBuf(movie);
+
+ if(isTsTest) {
+ testMovieUnpack(movie.unpack());
+
+ var movie_to = new Test.MovieT();
+ movie.unpackTo(movie_to);
+ testMovieUnpack(movie_to);
+
+ fbb.clear();
+ Test.Movie.finishMovieBuffer(fbb, movie_to.pack(fbb));
+ var unpackBuf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
+ testMovieBuf(Test.Movie.getRootAsMovie(unpackBuf));
+ }
+
console.log('FlatBuffers union vector test: completed successfully');
}
diff --git a/tests/JavaTest.java b/tests/JavaTest.java
index 6505767..23ebb5b 100644
--- a/tests/JavaTest.java
+++ b/tests/JavaTest.java
@@ -1,3 +1,37 @@
+
+import static com.google.flatbuffers.Constants.*;
+
+import MyGame.Example.*;
+import optional_scalars.ScalarStuff;
+import optional_scalars.OptionalByte;
+import MyGame.MonsterExtra;
+import NamespaceA.*;
+import NamespaceA.NamespaceB.*;
+import com.google.flatbuffers.ByteBufferUtil;
+import com.google.flatbuffers.ByteVector;
+import com.google.flatbuffers.FlatBufferBuilder;
+import com.google.flatbuffers.FlexBuffers;
+import com.google.flatbuffers.FlexBuffersBuilder;
+import com.google.flatbuffers.StringVector;
+import com.google.flatbuffers.UnionVector;
+
+import com.google.flatbuffers.FlexBuffers.FlexBufferException;
+import com.google.flatbuffers.FlexBuffers.Reference;
+import com.google.flatbuffers.FlexBuffers.Vector;
+import com.google.flatbuffers.ArrayReadWriteBuf;
+import com.google.flatbuffers.FlexBuffers.KeyVector;
+
+import java.io.*;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.CharBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
/*
* Copyright 2014 Google Inc. All rights reserved.
*
@@ -14,17 +48,7 @@
* limitations under the License.
*/
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.channels.FileChannel;
-import MyGame.Example.*;
-import NamespaceA.*;
-import NamespaceA.NamespaceB.*;
-import com.google.flatbuffers.ByteBufferUtil;
-import static com.google.flatbuffers.Constants.*;
-import com.google.flatbuffers.FlatBufferBuilder;
-import MyGame.MonsterExtra;
+
class JavaTest {
public static void main(String[] args) {
@@ -77,6 +101,14 @@
TestFixedLengthArrays();
+ TestFlexBuffers();
+
+ TestVectorOfBytes();
+
+ TestSharedStringPool();
+
+ TestScalarOptional();
+
System.out.println("FlatBuffers test: completed successfully");
}
@@ -120,6 +152,14 @@
invsum += monster.inventory(i);
TestEq(invsum, 10);
+ // Method using a vector access object:
+ ByteVector inventoryVector = monster.inventoryVector();
+ TestEq(inventoryVector.length(), 5);
+ invsum = 0;
+ for (int i = 0; i < inventoryVector.length(); i++)
+ invsum += inventoryVector.getAsUnsigned(i);
+ TestEq(invsum, 10);
+
// Alternative way of accessing a vector:
ByteBuffer ibb = monster.inventoryAsByteBuffer();
invsum = 0;
@@ -132,10 +172,22 @@
TestEq(monster.test4Length(), 2);
TestEq(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);
+ Test.Vector test4Vector = monster.test4Vector();
+ test_0 = test4Vector.get(0);
+ test_1 = test4Vector.get(1);
+ TestEq(test4Vector.length(), 2);
+ TestEq(test_0.a() + test_0.b() + test_1.a() + test_1.b(), 100);
+
TestEq(monster.testarrayofstringLength(), 2);
TestEq(monster.testarrayofstring(0),"test1");
TestEq(monster.testarrayofstring(1),"test2");
+ // Method using a vector access object:
+ StringVector testarrayofstringVector = monster.testarrayofstringVector();
+ TestEq(testarrayofstringVector.length(), 2);
+ TestEq(testarrayofstringVector.get(0),"test1");
+ TestEq(testarrayofstringVector.get(1),"test2");
+
TestEq(monster.testbool(), true);
}
@@ -212,6 +264,10 @@
TestEq(monsterObject.inventory(1), (int)inventory[1]);
TestEq(monsterObject.inventoryLength(), inventory.length);
+ ByteVector inventoryVector = monsterObject.inventoryVector();
+ TestEq(inventoryVector.getAsUnsigned(1), (int)inventory[1]);
+ TestEq(inventoryVector.length(), inventory.length);
+
TestEq(ByteBuffer.wrap(inventory), monsterObject.inventoryAsByteBuffer());
}
@@ -233,6 +289,9 @@
TestEq(monsterObject.inventory(1), (int)inventory[1]);
TestEq(monsterObject.inventoryLength(), inventory.length);
+ ByteVector inventoryVector = monsterObject.inventoryVector();
+ TestEq(inventoryVector.getAsUnsigned(1), (int)inventory[1]);
+ TestEq(inventoryVector.length(), inventory.length);
TestEq(ByteBuffer.wrap(inventory), monsterObject.inventoryAsByteBuffer());
}
@@ -242,7 +301,9 @@
public ByteBuffer newByteBuffer(int capacity) {
ByteBuffer bb;
try {
- bb = new RandomAccessFile("javatest.bin", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, capacity).order(ByteOrder.LITTLE_ENDIAN);
+ RandomAccessFile f = new RandomAccessFile("javatest.bin", "rw");
+ bb = f.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, capacity).order(ByteOrder.LITTLE_ENDIAN);
+ f.close();
} catch(Throwable e) {
System.out.println("FlatBuffers test: couldn't map ByteBuffer to a file");
bb = null;
@@ -380,18 +441,21 @@
TestEq(monster.testarrayoftables(0).name(), "Barney");
TestEq(monster.testarrayoftables(1).name(), "Frodo");
TestEq(monster.testarrayoftables(2).name(), "Wilma");
+ Monster.Vector testarrayoftablesVector = monster.testarrayoftablesVector();
+ TestEq(testarrayoftablesVector.get(0).name(), "Barney");
+ TestEq(testarrayoftablesVector.get(1).name(), "Frodo");
+ TestEq(testarrayoftablesVector.get(2).name(), "Wilma");
// Example of searching for a table by the key
TestEq(monster.testarrayoftablesByKey("Frodo").name(), "Frodo");
TestEq(monster.testarrayoftablesByKey("Barney").name(), "Barney");
TestEq(monster.testarrayoftablesByKey("Wilma").name(), "Wilma");
+ TestEq(testarrayoftablesVector.getByKey("Frodo").name(), "Frodo");
+ TestEq(testarrayoftablesVector.getByKey("Barney").name(), "Barney");
+ TestEq(testarrayoftablesVector.getByKey("Wilma").name(), "Wilma");
// testType is an existing field and mutating it should succeed
TestEq(monster.testType(), (byte)Any.Monster);
- TestEq(monster.mutateTestType(Any.NONE), true);
- TestEq(monster.testType(), (byte)Any.NONE);
- TestEq(monster.mutateTestType(Any.Monster), true);
- TestEq(monster.testType(), (byte)Any.Monster);
//mutate the inventory vector
TestEq(monster.mutateInventory(0, 1), true);
@@ -403,6 +467,10 @@
for (int i = 0; i < monster.inventoryLength(); i++) {
TestEq(monster.inventory(i), i + 1);
}
+ ByteVector inventoryVector = monster.inventoryVector();
+ for (int i = 0; i < inventoryVector.length(); i++) {
+ TestEq((int)inventoryVector.get(i), i + 1);
+ }
//reverse mutation
TestEq(monster.mutateInventory(0, 0), true);
@@ -445,11 +513,16 @@
);
final Movie movie = Movie.getRootAsMovie(fbb.dataBuffer());
+ ByteVector charactersTypeByteVector = movie.charactersTypeVector();
+ UnionVector charactersVector = movie.charactersVector();
TestEq(movie.charactersTypeLength(), characterTypeVector.length);
+ TestEq(charactersTypeByteVector.length(), characterTypeVector.length);
TestEq(movie.charactersLength(), characterVector.length);
+ TestEq(charactersVector.length(), characterVector.length);
TestEq(movie.charactersType(0), characterTypeVector[0]);
+ TestEq(charactersTypeByteVector.get(0), characterTypeVector[0]);
TestEq(((Attacker)movie.characters(new Attacker(), 0)).swordAttackDamage(), swordAttackDamage);
}
@@ -463,6 +536,9 @@
int[][] d_a = new int[2][2];
byte[] d_b = new byte[2];
byte[][] d_c = new byte[2][2];
+ long[][] d_d = new long[2][2];
+ int e;
+ long[] f = new long[2];
a = 0.5f;
for (int i = 0; i < 15; i++) b[i] = i;
@@ -477,9 +553,16 @@
d_c[0][1] = TestEnum.B;
d_c[1][0] = TestEnum.C;
d_c[1][1] = TestEnum.B;
+ d_d[0][0] = -1;
+ d_d[0][1] = 1;
+ d_d[1][0] = -2;
+ d_d[1][1] = 2;
+ e = 2;
+ f[0] = -1;
+ f[1] = 1;
int arrayOffset = ArrayStruct.createArrayStruct(builder,
- a, b, c, d_a, d_b, d_c);
+ a, b, c, d_a, d_b, d_c, d_d, e, f);
// Create a table with the ArrayStruct.
ArrayTable.startArrayTable(builder);
@@ -504,14 +587,807 @@
TestEq(table.a().d(nested, 0).c(1), TestEnum.B);
TestEq(table.a().d(nested, 1).c(0), TestEnum.C);
TestEq(table.a().d(nested, 1).c(1), TestEnum.B);
+ TestEq(table.a().d(nested, 0).d(0), (long)-1);
+ TestEq(table.a().d(nested, 0).d(1), (long)1);
+ TestEq(table.a().d(nested, 1).d(0), (long)-2);
+ TestEq(table.a().d(nested, 1).d(1), (long)2);
+ TestEq(table.a().e(), 2);
+ TestEq(table.a().f(0), (long)-1);
+ TestEq(table.a().f(1), (long)1);
+ }
+
+ public static void testFlexBuffersTest() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
+ FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
+ testFlexBuffersTest(builder);
+ int bufferLimit1 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();
+
+ // Repeat after clearing the builder to ensure the builder is reusable
+ builder.clear();
+ testFlexBuffersTest(builder);
+ int bufferLimit2 = ((ArrayReadWriteBuf) builder.getBuffer()).limit();
+ TestEq(bufferLimit1, bufferLimit2);
+ }
+
+ public static void testFlexBuffersTest(FlexBuffersBuilder builder) {
+ // Write the equivalent of:
+ // { vec: [ -100, "Fred", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ],
+ // foo: 100, bool: true, mymap: { foo: "Fred" } }
+ // It's possible to do this without std::function support as well.
+ int map1 = builder.startMap();
+
+ int vec1 = builder.startVector();
+ builder.putInt(-100);
+ builder.putString("Fred");
+ builder.putBlob(new byte[]{(byte) 77});
+ builder.putBoolean(false);
+ builder.putInt(Long.MAX_VALUE);
+
+ int map2 = builder.startMap();
+ builder.putInt("test", 200);
+ builder.endMap(null, map2);
+
+ builder.putFloat(150.9);
+ builder.putFloat(150.9999998);
+ builder.endVector("vec", vec1, false, false);
+
+ vec1 = builder.startVector();
+ builder.putInt(1);
+ builder.putInt(2);
+ builder.putInt(3);
+ builder.endVector("bar", vec1, true, false);
+
+ vec1 = builder.startVector();
+ builder.putBoolean(true);
+ builder.putBoolean(false);
+ builder.putBoolean(true);
+ builder.putBoolean(false);
+ builder.endVector("bools", vec1, true, false);
+
+ builder.putBoolean("bool", true);
+ builder.putFloat("foo", 100);
+
+ map2 = builder.startMap();
+ builder.putString("bar", "Fred"); // Testing key and string reuse.
+ builder.putInt("int", -120);
+ builder.putFloat("float", -123.0f);
+ builder.putBlob("blob", new byte[]{ 65, 67 });
+ builder.endMap("mymap", map2);
+
+ builder.endMap(null, map1);
+ builder.finish();
+
+ FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();
+
+ TestEq(m.size(), 6);
+
+ // test empty (an null)
+ TestEq(m.get("no_key").asString(), ""); // empty if fail
+ TestEq(m.get("no_key").asMap(), FlexBuffers.Map.empty()); // empty if fail
+ TestEq(m.get("no_key").asKey(), FlexBuffers.Key.empty()); // empty if fail
+ TestEq(m.get("no_key").asVector(), FlexBuffers.Vector.empty()); // empty if fail
+ TestEq(m.get("no_key").asBlob(), FlexBuffers.Blob.empty()); // empty if fail
+ assert(m.get("no_key").asVector().isEmpty()); // empty if fail
+
+ // testing "vec" field
+ FlexBuffers.Vector vec = m.get("vec").asVector();
+ TestEq(vec.size(), 8);
+ TestEq(vec.get(0).asLong(), (long) -100);
+ TestEq(vec.get(1).asString(), "Fred");
+ TestEq(vec.get(2).isBlob(), true);
+ TestEq(vec.get(2).asBlob().size(), 1);
+ TestEq(vec.get(2).asBlob().data().get(0), (byte) 77);
+ TestEq(vec.get(3).isBoolean(), true); // Check if type is a bool
+ TestEq(vec.get(3).asBoolean(), false); // Check if value is false
+ TestEq(vec.get(4).asLong(), Long.MAX_VALUE);
+ TestEq(vec.get(5).isMap(), true);
+ TestEq(vec.get(5).asMap().get("test").asInt(), 200);
+ TestEq(Float.compare((float)vec.get(6).asFloat(), 150.9f), 0);
+ TestEq(Double.compare(vec.get(7).asFloat(), 150.9999998), 0);
+ TestEq((long)0, (long)vec.get(1).asLong()); //conversion fail returns 0 as C++
+
+ // bar vector
+ FlexBuffers.Vector tvec = m.get("bar").asVector();
+ TestEq(tvec.size(), 3);
+ TestEq(tvec.get(0).asInt(), 1);
+ TestEq(tvec.get(1).asInt(), 2);
+ TestEq(tvec.get(2).asInt(), 3);
+ TestEq(((FlexBuffers.TypedVector) tvec).getElemType(), FlexBuffers.FBT_INT);
+
+ // bools vector
+ FlexBuffers.Vector bvec = m.get("bools").asVector();
+ TestEq(bvec.size(), 4);
+ TestEq(bvec.get(0).asBoolean(), true);
+ TestEq(bvec.get(1).asBoolean(), false);
+ TestEq(bvec.get(2).asBoolean(), true);
+ TestEq(bvec.get(3).asBoolean(), false);
+ TestEq(((FlexBuffers.TypedVector) bvec).getElemType(), FlexBuffers.FBT_BOOL);
+
+
+ TestEq((float)m.get("foo").asFloat(), (float) 100);
+ TestEq(m.get("unknown").isNull(), true);
+
+ // mymap vector
+ FlexBuffers.Map mymap = m.get("mymap").asMap();
+ TestEq(mymap.keys().get(0), m.keys().get(0)); // These should be equal by pointer equality, since key and value are shared.
+ TestEq(mymap.keys().get(0).toString(), "bar");
+ TestEq(mymap.values().get(0).asString(), vec.get(1).asString());
+ TestEq(mymap.get("int").asInt(), -120);
+ TestEq((float)mymap.get("float").asFloat(), -123.0f);
+ TestEq(Arrays.equals(mymap.get("blob").asBlob().getBytes(), new byte[]{ 65, 67 }), true);
+ TestEq(mymap.get("blob").asBlob().toString(), "AC");
+ TestEq(mymap.get("blob").toString(), "\"AC\"");
+ }
+
+ public static void testFlexBufferVectorStrings() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000000));
+
+ int size = 3000;
+ StringBuilder sb = new StringBuilder();
+ for (int i=0; i< size; i++) {
+ sb.append("a");
+ }
+
+ String text = sb.toString();
+ TestEq(text.length(), size);
+
+ int pos = builder.startVector();
+
+ for (int i=0; i<size; i++) {
+ builder.putString(text);
+ }
+
+ try {
+ builder.endVector(null, pos, true, false);
+ // this should raise an exception as
+ // typed vector of string was deprecated
+ assert false;
+ } catch(FlexBufferException fb) {
+ // no op
+ }
+ // we finish the vector again as non-typed
+ builder.endVector(null, pos, false, false);
+
+ ByteBuffer b = builder.finish();
+ Vector v = FlexBuffers.getRoot(b).asVector();
+
+ TestEq(v.size(), size);
+ for (int i=0; i<size; i++) {
+ TestEq(v.get(i).asString().length(), size);
+ TestEq(v.get(i).asString(), text);
+ }
+ }
+
+ public static void testDeprecatedTypedVectorString() {
+ // tests whether we are able to support reading deprecated typed vector string
+ // data is equivalent to [ "abc", "abc", "abc", "abc"]
+ byte[] data = new byte[] {0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00,
+ 0x03, 0x61, 0x62, 0x63, 0x00, 0x03, 0x61, 0x62, 0x63, 0x00, 0x04, 0x14, 0x10,
+ 0x0c, 0x08, 0x04, 0x3c, 0x01};
+ Reference ref = FlexBuffers.getRoot(ByteBuffer.wrap(data));
+ TestEq(ref.getType(), FlexBuffers.FBT_VECTOR_STRING_DEPRECATED);
+ TestEq(ref.isTypedVector(), true);
+ Vector vec = ref.asVector();
+ for (int i=0; i< vec.size(); i++) {
+ TestEq("abc", vec.get(i).asString());
+ }
+ }
+
+ public static void testSingleElementBoolean() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(100));
+ builder.putBoolean(true);
+ ByteBuffer b = builder.finish();
+ assert(FlexBuffers.getRoot(b).asBoolean());
+ }
+
+ public static void testSingleElementByte() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putInt(10);
+ ByteBuffer b = builder.finish();
+ TestEq(10, FlexBuffers.getRoot(b).asInt());
+ }
+
+ public static void testSingleElementShort() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putInt(Short.MAX_VALUE);
+ ByteBuffer b = builder.finish();
+ TestEq(Short.MAX_VALUE, (short)FlexBuffers.getRoot(b).asInt());
+ }
+
+ public static void testSingleElementInt() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putInt(Integer.MIN_VALUE);
+ ByteBuffer b = builder.finish();
+ TestEq(Integer.MIN_VALUE, FlexBuffers.getRoot(b).asInt());
+ }
+
+ public static void testSingleElementLong() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putInt(Long.MAX_VALUE);
+ ByteBuffer b = builder.finish();
+ TestEq(Long.MAX_VALUE, FlexBuffers.getRoot(b).asLong());
+ }
+
+ public static void testSingleElementFloat() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putFloat(Float.MAX_VALUE);
+ ByteBuffer b = builder.finish();
+ TestEq(Float.compare(Float.MAX_VALUE, (float) FlexBuffers.getRoot(b).asFloat()), 0);
+ }
+
+ public static void testSingleElementDouble() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putFloat(Double.MAX_VALUE);
+ ByteBuffer b = builder.finish();
+ TestEq(Double.compare(Double.MAX_VALUE, FlexBuffers.getRoot(b).asFloat()), 0);
+ }
+
+ public static void testSingleElementBigString() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));
+ StringBuilder sb = new StringBuilder();
+
+ for (int i=0; i< 3000; i++) {
+ sb.append("a");
+ }
+
+ builder.putString(sb.toString());
+ ByteBuffer b = builder.finish();
+
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+
+ TestEq(FlexBuffers.FBT_STRING, r.getType());
+ TestEq(sb.toString(), r.asString());
+ }
+
+ public static void testSingleElementSmallString() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(10000));
+
+ builder.putString("aa");
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+
+ TestEq(FlexBuffers.FBT_STRING, r.getType());
+ TestEq("aa", r.asString());
+ }
+
+ public static void testSingleElementBlob() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putBlob(new byte[]{5, 124, 118, -1});
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+ byte[] result = r.asBlob().getBytes();
+ TestEq((byte)5, result[0]);
+ TestEq((byte)124, result[1]);
+ TestEq((byte)118, result[2]);
+ TestEq((byte)-1, result[3]);
+ }
+
+ public static void testSingleElementUByte() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putUInt(0xFF);
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+ TestEq(255, (int)r.asUInt());
+ }
+
+ public static void testSingleElementUShort() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putUInt(0xFFFF);
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+ TestEq(65535, (int)r.asUInt());
+ }
+
+ public static void testSingleElementUInt() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ builder.putUInt(0xFFFF_FFFFL);
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+ TestEq(4294967295L, r.asUInt());
+ }
+
+ public static void testSingleFixedTypeVector() {
+
+ int[] ints = new int[]{5, 124, 118, -1};
+ float[] floats = new float[]{5.5f, 124.124f, 118.118f, -1.1f};
+ String[] strings = new String[]{"This", "is", "a", "typed", "array"};
+ boolean[] booleans = new boolean[]{false, true, true, false};
+
+
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
+ FlexBuffersBuilder.BUILDER_FLAG_NONE);
+
+ int mapPos = builder.startMap();
+
+ int vecPos = builder.startVector();
+ for (final int i : ints) {
+ builder.putInt(i);
+ }
+ builder.endVector("ints", vecPos, true, false);
+
+ vecPos = builder.startVector();
+ for (final float i : floats) {
+ builder.putFloat(i);
+ }
+ builder.endVector("floats", vecPos, true, false);
+
+ vecPos = builder.startVector();
+ for (final boolean i : booleans) {
+ builder.putBoolean(i);
+ }
+ builder.endVector("booleans", vecPos, true, false);
+
+ builder.endMap(null, mapPos);
+
+
+ ByteBuffer b = builder.finish();
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b);
+ assert(r.asMap().get("ints").isTypedVector());
+ assert(r.asMap().get("floats").isTypedVector());
+ assert(r.asMap().get("booleans").isTypedVector());
+ }
+
+ public static void testSingleElementVector() {
+ FlexBuffersBuilder b = new FlexBuffersBuilder();
+
+ int vecPos = b.startVector();
+ b.putInt(99);
+ b.putString("wow");
+ int vecpos2 = b.startVector();
+ b.putInt(99);
+ b.putString("wow");
+ b.endVector(null, vecpos2, false, false);
+ b.endVector(null, vecPos, false, false);
+ b.finish();
+
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());
+ TestEq(FlexBuffers.FBT_VECTOR, r.getType());
+ FlexBuffers.Vector vec = FlexBuffers.getRoot(b.getBuffer()).asVector();
+ TestEq(3, vec.size());
+ TestEq(99, vec.get(0).asInt());
+ TestEq("wow", vec.get(1).asString());
+ TestEq("[ 99, \"wow\" ]", vec.get(2).toString());
+ TestEq("[ 99, \"wow\", [ 99, \"wow\" ] ]", FlexBuffers.getRoot(b.getBuffer()).toString());
+ }
+
+ public static void testSingleElementMap() {
+ FlexBuffersBuilder b = new FlexBuffersBuilder();
+
+ int mapPost = b.startMap();
+ b.putInt("myInt", 0x7fffffbbbfffffffL);
+ b.putString("myString", "wow");
+ b.putString("myString2", "incredible");
+ int start = b.startVector();
+ b.putInt(99);
+ b.putString("wow");
+ b.endVector("myVec", start, false, false);
+
+ b.putFloat("double", 0x1.ffffbbbffffffP+1023);
+ b.endMap(null, mapPost);
+ b.finish();
+
+ FlexBuffers.Reference r = FlexBuffers.getRoot(b.getBuffer());
+ TestEq(FlexBuffers.FBT_MAP, r.getType());
+ FlexBuffers.Map map = FlexBuffers.getRoot(b.getBuffer()).asMap();
+ TestEq(5, map.size());
+ TestEq(0x7fffffbbbfffffffL, map.get("myInt").asLong());
+ TestEq("wow", map.get("myString").asString());
+ TestEq("incredible", map.get("myString2").asString());
+ TestEq(99, map.get("myVec").asVector().get(0).asInt());
+ TestEq("wow", map.get("myVec").asVector().get(1).asString());
+ TestEq(Double.compare(0x1.ffffbbbffffffP+1023, map.get("double").asFloat()), 0);
+ TestEq("{ \"double\" : 1.7976894783391937E308, \"myInt\" : 9223371743723257855, \"myString\" : \"wow\", \"myString2\" : \"incredible\", \"myVec\" : [ 99, \"wow\" ] }",
+ FlexBuffers.getRoot(b.getBuffer()).toString());
+ }
+
+ public static void testFlexBuferEmpty() {
+ FlexBuffers.Blob blob = FlexBuffers.Blob.empty();
+ FlexBuffers.Map ary = FlexBuffers.Map.empty();
+ FlexBuffers.Vector map = FlexBuffers.Vector.empty();
+ FlexBuffers.TypedVector typedAry = FlexBuffers.TypedVector.empty();
+ TestEq(blob.size(), 0);
+ TestEq(map.size(), 0);
+ TestEq(ary.size(), 0);
+ TestEq(typedAry.size(), 0);
+ }
+
+ public static void testHashMapToMap() {
+ int entriesCount = 12;
+
+ HashMap<String, String> source = new HashMap<>();
+ for (int i = 0; i < entriesCount; i++) {
+ source.put("foo_param_" + i, "foo_value_" + i);
+ }
+
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(1000);
+ int mapStart = builder.startMap();
+ for (Map.Entry<String, String> entry : source.entrySet()) {
+ builder.putString(entry.getKey(), entry.getValue());
+ }
+ builder.endMap(null, mapStart);
+ ByteBuffer bb = builder.finish();
+ bb.rewind();
+
+ FlexBuffers.Reference rootReference = FlexBuffers.getRoot(bb);
+
+ TestEq(rootReference.isMap(), true);
+
+ FlexBuffers.Map flexMap = rootReference.asMap();
+
+ FlexBuffers.KeyVector keys = flexMap.keys();
+ FlexBuffers.Vector values = flexMap.values();
+
+ TestEq(entriesCount, keys.size());
+ TestEq(entriesCount, values.size());
+
+ HashMap<String, String> result = new HashMap<>();
+ for (int i = 0; i < keys.size(); i++) {
+ result.put(keys.get(i).toString(), values.get(i).asString());
+ }
+
+ TestEq(source, result);
+ }
+
+ public static void testBuilderGrowth() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder();
+ String someString = "This is a small string";
+ builder.putString(someString);
+ ByteBuffer b = builder.finish();
+ TestEq(someString, FlexBuffers.getRoot(b).asString());
+
+ FlexBuffersBuilder failBuilder = new FlexBuffersBuilder(ByteBuffer.allocate(1));
+ failBuilder.putString(someString);
+ }
+
+ public static void testFlexBuffersUtf8Map() {
+ FlexBuffersBuilder builder = new FlexBuffersBuilder(ByteBuffer.allocate(512),
+ FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
+
+ String key0 = "😨 face1";
+ String key1 = "😩 face2";
+ String key2 = "😨 face3";
+ String key3 = "trademark ®";
+ String key4 = "€ euro";
+ String utf8keys[] = { "😨 face1", "😩 face2", "😨 face3", "trademark ®", "€ euro"};
+
+ int map = builder.startMap();
+
+ for (int i=0; i< utf8keys.length; i++) {
+ builder.putString(utf8keys[i], utf8keys[i]); // Testing key and string reuse.
+ }
+ builder.endMap(null, map);
+ builder.finish();
+
+ FlexBuffers.Map m = FlexBuffers.getRoot(builder.getBuffer()).asMap();
+
+ TestEq(m.size(), 5);
+
+ KeyVector kv = m.keys();
+ for (int i=0; i< utf8keys.length; i++) {
+ TestEq(kv.get(i).toString(), m.get(i).asString());
+ }
+
+ TestEq(m.get(key0).asString(), utf8keys[0]);
+ TestEq(m.get(key1).asString(), utf8keys[1]);
+ TestEq(m.get(key2).asString(), utf8keys[2]);
+ TestEq(m.get(key3).asString(), utf8keys[3]);
+ TestEq(m.get(key4).asString(), utf8keys[4]);
+ }
+
+ public static void TestFlexBuffers() {
+ testSingleElementByte();
+ testSingleElementShort();
+ testSingleElementInt();
+ testSingleElementLong();
+ testSingleElementFloat();
+ testSingleElementDouble();
+ testSingleElementSmallString();
+ testSingleElementBigString();
+ testSingleElementBlob();
+ testSingleElementVector();
+ testSingleFixedTypeVector();
+ testSingleElementUShort();
+ testSingleElementUInt();
+ testSingleElementUByte();
+ testSingleElementMap();
+ testFlexBuffersTest();
+ testHashMapToMap();
+ testFlexBuferEmpty();
+ testFlexBufferVectorStrings();
+ testDeprecatedTypedVectorString();
+ testBuilderGrowth();
+ testFlexBuffersUtf8Map();
+ }
+
+ static void TestVectorOfBytes() {
+ FlatBufferBuilder fbb = new FlatBufferBuilder(16);
+ int str = fbb.createString("ByteMonster");
+ byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+ int offset = Monster.createInventoryVector(fbb, data);
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ int monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject.inventoryLength(), data.length);
+ TestEq(monsterObject.inventory(4), (int) data[4]);
+ TestEq(ByteBuffer.wrap(data), monsterObject.inventoryAsByteBuffer());
+
+ fbb.clear();
+ ByteBuffer bb = ByteBuffer.wrap(data);
+ offset = fbb.createByteVector(bb);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject2 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject2.inventoryLength(), data.length);
+ for (int i = 0; i < data.length; i++) {
+ TestEq(monsterObject2.inventory(i), (int) bb.get(i));
+ }
+
+ fbb.clear();
+ offset = fbb.createByteVector(data, 3, 4);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject3 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject3.inventoryLength(), 4);
+ TestEq(monsterObject3.inventory(0), (int) data[3]);
+
+ fbb.clear();
+ bb = ByteBuffer.wrap(data);
+ offset = Monster.createInventoryVector(fbb, bb);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject4 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject4.inventoryLength(), data.length);
+ TestEq(monsterObject4.inventory(8), (int) 8);
+
+ fbb.clear();
+ byte[] largeData = new byte[1024];
+ offset = fbb.createByteVector(largeData);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject5 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject5.inventoryLength(), largeData.length);
+ TestEq(monsterObject5.inventory(25), (int) largeData[25]);
+
+ fbb.clear();
+ bb = ByteBuffer.wrap(largeData);
+ bb.position(512);
+ ByteBuffer bb2 = bb.slice();
+ TestEq(bb2.arrayOffset(), 512);
+ offset = fbb.createByteVector(bb2);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject6 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject6.inventoryLength(), 512);
+ TestEq(monsterObject6.inventory(0), (int) largeData[512]);
+
+ fbb.clear();
+ bb = ByteBuffer.wrap(largeData);
+ bb.limit(256);
+ offset = fbb.createByteVector(bb);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject7 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject7.inventoryLength(), 256);
+
+ fbb.clear();
+ bb = ByteBuffer.allocateDirect(2048);
+ offset = fbb.createByteVector(bb);
+ str = fbb.createString("ByteMonster");
+ Monster.startMonster(fbb);
+ Monster.addName(fbb, str);
+ Monster.addInventory(fbb, offset);
+ monster1 = Monster.endMonster(fbb);
+ Monster.finishMonsterBuffer(fbb, monster1);
+ Monster monsterObject8 = Monster.getRootAsMonster(fbb.dataBuffer());
+
+ TestEq(monsterObject8.inventoryLength(), 2048);
+ }
+
+ static void TestSharedStringPool() {
+ FlatBufferBuilder fb = new FlatBufferBuilder(1);
+ String testString = "My string";
+ int offset = fb.createSharedString(testString);
+ for (int i=0; i< 10; i++) {
+ TestEq(offset, fb.createSharedString(testString));
+ }
+ }
+
+ static void TestScalarOptional() {
+ FlatBufferBuilder fbb = new FlatBufferBuilder(1);
+ ScalarStuff.startScalarStuff(fbb);
+ int pos = ScalarStuff.endScalarStuff(fbb);
+ fbb.finish(pos);
+
+ ScalarStuff scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());
+ TestEq(scalarStuff.justI8(), (byte)0);
+ TestEq(scalarStuff.maybeI8(), (byte)0);
+ TestEq(scalarStuff.defaultI8(), (byte)42);
+ TestEq(scalarStuff.justU8(), 0);
+ TestEq(scalarStuff.maybeU8(), 0);
+ TestEq(scalarStuff.defaultU8(), 42);
+ TestEq(scalarStuff.justI16(), (short)0);
+ TestEq(scalarStuff.maybeI16(), (short)0);
+ TestEq(scalarStuff.defaultI16(), (short)42);
+ TestEq(scalarStuff.justU16(), 0);
+ TestEq(scalarStuff.maybeU16(), 0);
+ TestEq(scalarStuff.defaultU16(), 42);
+ TestEq(scalarStuff.justI32(), 0);
+ TestEq(scalarStuff.maybeI32(), 0);
+ TestEq(scalarStuff.defaultI32(), 42);
+ TestEq(scalarStuff.justU32(), 0L);
+ TestEq(scalarStuff.maybeU32(), 0L);
+ TestEq(scalarStuff.defaultU32(), 42L);
+ TestEq(scalarStuff.justI64(), 0L);
+ TestEq(scalarStuff.maybeI64(), 0L);
+ TestEq(scalarStuff.defaultI64(), 42L);
+ TestEq(scalarStuff.justU64(), 0L);
+ TestEq(scalarStuff.maybeU64(), 0L);
+ TestEq(scalarStuff.defaultU64(), 42L);
+ TestEq(scalarStuff.justF32(), 0.0f);
+ TestEq(scalarStuff.maybeF32(), 0f);
+ TestEq(scalarStuff.defaultF32(), 42.0f);
+ TestEq(scalarStuff.justF64(), 0.0);
+ TestEq(scalarStuff.maybeF64(), 0.0);
+ TestEq(scalarStuff.defaultF64(), 42.0);
+ TestEq(scalarStuff.justBool(), false);
+ TestEq(scalarStuff.maybeBool(), false);
+ TestEq(scalarStuff.defaultBool(), true);
+ TestEq(scalarStuff.justEnum(), OptionalByte.None);
+ TestEq(scalarStuff.maybeEnum(), OptionalByte.None);
+ TestEq(scalarStuff.defaultEnum(), OptionalByte.One);
+
+ TestEq(scalarStuff.hasMaybeI8(), false);
+ TestEq(scalarStuff.hasMaybeI16(), false);
+ TestEq(scalarStuff.hasMaybeI32(), false);
+ TestEq(scalarStuff.hasMaybeI64(), false);
+ TestEq(scalarStuff.hasMaybeU8(), false);
+ TestEq(scalarStuff.hasMaybeU16(), false);
+ TestEq(scalarStuff.hasMaybeU32(), false);
+ TestEq(scalarStuff.hasMaybeU64(), false);
+ TestEq(scalarStuff.hasMaybeF32(), false);
+ TestEq(scalarStuff.hasMaybeF64(), false);
+ TestEq(scalarStuff.hasMaybeBool(), false);
+ TestEq(scalarStuff.hasMaybeEnum(), false);
+
+ fbb.clear();
+
+ ScalarStuff.startScalarStuff(fbb);
+ ScalarStuff.addJustI8(fbb, (byte)5);
+ ScalarStuff.addMaybeI8(fbb, (byte)5);
+ ScalarStuff.addDefaultI8(fbb, (byte)5);
+ ScalarStuff.addJustU8(fbb, 6);
+ ScalarStuff.addMaybeU8(fbb, 6);
+ ScalarStuff.addDefaultU8(fbb, 6);
+ ScalarStuff.addJustI16(fbb, (short)7);
+ ScalarStuff.addMaybeI16(fbb, (short)7);
+ ScalarStuff.addDefaultI16(fbb, (short)7);
+ ScalarStuff.addJustU16(fbb, 8);
+ ScalarStuff.addMaybeU16(fbb, 8);
+ ScalarStuff.addDefaultU16(fbb, 8);
+ ScalarStuff.addJustI32(fbb, 9);
+ ScalarStuff.addMaybeI32(fbb, 9);
+ ScalarStuff.addDefaultI32(fbb, 9);
+ ScalarStuff.addJustU32(fbb, (long)10);
+ ScalarStuff.addMaybeU32(fbb, (long)10);
+ ScalarStuff.addDefaultU32(fbb, (long)10);
+ ScalarStuff.addJustI64(fbb, 11L);
+ ScalarStuff.addMaybeI64(fbb, 11L);
+ ScalarStuff.addDefaultI64(fbb, 11L);
+ ScalarStuff.addJustU64(fbb, 12L);
+ ScalarStuff.addMaybeU64(fbb, 12L);
+ ScalarStuff.addDefaultU64(fbb, 12L);
+ ScalarStuff.addJustF32(fbb, 13.0f);
+ ScalarStuff.addMaybeF32(fbb, 13.0f);
+ ScalarStuff.addDefaultF32(fbb, 13.0f);
+ ScalarStuff.addJustF64(fbb, 14.0);
+ ScalarStuff.addMaybeF64(fbb, 14.0);
+ ScalarStuff.addDefaultF64(fbb, 14.0);
+ ScalarStuff.addJustBool(fbb, true);
+ ScalarStuff.addMaybeBool(fbb, true);
+ ScalarStuff.addDefaultBool(fbb, true);
+ ScalarStuff.addJustEnum(fbb, OptionalByte.Two);
+ ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two);
+ ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two);
+
+ pos = ScalarStuff.endScalarStuff(fbb);
+
+ fbb.finish(pos);
+
+ scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer());
+
+ TestEq(scalarStuff.justI8(), (byte)5);
+ TestEq(scalarStuff.maybeI8(), (byte)5);
+ TestEq(scalarStuff.defaultI8(), (byte)5);
+ TestEq(scalarStuff.justU8(), 6);
+ TestEq(scalarStuff.maybeU8(), 6);
+ TestEq(scalarStuff.defaultU8(), 6);
+ TestEq(scalarStuff.justI16(), (short)7);
+ TestEq(scalarStuff.maybeI16(), (short)7);
+ TestEq(scalarStuff.defaultI16(), (short)7);
+ TestEq(scalarStuff.justU16(), 8);
+ TestEq(scalarStuff.maybeU16(), 8);
+ TestEq(scalarStuff.defaultU16(), 8);
+ TestEq(scalarStuff.justI32(), 9);
+ TestEq(scalarStuff.maybeI32(), 9);
+ TestEq(scalarStuff.defaultI32(), 9);
+ TestEq(scalarStuff.justU32(), 10L);
+ TestEq(scalarStuff.maybeU32(), 10L);
+ TestEq(scalarStuff.defaultU32(), 10L);
+ TestEq(scalarStuff.justI64(), 11L);
+ TestEq(scalarStuff.maybeI64(), 11L);
+ TestEq(scalarStuff.defaultI64(), 11L);
+ TestEq(scalarStuff.justU64(), 12L);
+ TestEq(scalarStuff.maybeU64(), 12L);
+ TestEq(scalarStuff.defaultU64(), 12L);
+ TestEq(scalarStuff.justF32(), 13.0f);
+ TestEq(scalarStuff.maybeF32(), 13.0f);
+ TestEq(scalarStuff.defaultF32(), 13.0f);
+ TestEq(scalarStuff.justF64(), 14.0);
+ TestEq(scalarStuff.maybeF64(), 14.0);
+ TestEq(scalarStuff.defaultF64(), 14.0);
+ TestEq(scalarStuff.justBool(), true);
+ TestEq(scalarStuff.maybeBool(), true);
+ TestEq(scalarStuff.defaultBool(), true);
+ TestEq(scalarStuff.justEnum(), OptionalByte.Two);
+ TestEq(scalarStuff.maybeEnum(), OptionalByte.Two);
+ TestEq(scalarStuff.defaultEnum(), OptionalByte.Two);
+
+ TestEq(scalarStuff.hasMaybeI8(), true);
+ TestEq(scalarStuff.hasMaybeI16(), true);
+ TestEq(scalarStuff.hasMaybeI32(), true);
+ TestEq(scalarStuff.hasMaybeI64(), true);
+ TestEq(scalarStuff.hasMaybeU8(), true);
+ TestEq(scalarStuff.hasMaybeU16(), true);
+ TestEq(scalarStuff.hasMaybeU32(), true);
+ TestEq(scalarStuff.hasMaybeU64(), true);
+ TestEq(scalarStuff.hasMaybeF32(), true);
+ TestEq(scalarStuff.hasMaybeF64(), true);
+ TestEq(scalarStuff.hasMaybeBool(), true);
+ TestEq(scalarStuff.hasMaybeEnum(), true);
}
static <T> void TestEq(T a, T b) {
- if (!a.equals(b)) {
+ if ((a == null && a != b) || (a != null && !a.equals(b))) {
System.out.println("" + a.getClass().getName() + " " + b.getClass().getName());
System.out.println("FlatBuffers test FAILED: \'" + a + "\' != \'" + b + "\'");
+ new Throwable().printStackTrace();
assert false;
System.exit(1);
}
}
+
}
diff --git a/tests/JavaTest.sh b/tests/JavaTest.sh
index 58d8442..099447e 100755
--- a/tests/JavaTest.sh
+++ b/tests/JavaTest.sh
@@ -20,7 +20,7 @@
java -version
-testdir="$(readlink -fn "$(dirname "$0")")"
+testdir=$(dirname $0)
targetdir="${testdir}/target"
@@ -36,8 +36,8 @@
exit 1
fi
-javac -d "${targetdir}" -classpath "${testdir}/../java:${testdir}:${testdir}/namespace_test:${testdir}/union_vector" "${testdir}/JavaTest.java"
+javac -d "${targetdir}" -classpath "${testdir}/optional_scalars:${testdir}/../java:${testdir}:${testdir}/namespace_test:${testdir}/union_vector" "${testdir}/JavaTest.java"
-(cd "${testdir}" && java -classpath "${targetdir}" JavaTest )
+(cd "${testdir}" && java -ea -classpath "${targetdir}" JavaTest )
rm -rf "${targetdir}"
diff --git a/tests/KotlinTest.kt b/tests/KotlinTest.kt
index 07f0465..cfb7056 100644
--- a/tests/KotlinTest.kt
+++ b/tests/KotlinTest.kt
@@ -15,6 +15,7 @@
*/
import MyGame.Example.*
+import optional_scalars.*
import com.google.flatbuffers.ByteBufferUtil
import com.google.flatbuffers.FlatBufferBuilder
import NamespaceA.*
@@ -76,6 +77,8 @@
TestVectorOfUnions()
+ TestSharedStringPool()
+ TestScalarOptional()
println("FlatBuffers test: completed successfully")
}
@@ -146,7 +149,7 @@
val monster = Monster.getRootAsMonster(bb)
- assert(monster.testhashu32Fnv1 == (1u + Integer.MAX_VALUE.toUInt()))
+ assert(monster.testhashu32Fnv1 == (Integer.MAX_VALUE + 1L).toUInt())
}
fun TestNamespaceNesting() {
@@ -331,7 +334,7 @@
Monster.addTest4(fbb, test4)
Monster.addTestarrayofstring(fbb, testArrayOfString)
Monster.addTestbool(fbb, true)
- Monster.addTesthashu32Fnv1(fbb, UInt.MAX_VALUE + 1u)
+ Monster.addTesthashu32Fnv1(fbb, (Integer.MAX_VALUE + 1L).toUInt())
Monster.addTestarrayoftables(fbb, sortMons)
val mon = Monster.endMonster(fbb)
@@ -456,5 +459,143 @@
assert((movie.characters(Attacker(), 0) as Attacker).swordAttackDamage == swordAttackDamage)
}
-}
+
+ fun TestSharedStringPool() {
+ val fb = FlatBufferBuilder(1);
+ val testString = "My string";
+ val offset = fb.createSharedString(testString);
+ for (i in 0..10) {
+ assert(offset == fb.createSharedString(testString));
+ }
+ }
+
+ fun TestScalarOptional() {
+ val fbb = FlatBufferBuilder(1)
+ ScalarStuff.startScalarStuff(fbb)
+ var pos = ScalarStuff.endScalarStuff(fbb)
+ fbb.finish(pos)
+
+ var scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())
+
+ assert(scalarStuff.justI8 == 0.toByte())
+ assert(scalarStuff.maybeI8 == null)
+ assert(scalarStuff.defaultI8 == 42.toByte())
+ assert(scalarStuff.justU8 == 0.toUByte())
+ assert(scalarStuff.maybeU8 == null)
+ assert(scalarStuff.defaultU8 == 42.toUByte())
+ assert(scalarStuff.justI16 == 0.toShort())
+ assert(scalarStuff.maybeI16 == null)
+ assert(scalarStuff.defaultI16 == 42.toShort())
+ assert(scalarStuff.justU16 == 0.toUShort())
+ assert(scalarStuff.maybeU16 == null)
+ assert(scalarStuff.defaultU16 == 42.toUShort())
+ assert(scalarStuff.justI32 == 0)
+ assert(scalarStuff.maybeI32 == null)
+ assert(scalarStuff.defaultI32 == 42)
+ assert(scalarStuff.justU32 == 0.toUInt())
+ assert(scalarStuff.maybeU32 == null)
+ assert(scalarStuff.defaultU32 == 42U)
+ assert(scalarStuff.justI64 == 0L)
+ assert(scalarStuff.maybeI64 == null)
+ assert(scalarStuff.defaultI64 == 42L)
+ assert(scalarStuff.justU64 == 0UL)
+ assert(scalarStuff.maybeU64 == null)
+ assert(scalarStuff.defaultU64 == 42UL)
+ assert(scalarStuff.justF32 == 0.0f)
+ assert(scalarStuff.maybeF32 == null)
+ assert(scalarStuff.defaultF32 == 42.0f)
+ assert(scalarStuff.justF64 == 0.0)
+ assert(scalarStuff.maybeF64 == null)
+ assert(scalarStuff.defaultF64 == 42.0)
+ assert(scalarStuff.justBool == false)
+ assert(scalarStuff.maybeBool == null)
+ assert(scalarStuff.defaultBool == true)
+ assert(scalarStuff.justEnum == OptionalByte.None)
+ assert(scalarStuff.maybeEnum == null)
+ assert(scalarStuff.defaultEnum == OptionalByte.One)
+
+ fbb.clear()
+
+ ScalarStuff.startScalarStuff(fbb)
+ ScalarStuff.addJustI8(fbb, 5.toByte())
+ ScalarStuff.addMaybeI8(fbb, 5.toByte())
+ ScalarStuff.addDefaultI8(fbb, 5.toByte())
+ ScalarStuff.addJustU8(fbb, 6.toUByte())
+ ScalarStuff.addMaybeU8(fbb, 6.toUByte())
+ ScalarStuff.addDefaultU8(fbb, 6.toUByte())
+ ScalarStuff.addJustI16(fbb, 7.toShort())
+ ScalarStuff.addMaybeI16(fbb, 7.toShort())
+ ScalarStuff.addDefaultI16(fbb, 7.toShort())
+ ScalarStuff.addJustU16(fbb, 8.toUShort())
+ ScalarStuff.addMaybeU16(fbb, 8.toUShort())
+ ScalarStuff.addDefaultU16(fbb, 8.toUShort())
+ ScalarStuff.addJustI32(fbb, 9)
+ ScalarStuff.addMaybeI32(fbb, 9)
+ ScalarStuff.addDefaultI32(fbb, 9)
+ ScalarStuff.addJustU32(fbb, 10.toUInt())
+ ScalarStuff.addMaybeU32(fbb, 10.toUInt())
+ ScalarStuff.addDefaultU32(fbb, 10.toUInt())
+ ScalarStuff.addJustI64(fbb, 11L)
+ ScalarStuff.addMaybeI64(fbb, 11L)
+ ScalarStuff.addDefaultI64(fbb, 11L)
+ ScalarStuff.addJustU64(fbb, 12UL)
+ ScalarStuff.addMaybeU64(fbb, 12UL)
+ ScalarStuff.addDefaultU64(fbb, 12UL)
+ ScalarStuff.addJustF32(fbb, 13.0f)
+ ScalarStuff.addMaybeF32(fbb, 13.0f)
+ ScalarStuff.addDefaultF32(fbb, 13.0f)
+ ScalarStuff.addJustF64(fbb, 14.0)
+ ScalarStuff.addMaybeF64(fbb, 14.0)
+ ScalarStuff.addDefaultF64(fbb, 14.0)
+ ScalarStuff.addJustBool(fbb, true)
+ ScalarStuff.addMaybeBool(fbb, true)
+ ScalarStuff.addDefaultBool(fbb, true)
+ ScalarStuff.addJustEnum(fbb, OptionalByte.Two)
+ ScalarStuff.addMaybeEnum(fbb, OptionalByte.Two)
+ ScalarStuff.addDefaultEnum(fbb, OptionalByte.Two)
+
+ pos = ScalarStuff.endScalarStuff(fbb)
+
+ fbb.finish(pos)
+
+ scalarStuff = ScalarStuff.getRootAsScalarStuff(fbb.dataBuffer())
+
+ assert(scalarStuff.justI8 == 5.toByte())
+ assert(scalarStuff.maybeI8 == 5.toByte())
+ assert(scalarStuff.defaultI8 == 5.toByte())
+ assert(scalarStuff.justU8 == 6.toUByte())
+ assert(scalarStuff.maybeU8 == 6.toUByte())
+ assert(scalarStuff.defaultU8 == 6.toUByte())
+ assert(scalarStuff.justI16 == 7.toShort())
+ assert(scalarStuff.maybeI16 == 7.toShort())
+ assert(scalarStuff.defaultI16 == 7.toShort())
+ assert(scalarStuff.justU16 == 8.toUShort())
+ assert(scalarStuff.maybeU16 == 8.toUShort())
+ assert(scalarStuff.defaultU16 == 8.toUShort())
+ assert(scalarStuff.justI32 == 9)
+ assert(scalarStuff.maybeI32 == 9)
+ assert(scalarStuff.defaultI32 == 9)
+ assert(scalarStuff.justU32 == 10u)
+ assert(scalarStuff.maybeU32 == 10u)
+ assert(scalarStuff.defaultU32 == 10u)
+ assert(scalarStuff.justI64 == 11L)
+ assert(scalarStuff.maybeI64 == 11L)
+ assert(scalarStuff.defaultI64 == 11L)
+ assert(scalarStuff.justU64 == 12UL)
+ assert(scalarStuff.maybeU64 == 12UL)
+ assert(scalarStuff.defaultU64 == 12UL)
+ assert(scalarStuff.justF32 == 13.0f)
+ assert(scalarStuff.maybeF32 == 13.0f)
+ assert(scalarStuff.defaultF32 == 13.0f)
+ assert(scalarStuff.justF64 == 14.0)
+ assert(scalarStuff.maybeF64 == 14.0)
+ assert(scalarStuff.defaultF64 == 14.0)
+ assert(scalarStuff.justBool == true)
+ assert(scalarStuff.maybeBool == true)
+ assert(scalarStuff.defaultBool == true)
+ assert(scalarStuff.justEnum == OptionalByte.Two)
+ assert(scalarStuff.maybeEnum == OptionalByte.Two)
+ assert(scalarStuff.defaultEnum == OptionalByte.Two)
+ }
}
+}
diff --git a/tests/KotlinTest.sh b/tests/KotlinTest.sh
index 709e68c..e41ce3a 100755
--- a/tests/KotlinTest.sh
+++ b/tests/KotlinTest.sh
@@ -40,7 +40,7 @@
# Make jar
jar cvf ${testdir}/kotlin_test.jar -C $targetdir . > /dev/null
# Run test
-kotlin -cp ${testdir}/kotlin_test.jar KotlinTest
+kotlin -J"-ea" -cp ${testdir}/kotlin_test.jar KotlinTest
# clean up
rm -rf $targetdir
rm ${testdir}/kotlin_test.jar
diff --git a/tests/MyGame/Example/Ability.cs b/tests/MyGame/Example/Ability.cs
index 8315985..bd49ccd 100644
--- a/tests/MyGame/Example/Ability.cs
+++ b/tests/MyGame/Example/Ability.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Ability : IFlatbufferObject
@@ -26,7 +27,36 @@
builder.PutUint(Id);
return new Offset<MyGame.Example.Ability>(builder.Offset);
}
+ public AbilityT UnPack() {
+ var _o = new AbilityT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(AbilityT _o) {
+ _o.Id = this.Id;
+ _o.Distance = this.Distance;
+ }
+ public static Offset<MyGame.Example.Ability> Pack(FlatBufferBuilder builder, AbilityT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Ability>);
+ return CreateAbility(
+ builder,
+ _o.Id,
+ _o.Distance);
+ }
};
+public class AbilityT
+{
+ [Newtonsoft.Json.JsonProperty("id")]
+ public uint Id { get; set; }
+ [Newtonsoft.Json.JsonProperty("distance")]
+ public uint Distance { get; set; }
+
+ public AbilityT() {
+ this.Id = 0;
+ this.Distance = 0;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Ability.go b/tests/MyGame/Example/Ability.go
index a56b445..9852a75 100644
--- a/tests/MyGame/Example/Ability.go
+++ b/tests/MyGame/Example/Ability.go
@@ -6,6 +6,27 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type AbilityT struct {
+ Id uint32
+ Distance uint32
+}
+
+func (t *AbilityT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ return CreateAbility(builder, t.Id, t.Distance)
+}
+func (rcv *Ability) UnPackTo(t *AbilityT) {
+ t.Id = rcv.Id()
+ t.Distance = rcv.Distance()
+}
+
+func (rcv *Ability) UnPack() *AbilityT {
+ if rcv == nil { return nil }
+ t := &AbilityT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Ability struct {
_tab flatbuffers.Struct
}
diff --git a/tests/MyGame/Example/Ability.java b/tests/MyGame/Example/Ability.java
index 1a8ef03..df5fe71 100644
--- a/tests/MyGame/Example/Ability.java
+++ b/tests/MyGame/Example/Ability.java
@@ -23,5 +23,12 @@
builder.putInt((int)id);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Ability get(int j) { return get(new Ability(), j); }
+ public Ability get(Ability obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/MyGame/Example/Ability.py b/tests/MyGame/Example/Ability.py
index 3c4776e..e57dfd7 100644
--- a/tests/MyGame/Example/Ability.py
+++ b/tests/MyGame/Example/Ability.py
@@ -3,10 +3,16 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Ability(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 8
+
# Ability
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -21,3 +27,34 @@
builder.PrependUint32(distance)
builder.PrependUint32(id)
return builder.Offset()
+
+
+class AbilityT(object):
+
+ # AbilityT
+ def __init__(self):
+ self.id = 0 # type: int
+ self.distance = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ ability = Ability()
+ ability.Init(buf, pos)
+ return cls.InitFromObj(ability)
+
+ @classmethod
+ def InitFromObj(cls, ability):
+ x = AbilityT()
+ x._UnPack(ability)
+ return x
+
+ # AbilityT
+ def _UnPack(self, ability):
+ if ability is None:
+ return
+ self.id = ability.Id()
+ self.distance = ability.Distance()
+
+ # AbilityT
+ def Pack(self, builder):
+ return CreateAbility(builder, self.id, self.distance)
diff --git a/tests/MyGame/Example/Any.cs b/tests/MyGame/Example/Any.cs
index f95c6bc..edf98ef 100644
--- a/tests/MyGame/Example/Any.cs
+++ b/tests/MyGame/Example/Any.cs
@@ -5,6 +5,7 @@
namespace MyGame.Example
{
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum Any : byte
{
NONE = 0,
@@ -13,5 +14,72 @@
MyGame_Example2_Monster = 3,
};
+public class AnyUnion {
+ public Any Type { get; set; }
+ public object Value { get; set; }
+
+ public AnyUnion() {
+ this.Type = Any.NONE;
+ this.Value = null;
+ }
+
+ public T As<T>() where T : class { return this.Value as T; }
+ public MyGame.Example.MonsterT AsMonster() { return this.As<MyGame.Example.MonsterT>(); }
+ internal MyGame.Example.TestSimpleTableWithEnumT AsTestSimpleTableWithEnum() { return this.As<MyGame.Example.TestSimpleTableWithEnumT>(); }
+ public MyGame.Example2.MonsterT AsMyGame_Example2_Monster() { return this.As<MyGame.Example2.MonsterT>(); }
+
+ public static int Pack(FlatBuffers.FlatBufferBuilder builder, AnyUnion _o) {
+ switch (_o.Type) {
+ default: return 0;
+ case Any.Monster: return MyGame.Example.Monster.Pack(builder, _o.AsMonster()).Value;
+ case Any.TestSimpleTableWithEnum: return MyGame.Example.TestSimpleTableWithEnum.Pack(builder, _o.AsTestSimpleTableWithEnum()).Value;
+ case Any.MyGame_Example2_Monster: return MyGame.Example2.Monster.Pack(builder, _o.AsMyGame_Example2_Monster()).Value;
+ }
+ }
+}
+
+public class AnyUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
+ public override bool CanConvert(System.Type objectType) {
+ return objectType == typeof(AnyUnion) || objectType == typeof(System.Collections.Generic.List<AnyUnion>);
+ }
+ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = value as System.Collections.Generic.List<AnyUnion>;
+ if (_olist != null) {
+ writer.WriteStartArray();
+ foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }
+ writer.WriteEndArray();
+ } else {
+ this.WriteJson(writer, value as AnyUnion, serializer);
+ }
+ }
+ public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return;
+ serializer.Serialize(writer, _o.Value);
+ }
+ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = existingValue as System.Collections.Generic.List<AnyUnion>;
+ if (_olist != null) {
+ for (var _j = 0; _j < _olist.Count; ++_j) {
+ reader.Read();
+ _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);
+ }
+ reader.Read();
+ return _olist;
+ } else {
+ return this.ReadJson(reader, existingValue as AnyUnion, serializer);
+ }
+ }
+ public AnyUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return null;
+ switch (_o.Type) {
+ default: break;
+ case Any.Monster: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;
+ case Any.TestSimpleTableWithEnum: _o.Value = serializer.Deserialize<MyGame.Example.TestSimpleTableWithEnumT>(reader); break;
+ case Any.MyGame_Example2_Monster: _o.Value = serializer.Deserialize<MyGame.Example2.MonsterT>(reader); break;
+ }
+ return _o;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Any.go b/tests/MyGame/Example/Any.go
index 8d9067e..14b66b5 100644
--- a/tests/MyGame/Example/Any.go
+++ b/tests/MyGame/Example/Any.go
@@ -2,7 +2,13 @@
package Example
-import "strconv"
+import (
+ "strconv"
+
+ flatbuffers "github.com/google/flatbuffers/go"
+
+ MyGame__Example2 "MyGame/Example2"
+)
type Any byte
@@ -33,3 +39,38 @@
}
return "Any(" + strconv.FormatInt(int64(v), 10) + ")"
}
+
+type AnyT struct {
+ Type Any
+ Value interface{}
+}
+
+func (t *AnyT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil {
+ return 0
+ }
+ switch t.Type {
+ case AnyMonster:
+ return t.Value.(*MonsterT).Pack(builder)
+ case AnyTestSimpleTableWithEnum:
+ return t.Value.(*TestSimpleTableWithEnumT).Pack(builder)
+ case AnyMyGame_Example2_Monster:
+ return t.Value.(*MyGame__Example2.MonsterT).Pack(builder)
+ }
+ return 0
+}
+
+func (rcv Any) UnPack(table flatbuffers.Table) *AnyT {
+ switch rcv {
+ case AnyMonster:
+ x := Monster{_tab: table}
+ return &AnyT{ Type: AnyMonster, Value: x.UnPack() }
+ case AnyTestSimpleTableWithEnum:
+ x := TestSimpleTableWithEnum{_tab: table}
+ return &AnyT{ Type: AnyTestSimpleTableWithEnum, Value: x.UnPack() }
+ case AnyMyGame_Example2_Monster:
+ x := Monster{_tab: table}
+ return &AnyT{ Type: AnyMyGame_Example2_Monster, Value: x.UnPack() }
+ }
+ return nil
+}
diff --git a/tests/MyGame/Example/Any.py b/tests/MyGame/Example/Any.py
index f1b8d51..b10d35d 100644
--- a/tests/MyGame/Example/Any.py
+++ b/tests/MyGame/Example/Any.py
@@ -8,3 +8,18 @@
TestSimpleTableWithEnum = 2
MyGame_Example2_Monster = 3
+
+def AnyCreator(unionType, table):
+ from flatbuffers.table import Table
+ if not isinstance(table, Table):
+ return None
+ if unionType == Any().Monster:
+ import MyGame.Example.Monster
+ return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == Any().TestSimpleTableWithEnum:
+ import MyGame.Example.TestSimpleTableWithEnum
+ return MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == Any().MyGame_Example2_Monster:
+ import MyGame.Example2.Monster
+ return MyGame.Example2.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ return None
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.cs b/tests/MyGame/Example/AnyAmbiguousAliases.cs
index c727b88..07deadc 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.cs
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.cs
@@ -5,6 +5,7 @@
namespace MyGame.Example
{
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum AnyAmbiguousAliases : byte
{
NONE = 0,
@@ -13,5 +14,72 @@
M3 = 3,
};
+public class AnyAmbiguousAliasesUnion {
+ public AnyAmbiguousAliases Type { get; set; }
+ public object Value { get; set; }
+
+ public AnyAmbiguousAliasesUnion() {
+ this.Type = AnyAmbiguousAliases.NONE;
+ this.Value = null;
+ }
+
+ public T As<T>() where T : class { return this.Value as T; }
+ public MyGame.Example.MonsterT AsM1() { return this.As<MyGame.Example.MonsterT>(); }
+ public MyGame.Example.MonsterT AsM2() { return this.As<MyGame.Example.MonsterT>(); }
+ public MyGame.Example.MonsterT AsM3() { return this.As<MyGame.Example.MonsterT>(); }
+
+ public static int Pack(FlatBuffers.FlatBufferBuilder builder, AnyAmbiguousAliasesUnion _o) {
+ switch (_o.Type) {
+ default: return 0;
+ case AnyAmbiguousAliases.M1: return MyGame.Example.Monster.Pack(builder, _o.AsM1()).Value;
+ case AnyAmbiguousAliases.M2: return MyGame.Example.Monster.Pack(builder, _o.AsM2()).Value;
+ case AnyAmbiguousAliases.M3: return MyGame.Example.Monster.Pack(builder, _o.AsM3()).Value;
+ }
+ }
+}
+
+public class AnyAmbiguousAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
+ public override bool CanConvert(System.Type objectType) {
+ return objectType == typeof(AnyAmbiguousAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyAmbiguousAliasesUnion>);
+ }
+ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = value as System.Collections.Generic.List<AnyAmbiguousAliasesUnion>;
+ if (_olist != null) {
+ writer.WriteStartArray();
+ foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }
+ writer.WriteEndArray();
+ } else {
+ this.WriteJson(writer, value as AnyAmbiguousAliasesUnion, serializer);
+ }
+ }
+ public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyAmbiguousAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return;
+ serializer.Serialize(writer, _o.Value);
+ }
+ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = existingValue as System.Collections.Generic.List<AnyAmbiguousAliasesUnion>;
+ if (_olist != null) {
+ for (var _j = 0; _j < _olist.Count; ++_j) {
+ reader.Read();
+ _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);
+ }
+ reader.Read();
+ return _olist;
+ } else {
+ return this.ReadJson(reader, existingValue as AnyAmbiguousAliasesUnion, serializer);
+ }
+ }
+ public AnyAmbiguousAliasesUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyAmbiguousAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return null;
+ switch (_o.Type) {
+ default: break;
+ case AnyAmbiguousAliases.M1: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;
+ case AnyAmbiguousAliases.M2: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;
+ case AnyAmbiguousAliases.M3: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;
+ }
+ return _o;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.go b/tests/MyGame/Example/AnyAmbiguousAliases.go
index b9c3793..8a088db 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.go
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.go
@@ -2,7 +2,11 @@
package Example
-import "strconv"
+import (
+ "strconv"
+
+ flatbuffers "github.com/google/flatbuffers/go"
+)
type AnyAmbiguousAliases byte
@@ -33,3 +37,38 @@
}
return "AnyAmbiguousAliases(" + strconv.FormatInt(int64(v), 10) + ")"
}
+
+type AnyAmbiguousAliasesT struct {
+ Type AnyAmbiguousAliases
+ Value interface{}
+}
+
+func (t *AnyAmbiguousAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil {
+ return 0
+ }
+ switch t.Type {
+ case AnyAmbiguousAliasesM1:
+ return t.Value.(*MonsterT).Pack(builder)
+ case AnyAmbiguousAliasesM2:
+ return t.Value.(*MonsterT).Pack(builder)
+ case AnyAmbiguousAliasesM3:
+ return t.Value.(*MonsterT).Pack(builder)
+ }
+ return 0
+}
+
+func (rcv AnyAmbiguousAliases) UnPack(table flatbuffers.Table) *AnyAmbiguousAliasesT {
+ switch rcv {
+ case AnyAmbiguousAliasesM1:
+ x := Monster{_tab: table}
+ return &AnyAmbiguousAliasesT{ Type: AnyAmbiguousAliasesM1, Value: x.UnPack() }
+ case AnyAmbiguousAliasesM2:
+ x := Monster{_tab: table}
+ return &AnyAmbiguousAliasesT{ Type: AnyAmbiguousAliasesM2, Value: x.UnPack() }
+ case AnyAmbiguousAliasesM3:
+ x := Monster{_tab: table}
+ return &AnyAmbiguousAliasesT{ Type: AnyAmbiguousAliasesM3, Value: x.UnPack() }
+ }
+ return nil
+}
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.py b/tests/MyGame/Example/AnyAmbiguousAliases.py
index de6e9d0..3fb4830 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.py
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.py
@@ -8,3 +8,18 @@
M2 = 2
M3 = 3
+
+def AnyAmbiguousAliasesCreator(unionType, table):
+ from flatbuffers.table import Table
+ if not isinstance(table, Table):
+ return None
+ if unionType == AnyAmbiguousAliases().M1:
+ import MyGame.Example.Monster
+ return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == AnyAmbiguousAliases().M2:
+ import MyGame.Example.Monster
+ return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == AnyAmbiguousAliases().M3:
+ import MyGame.Example.Monster
+ return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ return None
diff --git a/tests/MyGame/Example/AnyUniqueAliases.cs b/tests/MyGame/Example/AnyUniqueAliases.cs
index 42a3e0b..3594952 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.cs
+++ b/tests/MyGame/Example/AnyUniqueAliases.cs
@@ -5,6 +5,7 @@
namespace MyGame.Example
{
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum AnyUniqueAliases : byte
{
NONE = 0,
@@ -13,5 +14,72 @@
M2 = 3,
};
+public class AnyUniqueAliasesUnion {
+ public AnyUniqueAliases Type { get; set; }
+ public object Value { get; set; }
+
+ public AnyUniqueAliasesUnion() {
+ this.Type = AnyUniqueAliases.NONE;
+ this.Value = null;
+ }
+
+ public T As<T>() where T : class { return this.Value as T; }
+ public MyGame.Example.MonsterT AsM() { return this.As<MyGame.Example.MonsterT>(); }
+ internal MyGame.Example.TestSimpleTableWithEnumT AsTS() { return this.As<MyGame.Example.TestSimpleTableWithEnumT>(); }
+ public MyGame.Example2.MonsterT AsM2() { return this.As<MyGame.Example2.MonsterT>(); }
+
+ public static int Pack(FlatBuffers.FlatBufferBuilder builder, AnyUniqueAliasesUnion _o) {
+ switch (_o.Type) {
+ default: return 0;
+ case AnyUniqueAliases.M: return MyGame.Example.Monster.Pack(builder, _o.AsM()).Value;
+ case AnyUniqueAliases.TS: return MyGame.Example.TestSimpleTableWithEnum.Pack(builder, _o.AsTS()).Value;
+ case AnyUniqueAliases.M2: return MyGame.Example2.Monster.Pack(builder, _o.AsM2()).Value;
+ }
+ }
+}
+
+public class AnyUniqueAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
+ public override bool CanConvert(System.Type objectType) {
+ return objectType == typeof(AnyUniqueAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyUniqueAliasesUnion>);
+ }
+ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = value as System.Collections.Generic.List<AnyUniqueAliasesUnion>;
+ if (_olist != null) {
+ writer.WriteStartArray();
+ foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }
+ writer.WriteEndArray();
+ } else {
+ this.WriteJson(writer, value as AnyUniqueAliasesUnion, serializer);
+ }
+ }
+ public void WriteJson(Newtonsoft.Json.JsonWriter writer, AnyUniqueAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return;
+ serializer.Serialize(writer, _o.Value);
+ }
+ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = existingValue as System.Collections.Generic.List<AnyUniqueAliasesUnion>;
+ if (_olist != null) {
+ for (var _j = 0; _j < _olist.Count; ++_j) {
+ reader.Read();
+ _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);
+ }
+ reader.Read();
+ return _olist;
+ } else {
+ return this.ReadJson(reader, existingValue as AnyUniqueAliasesUnion, serializer);
+ }
+ }
+ public AnyUniqueAliasesUnion ReadJson(Newtonsoft.Json.JsonReader reader, AnyUniqueAliasesUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return null;
+ switch (_o.Type) {
+ default: break;
+ case AnyUniqueAliases.M: _o.Value = serializer.Deserialize<MyGame.Example.MonsterT>(reader); break;
+ case AnyUniqueAliases.TS: _o.Value = serializer.Deserialize<MyGame.Example.TestSimpleTableWithEnumT>(reader); break;
+ case AnyUniqueAliases.M2: _o.Value = serializer.Deserialize<MyGame.Example2.MonsterT>(reader); break;
+ }
+ return _o;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/AnyUniqueAliases.go b/tests/MyGame/Example/AnyUniqueAliases.go
index 23d8649..2a52ebe 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.go
+++ b/tests/MyGame/Example/AnyUniqueAliases.go
@@ -2,7 +2,13 @@
package Example
-import "strconv"
+import (
+ "strconv"
+
+ flatbuffers "github.com/google/flatbuffers/go"
+
+ MyGame__Example2 "MyGame/Example2"
+)
type AnyUniqueAliases byte
@@ -33,3 +39,38 @@
}
return "AnyUniqueAliases(" + strconv.FormatInt(int64(v), 10) + ")"
}
+
+type AnyUniqueAliasesT struct {
+ Type AnyUniqueAliases
+ Value interface{}
+}
+
+func (t *AnyUniqueAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil {
+ return 0
+ }
+ switch t.Type {
+ case AnyUniqueAliasesM:
+ return t.Value.(*MonsterT).Pack(builder)
+ case AnyUniqueAliasesTS:
+ return t.Value.(*TestSimpleTableWithEnumT).Pack(builder)
+ case AnyUniqueAliasesM2:
+ return t.Value.(*MyGame__Example2.MonsterT).Pack(builder)
+ }
+ return 0
+}
+
+func (rcv AnyUniqueAliases) UnPack(table flatbuffers.Table) *AnyUniqueAliasesT {
+ switch rcv {
+ case AnyUniqueAliasesM:
+ x := Monster{_tab: table}
+ return &AnyUniqueAliasesT{ Type: AnyUniqueAliasesM, Value: x.UnPack() }
+ case AnyUniqueAliasesTS:
+ x := TestSimpleTableWithEnum{_tab: table}
+ return &AnyUniqueAliasesT{ Type: AnyUniqueAliasesTS, Value: x.UnPack() }
+ case AnyUniqueAliasesM2:
+ x := Monster{_tab: table}
+ return &AnyUniqueAliasesT{ Type: AnyUniqueAliasesM2, Value: x.UnPack() }
+ }
+ return nil
+}
diff --git a/tests/MyGame/Example/AnyUniqueAliases.py b/tests/MyGame/Example/AnyUniqueAliases.py
index a6da355..cf89fc2 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.py
+++ b/tests/MyGame/Example/AnyUniqueAliases.py
@@ -8,3 +8,18 @@
TS = 2
M2 = 3
+
+def AnyUniqueAliasesCreator(unionType, table):
+ from flatbuffers.table import Table
+ if not isinstance(table, Table):
+ return None
+ if unionType == AnyUniqueAliases().M:
+ import MyGame.Example.Monster
+ return MyGame.Example.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == AnyUniqueAliases().TS:
+ import MyGame.Example.TestSimpleTableWithEnum
+ return MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT.InitFromBuf(table.Bytes, table.Pos)
+ if unionType == AnyUniqueAliases().M2:
+ import MyGame.Example2.Monster
+ return MyGame.Example2.Monster.MonsterT.InitFromBuf(table.Bytes, table.Pos)
+ return None
diff --git a/tests/MyGame/Example/ArrayStruct.cs b/tests/MyGame/Example/ArrayStruct.cs
index 28815e7..41c088d 100644
--- a/tests/MyGame/Example/ArrayStruct.cs
+++ b/tests/MyGame/Example/ArrayStruct.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct ArrayStruct : IFlatbufferObject
@@ -21,13 +22,25 @@
public void MutateB(int j, int b) { __p.bb.PutInt(__p.bb_pos + 4 + j * 4, b); }
public sbyte C { get { return __p.bb.GetSbyte(__p.bb_pos + 64); } }
public void MutateC(sbyte c) { __p.bb.PutSbyte(__p.bb_pos + 64, c); }
- public MyGame.Example.NestedStruct D(int j) { return (new MyGame.Example.NestedStruct()).__assign(__p.bb_pos + 68 + j * 12, __p.bb); }
+ public MyGame.Example.NestedStruct D(int j) { return (new MyGame.Example.NestedStruct()).__assign(__p.bb_pos + 72 + j * 32, __p.bb); }
+ public int E { get { return __p.bb.GetInt(__p.bb_pos + 136); } }
+ public void MutateE(int e) { __p.bb.PutInt(__p.bb_pos + 136, e); }
+ public long F(int j) { return __p.bb.GetLong(__p.bb_pos + 144 + j * 8); }
+ public void MutateF(int j, long f) { __p.bb.PutLong(__p.bb_pos + 144 + j * 8, f); }
- public static Offset<MyGame.Example.ArrayStruct> CreateArrayStruct(FlatBufferBuilder builder, float A, int[] B, sbyte C, int[,] d_A, MyGame.Example.TestEnum[] d_B, MyGame.Example.TestEnum[,] d_C) {
- builder.Prep(4, 92);
+ public static Offset<MyGame.Example.ArrayStruct> CreateArrayStruct(FlatBufferBuilder builder, float A, int[] B, sbyte C, int[,] d_A, MyGame.Example.TestEnum[] d_B, MyGame.Example.TestEnum[,] d_C, long[,] d_D, int E, long[] F) {
+ builder.Prep(8, 160);
for (int _idx0 = 2; _idx0 > 0; _idx0--) {
- builder.Prep(4, 12);
- builder.Pad(1);
+ builder.PutLong(F[_idx0-1]);
+ }
+ builder.Pad(4);
+ builder.PutInt(E);
+ for (int _idx0 = 2; _idx0 > 0; _idx0--) {
+ builder.Prep(8, 32);
+ for (int _idx1 = 2; _idx1 > 0; _idx1--) {
+ builder.PutLong(d_D[_idx0-1,_idx1-1]);
+ }
+ builder.Pad(5);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.PutSbyte((sbyte)d_C[_idx0-1,_idx1-1]);
}
@@ -36,7 +49,7 @@
builder.PutInt(d_A[_idx0-1,_idx1-1]);
}
}
- builder.Pad(3);
+ builder.Pad(7);
builder.PutSbyte(C);
for (int _idx0 = 15; _idx0 > 0; _idx0--) {
builder.PutInt(B[_idx0-1]);
@@ -44,7 +57,72 @@
builder.PutFloat(A);
return new Offset<MyGame.Example.ArrayStruct>(builder.Offset);
}
+ public ArrayStructT UnPack() {
+ var _o = new ArrayStructT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(ArrayStructT _o) {
+ _o.A = this.A;
+ _o.B = new int[15];
+ for (var _j = 0; _j < 15; ++_j) { _o.B[_j] = this.B(_j); }
+ _o.C = this.C;
+ _o.D = new MyGame.Example.NestedStructT[2];
+ for (var _j = 0; _j < 2; ++_j) { _o.D[_j] = this.D(_j).UnPack(); }
+ _o.E = this.E;
+ _o.F = new long[2];
+ for (var _j = 0; _j < 2; ++_j) { _o.F[_j] = this.F(_j); }
+ }
+ public static Offset<MyGame.Example.ArrayStruct> Pack(FlatBufferBuilder builder, ArrayStructT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.ArrayStruct>);
+ var _b = _o.B;
+ var _d_a = new int[2,2];
+ for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_a[idx0,idx1] = _o.D[idx0].A[idx1];}}
+ var _d_b = new MyGame.Example.TestEnum[2];
+ for (var idx0 = 0; idx0 < 2; ++idx0) {_d_b[idx0] = _o.D[idx0].B;}
+ var _d_c = new MyGame.Example.TestEnum[2,2];
+ for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_c[idx0,idx1] = _o.D[idx0].C[idx1];}}
+ var _d_d = new long[2,2];
+ for (var idx0 = 0; idx0 < 2; ++idx0) {for (var idx1 = 0; idx1 < 2; ++idx1) {_d_d[idx0,idx1] = _o.D[idx0].D[idx1];}}
+ var _f = _o.F;
+ return CreateArrayStruct(
+ builder,
+ _o.A,
+ _b,
+ _o.C,
+ _d_a,
+ _d_b,
+ _d_c,
+ _d_d,
+ _o.E,
+ _f);
+ }
};
+public class ArrayStructT
+{
+ [Newtonsoft.Json.JsonProperty("a")]
+ public float A { get; set; }
+ [Newtonsoft.Json.JsonProperty("b")]
+ public int[] B { get; set; }
+ [Newtonsoft.Json.JsonProperty("c")]
+ public sbyte C { get; set; }
+ [Newtonsoft.Json.JsonProperty("d")]
+ public MyGame.Example.NestedStructT[] D { get; set; }
+ [Newtonsoft.Json.JsonProperty("e")]
+ public int E { get; set; }
+ [Newtonsoft.Json.JsonProperty("f")]
+ public long[] F { get; set; }
+
+ public ArrayStructT() {
+ this.A = 0.0f;
+ this.B = new int[15];
+ this.C = 0;
+ this.D = new MyGame.Example.NestedStructT[2];
+ this.E = 0;
+ this.F = new long[2];
+ }
+}
+
}
diff --git a/tests/MyGame/Example/ArrayStruct.java b/tests/MyGame/Example/ArrayStruct.java
index 0098c55..5c5b3f6 100644
--- a/tests/MyGame/Example/ArrayStruct.java
+++ b/tests/MyGame/Example/ArrayStruct.java
@@ -18,13 +18,25 @@
public void mutateB(int j, int b) { bb.putInt(bb_pos + 4 + j * 4, b); }
public byte c() { return bb.get(bb_pos + 64); }
public void mutateC(byte c) { bb.put(bb_pos + 64, c); }
- public MyGame.Example.NestedStruct d(MyGame.Example.NestedStruct obj, int j) { return obj.__assign(bb_pos + 68 + j * 12, bb); }
+ public MyGame.Example.NestedStruct d(MyGame.Example.NestedStruct obj, int j) { return obj.__assign(bb_pos + 72 + j * 32, bb); }
+ public int e() { return bb.getInt(bb_pos + 136); }
+ public void mutateE(int e) { bb.putInt(bb_pos + 136, e); }
+ public long f(int j) { return bb.getLong(bb_pos + 144 + j * 8); }
+ public void mutateF(int j, long f) { bb.putLong(bb_pos + 144 + j * 8, f); }
- public static int createArrayStruct(FlatBufferBuilder builder, float a, int[] b, byte c, int[][] d_a, byte[] d_b, byte[][] d_c) {
- builder.prep(4, 92);
+ public static int createArrayStruct(FlatBufferBuilder builder, float a, int[] b, byte c, int[][] d_a, byte[] d_b, byte[][] d_c, long[][] d_d, int e, long[] f) {
+ builder.prep(8, 160);
for (int _idx0 = 2; _idx0 > 0; _idx0--) {
- builder.prep(4, 12);
- builder.pad(1);
+ builder.putLong(f[_idx0-1]);
+ }
+ builder.pad(4);
+ builder.putInt(e);
+ for (int _idx0 = 2; _idx0 > 0; _idx0--) {
+ builder.prep(8, 32);
+ for (int _idx1 = 2; _idx1 > 0; _idx1--) {
+ builder.putLong(d_d[_idx0-1][_idx1-1]);
+ }
+ builder.pad(5);
for (int _idx1 = 2; _idx1 > 0; _idx1--) {
builder.putByte(d_c[_idx0-1][_idx1-1]);
}
@@ -33,7 +45,7 @@
builder.putInt(d_a[_idx0-1][_idx1-1]);
}
}
- builder.pad(3);
+ builder.pad(7);
builder.putByte(c);
for (int _idx0 = 15; _idx0 > 0; _idx0--) {
builder.putInt(b[_idx0-1]);
@@ -41,5 +53,12 @@
builder.putFloat(a);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public ArrayStruct get(int j) { return get(new ArrayStruct(), j); }
+ public ArrayStruct get(ArrayStruct obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/MyGame/Example/ArrayStruct.py b/tests/MyGame/Example/ArrayStruct.py
index 79dda31..c80bf68 100644
--- a/tests/MyGame/Example/ArrayStruct.py
+++ b/tests/MyGame/Example/ArrayStruct.py
@@ -3,10 +3,16 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class ArrayStruct(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 160
+
# ArrayStruct
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -16,26 +22,131 @@
# ArrayStruct
def B(self): return [self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(4 + i * 4)) for i in range(15)]
# ArrayStruct
+ def BLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # ArrayStruct
+ def BIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ return o == 0
+
+ # ArrayStruct
def C(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(64))
# ArrayStruct
def D(self, obj, i):
- obj.Init(self._tab.Bytes, self._tab.Pos + 68 + i * 12)
+ obj.Init(self._tab.Bytes, self._tab.Pos + 72 + i * 32)
return obj
+ # ArrayStruct
+ def DLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
-def CreateArrayStruct(builder, a, b, c, d_a, d_b, d_c):
- builder.Prep(4, 92)
+ # ArrayStruct
+ def DIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))
+ return o == 0
+
+ # ArrayStruct
+ def E(self): return self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(136))
+ # ArrayStruct
+ def F(self): return [self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(144 + i * 8)) for i in range(2)]
+ # ArrayStruct
+ def FLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(144))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # ArrayStruct
+ def FIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(144))
+ return o == 0
+
+
+def CreateArrayStruct(builder, a, b, c, d_a, d_b, d_c, d_d, e, f):
+ builder.Prep(8, 160)
for _idx0 in range(2 , 0, -1):
- builder.Prep(4, 12)
- builder.Pad(1)
+ builder.PrependInt64(f[_idx0-1])
+ builder.Pad(4)
+ builder.PrependInt32(e)
+ for _idx0 in range(2 , 0, -1):
+ builder.Prep(8, 32)
+ for _idx1 in range(2 , 0, -1):
+ builder.PrependInt64(d_d[_idx0-1][_idx1-1])
+ builder.Pad(5)
for _idx1 in range(2 , 0, -1):
builder.PrependInt8(d_c[_idx0-1][_idx1-1])
builder.PrependInt8(d_b[_idx0-1])
for _idx1 in range(2 , 0, -1):
builder.PrependInt32(d_a[_idx0-1][_idx1-1])
- builder.Pad(3)
+ builder.Pad(7)
builder.PrependInt8(c)
for _idx0 in range(15 , 0, -1):
builder.PrependInt32(b[_idx0-1])
builder.PrependFloat32(a)
return builder.Offset()
+
+import MyGame.Example.NestedStruct
+try:
+ from typing import List
+except:
+ pass
+
+class ArrayStructT(object):
+
+ # ArrayStructT
+ def __init__(self):
+ self.a = 0.0 # type: float
+ self.b = None # type: List[int]
+ self.c = 0 # type: int
+ self.d = None # type: List[MyGame.Example.NestedStruct.NestedStructT]
+ self.e = 0 # type: int
+ self.f = None # type: List[int]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ arrayStruct = ArrayStruct()
+ arrayStruct.Init(buf, pos)
+ return cls.InitFromObj(arrayStruct)
+
+ @classmethod
+ def InitFromObj(cls, arrayStruct):
+ x = ArrayStructT()
+ x._UnPack(arrayStruct)
+ return x
+
+ # ArrayStructT
+ def _UnPack(self, arrayStruct):
+ if arrayStruct is None:
+ return
+ self.a = arrayStruct.A()
+ if not arrayStruct.BIsNone():
+ if np is None:
+ self.b = []
+ for i in range(arrayStruct.BLength()):
+ self.b.append(arrayStruct.B(i))
+ else:
+ self.b = arrayStruct.BAsNumpy()
+ self.c = arrayStruct.C()
+ if not arrayStruct.DIsNone():
+ self.d = []
+ for i in range(arrayStruct.DLength()):
+ self.d.append(arrayStruct.D(i))
+ self.e = arrayStruct.E()
+ if not arrayStruct.FIsNone():
+ if np is None:
+ self.f = []
+ for i in range(arrayStruct.FLength()):
+ self.f.append(arrayStruct.F(i))
+ else:
+ self.f = arrayStruct.FAsNumpy()
+
+ # ArrayStructT
+ def Pack(self, builder):
+ return CreateArrayStruct(builder, self.a, self.b, self.c, self.d.a, self.d.b, self.d.c, self.d.d, self.e, self.f)
diff --git a/tests/MyGame/Example/ArrayTable.cs b/tests/MyGame/Example/ArrayTable.cs
index e303211..b5b599f 100644
--- a/tests/MyGame/Example/ArrayTable.cs
+++ b/tests/MyGame/Example/ArrayTable.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct ArrayTable : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static ArrayTable GetRootAsArrayTable(ByteBuffer _bb) { return GetRootAsArrayTable(_bb, new ArrayTable()); }
public static ArrayTable GetRootAsArrayTable(ByteBuffer _bb, ArrayTable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public static bool ArrayTableBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "ARRT"); }
@@ -29,7 +30,46 @@
}
public static void FinishArrayTableBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.ArrayTable> offset) { builder.Finish(offset.Value, "ARRT"); }
public static void FinishSizePrefixedArrayTableBuffer(FlatBufferBuilder builder, Offset<MyGame.Example.ArrayTable> offset) { builder.FinishSizePrefixed(offset.Value, "ARRT"); }
+ public ArrayTableT UnPack() {
+ var _o = new ArrayTableT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(ArrayTableT _o) {
+ _o.A = this.A.HasValue ? this.A.Value.UnPack() : null;
+ }
+ public static Offset<MyGame.Example.ArrayTable> Pack(FlatBufferBuilder builder, ArrayTableT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.ArrayTable>);
+ StartArrayTable(builder);
+ AddA(builder, MyGame.Example.ArrayStruct.Pack(builder, _o.A));
+ return EndArrayTable(builder);
+ }
};
+public class ArrayTableT
+{
+ [Newtonsoft.Json.JsonProperty("a")]
+ public MyGame.Example.ArrayStructT A { get; set; }
+
+ public ArrayTableT() {
+ this.A = new MyGame.Example.ArrayStructT();
+ }
+
+ public static ArrayTableT DeserializeFromJson(string jsonText) {
+ return Newtonsoft.Json.JsonConvert.DeserializeObject<ArrayTableT>(jsonText);
+ }
+ public string SerializeToJson() {
+ return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+ }
+ public static ArrayTableT DeserializeFromBinary(byte[] fbBuffer) {
+ return ArrayTable.GetRootAsArrayTable(new ByteBuffer(fbBuffer)).UnPack();
+ }
+ public byte[] SerializeToBinary() {
+ var fbb = new FlatBufferBuilder(0x10000);
+ ArrayTable.FinishArrayTableBuffer(fbb, ArrayTable.Pack(fbb, this));
+ return fbb.DataBuffer.ToSizedArray();
+ }
+}
+
}
diff --git a/tests/MyGame/Example/ArrayTable.java b/tests/MyGame/Example/ArrayTable.java
index 74ce86a..41730d3 100644
--- a/tests/MyGame/Example/ArrayTable.java
+++ b/tests/MyGame/Example/ArrayTable.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class ArrayTable extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static ArrayTable getRootAsArrayTable(ByteBuffer _bb) { return getRootAsArrayTable(_bb, new ArrayTable()); }
public static ArrayTable getRootAsArrayTable(ByteBuffer _bb, ArrayTable obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public static boolean ArrayTableBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "ARRT"); }
@@ -27,5 +27,12 @@
}
public static void finishArrayTableBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, "ARRT"); }
public static void finishSizePrefixedArrayTableBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, "ARRT"); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public ArrayTable get(int j) { return get(new ArrayTable(), j); }
+ public ArrayTable get(ArrayTable obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/Example/ArrayTable.py b/tests/MyGame/Example/ArrayTable.py
index 6d583f9..83905e6 100644
--- a/tests/MyGame/Example/ArrayTable.py
+++ b/tests/MyGame/Example/ArrayTable.py
@@ -3,6 +3,8 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class ArrayTable(object):
__slots__ = ['_tab']
@@ -27,7 +29,7 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
x = o + self._tab.Pos
- from .ArrayStruct import ArrayStruct
+ from MyGame.Example.ArrayStruct import ArrayStruct
obj = ArrayStruct()
obj.Init(self._tab.Bytes, x)
return obj
@@ -36,3 +38,43 @@
def ArrayTableStart(builder): builder.StartObject(1)
def ArrayTableAddA(builder, a): builder.PrependStructSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(a), 0)
def ArrayTableEnd(builder): return builder.EndObject()
+
+import MyGame.Example.ArrayStruct
+try:
+ from typing import Optional
+except:
+ pass
+
+class ArrayTableT(object):
+
+ # ArrayTableT
+ def __init__(self):
+ self.a = None # type: Optional[MyGame.Example.ArrayStruct.ArrayStructT]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ arrayTable = ArrayTable()
+ arrayTable.Init(buf, pos)
+ return cls.InitFromObj(arrayTable)
+
+ @classmethod
+ def InitFromObj(cls, arrayTable):
+ x = ArrayTableT()
+ x._UnPack(arrayTable)
+ return x
+
+ # ArrayTableT
+ def _UnPack(self, arrayTable):
+ if arrayTable is None:
+ return
+ if arrayTable.A() is not None:
+ self.a = MyGame.Example.ArrayStruct.ArrayStructT.InitFromObj(arrayTable.A())
+
+ # ArrayTableT
+ def Pack(self, builder):
+ ArrayTableStart(builder)
+ if self.a is not None:
+ a = self.a.Pack(builder)
+ ArrayTableAddA(builder, a)
+ arrayTable = ArrayTableEnd(builder)
+ return arrayTable
diff --git a/tests/MyGame/Example/Color.cs b/tests/MyGame/Example/Color.cs
index 5981cf8..1137a27 100644
--- a/tests/MyGame/Example/Color.cs
+++ b/tests/MyGame/Example/Color.cs
@@ -6,6 +6,7 @@
{
/// Composite components of Monster color.
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
[System.FlagsAttribute]
public enum Color : byte
{
diff --git a/tests/MyGame/Example/Monster.cs b/tests/MyGame/Example/Monster.cs
index 5dc669e..acfb394 100644
--- a/tests/MyGame/Example/Monster.cs
+++ b/tests/MyGame/Example/Monster.cs
@@ -6,14 +6,15 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
public struct Monster : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }
public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public static bool MonsterBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "MONS"); }
@@ -27,7 +28,7 @@
public bool MutateHp(short hp) { int o = __p.__offset(8); if (o != 0) { __p.bb.PutShort(o + __p.bb_pos, hp); return true; } else { return false; } }
public string Name { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }
#if ENABLE_SPAN_T
- public Span<byte> GetNameBytes() { return __p.__vector_as_span(10); }
+ public Span<byte> GetNameBytes() { return __p.__vector_as_span<byte>(10, 1); }
#else
public ArraySegment<byte>? GetNameBytes() { return __p.__vector_as_arraysegment(10); }
#endif
@@ -35,7 +36,7 @@
public byte Inventory(int j) { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }
public int InventoryLength { get { int o = __p.__offset(14); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetInventoryBytes() { return __p.__vector_as_span(14); }
+ public Span<byte> GetInventoryBytes() { return __p.__vector_as_span<byte>(14, 1); }
#else
public ArraySegment<byte>? GetInventoryBytes() { return __p.__vector_as_arraysegment(14); }
#endif
@@ -44,8 +45,10 @@
public MyGame.Example.Color Color { get { int o = __p.__offset(16); return o != 0 ? (MyGame.Example.Color)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.Color.Blue; } }
public bool MutateColor(MyGame.Example.Color color) { int o = __p.__offset(16); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)color); return true; } else { return false; } }
public MyGame.Example.Any TestType { get { int o = __p.__offset(18); return o != 0 ? (MyGame.Example.Any)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.Any.NONE; } }
- public bool MutateTestType(MyGame.Example.Any test_type) { int o = __p.__offset(18); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)test_type); return true; } else { return false; } }
- public TTable? Test<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(20); return o != 0 ? (TTable?)__p.__union<TTable>(o) : null; }
+ public TTable? Test<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(20); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }
+ public MyGame.Example.Monster TestAsMonster() { return Test<MyGame.Example.Monster>().Value; }
+ internal MyGame.Example.TestSimpleTableWithEnum TestAsTestSimpleTableWithEnum() { return Test<MyGame.Example.TestSimpleTableWithEnum>().Value; }
+ public MyGame.Example2.Monster TestAsMyGame_Example2_Monster() { return Test<MyGame.Example2.Monster>().Value; }
public MyGame.Example.Test? Test4(int j) { int o = __p.__offset(22); return o != 0 ? (MyGame.Example.Test?)(new MyGame.Example.Test()).__assign(__p.__vector(o) + j * 4, __p.bb) : null; }
public int Test4Length { get { int o = __p.__offset(22); return o != 0 ? __p.__vector_len(o) : 0; } }
public string Testarrayofstring(int j) { int o = __p.__offset(24); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }
@@ -59,7 +62,7 @@
public byte Testnestedflatbuffer(int j) { int o = __p.__offset(30); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }
public int TestnestedflatbufferLength { get { int o = __p.__offset(30); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetTestnestedflatbufferBytes() { return __p.__vector_as_span(30); }
+ public Span<byte> GetTestnestedflatbufferBytes() { return __p.__vector_as_span<byte>(30, 1); }
#else
public ArraySegment<byte>? GetTestnestedflatbufferBytes() { return __p.__vector_as_arraysegment(30); }
#endif
@@ -88,7 +91,7 @@
public bool Testarrayofbools(int j) { int o = __p.__offset(52); return o != 0 ? 0!=__p.bb.Get(__p.__vector(o) + j * 1) : false; }
public int TestarrayofboolsLength { get { int o = __p.__offset(52); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetTestarrayofboolsBytes() { return __p.__vector_as_span(52); }
+ public Span<bool> GetTestarrayofboolsBytes() { return __p.__vector_as_span<bool>(52, 1); }
#else
public ArraySegment<byte>? GetTestarrayofboolsBytes() { return __p.__vector_as_arraysegment(52); }
#endif
@@ -107,7 +110,7 @@
public byte Flex(int j) { int o = __p.__offset(64); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }
public int FlexLength { get { int o = __p.__offset(64); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetFlexBytes() { return __p.__vector_as_span(64); }
+ public Span<byte> GetFlexBytes() { return __p.__vector_as_span<byte>(64, 1); }
#else
public ArraySegment<byte>? GetFlexBytes() { return __p.__vector_as_arraysegment(64); }
#endif
@@ -118,7 +121,7 @@
public long VectorOfLongs(int j) { int o = __p.__offset(68); return o != 0 ? __p.bb.GetLong(__p.__vector(o) + j * 8) : (long)0; }
public int VectorOfLongsLength { get { int o = __p.__offset(68); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfLongsBytes() { return __p.__vector_as_span(68); }
+ public Span<long> GetVectorOfLongsBytes() { return __p.__vector_as_span<long>(68, 8); }
#else
public ArraySegment<byte>? GetVectorOfLongsBytes() { return __p.__vector_as_arraysegment(68); }
#endif
@@ -127,7 +130,7 @@
public double VectorOfDoubles(int j) { int o = __p.__offset(70); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }
public int VectorOfDoublesLength { get { int o = __p.__offset(70); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfDoublesBytes() { return __p.__vector_as_span(70); }
+ public Span<double> GetVectorOfDoublesBytes() { return __p.__vector_as_span<double>(70, 8); }
#else
public ArraySegment<byte>? GetVectorOfDoublesBytes() { return __p.__vector_as_arraysegment(70); }
#endif
@@ -142,7 +145,7 @@
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; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfWeakReferencesBytes() { return __p.__vector_as_span(78); }
+ public Span<ulong> GetVectorOfWeakReferencesBytes() { return __p.__vector_as_span<ulong>(78, 8); }
#else
public ArraySegment<byte>? GetVectorOfWeakReferencesBytes() { return __p.__vector_as_arraysegment(78); }
#endif
@@ -156,7 +159,7 @@
public ulong VectorOfCoOwningReferences(int j) { int o = __p.__offset(84); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; }
public int VectorOfCoOwningReferencesLength { get { int o = __p.__offset(84); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfCoOwningReferencesBytes() { return __p.__vector_as_span(84); }
+ public Span<ulong> GetVectorOfCoOwningReferencesBytes() { return __p.__vector_as_span<ulong>(84, 8); }
#else
public ArraySegment<byte>? GetVectorOfCoOwningReferencesBytes() { return __p.__vector_as_arraysegment(84); }
#endif
@@ -167,29 +170,148 @@
public ulong VectorOfNonOwningReferences(int j) { int o = __p.__offset(88); return o != 0 ? __p.bb.GetUlong(__p.__vector(o) + j * 8) : (ulong)0; }
public int VectorOfNonOwningReferencesLength { get { int o = __p.__offset(88); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfNonOwningReferencesBytes() { return __p.__vector_as_span(88); }
+ public Span<ulong> GetVectorOfNonOwningReferencesBytes() { return __p.__vector_as_span<ulong>(88, 8); }
#else
public ArraySegment<byte>? GetVectorOfNonOwningReferencesBytes() { return __p.__vector_as_arraysegment(88); }
#endif
public ulong[] GetVectorOfNonOwningReferencesArray() { return __p.__vector_as_array<ulong>(88); }
public bool MutateVectorOfNonOwningReferences(int j, ulong vector_of_non_owning_references) { int o = __p.__offset(88); if (o != 0) { __p.bb.PutUlong(__p.__vector(o) + j * 8, vector_of_non_owning_references); return true; } else { return false; } }
public MyGame.Example.AnyUniqueAliases AnyUniqueType { get { int o = __p.__offset(90); return o != 0 ? (MyGame.Example.AnyUniqueAliases)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.AnyUniqueAliases.NONE; } }
- public bool MutateAnyUniqueType(MyGame.Example.AnyUniqueAliases any_unique_type) { int o = __p.__offset(90); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)any_unique_type); return true; } else { return false; } }
- public TTable? AnyUnique<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(92); return o != 0 ? (TTable?)__p.__union<TTable>(o) : null; }
+ public TTable? AnyUnique<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(92); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }
+ public MyGame.Example.Monster AnyUniqueAsM() { return AnyUnique<MyGame.Example.Monster>().Value; }
+ internal MyGame.Example.TestSimpleTableWithEnum AnyUniqueAsTS() { return AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().Value; }
+ public MyGame.Example2.Monster AnyUniqueAsM2() { return AnyUnique<MyGame.Example2.Monster>().Value; }
public MyGame.Example.AnyAmbiguousAliases AnyAmbiguousType { get { int o = __p.__offset(94); return o != 0 ? (MyGame.Example.AnyAmbiguousAliases)__p.bb.Get(o + __p.bb_pos) : MyGame.Example.AnyAmbiguousAliases.NONE; } }
- public bool MutateAnyAmbiguousType(MyGame.Example.AnyAmbiguousAliases any_ambiguous_type) { int o = __p.__offset(94); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)any_ambiguous_type); return true; } else { return false; } }
- public TTable? AnyAmbiguous<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(96); return o != 0 ? (TTable?)__p.__union<TTable>(o) : null; }
+ public TTable? AnyAmbiguous<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(96); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }
+ public MyGame.Example.Monster AnyAmbiguousAsM1() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }
+ public MyGame.Example.Monster AnyAmbiguousAsM2() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }
+ public MyGame.Example.Monster AnyAmbiguousAsM3() { return AnyAmbiguous<MyGame.Example.Monster>().Value; }
public MyGame.Example.Color VectorOfEnums(int j) { int o = __p.__offset(98); return o != 0 ? (MyGame.Example.Color)__p.bb.Get(__p.__vector(o) + j * 1) : (MyGame.Example.Color)0; }
public int VectorOfEnumsLength { get { int o = __p.__offset(98); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVectorOfEnumsBytes() { return __p.__vector_as_span(98); }
+ public Span<MyGame.Example.Color> GetVectorOfEnumsBytes() { return __p.__vector_as_span<MyGame.Example.Color>(98, 1); }
#else
public ArraySegment<byte>? GetVectorOfEnumsBytes() { return __p.__vector_as_arraysegment(98); }
#endif
- public MyGame.Example.Color[] GetVectorOfEnumsArray() { return __p.__vector_as_array<MyGame.Example.Color>(98); }
+ public MyGame.Example.Color[] GetVectorOfEnumsArray() { int o = __p.__offset(98); if (o == 0) return null; int p = __p.__vector(o); int l = __p.__vector_len(o); MyGame.Example.Color[] a = new MyGame.Example.Color[l]; for (int i = 0; i < l; i++) { a[i] = (MyGame.Example.Color)__p.bb.Get(p + i * 1); } return a; }
public bool MutateVectorOfEnums(int j, MyGame.Example.Color vector_of_enums) { int o = __p.__offset(98); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, (byte)vector_of_enums); return true; } else { return false; } }
+ public MyGame.Example.Race SignedEnum { get { int o = __p.__offset(100); return o != 0 ? (MyGame.Example.Race)__p.bb.GetSbyte(o + __p.bb_pos) : MyGame.Example.Race.None; } }
+ public bool MutateSignedEnum(MyGame.Example.Race signed_enum) { int o = __p.__offset(100); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)signed_enum); return true; } else { return false; } }
+ public byte Testrequirednestedflatbuffer(int j) { int o = __p.__offset(102); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; }
+ public int TestrequirednestedflatbufferLength { get { int o = __p.__offset(102); return o != 0 ? __p.__vector_len(o) : 0; } }
+#if ENABLE_SPAN_T
+ public Span<byte> GetTestrequirednestedflatbufferBytes() { return __p.__vector_as_span<byte>(102, 1); }
+#else
+ public ArraySegment<byte>? GetTestrequirednestedflatbufferBytes() { return __p.__vector_as_arraysegment(102); }
+#endif
+ public byte[] GetTestrequirednestedflatbufferArray() { return __p.__vector_as_array<byte>(102); }
+ public MyGame.Example.Monster? GetTestrequirednestedflatbufferAsMonster() { int o = __p.__offset(102); return o != 0 ? (MyGame.Example.Monster?)(new MyGame.Example.Monster()).__assign(__p.__indirect(__p.__vector(o)), __p.bb) : null; }
+ public bool MutateTestrequirednestedflatbuffer(int j, byte testrequirednestedflatbuffer) { int o = __p.__offset(102); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, testrequirednestedflatbuffer); return true; } else { return false; } }
- public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(48); }
+ public static Offset<MyGame.Example.Monster> CreateMonster(FlatBufferBuilder builder,
+ MyGame.Example.Vec3T pos = null,
+ short mana = 150,
+ short hp = 100,
+ StringOffset nameOffset = default(StringOffset),
+ VectorOffset inventoryOffset = default(VectorOffset),
+ MyGame.Example.Color color = MyGame.Example.Color.Blue,
+ MyGame.Example.Any test_type = MyGame.Example.Any.NONE,
+ int testOffset = 0,
+ VectorOffset test4Offset = default(VectorOffset),
+ VectorOffset testarrayofstringOffset = default(VectorOffset),
+ VectorOffset testarrayoftablesOffset = default(VectorOffset),
+ Offset<MyGame.Example.Monster> enemyOffset = default(Offset<MyGame.Example.Monster>),
+ VectorOffset testnestedflatbufferOffset = default(VectorOffset),
+ Offset<MyGame.Example.Stat> testemptyOffset = default(Offset<MyGame.Example.Stat>),
+ bool testbool = false,
+ int testhashs32_fnv1 = 0,
+ uint testhashu32_fnv1 = 0,
+ long testhashs64_fnv1 = 0,
+ ulong testhashu64_fnv1 = 0,
+ int testhashs32_fnv1a = 0,
+ uint testhashu32_fnv1a = 0,
+ long testhashs64_fnv1a = 0,
+ ulong testhashu64_fnv1a = 0,
+ VectorOffset testarrayofboolsOffset = default(VectorOffset),
+ float testf = 3.14159f,
+ float testf2 = 3.0f,
+ float testf3 = 0.0f,
+ VectorOffset testarrayofstring2Offset = default(VectorOffset),
+ VectorOffset testarrayofsortedstructOffset = default(VectorOffset),
+ VectorOffset flexOffset = default(VectorOffset),
+ VectorOffset test5Offset = default(VectorOffset),
+ VectorOffset vector_of_longsOffset = default(VectorOffset),
+ VectorOffset vector_of_doublesOffset = default(VectorOffset),
+ Offset<MyGame.InParentNamespace> parent_namespace_testOffset = default(Offset<MyGame.InParentNamespace>),
+ VectorOffset vector_of_referrablesOffset = default(VectorOffset),
+ ulong single_weak_reference = 0,
+ VectorOffset vector_of_weak_referencesOffset = default(VectorOffset),
+ VectorOffset vector_of_strong_referrablesOffset = default(VectorOffset),
+ ulong co_owning_reference = 0,
+ VectorOffset vector_of_co_owning_referencesOffset = default(VectorOffset),
+ ulong non_owning_reference = 0,
+ VectorOffset vector_of_non_owning_referencesOffset = default(VectorOffset),
+ MyGame.Example.AnyUniqueAliases any_unique_type = MyGame.Example.AnyUniqueAliases.NONE,
+ int any_uniqueOffset = 0,
+ MyGame.Example.AnyAmbiguousAliases any_ambiguous_type = MyGame.Example.AnyAmbiguousAliases.NONE,
+ int any_ambiguousOffset = 0,
+ VectorOffset vector_of_enumsOffset = default(VectorOffset),
+ MyGame.Example.Race signed_enum = MyGame.Example.Race.None,
+ VectorOffset testrequirednestedflatbufferOffset = default(VectorOffset)) {
+ builder.StartTable(50);
+ Monster.AddNonOwningReference(builder, non_owning_reference);
+ Monster.AddCoOwningReference(builder, co_owning_reference);
+ Monster.AddSingleWeakReference(builder, single_weak_reference);
+ Monster.AddTesthashu64Fnv1a(builder, testhashu64_fnv1a);
+ Monster.AddTesthashs64Fnv1a(builder, testhashs64_fnv1a);
+ Monster.AddTesthashu64Fnv1(builder, testhashu64_fnv1);
+ Monster.AddTesthashs64Fnv1(builder, testhashs64_fnv1);
+ Monster.AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset);
+ Monster.AddVectorOfEnums(builder, vector_of_enumsOffset);
+ Monster.AddAnyAmbiguous(builder, any_ambiguousOffset);
+ Monster.AddAnyUnique(builder, any_uniqueOffset);
+ Monster.AddVectorOfNonOwningReferences(builder, vector_of_non_owning_referencesOffset);
+ Monster.AddVectorOfCoOwningReferences(builder, vector_of_co_owning_referencesOffset);
+ Monster.AddVectorOfStrongReferrables(builder, vector_of_strong_referrablesOffset);
+ Monster.AddVectorOfWeakReferences(builder, vector_of_weak_referencesOffset);
+ Monster.AddVectorOfReferrables(builder, vector_of_referrablesOffset);
+ Monster.AddParentNamespaceTest(builder, parent_namespace_testOffset);
+ Monster.AddVectorOfDoubles(builder, vector_of_doublesOffset);
+ Monster.AddVectorOfLongs(builder, vector_of_longsOffset);
+ Monster.AddTest5(builder, test5Offset);
+ Monster.AddFlex(builder, flexOffset);
+ Monster.AddTestarrayofsortedstruct(builder, testarrayofsortedstructOffset);
+ Monster.AddTestarrayofstring2(builder, testarrayofstring2Offset);
+ Monster.AddTestf3(builder, testf3);
+ Monster.AddTestf2(builder, testf2);
+ Monster.AddTestf(builder, testf);
+ Monster.AddTestarrayofbools(builder, testarrayofboolsOffset);
+ Monster.AddTesthashu32Fnv1a(builder, testhashu32_fnv1a);
+ Monster.AddTesthashs32Fnv1a(builder, testhashs32_fnv1a);
+ Monster.AddTesthashu32Fnv1(builder, testhashu32_fnv1);
+ Monster.AddTesthashs32Fnv1(builder, testhashs32_fnv1);
+ Monster.AddTestempty(builder, testemptyOffset);
+ Monster.AddTestnestedflatbuffer(builder, testnestedflatbufferOffset);
+ Monster.AddEnemy(builder, enemyOffset);
+ Monster.AddTestarrayoftables(builder, testarrayoftablesOffset);
+ Monster.AddTestarrayofstring(builder, testarrayofstringOffset);
+ Monster.AddTest4(builder, test4Offset);
+ Monster.AddTest(builder, testOffset);
+ Monster.AddInventory(builder, inventoryOffset);
+ Monster.AddName(builder, nameOffset);
+ Monster.AddPos(builder, MyGame.Example.Vec3.Pack(builder, pos));
+ Monster.AddHp(builder, hp);
+ Monster.AddMana(builder, mana);
+ Monster.AddSignedEnum(builder, signed_enum);
+ Monster.AddAnyAmbiguousType(builder, any_ambiguous_type);
+ Monster.AddAnyUniqueType(builder, any_unique_type);
+ Monster.AddTestbool(builder, testbool);
+ Monster.AddTestType(builder, test_type);
+ Monster.AddColor(builder, color);
+ return Monster.EndMonster(builder);
+ }
+
+ public static void StartMonster(FlatBufferBuilder builder) { builder.StartTable(50); }
public static void AddPos(FlatBufferBuilder builder, Offset<MyGame.Example.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); }
@@ -285,6 +407,11 @@
public static VectorOffset CreateVectorOfEnumsVector(FlatBufferBuilder builder, MyGame.Example.Color[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte((byte)data[i]); return builder.EndVector(); }
public static VectorOffset CreateVectorOfEnumsVectorBlock(FlatBufferBuilder builder, MyGame.Example.Color[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }
public static void StartVectorOfEnumsVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }
+ public static void AddSignedEnum(FlatBufferBuilder builder, MyGame.Example.Race signedEnum) { builder.AddSbyte(48, (sbyte)signedEnum, -1); }
+ public static void AddTestrequirednestedflatbuffer(FlatBufferBuilder builder, VectorOffset testrequirednestedflatbufferOffset) { builder.AddOffset(49, testrequirednestedflatbufferOffset.Value, 0); }
+ public static VectorOffset CreateTestrequirednestedflatbufferVector(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 VectorOffset CreateTestrequirednestedflatbufferVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); }
+ public static void StartTestrequirednestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); }
public static Offset<MyGame.Example.Monster> EndMonster(FlatBufferBuilder builder) {
int o = builder.EndTable();
builder.Required(o, 10); // name
@@ -318,7 +445,492 @@
}
return null;
}
+ public MonsterT UnPack() {
+ var _o = new MonsterT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(MonsterT _o) {
+ _o.Pos = this.Pos.HasValue ? this.Pos.Value.UnPack() : null;
+ _o.Mana = this.Mana;
+ _o.Hp = this.Hp;
+ _o.Name = this.Name;
+ _o.Inventory = new List<byte>();
+ for (var _j = 0; _j < this.InventoryLength; ++_j) {_o.Inventory.Add(this.Inventory(_j));}
+ _o.Color = this.Color;
+ _o.Test = new MyGame.Example.AnyUnion();
+ _o.Test.Type = this.TestType;
+ switch (this.TestType) {
+ default: break;
+ case MyGame.Example.Any.Monster:
+ _o.Test.Value = this.Test<MyGame.Example.Monster>().HasValue ? this.Test<MyGame.Example.Monster>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.Any.TestSimpleTableWithEnum:
+ _o.Test.Value = this.Test<MyGame.Example.TestSimpleTableWithEnum>().HasValue ? this.Test<MyGame.Example.TestSimpleTableWithEnum>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.Any.MyGame_Example2_Monster:
+ _o.Test.Value = this.Test<MyGame.Example2.Monster>().HasValue ? this.Test<MyGame.Example2.Monster>().Value.UnPack() : null;
+ break;
+ }
+ _o.Test4 = new List<MyGame.Example.TestT>();
+ for (var _j = 0; _j < this.Test4Length; ++_j) {_o.Test4.Add(this.Test4(_j).HasValue ? this.Test4(_j).Value.UnPack() : null);}
+ _o.Testarrayofstring = new List<string>();
+ for (var _j = 0; _j < this.TestarrayofstringLength; ++_j) {_o.Testarrayofstring.Add(this.Testarrayofstring(_j));}
+ _o.Testarrayoftables = new List<MyGame.Example.MonsterT>();
+ for (var _j = 0; _j < this.TestarrayoftablesLength; ++_j) {_o.Testarrayoftables.Add(this.Testarrayoftables(_j).HasValue ? this.Testarrayoftables(_j).Value.UnPack() : null);}
+ _o.Enemy = this.Enemy.HasValue ? this.Enemy.Value.UnPack() : null;
+ _o.Testnestedflatbuffer = new List<byte>();
+ for (var _j = 0; _j < this.TestnestedflatbufferLength; ++_j) {_o.Testnestedflatbuffer.Add(this.Testnestedflatbuffer(_j));}
+ _o.Testempty = this.Testempty.HasValue ? this.Testempty.Value.UnPack() : null;
+ _o.Testbool = this.Testbool;
+ _o.Testhashs32Fnv1 = this.Testhashs32Fnv1;
+ _o.Testhashu32Fnv1 = this.Testhashu32Fnv1;
+ _o.Testhashs64Fnv1 = this.Testhashs64Fnv1;
+ _o.Testhashu64Fnv1 = this.Testhashu64Fnv1;
+ _o.Testhashs32Fnv1a = this.Testhashs32Fnv1a;
+ _o.Testhashu32Fnv1a = this.Testhashu32Fnv1a;
+ _o.Testhashs64Fnv1a = this.Testhashs64Fnv1a;
+ _o.Testhashu64Fnv1a = this.Testhashu64Fnv1a;
+ _o.Testarrayofbools = new List<bool>();
+ for (var _j = 0; _j < this.TestarrayofboolsLength; ++_j) {_o.Testarrayofbools.Add(this.Testarrayofbools(_j));}
+ _o.Testf = this.Testf;
+ _o.Testf2 = this.Testf2;
+ _o.Testf3 = this.Testf3;
+ _o.Testarrayofstring2 = new List<string>();
+ for (var _j = 0; _j < this.Testarrayofstring2Length; ++_j) {_o.Testarrayofstring2.Add(this.Testarrayofstring2(_j));}
+ _o.Testarrayofsortedstruct = new List<MyGame.Example.AbilityT>();
+ for (var _j = 0; _j < this.TestarrayofsortedstructLength; ++_j) {_o.Testarrayofsortedstruct.Add(this.Testarrayofsortedstruct(_j).HasValue ? this.Testarrayofsortedstruct(_j).Value.UnPack() : null);}
+ _o.Flex = new List<byte>();
+ for (var _j = 0; _j < this.FlexLength; ++_j) {_o.Flex.Add(this.Flex(_j));}
+ _o.Test5 = new List<MyGame.Example.TestT>();
+ for (var _j = 0; _j < this.Test5Length; ++_j) {_o.Test5.Add(this.Test5(_j).HasValue ? this.Test5(_j).Value.UnPack() : null);}
+ _o.VectorOfLongs = new List<long>();
+ for (var _j = 0; _j < this.VectorOfLongsLength; ++_j) {_o.VectorOfLongs.Add(this.VectorOfLongs(_j));}
+ _o.VectorOfDoubles = new List<double>();
+ for (var _j = 0; _j < this.VectorOfDoublesLength; ++_j) {_o.VectorOfDoubles.Add(this.VectorOfDoubles(_j));}
+ _o.ParentNamespaceTest = this.ParentNamespaceTest.HasValue ? this.ParentNamespaceTest.Value.UnPack() : null;
+ _o.VectorOfReferrables = new List<MyGame.Example.ReferrableT>();
+ for (var _j = 0; _j < this.VectorOfReferrablesLength; ++_j) {_o.VectorOfReferrables.Add(this.VectorOfReferrables(_j).HasValue ? this.VectorOfReferrables(_j).Value.UnPack() : null);}
+ _o.SingleWeakReference = this.SingleWeakReference;
+ _o.VectorOfWeakReferences = new List<ulong>();
+ for (var _j = 0; _j < this.VectorOfWeakReferencesLength; ++_j) {_o.VectorOfWeakReferences.Add(this.VectorOfWeakReferences(_j));}
+ _o.VectorOfStrongReferrables = new List<MyGame.Example.ReferrableT>();
+ for (var _j = 0; _j < this.VectorOfStrongReferrablesLength; ++_j) {_o.VectorOfStrongReferrables.Add(this.VectorOfStrongReferrables(_j).HasValue ? this.VectorOfStrongReferrables(_j).Value.UnPack() : null);}
+ _o.CoOwningReference = this.CoOwningReference;
+ _o.VectorOfCoOwningReferences = new List<ulong>();
+ for (var _j = 0; _j < this.VectorOfCoOwningReferencesLength; ++_j) {_o.VectorOfCoOwningReferences.Add(this.VectorOfCoOwningReferences(_j));}
+ _o.NonOwningReference = this.NonOwningReference;
+ _o.VectorOfNonOwningReferences = new List<ulong>();
+ for (var _j = 0; _j < this.VectorOfNonOwningReferencesLength; ++_j) {_o.VectorOfNonOwningReferences.Add(this.VectorOfNonOwningReferences(_j));}
+ _o.AnyUnique = new MyGame.Example.AnyUniqueAliasesUnion();
+ _o.AnyUnique.Type = this.AnyUniqueType;
+ switch (this.AnyUniqueType) {
+ default: break;
+ case MyGame.Example.AnyUniqueAliases.M:
+ _o.AnyUnique.Value = this.AnyUnique<MyGame.Example.Monster>().HasValue ? this.AnyUnique<MyGame.Example.Monster>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.AnyUniqueAliases.TS:
+ _o.AnyUnique.Value = this.AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().HasValue ? this.AnyUnique<MyGame.Example.TestSimpleTableWithEnum>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.AnyUniqueAliases.M2:
+ _o.AnyUnique.Value = this.AnyUnique<MyGame.Example2.Monster>().HasValue ? this.AnyUnique<MyGame.Example2.Monster>().Value.UnPack() : null;
+ break;
+ }
+ _o.AnyAmbiguous = new MyGame.Example.AnyAmbiguousAliasesUnion();
+ _o.AnyAmbiguous.Type = this.AnyAmbiguousType;
+ switch (this.AnyAmbiguousType) {
+ default: break;
+ case MyGame.Example.AnyAmbiguousAliases.M1:
+ _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.AnyAmbiguousAliases.M2:
+ _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;
+ break;
+ case MyGame.Example.AnyAmbiguousAliases.M3:
+ _o.AnyAmbiguous.Value = this.AnyAmbiguous<MyGame.Example.Monster>().HasValue ? this.AnyAmbiguous<MyGame.Example.Monster>().Value.UnPack() : null;
+ break;
+ }
+ _o.VectorOfEnums = new List<MyGame.Example.Color>();
+ for (var _j = 0; _j < this.VectorOfEnumsLength; ++_j) {_o.VectorOfEnums.Add(this.VectorOfEnums(_j));}
+ _o.SignedEnum = this.SignedEnum;
+ _o.Testrequirednestedflatbuffer = new List<byte>();
+ for (var _j = 0; _j < this.TestrequirednestedflatbufferLength; ++_j) {_o.Testrequirednestedflatbuffer.Add(this.Testrequirednestedflatbuffer(_j));}
+ }
+ public static Offset<MyGame.Example.Monster> Pack(FlatBufferBuilder builder, MonsterT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Monster>);
+ var _name = _o.Name == null ? default(StringOffset) : builder.CreateString(_o.Name);
+ var _inventory = default(VectorOffset);
+ if (_o.Inventory != null) {
+ var __inventory = _o.Inventory.ToArray();
+ _inventory = CreateInventoryVector(builder, __inventory);
+ }
+ var _test_type = _o.Test == null ? MyGame.Example.Any.NONE : _o.Test.Type;
+ var _test = _o.Test == null ? 0 : MyGame.Example.AnyUnion.Pack(builder, _o.Test);
+ var _test4 = default(VectorOffset);
+ if (_o.Test4 != null) {
+ StartTest4Vector(builder, _o.Test4.Count);
+ for (var _j = _o.Test4.Count - 1; _j >= 0; --_j) { MyGame.Example.Test.Pack(builder, _o.Test4[_j]); }
+ _test4 = builder.EndVector();
+ }
+ var _testarrayofstring = default(VectorOffset);
+ if (_o.Testarrayofstring != null) {
+ var __testarrayofstring = new StringOffset[_o.Testarrayofstring.Count];
+ for (var _j = 0; _j < __testarrayofstring.Length; ++_j) { __testarrayofstring[_j] = builder.CreateString(_o.Testarrayofstring[_j]); }
+ _testarrayofstring = CreateTestarrayofstringVector(builder, __testarrayofstring);
+ }
+ var _testarrayoftables = default(VectorOffset);
+ if (_o.Testarrayoftables != null) {
+ var __testarrayoftables = new Offset<MyGame.Example.Monster>[_o.Testarrayoftables.Count];
+ for (var _j = 0; _j < __testarrayoftables.Length; ++_j) { __testarrayoftables[_j] = MyGame.Example.Monster.Pack(builder, _o.Testarrayoftables[_j]); }
+ _testarrayoftables = CreateTestarrayoftablesVector(builder, __testarrayoftables);
+ }
+ var _enemy = _o.Enemy == null ? default(Offset<MyGame.Example.Monster>) : MyGame.Example.Monster.Pack(builder, _o.Enemy);
+ var _testnestedflatbuffer = default(VectorOffset);
+ if (_o.Testnestedflatbuffer != null) {
+ var __testnestedflatbuffer = _o.Testnestedflatbuffer.ToArray();
+ _testnestedflatbuffer = CreateTestnestedflatbufferVector(builder, __testnestedflatbuffer);
+ }
+ var _testempty = _o.Testempty == null ? default(Offset<MyGame.Example.Stat>) : MyGame.Example.Stat.Pack(builder, _o.Testempty);
+ var _testarrayofbools = default(VectorOffset);
+ if (_o.Testarrayofbools != null) {
+ var __testarrayofbools = _o.Testarrayofbools.ToArray();
+ _testarrayofbools = CreateTestarrayofboolsVector(builder, __testarrayofbools);
+ }
+ var _testarrayofstring2 = default(VectorOffset);
+ if (_o.Testarrayofstring2 != null) {
+ var __testarrayofstring2 = new StringOffset[_o.Testarrayofstring2.Count];
+ for (var _j = 0; _j < __testarrayofstring2.Length; ++_j) { __testarrayofstring2[_j] = builder.CreateString(_o.Testarrayofstring2[_j]); }
+ _testarrayofstring2 = CreateTestarrayofstring2Vector(builder, __testarrayofstring2);
+ }
+ var _testarrayofsortedstruct = default(VectorOffset);
+ if (_o.Testarrayofsortedstruct != null) {
+ StartTestarrayofsortedstructVector(builder, _o.Testarrayofsortedstruct.Count);
+ for (var _j = _o.Testarrayofsortedstruct.Count - 1; _j >= 0; --_j) { MyGame.Example.Ability.Pack(builder, _o.Testarrayofsortedstruct[_j]); }
+ _testarrayofsortedstruct = builder.EndVector();
+ }
+ var _flex = default(VectorOffset);
+ if (_o.Flex != null) {
+ var __flex = _o.Flex.ToArray();
+ _flex = CreateFlexVector(builder, __flex);
+ }
+ var _test5 = default(VectorOffset);
+ if (_o.Test5 != null) {
+ StartTest5Vector(builder, _o.Test5.Count);
+ for (var _j = _o.Test5.Count - 1; _j >= 0; --_j) { MyGame.Example.Test.Pack(builder, _o.Test5[_j]); }
+ _test5 = builder.EndVector();
+ }
+ var _vector_of_longs = default(VectorOffset);
+ if (_o.VectorOfLongs != null) {
+ var __vector_of_longs = _o.VectorOfLongs.ToArray();
+ _vector_of_longs = CreateVectorOfLongsVector(builder, __vector_of_longs);
+ }
+ var _vector_of_doubles = default(VectorOffset);
+ if (_o.VectorOfDoubles != null) {
+ var __vector_of_doubles = _o.VectorOfDoubles.ToArray();
+ _vector_of_doubles = CreateVectorOfDoublesVector(builder, __vector_of_doubles);
+ }
+ var _parent_namespace_test = _o.ParentNamespaceTest == null ? default(Offset<MyGame.InParentNamespace>) : MyGame.InParentNamespace.Pack(builder, _o.ParentNamespaceTest);
+ var _vector_of_referrables = default(VectorOffset);
+ if (_o.VectorOfReferrables != null) {
+ var __vector_of_referrables = new Offset<MyGame.Example.Referrable>[_o.VectorOfReferrables.Count];
+ for (var _j = 0; _j < __vector_of_referrables.Length; ++_j) { __vector_of_referrables[_j] = MyGame.Example.Referrable.Pack(builder, _o.VectorOfReferrables[_j]); }
+ _vector_of_referrables = CreateVectorOfReferrablesVector(builder, __vector_of_referrables);
+ }
+ var _vector_of_weak_references = default(VectorOffset);
+ if (_o.VectorOfWeakReferences != null) {
+ var __vector_of_weak_references = _o.VectorOfWeakReferences.ToArray();
+ _vector_of_weak_references = CreateVectorOfWeakReferencesVector(builder, __vector_of_weak_references);
+ }
+ var _vector_of_strong_referrables = default(VectorOffset);
+ if (_o.VectorOfStrongReferrables != null) {
+ var __vector_of_strong_referrables = new Offset<MyGame.Example.Referrable>[_o.VectorOfStrongReferrables.Count];
+ for (var _j = 0; _j < __vector_of_strong_referrables.Length; ++_j) { __vector_of_strong_referrables[_j] = MyGame.Example.Referrable.Pack(builder, _o.VectorOfStrongReferrables[_j]); }
+ _vector_of_strong_referrables = CreateVectorOfStrongReferrablesVector(builder, __vector_of_strong_referrables);
+ }
+ var _vector_of_co_owning_references = default(VectorOffset);
+ if (_o.VectorOfCoOwningReferences != null) {
+ var __vector_of_co_owning_references = _o.VectorOfCoOwningReferences.ToArray();
+ _vector_of_co_owning_references = CreateVectorOfCoOwningReferencesVector(builder, __vector_of_co_owning_references);
+ }
+ var _vector_of_non_owning_references = default(VectorOffset);
+ if (_o.VectorOfNonOwningReferences != null) {
+ var __vector_of_non_owning_references = _o.VectorOfNonOwningReferences.ToArray();
+ _vector_of_non_owning_references = CreateVectorOfNonOwningReferencesVector(builder, __vector_of_non_owning_references);
+ }
+ var _any_unique_type = _o.AnyUnique == null ? MyGame.Example.AnyUniqueAliases.NONE : _o.AnyUnique.Type;
+ var _any_unique = _o.AnyUnique == null ? 0 : MyGame.Example.AnyUniqueAliasesUnion.Pack(builder, _o.AnyUnique);
+ var _any_ambiguous_type = _o.AnyAmbiguous == null ? MyGame.Example.AnyAmbiguousAliases.NONE : _o.AnyAmbiguous.Type;
+ var _any_ambiguous = _o.AnyAmbiguous == null ? 0 : MyGame.Example.AnyAmbiguousAliasesUnion.Pack(builder, _o.AnyAmbiguous);
+ var _vector_of_enums = default(VectorOffset);
+ if (_o.VectorOfEnums != null) {
+ var __vector_of_enums = _o.VectorOfEnums.ToArray();
+ _vector_of_enums = CreateVectorOfEnumsVector(builder, __vector_of_enums);
+ }
+ var _testrequirednestedflatbuffer = default(VectorOffset);
+ if (_o.Testrequirednestedflatbuffer != null) {
+ var __testrequirednestedflatbuffer = _o.Testrequirednestedflatbuffer.ToArray();
+ _testrequirednestedflatbuffer = CreateTestrequirednestedflatbufferVector(builder, __testrequirednestedflatbuffer);
+ }
+ return CreateMonster(
+ builder,
+ _o.Pos,
+ _o.Mana,
+ _o.Hp,
+ _name,
+ _inventory,
+ _o.Color,
+ _test_type,
+ _test,
+ _test4,
+ _testarrayofstring,
+ _testarrayoftables,
+ _enemy,
+ _testnestedflatbuffer,
+ _testempty,
+ _o.Testbool,
+ _o.Testhashs32Fnv1,
+ _o.Testhashu32Fnv1,
+ _o.Testhashs64Fnv1,
+ _o.Testhashu64Fnv1,
+ _o.Testhashs32Fnv1a,
+ _o.Testhashu32Fnv1a,
+ _o.Testhashs64Fnv1a,
+ _o.Testhashu64Fnv1a,
+ _testarrayofbools,
+ _o.Testf,
+ _o.Testf2,
+ _o.Testf3,
+ _testarrayofstring2,
+ _testarrayofsortedstruct,
+ _flex,
+ _test5,
+ _vector_of_longs,
+ _vector_of_doubles,
+ _parent_namespace_test,
+ _vector_of_referrables,
+ _o.SingleWeakReference,
+ _vector_of_weak_references,
+ _vector_of_strong_referrables,
+ _o.CoOwningReference,
+ _vector_of_co_owning_references,
+ _o.NonOwningReference,
+ _vector_of_non_owning_references,
+ _any_unique_type,
+ _any_unique,
+ _any_ambiguous_type,
+ _any_ambiguous,
+ _vector_of_enums,
+ _o.SignedEnum,
+ _testrequirednestedflatbuffer);
+ }
};
+public class MonsterT
+{
+ [Newtonsoft.Json.JsonProperty("pos")]
+ public MyGame.Example.Vec3T Pos { get; set; }
+ [Newtonsoft.Json.JsonProperty("mana")]
+ public short Mana { get; set; }
+ [Newtonsoft.Json.JsonProperty("hp")]
+ public short Hp { get; set; }
+ [Newtonsoft.Json.JsonProperty("name")]
+ public string Name { get; set; }
+ [Newtonsoft.Json.JsonProperty("inventory")]
+ public List<byte> Inventory { get; set; }
+ [Newtonsoft.Json.JsonProperty("color")]
+ public MyGame.Example.Color Color { get; set; }
+ [Newtonsoft.Json.JsonProperty("test_type")]
+ private MyGame.Example.Any TestType {
+ get {
+ return this.Test != null ? this.Test.Type : MyGame.Example.Any.NONE;
+ }
+ set {
+ this.Test = new MyGame.Example.AnyUnion();
+ this.Test.Type = value;
+ }
+ }
+ [Newtonsoft.Json.JsonProperty("test")]
+ [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyUnion_JsonConverter))]
+ public MyGame.Example.AnyUnion Test { get; set; }
+ [Newtonsoft.Json.JsonProperty("test4")]
+ public List<MyGame.Example.TestT> Test4 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testarrayofstring")]
+ public List<string> Testarrayofstring { get; set; }
+ [Newtonsoft.Json.JsonProperty("testarrayoftables")]
+ public List<MyGame.Example.MonsterT> Testarrayoftables { get; set; }
+ [Newtonsoft.Json.JsonProperty("enemy")]
+ public MyGame.Example.MonsterT Enemy { get; set; }
+ [Newtonsoft.Json.JsonProperty("testnestedflatbuffer")]
+ public List<byte> Testnestedflatbuffer { get; set; }
+ [Newtonsoft.Json.JsonProperty("testempty")]
+ public MyGame.Example.StatT Testempty { get; set; }
+ [Newtonsoft.Json.JsonProperty("testbool")]
+ public bool Testbool { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashs32_fnv1")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public int Testhashs32Fnv1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashu32_fnv1")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public uint Testhashu32Fnv1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashs64_fnv1")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public long Testhashs64Fnv1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashu64_fnv1")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong Testhashu64Fnv1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashs32_fnv1a")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public int Testhashs32Fnv1a { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashu32_fnv1a")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public uint Testhashu32Fnv1a { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashs64_fnv1a")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public long Testhashs64Fnv1a { get; set; }
+ [Newtonsoft.Json.JsonProperty("testhashu64_fnv1a")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong Testhashu64Fnv1a { get; set; }
+ [Newtonsoft.Json.JsonProperty("testarrayofbools")]
+ public List<bool> Testarrayofbools { get; set; }
+ [Newtonsoft.Json.JsonProperty("testf")]
+ public float Testf { get; set; }
+ [Newtonsoft.Json.JsonProperty("testf2")]
+ public float Testf2 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testf3")]
+ public float Testf3 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testarrayofstring2")]
+ public List<string> Testarrayofstring2 { get; set; }
+ [Newtonsoft.Json.JsonProperty("testarrayofsortedstruct")]
+ public List<MyGame.Example.AbilityT> Testarrayofsortedstruct { get; set; }
+ [Newtonsoft.Json.JsonProperty("flex")]
+ public List<byte> Flex { get; set; }
+ [Newtonsoft.Json.JsonProperty("test5")]
+ public List<MyGame.Example.TestT> Test5 { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_longs")]
+ public List<long> VectorOfLongs { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_doubles")]
+ public List<double> VectorOfDoubles { get; set; }
+ [Newtonsoft.Json.JsonProperty("parent_namespace_test")]
+ public MyGame.InParentNamespaceT ParentNamespaceTest { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_referrables")]
+ public List<MyGame.Example.ReferrableT> VectorOfReferrables { get; set; }
+ [Newtonsoft.Json.JsonProperty("single_weak_reference")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong SingleWeakReference { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_weak_references")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public List<ulong> VectorOfWeakReferences { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_strong_referrables")]
+ public List<MyGame.Example.ReferrableT> VectorOfStrongReferrables { get; set; }
+ [Newtonsoft.Json.JsonProperty("co_owning_reference")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong CoOwningReference { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_co_owning_references")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public List<ulong> VectorOfCoOwningReferences { get; set; }
+ [Newtonsoft.Json.JsonProperty("non_owning_reference")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong NonOwningReference { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_non_owning_references")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public List<ulong> VectorOfNonOwningReferences { get; set; }
+ [Newtonsoft.Json.JsonProperty("any_unique_type")]
+ private MyGame.Example.AnyUniqueAliases AnyUniqueType {
+ get {
+ return this.AnyUnique != null ? this.AnyUnique.Type : MyGame.Example.AnyUniqueAliases.NONE;
+ }
+ set {
+ this.AnyUnique = new MyGame.Example.AnyUniqueAliasesUnion();
+ this.AnyUnique.Type = value;
+ }
+ }
+ [Newtonsoft.Json.JsonProperty("any_unique")]
+ [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyUniqueAliasesUnion_JsonConverter))]
+ public MyGame.Example.AnyUniqueAliasesUnion AnyUnique { get; set; }
+ [Newtonsoft.Json.JsonProperty("any_ambiguous_type")]
+ private MyGame.Example.AnyAmbiguousAliases AnyAmbiguousType {
+ get {
+ return this.AnyAmbiguous != null ? this.AnyAmbiguous.Type : MyGame.Example.AnyAmbiguousAliases.NONE;
+ }
+ set {
+ this.AnyAmbiguous = new MyGame.Example.AnyAmbiguousAliasesUnion();
+ this.AnyAmbiguous.Type = value;
+ }
+ }
+ [Newtonsoft.Json.JsonProperty("any_ambiguous")]
+ [Newtonsoft.Json.JsonConverter(typeof(MyGame.Example.AnyAmbiguousAliasesUnion_JsonConverter))]
+ public MyGame.Example.AnyAmbiguousAliasesUnion AnyAmbiguous { get; set; }
+ [Newtonsoft.Json.JsonProperty("vector_of_enums")]
+ public List<MyGame.Example.Color> VectorOfEnums { get; set; }
+ [Newtonsoft.Json.JsonProperty("signed_enum")]
+ public MyGame.Example.Race SignedEnum { get; set; }
+ [Newtonsoft.Json.JsonProperty("testrequirednestedflatbuffer")]
+ public List<byte> Testrequirednestedflatbuffer { get; set; }
+
+ public MonsterT() {
+ this.Pos = new MyGame.Example.Vec3T();
+ this.Mana = 150;
+ this.Hp = 100;
+ this.Name = null;
+ this.Inventory = null;
+ this.Color = MyGame.Example.Color.Blue;
+ this.Test = null;
+ this.Test4 = null;
+ this.Testarrayofstring = null;
+ this.Testarrayoftables = null;
+ this.Enemy = null;
+ this.Testnestedflatbuffer = null;
+ this.Testempty = null;
+ this.Testbool = false;
+ this.Testhashs32Fnv1 = 0;
+ this.Testhashu32Fnv1 = 0;
+ this.Testhashs64Fnv1 = 0;
+ this.Testhashu64Fnv1 = 0;
+ this.Testhashs32Fnv1a = 0;
+ this.Testhashu32Fnv1a = 0;
+ this.Testhashs64Fnv1a = 0;
+ this.Testhashu64Fnv1a = 0;
+ this.Testarrayofbools = null;
+ this.Testf = 3.14159f;
+ this.Testf2 = 3.0f;
+ this.Testf3 = 0.0f;
+ this.Testarrayofstring2 = null;
+ this.Testarrayofsortedstruct = null;
+ this.Flex = null;
+ this.Test5 = null;
+ this.VectorOfLongs = null;
+ this.VectorOfDoubles = null;
+ this.ParentNamespaceTest = null;
+ this.VectorOfReferrables = null;
+ this.SingleWeakReference = 0;
+ this.VectorOfWeakReferences = null;
+ this.VectorOfStrongReferrables = null;
+ this.CoOwningReference = 0;
+ this.VectorOfCoOwningReferences = null;
+ this.NonOwningReference = 0;
+ this.VectorOfNonOwningReferences = null;
+ this.AnyUnique = null;
+ this.AnyAmbiguous = null;
+ this.VectorOfEnums = null;
+ this.SignedEnum = MyGame.Example.Race.None;
+ this.Testrequirednestedflatbuffer = null;
+ }
+
+ public static MonsterT DeserializeFromJson(string jsonText) {
+ return Newtonsoft.Json.JsonConvert.DeserializeObject<MonsterT>(jsonText);
+ }
+ public string SerializeToJson() {
+ return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+ }
+ public static MonsterT DeserializeFromBinary(byte[] fbBuffer) {
+ return Monster.GetRootAsMonster(new ByteBuffer(fbBuffer)).UnPack();
+ }
+ public byte[] SerializeToBinary() {
+ var fbb = new FlatBufferBuilder(0x10000);
+ Monster.FinishMonsterBuffer(fbb, Monster.Pack(fbb, this));
+ return fbb.DataBuffer.ToSizedArray();
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Monster.go b/tests/MyGame/Example/Monster.go
index dabb596..2ffe926 100644
--- a/tests/MyGame/Example/Monster.go
+++ b/tests/MyGame/Example/Monster.go
@@ -8,7 +8,436 @@
MyGame "MyGame"
)
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
+type MonsterT struct {
+ Pos *Vec3T
+ Mana int16
+ Hp int16
+ Name string
+ Inventory []byte
+ Color Color
+ Test *AnyT
+ Test4 []*TestT
+ Testarrayofstring []string
+ Testarrayoftables []*MonsterT
+ Enemy *MonsterT
+ Testnestedflatbuffer []byte
+ Testempty *StatT
+ Testbool bool
+ Testhashs32Fnv1 int32
+ Testhashu32Fnv1 uint32
+ Testhashs64Fnv1 int64
+ Testhashu64Fnv1 uint64
+ Testhashs32Fnv1a int32
+ Testhashu32Fnv1a uint32
+ Testhashs64Fnv1a int64
+ Testhashu64Fnv1a uint64
+ Testarrayofbools []bool
+ Testf float32
+ Testf2 float32
+ Testf3 float32
+ Testarrayofstring2 []string
+ Testarrayofsortedstruct []*AbilityT
+ Flex []byte
+ Test5 []*TestT
+ VectorOfLongs []int64
+ VectorOfDoubles []float64
+ ParentNamespaceTest *MyGame.InParentNamespaceT
+ VectorOfReferrables []*ReferrableT
+ SingleWeakReference uint64
+ VectorOfWeakReferences []uint64
+ VectorOfStrongReferrables []*ReferrableT
+ CoOwningReference uint64
+ VectorOfCoOwningReferences []uint64
+ NonOwningReference uint64
+ VectorOfNonOwningReferences []uint64
+ AnyUnique *AnyUniqueAliasesT
+ AnyAmbiguous *AnyAmbiguousAliasesT
+ VectorOfEnums []Color
+ SignedEnum Race
+ Testrequirednestedflatbuffer []byte
+}
+
+func (t *MonsterT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ nameOffset := builder.CreateString(t.Name)
+ inventoryOffset := flatbuffers.UOffsetT(0)
+ if t.Inventory != nil {
+ inventoryOffset = builder.CreateByteString(t.Inventory)
+ }
+ testOffset := t.Test.Pack(builder)
+
+ test4Offset := flatbuffers.UOffsetT(0)
+ if t.Test4 != nil {
+ test4Length := len(t.Test4)
+ MonsterStartTest4Vector(builder, test4Length)
+ for j := test4Length - 1; j >= 0; j-- {
+ t.Test4[j].Pack(builder)
+ }
+ test4Offset = builder.EndVector(test4Length)
+ }
+ testarrayofstringOffset := flatbuffers.UOffsetT(0)
+ if t.Testarrayofstring != nil {
+ testarrayofstringLength := len(t.Testarrayofstring)
+ testarrayofstringOffsets := make([]flatbuffers.UOffsetT, testarrayofstringLength)
+ for j := 0; j < testarrayofstringLength; j++ {
+ testarrayofstringOffsets[j] = builder.CreateString(t.Testarrayofstring[j])
+ }
+ MonsterStartTestarrayofstringVector(builder, testarrayofstringLength)
+ for j := testarrayofstringLength - 1; j >= 0; j-- {
+ builder.PrependUOffsetT(testarrayofstringOffsets[j])
+ }
+ testarrayofstringOffset = builder.EndVector(testarrayofstringLength)
+ }
+ testarrayoftablesOffset := flatbuffers.UOffsetT(0)
+ if t.Testarrayoftables != nil {
+ testarrayoftablesLength := len(t.Testarrayoftables)
+ testarrayoftablesOffsets := make([]flatbuffers.UOffsetT, testarrayoftablesLength)
+ for j := 0; j < testarrayoftablesLength; j++ {
+ testarrayoftablesOffsets[j] = t.Testarrayoftables[j].Pack(builder)
+ }
+ MonsterStartTestarrayoftablesVector(builder, testarrayoftablesLength)
+ for j := testarrayoftablesLength - 1; j >= 0; j-- {
+ builder.PrependUOffsetT(testarrayoftablesOffsets[j])
+ }
+ testarrayoftablesOffset = builder.EndVector(testarrayoftablesLength)
+ }
+ enemyOffset := t.Enemy.Pack(builder)
+ testnestedflatbufferOffset := flatbuffers.UOffsetT(0)
+ if t.Testnestedflatbuffer != nil {
+ testnestedflatbufferOffset = builder.CreateByteString(t.Testnestedflatbuffer)
+ }
+ testemptyOffset := t.Testempty.Pack(builder)
+ testarrayofboolsOffset := flatbuffers.UOffsetT(0)
+ if t.Testarrayofbools != nil {
+ testarrayofboolsLength := len(t.Testarrayofbools)
+ MonsterStartTestarrayofboolsVector(builder, testarrayofboolsLength)
+ for j := testarrayofboolsLength - 1; j >= 0; j-- {
+ builder.PrependBool(t.Testarrayofbools[j])
+ }
+ testarrayofboolsOffset = builder.EndVector(testarrayofboolsLength)
+ }
+ testarrayofstring2Offset := flatbuffers.UOffsetT(0)
+ if t.Testarrayofstring2 != nil {
+ testarrayofstring2Length := len(t.Testarrayofstring2)
+ testarrayofstring2Offsets := make([]flatbuffers.UOffsetT, testarrayofstring2Length)
+ for j := 0; j < testarrayofstring2Length; j++ {
+ testarrayofstring2Offsets[j] = builder.CreateString(t.Testarrayofstring2[j])
+ }
+ MonsterStartTestarrayofstring2Vector(builder, testarrayofstring2Length)
+ for j := testarrayofstring2Length - 1; j >= 0; j-- {
+ builder.PrependUOffsetT(testarrayofstring2Offsets[j])
+ }
+ testarrayofstring2Offset = builder.EndVector(testarrayofstring2Length)
+ }
+ testarrayofsortedstructOffset := flatbuffers.UOffsetT(0)
+ if t.Testarrayofsortedstruct != nil {
+ testarrayofsortedstructLength := len(t.Testarrayofsortedstruct)
+ MonsterStartTestarrayofsortedstructVector(builder, testarrayofsortedstructLength)
+ for j := testarrayofsortedstructLength - 1; j >= 0; j-- {
+ t.Testarrayofsortedstruct[j].Pack(builder)
+ }
+ testarrayofsortedstructOffset = builder.EndVector(testarrayofsortedstructLength)
+ }
+ flexOffset := flatbuffers.UOffsetT(0)
+ if t.Flex != nil {
+ flexOffset = builder.CreateByteString(t.Flex)
+ }
+ test5Offset := flatbuffers.UOffsetT(0)
+ if t.Test5 != nil {
+ test5Length := len(t.Test5)
+ MonsterStartTest5Vector(builder, test5Length)
+ for j := test5Length - 1; j >= 0; j-- {
+ t.Test5[j].Pack(builder)
+ }
+ test5Offset = builder.EndVector(test5Length)
+ }
+ vectorOfLongsOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfLongs != nil {
+ vectorOfLongsLength := len(t.VectorOfLongs)
+ MonsterStartVectorOfLongsVector(builder, vectorOfLongsLength)
+ for j := vectorOfLongsLength - 1; j >= 0; j-- {
+ builder.PrependInt64(t.VectorOfLongs[j])
+ }
+ vectorOfLongsOffset = builder.EndVector(vectorOfLongsLength)
+ }
+ vectorOfDoublesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfDoubles != nil {
+ vectorOfDoublesLength := len(t.VectorOfDoubles)
+ MonsterStartVectorOfDoublesVector(builder, vectorOfDoublesLength)
+ for j := vectorOfDoublesLength - 1; j >= 0; j-- {
+ builder.PrependFloat64(t.VectorOfDoubles[j])
+ }
+ vectorOfDoublesOffset = builder.EndVector(vectorOfDoublesLength)
+ }
+ parentNamespaceTestOffset := t.ParentNamespaceTest.Pack(builder)
+ vectorOfReferrablesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfReferrables != nil {
+ vectorOfReferrablesLength := len(t.VectorOfReferrables)
+ vectorOfReferrablesOffsets := make([]flatbuffers.UOffsetT, vectorOfReferrablesLength)
+ for j := 0; j < vectorOfReferrablesLength; j++ {
+ vectorOfReferrablesOffsets[j] = t.VectorOfReferrables[j].Pack(builder)
+ }
+ MonsterStartVectorOfReferrablesVector(builder, vectorOfReferrablesLength)
+ for j := vectorOfReferrablesLength - 1; j >= 0; j-- {
+ builder.PrependUOffsetT(vectorOfReferrablesOffsets[j])
+ }
+ vectorOfReferrablesOffset = builder.EndVector(vectorOfReferrablesLength)
+ }
+ vectorOfWeakReferencesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfWeakReferences != nil {
+ vectorOfWeakReferencesLength := len(t.VectorOfWeakReferences)
+ MonsterStartVectorOfWeakReferencesVector(builder, vectorOfWeakReferencesLength)
+ for j := vectorOfWeakReferencesLength - 1; j >= 0; j-- {
+ builder.PrependUint64(t.VectorOfWeakReferences[j])
+ }
+ vectorOfWeakReferencesOffset = builder.EndVector(vectorOfWeakReferencesLength)
+ }
+ vectorOfStrongReferrablesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfStrongReferrables != nil {
+ vectorOfStrongReferrablesLength := len(t.VectorOfStrongReferrables)
+ vectorOfStrongReferrablesOffsets := make([]flatbuffers.UOffsetT, vectorOfStrongReferrablesLength)
+ for j := 0; j < vectorOfStrongReferrablesLength; j++ {
+ vectorOfStrongReferrablesOffsets[j] = t.VectorOfStrongReferrables[j].Pack(builder)
+ }
+ MonsterStartVectorOfStrongReferrablesVector(builder, vectorOfStrongReferrablesLength)
+ for j := vectorOfStrongReferrablesLength - 1; j >= 0; j-- {
+ builder.PrependUOffsetT(vectorOfStrongReferrablesOffsets[j])
+ }
+ vectorOfStrongReferrablesOffset = builder.EndVector(vectorOfStrongReferrablesLength)
+ }
+ vectorOfCoOwningReferencesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfCoOwningReferences != nil {
+ vectorOfCoOwningReferencesLength := len(t.VectorOfCoOwningReferences)
+ MonsterStartVectorOfCoOwningReferencesVector(builder, vectorOfCoOwningReferencesLength)
+ for j := vectorOfCoOwningReferencesLength - 1; j >= 0; j-- {
+ builder.PrependUint64(t.VectorOfCoOwningReferences[j])
+ }
+ vectorOfCoOwningReferencesOffset = builder.EndVector(vectorOfCoOwningReferencesLength)
+ }
+ vectorOfNonOwningReferencesOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfNonOwningReferences != nil {
+ vectorOfNonOwningReferencesLength := len(t.VectorOfNonOwningReferences)
+ MonsterStartVectorOfNonOwningReferencesVector(builder, vectorOfNonOwningReferencesLength)
+ for j := vectorOfNonOwningReferencesLength - 1; j >= 0; j-- {
+ builder.PrependUint64(t.VectorOfNonOwningReferences[j])
+ }
+ vectorOfNonOwningReferencesOffset = builder.EndVector(vectorOfNonOwningReferencesLength)
+ }
+ anyUniqueOffset := t.AnyUnique.Pack(builder)
+
+ anyAmbiguousOffset := t.AnyAmbiguous.Pack(builder)
+
+ vectorOfEnumsOffset := flatbuffers.UOffsetT(0)
+ if t.VectorOfEnums != nil {
+ vectorOfEnumsLength := len(t.VectorOfEnums)
+ MonsterStartVectorOfEnumsVector(builder, vectorOfEnumsLength)
+ for j := vectorOfEnumsLength - 1; j >= 0; j-- {
+ builder.PrependByte(byte(t.VectorOfEnums[j]))
+ }
+ vectorOfEnumsOffset = builder.EndVector(vectorOfEnumsLength)
+ }
+ testrequirednestedflatbufferOffset := flatbuffers.UOffsetT(0)
+ if t.Testrequirednestedflatbuffer != nil {
+ testrequirednestedflatbufferOffset = builder.CreateByteString(t.Testrequirednestedflatbuffer)
+ }
+ MonsterStart(builder)
+ posOffset := t.Pos.Pack(builder)
+ MonsterAddPos(builder, posOffset)
+ MonsterAddMana(builder, t.Mana)
+ MonsterAddHp(builder, t.Hp)
+ MonsterAddName(builder, nameOffset)
+ MonsterAddInventory(builder, inventoryOffset)
+ MonsterAddColor(builder, t.Color)
+ if t.Test != nil {
+ MonsterAddTestType(builder, t.Test.Type)
+ }
+ MonsterAddTest(builder, testOffset)
+ MonsterAddTest4(builder, test4Offset)
+ MonsterAddTestarrayofstring(builder, testarrayofstringOffset)
+ MonsterAddTestarrayoftables(builder, testarrayoftablesOffset)
+ MonsterAddEnemy(builder, enemyOffset)
+ MonsterAddTestnestedflatbuffer(builder, testnestedflatbufferOffset)
+ MonsterAddTestempty(builder, testemptyOffset)
+ MonsterAddTestbool(builder, t.Testbool)
+ MonsterAddTesthashs32Fnv1(builder, t.Testhashs32Fnv1)
+ MonsterAddTesthashu32Fnv1(builder, t.Testhashu32Fnv1)
+ MonsterAddTesthashs64Fnv1(builder, t.Testhashs64Fnv1)
+ MonsterAddTesthashu64Fnv1(builder, t.Testhashu64Fnv1)
+ MonsterAddTesthashs32Fnv1a(builder, t.Testhashs32Fnv1a)
+ MonsterAddTesthashu32Fnv1a(builder, t.Testhashu32Fnv1a)
+ MonsterAddTesthashs64Fnv1a(builder, t.Testhashs64Fnv1a)
+ MonsterAddTesthashu64Fnv1a(builder, t.Testhashu64Fnv1a)
+ MonsterAddTestarrayofbools(builder, testarrayofboolsOffset)
+ MonsterAddTestf(builder, t.Testf)
+ MonsterAddTestf2(builder, t.Testf2)
+ MonsterAddTestf3(builder, t.Testf3)
+ MonsterAddTestarrayofstring2(builder, testarrayofstring2Offset)
+ MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstructOffset)
+ MonsterAddFlex(builder, flexOffset)
+ MonsterAddTest5(builder, test5Offset)
+ MonsterAddVectorOfLongs(builder, vectorOfLongsOffset)
+ MonsterAddVectorOfDoubles(builder, vectorOfDoublesOffset)
+ MonsterAddParentNamespaceTest(builder, parentNamespaceTestOffset)
+ MonsterAddVectorOfReferrables(builder, vectorOfReferrablesOffset)
+ MonsterAddSingleWeakReference(builder, t.SingleWeakReference)
+ MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset)
+ MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset)
+ MonsterAddCoOwningReference(builder, t.CoOwningReference)
+ MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset)
+ MonsterAddNonOwningReference(builder, t.NonOwningReference)
+ MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset)
+ if t.AnyUnique != nil {
+ MonsterAddAnyUniqueType(builder, t.AnyUnique.Type)
+ }
+ MonsterAddAnyUnique(builder, anyUniqueOffset)
+ if t.AnyAmbiguous != nil {
+ MonsterAddAnyAmbiguousType(builder, t.AnyAmbiguous.Type)
+ }
+ MonsterAddAnyAmbiguous(builder, anyAmbiguousOffset)
+ MonsterAddVectorOfEnums(builder, vectorOfEnumsOffset)
+ MonsterAddSignedEnum(builder, t.SignedEnum)
+ MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbufferOffset)
+ return MonsterEnd(builder)
+}
+
+func (rcv *Monster) UnPackTo(t *MonsterT) {
+ t.Pos = rcv.Pos(nil).UnPack()
+ t.Mana = rcv.Mana()
+ t.Hp = rcv.Hp()
+ t.Name = string(rcv.Name())
+ t.Inventory = rcv.InventoryBytes()
+ t.Color = rcv.Color()
+ testTable := flatbuffers.Table{}
+ if rcv.Test(&testTable) {
+ t.Test = rcv.TestType().UnPack(testTable)
+ }
+ test4Length := rcv.Test4Length()
+ t.Test4 = make([]*TestT, test4Length)
+ for j := 0; j < test4Length; j++ {
+ x := Test{}
+ rcv.Test4(&x, j)
+ t.Test4[j] = x.UnPack()
+ }
+ testarrayofstringLength := rcv.TestarrayofstringLength()
+ t.Testarrayofstring = make([]string, testarrayofstringLength)
+ for j := 0; j < testarrayofstringLength; j++ {
+ t.Testarrayofstring[j] = string(rcv.Testarrayofstring(j))
+ }
+ testarrayoftablesLength := rcv.TestarrayoftablesLength()
+ t.Testarrayoftables = make([]*MonsterT, testarrayoftablesLength)
+ for j := 0; j < testarrayoftablesLength; j++ {
+ x := Monster{}
+ rcv.Testarrayoftables(&x, j)
+ t.Testarrayoftables[j] = x.UnPack()
+ }
+ t.Enemy = rcv.Enemy(nil).UnPack()
+ t.Testnestedflatbuffer = rcv.TestnestedflatbufferBytes()
+ t.Testempty = rcv.Testempty(nil).UnPack()
+ t.Testbool = rcv.Testbool()
+ t.Testhashs32Fnv1 = rcv.Testhashs32Fnv1()
+ t.Testhashu32Fnv1 = rcv.Testhashu32Fnv1()
+ t.Testhashs64Fnv1 = rcv.Testhashs64Fnv1()
+ t.Testhashu64Fnv1 = rcv.Testhashu64Fnv1()
+ t.Testhashs32Fnv1a = rcv.Testhashs32Fnv1a()
+ t.Testhashu32Fnv1a = rcv.Testhashu32Fnv1a()
+ t.Testhashs64Fnv1a = rcv.Testhashs64Fnv1a()
+ t.Testhashu64Fnv1a = rcv.Testhashu64Fnv1a()
+ testarrayofboolsLength := rcv.TestarrayofboolsLength()
+ t.Testarrayofbools = make([]bool, testarrayofboolsLength)
+ for j := 0; j < testarrayofboolsLength; j++ {
+ t.Testarrayofbools[j] = rcv.Testarrayofbools(j)
+ }
+ t.Testf = rcv.Testf()
+ t.Testf2 = rcv.Testf2()
+ t.Testf3 = rcv.Testf3()
+ testarrayofstring2Length := rcv.Testarrayofstring2Length()
+ t.Testarrayofstring2 = make([]string, testarrayofstring2Length)
+ for j := 0; j < testarrayofstring2Length; j++ {
+ t.Testarrayofstring2[j] = string(rcv.Testarrayofstring2(j))
+ }
+ testarrayofsortedstructLength := rcv.TestarrayofsortedstructLength()
+ t.Testarrayofsortedstruct = make([]*AbilityT, testarrayofsortedstructLength)
+ for j := 0; j < testarrayofsortedstructLength; j++ {
+ x := Ability{}
+ rcv.Testarrayofsortedstruct(&x, j)
+ t.Testarrayofsortedstruct[j] = x.UnPack()
+ }
+ t.Flex = rcv.FlexBytes()
+ test5Length := rcv.Test5Length()
+ t.Test5 = make([]*TestT, test5Length)
+ for j := 0; j < test5Length; j++ {
+ x := Test{}
+ rcv.Test5(&x, j)
+ t.Test5[j] = x.UnPack()
+ }
+ vectorOfLongsLength := rcv.VectorOfLongsLength()
+ t.VectorOfLongs = make([]int64, vectorOfLongsLength)
+ for j := 0; j < vectorOfLongsLength; j++ {
+ t.VectorOfLongs[j] = rcv.VectorOfLongs(j)
+ }
+ vectorOfDoublesLength := rcv.VectorOfDoublesLength()
+ t.VectorOfDoubles = make([]float64, vectorOfDoublesLength)
+ for j := 0; j < vectorOfDoublesLength; j++ {
+ t.VectorOfDoubles[j] = rcv.VectorOfDoubles(j)
+ }
+ t.ParentNamespaceTest = rcv.ParentNamespaceTest(nil).UnPack()
+ vectorOfReferrablesLength := rcv.VectorOfReferrablesLength()
+ t.VectorOfReferrables = make([]*ReferrableT, vectorOfReferrablesLength)
+ for j := 0; j < vectorOfReferrablesLength; j++ {
+ x := Referrable{}
+ rcv.VectorOfReferrables(&x, j)
+ t.VectorOfReferrables[j] = x.UnPack()
+ }
+ t.SingleWeakReference = rcv.SingleWeakReference()
+ vectorOfWeakReferencesLength := rcv.VectorOfWeakReferencesLength()
+ t.VectorOfWeakReferences = make([]uint64, vectorOfWeakReferencesLength)
+ for j := 0; j < vectorOfWeakReferencesLength; j++ {
+ t.VectorOfWeakReferences[j] = rcv.VectorOfWeakReferences(j)
+ }
+ vectorOfStrongReferrablesLength := rcv.VectorOfStrongReferrablesLength()
+ t.VectorOfStrongReferrables = make([]*ReferrableT, vectorOfStrongReferrablesLength)
+ for j := 0; j < vectorOfStrongReferrablesLength; j++ {
+ x := Referrable{}
+ rcv.VectorOfStrongReferrables(&x, j)
+ t.VectorOfStrongReferrables[j] = x.UnPack()
+ }
+ t.CoOwningReference = rcv.CoOwningReference()
+ vectorOfCoOwningReferencesLength := rcv.VectorOfCoOwningReferencesLength()
+ t.VectorOfCoOwningReferences = make([]uint64, vectorOfCoOwningReferencesLength)
+ for j := 0; j < vectorOfCoOwningReferencesLength; j++ {
+ t.VectorOfCoOwningReferences[j] = rcv.VectorOfCoOwningReferences(j)
+ }
+ t.NonOwningReference = rcv.NonOwningReference()
+ vectorOfNonOwningReferencesLength := rcv.VectorOfNonOwningReferencesLength()
+ t.VectorOfNonOwningReferences = make([]uint64, vectorOfNonOwningReferencesLength)
+ for j := 0; j < vectorOfNonOwningReferencesLength; j++ {
+ t.VectorOfNonOwningReferences[j] = rcv.VectorOfNonOwningReferences(j)
+ }
+ anyUniqueTable := flatbuffers.Table{}
+ if rcv.AnyUnique(&anyUniqueTable) {
+ t.AnyUnique = rcv.AnyUniqueType().UnPack(anyUniqueTable)
+ }
+ anyAmbiguousTable := flatbuffers.Table{}
+ if rcv.AnyAmbiguous(&anyAmbiguousTable) {
+ t.AnyAmbiguous = rcv.AnyAmbiguousType().UnPack(anyAmbiguousTable)
+ }
+ vectorOfEnumsLength := rcv.VectorOfEnumsLength()
+ t.VectorOfEnums = make([]Color, vectorOfEnumsLength)
+ for j := 0; j < vectorOfEnumsLength; j++ {
+ t.VectorOfEnums[j] = rcv.VectorOfEnums(j)
+ }
+ t.SignedEnum = rcv.SignedEnum()
+ t.Testrequirednestedflatbuffer = rcv.TestrequirednestedflatbufferBytes()
+}
+
+func (rcv *Monster) UnPack() *MonsterT {
+ if rcv == nil { return nil }
+ t := &MonsterT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Monster struct {
_tab flatbuffers.Table
}
@@ -20,6 +449,13 @@
return x
}
+func GetSizePrefixedRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &Monster{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *Monster) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
@@ -815,8 +1251,54 @@
return false
}
+func (rcv *Monster) SignedEnum() Race {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(100))
+ if o != 0 {
+ return Race(rcv._tab.GetInt8(o + rcv._tab.Pos))
+ }
+ return -1
+}
+
+func (rcv *Monster) MutateSignedEnum(n Race) bool {
+ return rcv._tab.MutateInt8Slot(100, int8(n))
+}
+
+func (rcv *Monster) Testrequirednestedflatbuffer(j int) byte {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(102))
+ if o != 0 {
+ a := rcv._tab.Vector(o)
+ return rcv._tab.GetByte(a + flatbuffers.UOffsetT(j*1))
+ }
+ return 0
+}
+
+func (rcv *Monster) TestrequirednestedflatbufferLength() int {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(102))
+ if o != 0 {
+ return rcv._tab.VectorLen(o)
+ }
+ return 0
+}
+
+func (rcv *Monster) TestrequirednestedflatbufferBytes() []byte {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(102))
+ if o != 0 {
+ return rcv._tab.ByteVector(o + rcv._tab.Pos)
+ }
+ return nil
+}
+
+func (rcv *Monster) MutateTestrequirednestedflatbuffer(j int, n byte) bool {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(102))
+ if o != 0 {
+ a := rcv._tab.Vector(o)
+ return rcv._tab.MutateByte(a+flatbuffers.UOffsetT(j*1), n)
+ }
+ return false
+}
+
func MonsterStart(builder *flatbuffers.Builder) {
- builder.StartObject(48)
+ builder.StartObject(50)
}
func MonsterAddPos(builder *flatbuffers.Builder, pos flatbuffers.UOffsetT) {
builder.PrependStructSlot(0, flatbuffers.UOffsetT(pos), 0)
@@ -1013,6 +1495,15 @@
func MonsterStartVectorOfEnumsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
return builder.StartVector(1, numElems, 1)
}
+func MonsterAddSignedEnum(builder *flatbuffers.Builder, signedEnum Race) {
+ builder.PrependInt8Slot(48, int8(signedEnum), -1)
+}
+func MonsterAddTestrequirednestedflatbuffer(builder *flatbuffers.Builder, testrequirednestedflatbuffer flatbuffers.UOffsetT) {
+ builder.PrependUOffsetTSlot(49, flatbuffers.UOffsetT(testrequirednestedflatbuffer), 0)
+}
+func MonsterStartTestrequirednestedflatbufferVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
+ return builder.StartVector(1, numElems, 1)
+}
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 34d7983..c3cd1ca 100644
--- a/tests/MyGame/Example/Monster.java
+++ b/tests/MyGame/Example/Monster.java
@@ -7,12 +7,12 @@
import java.util.*;
import com.google.flatbuffers.*;
-@SuppressWarnings("unused")
/**
- * an example documentation comment: monster object
+ * an example documentation comment: "monster object"
*/
+@SuppressWarnings("unused")
public final class Monster extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }
public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public static boolean MonsterBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "MONS"); }
@@ -30,19 +30,24 @@
public ByteBuffer nameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); }
public int inventory(int j) { int o = __offset(14); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
public int inventoryLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector inventoryVector() { return inventoryVector(new ByteVector()); }
+ public ByteVector inventoryVector(ByteVector obj) { int o = __offset(14); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer inventoryAsByteBuffer() { return __vector_as_bytebuffer(14, 1); }
public ByteBuffer inventoryInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); }
public boolean mutateInventory(int j, int inventory) { int o = __offset(14); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)inventory); return true; } else { return false; } }
public int color() { int o = __offset(16); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 8; }
public boolean mutateColor(int color) { int o = __offset(16); if (o != 0) { bb.put(o + bb_pos, (byte)color); return true; } else { return false; } }
public byte testType() { int o = __offset(18); return o != 0 ? bb.get(o + bb_pos) : 0; }
- public boolean mutateTestType(byte test_type) { int o = __offset(18); if (o != 0) { bb.put(o + bb_pos, test_type); return true; } else { return false; } }
- public Table test(Table obj) { int o = __offset(20); return o != 0 ? __union(obj, o) : null; }
+ public Table test(Table obj) { int o = __offset(20); return o != 0 ? __union(obj, o + bb_pos) : null; }
public MyGame.Example.Test test4(int j) { return test4(new MyGame.Example.Test(), j); }
public MyGame.Example.Test test4(MyGame.Example.Test obj, int j) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o) + j * 4, bb) : null; }
public int test4Length() { int o = __offset(22); return o != 0 ? __vector_len(o) : 0; }
+ public MyGame.Example.Test.Vector test4Vector() { return test4Vector(new MyGame.Example.Test.Vector()); }
+ public MyGame.Example.Test.Vector test4Vector(MyGame.Example.Test.Vector obj) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public String testarrayofstring(int j) { int o = __offset(24); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int testarrayofstringLength() { int o = __offset(24); return o != 0 ? __vector_len(o) : 0; }
+ public StringVector testarrayofstringVector() { return testarrayofstringVector(new StringVector()); }
+ public StringVector testarrayofstringVector(StringVector obj) { int o = __offset(24); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
/**
* an example documentation comment: this will end up in the generated code
* multiline too
@@ -52,10 +57,14 @@
public int testarrayoftablesLength() { int o = __offset(26); return o != 0 ? __vector_len(o) : 0; }
public MyGame.Example.Monster testarrayoftablesByKey(String key) { int o = __offset(26); return o != 0 ? MyGame.Example.Monster.__lookup_by_key(null, __vector(o), key, bb) : null; }
public MyGame.Example.Monster testarrayoftablesByKey(MyGame.Example.Monster obj, String key) { int o = __offset(26); return o != 0 ? MyGame.Example.Monster.__lookup_by_key(obj, __vector(o), key, bb) : null; }
+ public MyGame.Example.Monster.Vector testarrayoftablesVector() { return testarrayoftablesVector(new MyGame.Example.Monster.Vector()); }
+ public MyGame.Example.Monster.Vector testarrayoftablesVector(MyGame.Example.Monster.Vector obj) { int o = __offset(26); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public MyGame.Example.Monster enemy() { return enemy(new MyGame.Example.Monster()); }
public MyGame.Example.Monster enemy(MyGame.Example.Monster obj) { int o = __offset(28); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; }
public int testnestedflatbuffer(int j) { int o = __offset(30); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
public int testnestedflatbufferLength() { int o = __offset(30); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector testnestedflatbufferVector() { return testnestedflatbufferVector(new ByteVector()); }
+ public ByteVector testnestedflatbufferVector(ByteVector obj) { int o = __offset(30); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer testnestedflatbufferAsByteBuffer() { return __vector_as_bytebuffer(30, 1); }
public ByteBuffer testnestedflatbufferInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 30, 1); }
public MyGame.Example.Monster testnestedflatbufferAsMonster() { return testnestedflatbufferAsMonster(new MyGame.Example.Monster()); }
@@ -83,6 +92,8 @@
public boolean mutateTesthashu64Fnv1a(long testhashu64_fnv1a) { int o = __offset(50); if (o != 0) { bb.putLong(o + bb_pos, testhashu64_fnv1a); return true; } else { return false; } }
public boolean testarrayofbools(int j) { int o = __offset(52); return o != 0 ? 0!=bb.get(__vector(o) + j * 1) : false; }
public int testarrayofboolsLength() { int o = __offset(52); return o != 0 ? __vector_len(o) : 0; }
+ public BooleanVector testarrayofboolsVector() { return testarrayofboolsVector(new BooleanVector()); }
+ public BooleanVector testarrayofboolsVector(BooleanVector obj) { int o = __offset(52); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer testarrayofboolsAsByteBuffer() { return __vector_as_bytebuffer(52, 1); }
public ByteBuffer testarrayofboolsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 52, 1); }
public boolean mutateTestarrayofbools(int j, boolean testarrayofbools) { int o = __offset(52); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)(testarrayofbools ? 1 : 0)); return true; } else { return false; } }
@@ -94,24 +105,36 @@
public boolean mutateTestf3(float testf3) { int o = __offset(58); if (o != 0) { bb.putFloat(o + bb_pos, testf3); return true; } else { return false; } }
public String testarrayofstring2(int j) { int o = __offset(60); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int testarrayofstring2Length() { int o = __offset(60); return o != 0 ? __vector_len(o) : 0; }
+ public StringVector testarrayofstring2Vector() { return testarrayofstring2Vector(new StringVector()); }
+ public StringVector testarrayofstring2Vector(StringVector obj) { int o = __offset(60); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public MyGame.Example.Ability testarrayofsortedstruct(int j) { return testarrayofsortedstruct(new MyGame.Example.Ability(), j); }
public MyGame.Example.Ability testarrayofsortedstruct(MyGame.Example.Ability obj, int j) { int o = __offset(62); return o != 0 ? obj.__assign(__vector(o) + j * 8, bb) : null; }
public int testarrayofsortedstructLength() { int o = __offset(62); return o != 0 ? __vector_len(o) : 0; }
+ public MyGame.Example.Ability.Vector testarrayofsortedstructVector() { return testarrayofsortedstructVector(new MyGame.Example.Ability.Vector()); }
+ public MyGame.Example.Ability.Vector testarrayofsortedstructVector(MyGame.Example.Ability.Vector obj) { int o = __offset(62); return o != 0 ? obj.__assign(__vector(o), 8, bb) : null; }
public int flex(int j) { int o = __offset(64); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
public int flexLength() { int o = __offset(64); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector flexVector() { return flexVector(new ByteVector()); }
+ public ByteVector flexVector(ByteVector obj) { int o = __offset(64); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer flexAsByteBuffer() { return __vector_as_bytebuffer(64, 1); }
public ByteBuffer flexInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 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 MyGame.Example.Test test5(int j) { return test5(new MyGame.Example.Test(), j); }
public MyGame.Example.Test test5(MyGame.Example.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 MyGame.Example.Test.Vector test5Vector() { return test5Vector(new MyGame.Example.Test.Vector()); }
+ public MyGame.Example.Test.Vector test5Vector(MyGame.Example.Test.Vector obj) { int o = __offset(66); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public long vectorOfLongs(int j) { int o = __offset(68); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }
public int vectorOfLongsLength() { int o = __offset(68); return o != 0 ? __vector_len(o) : 0; }
+ public LongVector vectorOfLongsVector() { return vectorOfLongsVector(new LongVector()); }
+ public LongVector vectorOfLongsVector(LongVector obj) { int o = __offset(68); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfLongsAsByteBuffer() { return __vector_as_bytebuffer(68, 8); }
public ByteBuffer vectorOfLongsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 68, 8); }
public boolean mutateVectorOfLongs(int j, long vector_of_longs) { int o = __offset(68); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_longs); return true; } else { return false; } }
public double vectorOfDoubles(int j) { int o = __offset(70); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }
public int vectorOfDoublesLength() { int o = __offset(70); return o != 0 ? __vector_len(o) : 0; }
+ public DoubleVector vectorOfDoublesVector() { return vectorOfDoublesVector(new DoubleVector()); }
+ public DoubleVector vectorOfDoublesVector(DoubleVector obj) { int o = __offset(70); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfDoublesAsByteBuffer() { return __vector_as_bytebuffer(70, 8); }
public ByteBuffer vectorOfDoublesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 70, 8); }
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; } }
@@ -122,10 +145,14 @@
public int vectorOfReferrablesLength() { int o = __offset(74); return o != 0 ? __vector_len(o) : 0; }
public MyGame.Example.Referrable vectorOfReferrablesByKey(long key) { int o = __offset(74); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb) : null; }
public MyGame.Example.Referrable vectorOfReferrablesByKey(MyGame.Example.Referrable obj, long key) { int o = __offset(74); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb) : null; }
+ public MyGame.Example.Referrable.Vector vectorOfReferrablesVector() { return vectorOfReferrablesVector(new MyGame.Example.Referrable.Vector()); }
+ public MyGame.Example.Referrable.Vector vectorOfReferrablesVector(MyGame.Example.Referrable.Vector obj) { int o = __offset(74); return o != 0 ? obj.__assign(__vector(o), 4, 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 LongVector vectorOfWeakReferencesVector() { return vectorOfWeakReferencesVector(new LongVector()); }
+ public LongVector vectorOfWeakReferencesVector(LongVector obj) { int o = __offset(78); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfWeakReferencesAsByteBuffer() { return __vector_as_bytebuffer(78, 8); }
public ByteBuffer vectorOfWeakReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 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; } }
@@ -134,10 +161,14 @@
public int vectorOfStrongReferrablesLength() { int o = __offset(80); return o != 0 ? __vector_len(o) : 0; }
public MyGame.Example.Referrable vectorOfStrongReferrablesByKey(long key) { int o = __offset(80); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(null, __vector(o), key, bb) : null; }
public MyGame.Example.Referrable vectorOfStrongReferrablesByKey(MyGame.Example.Referrable obj, long key) { int o = __offset(80); return o != 0 ? MyGame.Example.Referrable.__lookup_by_key(obj, __vector(o), key, bb) : null; }
+ public MyGame.Example.Referrable.Vector vectorOfStrongReferrablesVector() { return vectorOfStrongReferrablesVector(new MyGame.Example.Referrable.Vector()); }
+ public MyGame.Example.Referrable.Vector vectorOfStrongReferrablesVector(MyGame.Example.Referrable.Vector obj) { int o = __offset(80); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public long coOwningReference() { int o = __offset(82); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
public boolean mutateCoOwningReference(long co_owning_reference) { int o = __offset(82); if (o != 0) { bb.putLong(o + bb_pos, co_owning_reference); return true; } else { return false; } }
public long vectorOfCoOwningReferences(int j) { int o = __offset(84); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }
public int vectorOfCoOwningReferencesLength() { int o = __offset(84); return o != 0 ? __vector_len(o) : 0; }
+ public LongVector vectorOfCoOwningReferencesVector() { return vectorOfCoOwningReferencesVector(new LongVector()); }
+ public LongVector vectorOfCoOwningReferencesVector(LongVector obj) { int o = __offset(84); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfCoOwningReferencesAsByteBuffer() { return __vector_as_bytebuffer(84, 8); }
public ByteBuffer vectorOfCoOwningReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 84, 8); }
public boolean mutateVectorOfCoOwningReferences(int j, long vector_of_co_owning_references) { int o = __offset(84); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_co_owning_references); return true; } else { return false; } }
@@ -145,28 +176,42 @@
public boolean mutateNonOwningReference(long non_owning_reference) { int o = __offset(86); if (o != 0) { bb.putLong(o + bb_pos, non_owning_reference); return true; } else { return false; } }
public long vectorOfNonOwningReferences(int j) { int o = __offset(88); return o != 0 ? bb.getLong(__vector(o) + j * 8) : 0; }
public int vectorOfNonOwningReferencesLength() { int o = __offset(88); return o != 0 ? __vector_len(o) : 0; }
+ public LongVector vectorOfNonOwningReferencesVector() { return vectorOfNonOwningReferencesVector(new LongVector()); }
+ public LongVector vectorOfNonOwningReferencesVector(LongVector obj) { int o = __offset(88); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfNonOwningReferencesAsByteBuffer() { return __vector_as_bytebuffer(88, 8); }
public ByteBuffer vectorOfNonOwningReferencesInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 88, 8); }
public boolean mutateVectorOfNonOwningReferences(int j, long vector_of_non_owning_references) { int o = __offset(88); if (o != 0) { bb.putLong(__vector(o) + j * 8, vector_of_non_owning_references); return true; } else { return false; } }
public byte anyUniqueType() { int o = __offset(90); return o != 0 ? bb.get(o + bb_pos) : 0; }
- public boolean mutateAnyUniqueType(byte any_unique_type) { int o = __offset(90); if (o != 0) { bb.put(o + bb_pos, any_unique_type); return true; } else { return false; } }
- public Table anyUnique(Table obj) { int o = __offset(92); return o != 0 ? __union(obj, o) : null; }
+ public Table anyUnique(Table obj) { int o = __offset(92); return o != 0 ? __union(obj, o + bb_pos) : null; }
public byte anyAmbiguousType() { int o = __offset(94); return o != 0 ? bb.get(o + bb_pos) : 0; }
- public boolean mutateAnyAmbiguousType(byte any_ambiguous_type) { int o = __offset(94); if (o != 0) { bb.put(o + bb_pos, any_ambiguous_type); return true; } else { return false; } }
- public Table anyAmbiguous(Table obj) { int o = __offset(96); return o != 0 ? __union(obj, o) : null; }
+ public Table anyAmbiguous(Table obj) { int o = __offset(96); return o != 0 ? __union(obj, o + bb_pos) : null; }
public int vectorOfEnums(int j) { int o = __offset(98); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
public int vectorOfEnumsLength() { int o = __offset(98); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector vectorOfEnumsVector() { return vectorOfEnumsVector(new ByteVector()); }
+ public ByteVector vectorOfEnumsVector(ByteVector obj) { int o = __offset(98); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vectorOfEnumsAsByteBuffer() { return __vector_as_bytebuffer(98, 1); }
public ByteBuffer vectorOfEnumsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 98, 1); }
public boolean mutateVectorOfEnums(int j, int vector_of_enums) { int o = __offset(98); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)vector_of_enums); return true; } else { return false; } }
+ public byte signedEnum() { int o = __offset(100); return o != 0 ? bb.get(o + bb_pos) : -1; }
+ public boolean mutateSignedEnum(byte signed_enum) { int o = __offset(100); if (o != 0) { bb.put(o + bb_pos, signed_enum); return true; } else { return false; } }
+ public int testrequirednestedflatbuffer(int j) { int o = __offset(102); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; }
+ public int testrequirednestedflatbufferLength() { int o = __offset(102); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector testrequirednestedflatbufferVector() { return testrequirednestedflatbufferVector(new ByteVector()); }
+ public ByteVector testrequirednestedflatbufferVector(ByteVector obj) { int o = __offset(102); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
+ public ByteBuffer testrequirednestedflatbufferAsByteBuffer() { return __vector_as_bytebuffer(102, 1); }
+ public ByteBuffer testrequirednestedflatbufferInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 102, 1); }
+ public MyGame.Example.Monster testrequirednestedflatbufferAsMonster() { return testrequirednestedflatbufferAsMonster(new MyGame.Example.Monster()); }
+ public MyGame.Example.Monster testrequirednestedflatbufferAsMonster(MyGame.Example.Monster obj) { int o = __offset(102); return o != 0 ? obj.__assign(__indirect(__vector(o)), bb) : null; }
+ public boolean mutateTestrequirednestedflatbuffer(int j, int testrequirednestedflatbuffer) { int o = __offset(102); if (o != 0) { bb.put(__vector(o) + j * 1, (byte)testrequirednestedflatbuffer); return true; } else { return false; } }
- public static void startMonster(FlatBufferBuilder builder) { builder.startTable(48); }
+ public static void startMonster(FlatBufferBuilder builder) { builder.startTable(50); }
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); }
public static void addName(FlatBufferBuilder builder, int nameOffset) { builder.addOffset(3, nameOffset, 0); }
public static void addInventory(FlatBufferBuilder builder, int inventoryOffset) { builder.addOffset(5, inventoryOffset, 0); }
- public static int createInventoryVector(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 int createInventoryVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createInventoryVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
public static void startInventoryVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
public static void addColor(FlatBufferBuilder builder, int color) { builder.addByte(6, (byte)color, (byte)8); }
public static void addTestType(FlatBufferBuilder builder, byte testType) { builder.addByte(7, testType, 0); }
@@ -181,7 +226,8 @@
public static void startTestarrayoftablesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static void addEnemy(FlatBufferBuilder builder, int enemyOffset) { builder.addOffset(12, enemyOffset, 0); }
public static void addTestnestedflatbuffer(FlatBufferBuilder builder, int testnestedflatbufferOffset) { builder.addOffset(13, testnestedflatbufferOffset, 0); }
- public static int createTestnestedflatbufferVector(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 int createTestnestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createTestnestedflatbufferVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
public static void startTestnestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
public static void addTestempty(FlatBufferBuilder builder, int testemptyOffset) { builder.addOffset(14, testemptyOffset, 0); }
public static void addTestbool(FlatBufferBuilder builder, boolean testbool) { builder.addBoolean(15, testbool, false); }
@@ -205,7 +251,8 @@
public static void addTestarrayofsortedstruct(FlatBufferBuilder builder, int testarrayofsortedstructOffset) { builder.addOffset(29, testarrayofsortedstructOffset, 0); }
public static void startTestarrayofsortedstructVector(FlatBufferBuilder builder, int numElems) { builder.startVector(8, numElems, 4); }
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 int createFlexVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createFlexVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
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); }
@@ -239,8 +286,14 @@
public static void addAnyAmbiguousType(FlatBufferBuilder builder, byte anyAmbiguousType) { builder.addByte(45, anyAmbiguousType, 0); }
public static void addAnyAmbiguous(FlatBufferBuilder builder, int anyAmbiguousOffset) { builder.addOffset(46, anyAmbiguousOffset, 0); }
public static void addVectorOfEnums(FlatBufferBuilder builder, int vectorOfEnumsOffset) { builder.addOffset(47, vectorOfEnumsOffset, 0); }
- public static int createVectorOfEnumsVector(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 int createVectorOfEnumsVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createVectorOfEnumsVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
public static void startVectorOfEnumsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
+ public static void addSignedEnum(FlatBufferBuilder builder, byte signedEnum) { builder.addByte(48, signedEnum, -1); }
+ public static void addTestrequirednestedflatbuffer(FlatBufferBuilder builder, int testrequirednestedflatbufferOffset) { builder.addOffset(49, testrequirednestedflatbufferOffset, 0); }
+ public static int createTestrequirednestedflatbufferVector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createTestrequirednestedflatbufferVector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
+ public static void startTestrequirednestedflatbufferVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
public static int endMonster(FlatBufferBuilder builder) {
int o = builder.endTable();
builder.required(o, 10); // name
@@ -253,7 +306,7 @@
protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(10, o1, _bb), __offset(10, o2, _bb), _bb); }
public static Monster __lookup_by_key(Monster obj, int vectorLocation, String key, ByteBuffer bb) {
- byte[] byteKey = key.getBytes(Table.UTF8_CHARSET.get());
+ byte[] byteKey = key.getBytes(java.nio.charset.StandardCharsets.UTF_8);
int span = bb.getInt(vectorLocation - 4);
int start = 0;
while (span != 0) {
@@ -272,5 +325,14 @@
}
return null;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Monster get(int j) { return get(new Monster(), j); }
+ public Monster get(Monster obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ public Monster getByKey(String key) { return __lookup_by_key(null, __vector(), key, bb); }
+ public Monster getByKey(Monster obj, String key) { return __lookup_by_key(obj, __vector(), key, bb); }
+ }
}
diff --git a/tests/MyGame/Example/Monster.kt b/tests/MyGame/Example/Monster.kt
index 71d72b8..7b15138 100644
--- a/tests/MyGame/Example/Monster.kt
+++ b/tests/MyGame/Example/Monster.kt
@@ -7,7 +7,7 @@
import com.google.flatbuffers.*
/**
- * an example documentation comment: monster object
+ * an example documentation comment: "monster object"
*/
@Suppress("unused")
@ExperimentalUnsignedTypes
@@ -116,7 +116,7 @@
}
}
fun test(obj: Table) : Table? {
- val o = __offset(20); return if (o != 0) __union(obj, o) else null
+ val o = __offset(20); return if (o != 0) __union(obj, o + bb_pos) else null
}
fun test4(j: Int) : MyGame.Example.Test? = test4(MyGame.Example.Test(), j)
fun test4(obj: MyGame.Example.Test, j: Int) : MyGame.Example.Test? {
@@ -717,7 +717,7 @@
}
}
fun anyUnique(obj: Table) : Table? {
- val o = __offset(92); return if (o != 0) __union(obj, o) else null
+ val o = __offset(92); return if (o != 0) __union(obj, o + bb_pos) else null
}
val anyAmbiguousType : UByte
get() {
@@ -734,7 +734,7 @@
}
}
fun anyAmbiguous(obj: Table) : Table? {
- val o = __offset(96); return if (o != 0) __union(obj, o) else null
+ val o = __offset(96); return if (o != 0) __union(obj, o + bb_pos) else null
}
fun vectorOfEnums(j: Int) : UByte {
val o = __offset(98)
@@ -759,18 +759,64 @@
false
}
}
+ val signedEnum : Byte
+ get() {
+ val o = __offset(100)
+ return if(o != 0) bb.get(o + bb_pos) else -1
+ }
+ fun mutateSignedEnum(signedEnum: Byte) : Boolean {
+ val o = __offset(100)
+ return if (o != 0) {
+ bb.put(o + bb_pos, signedEnum)
+ true
+ } else {
+ false
+ }
+ }
+ fun testrequirednestedflatbuffer(j: Int) : UByte {
+ val o = __offset(102)
+ return if (o != 0) {
+ bb.get(__vector(o) + j * 1).toUByte()
+ } else {
+ 0u
+ }
+ }
+ val testrequirednestedflatbufferLength : Int
+ get() {
+ val o = __offset(102); return if (o != 0) __vector_len(o) else 0
+ }
+ val testrequirednestedflatbufferAsByteBuffer : ByteBuffer get() = __vector_as_bytebuffer(102, 1)
+ fun testrequirednestedflatbufferInByteBuffer(_bb: ByteBuffer) : ByteBuffer = __vector_in_bytebuffer(_bb, 102, 1)
+ val testrequirednestedflatbufferAsMonster : MyGame.Example.Monster? get() = testrequirednestedflatbufferAsMonster(MyGame.Example.Monster())
+ fun testrequirednestedflatbufferAsMonster(obj: MyGame.Example.Monster) : MyGame.Example.Monster? {
+ val o = __offset(102)
+ return if (o != 0) {
+ obj.__assign(__indirect(__vector(o)), bb)
+ } else {
+ null
+ }
+ }
+ fun mutateTestrequirednestedflatbuffer(j: Int, testrequirednestedflatbuffer: UByte) : Boolean {
+ val o = __offset(102)
+ return if (o != 0) {
+ bb.put(__vector(o) + j * 1, testrequirednestedflatbuffer.toByte())
+ true
+ } else {
+ false
+ }
+ }
override fun keysCompare(o1: Int, o2: Int, _bb: ByteBuffer) : Int {
return compareStrings(__offset(10, o1, _bb), __offset(10, o2, _bb), _bb)
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsMonster(_bb: ByteBuffer): Monster = getRootAsMonster(_bb, Monster())
fun getRootAsMonster(_bb: ByteBuffer, obj: Monster): Monster {
_bb.order(ByteOrder.LITTLE_ENDIAN)
return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
}
fun MonsterBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "MONS")
- fun startMonster(builder: FlatBufferBuilder) = builder.startTable(48)
+ fun startMonster(builder: FlatBufferBuilder) = builder.startTable(50)
fun addPos(builder: FlatBufferBuilder, pos: Int) = builder.addStruct(0, pos, 0)
fun addMana(builder: FlatBufferBuilder, mana: Short) = builder.addShort(1, mana, 150)
fun addHp(builder: FlatBufferBuilder, hp: Short) = builder.addShort(2, hp, 100)
@@ -941,6 +987,16 @@
return builder.endVector()
}
fun startVectorOfEnumsVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)
+ fun addSignedEnum(builder: FlatBufferBuilder, signedEnum: Byte) = builder.addByte(48, signedEnum, -1)
+ fun addTestrequirednestedflatbuffer(builder: FlatBufferBuilder, testrequirednestedflatbuffer: Int) = builder.addOffset(49, testrequirednestedflatbuffer, 0)
+ fun createTestrequirednestedflatbufferVector(builder: FlatBufferBuilder, data: UByteArray) : Int {
+ builder.startVector(1, data.size, 1)
+ for (i in data.size - 1 downTo 0) {
+ builder.addByte(data[i].toByte())
+ }
+ return builder.endVector()
+ }
+ fun startTestrequirednestedflatbufferVector(builder: FlatBufferBuilder, numElems: Int) = builder.startVector(1, numElems, 1)
fun endMonster(builder: FlatBufferBuilder) : Int {
val o = builder.endTable()
builder.required(o, 10)
@@ -949,7 +1005,7 @@
fun finishMonsterBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, "MONS")
fun finishSizePrefixedMonsterBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, "MONS")
fun __lookup_by_key(obj: Monster?, vectorLocation: Int, key: String, bb: ByteBuffer) : Monster? {
- val byteKey = key.toByteArray(Table.UTF8_CHARSET.get()!!)
+ val byteKey = key.toByteArray(java.nio.charset.StandardCharsets.UTF_8)
var span = bb.getInt(vectorLocation - 4)
var start = 0
while (span != 0) {
diff --git a/tests/MyGame/Example/Monster.lua b/tests/MyGame/Example/Monster.lua
index 130c903..78ae4a5 100644
--- a/tests/MyGame/Example/Monster.lua
+++ b/tests/MyGame/Example/Monster.lua
@@ -4,7 +4,7 @@
local flatbuffers = require('flatbuffers')
--- an example documentation comment: monster object
+-- an example documentation comment: "monster object"
local Monster = {} -- the module
local Monster_mt = {} -- the class metatable
@@ -522,7 +522,29 @@
end
return 0
end
-function Monster.Start(builder) builder:StartObject(48) end
+function Monster_mt:SignedEnum()
+ local o = self.view:Offset(100)
+ if o ~= 0 then
+ return self.view:Get(flatbuffers.N.Int8, o + self.view.pos)
+ end
+ return -1
+end
+function Monster_mt:Testrequirednestedflatbuffer(j)
+ local o = self.view:Offset(102)
+ if o ~= 0 then
+ local a = self.view:Vector(o)
+ return self.view:Get(flatbuffers.N.Uint8, a + ((j-1) * 1))
+ end
+ return 0
+end
+function Monster_mt:TestrequirednestedflatbufferLength()
+ local o = self.view:Offset(102)
+ if o ~= 0 then
+ return self.view:VectorLen(o)
+ end
+ return 0
+end
+function Monster.Start(builder) builder:StartObject(50) end
function Monster.AddPos(builder, pos) builder:PrependStructSlot(0, pos, 0) end
function Monster.AddMana(builder, mana) builder:PrependInt16Slot(1, mana, 150) end
function Monster.AddHp(builder, hp) builder:PrependInt16Slot(2, hp, 100) end
@@ -588,6 +610,9 @@
function Monster.AddAnyAmbiguous(builder, anyAmbiguous) builder:PrependUOffsetTRelativeSlot(46, anyAmbiguous, 0) end
function Monster.AddVectorOfEnums(builder, vectorOfEnums) builder:PrependUOffsetTRelativeSlot(47, vectorOfEnums, 0) end
function Monster.StartVectorOfEnumsVector(builder, numElems) return builder:StartVector(1, numElems, 1) end
+function Monster.AddSignedEnum(builder, signedEnum) builder:PrependInt8Slot(48, signedEnum, -1) end
+function Monster.AddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer) builder:PrependUOffsetTRelativeSlot(49, testrequirednestedflatbuffer, 0) end
+function Monster.StartTestrequirednestedflatbufferVector(builder, numElems) return builder:StartVector(1, numElems, 1) end
function Monster.End(builder) return builder:EndObject() end
return Monster -- return the module
\ No newline at end of file
diff --git a/tests/MyGame/Example/Monster.php b/tests/MyGame/Example/Monster.php
index 7d6de87b..21e27dc 100644
--- a/tests/MyGame/Example/Monster.php
+++ b/tests/MyGame/Example/Monster.php
@@ -8,7 +8,7 @@
use \Google\FlatBuffers\ByteBuffer;
use \Google\FlatBuffers\FlatBufferBuilder;
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
class Monster extends Table
{
/**
@@ -675,21 +675,57 @@
}
/**
+ * @return sbyte
+ */
+ public function getSignedEnum()
+ {
+ $o = $this->__offset(100);
+ return $o != 0 ? $this->bb->getSbyte($o + $this->bb_pos) : \MyGame\Example\Race::None;
+ }
+
+ /**
+ * @param int offset
+ * @return byte
+ */
+ public function getTestrequirednestedflatbuffer($j)
+ {
+ $o = $this->__offset(102);
+ return $o != 0 ? $this->bb->getByte($this->__vector($o) + $j * 1) : 0;
+ }
+
+ /**
+ * @return int
+ */
+ public function getTestrequirednestedflatbufferLength()
+ {
+ $o = $this->__offset(102);
+ return $o != 0 ? $this->__vector_len($o) : 0;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTestrequirednestedflatbufferBytes()
+ {
+ return $this->__vector_as_bytes(102);
+ }
+
+ /**
* @param FlatBufferBuilder $builder
* @return void
*/
public static function startMonster(FlatBufferBuilder $builder)
{
- $builder->StartObject(48);
+ $builder->StartObject(50);
}
/**
* @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, $vector_of_referrables, $single_weak_reference, $vector_of_weak_references, $vector_of_strong_referrables, $co_owning_reference, $vector_of_co_owning_references, $non_owning_reference, $vector_of_non_owning_references, $any_unique_type, $any_unique, $any_ambiguous_type, $any_ambiguous, $vector_of_enums)
+ 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, $vector_of_strong_referrables, $co_owning_reference, $vector_of_co_owning_references, $non_owning_reference, $vector_of_non_owning_references, $any_unique_type, $any_unique, $any_ambiguous_type, $any_ambiguous, $vector_of_enums, $signed_enum, $testrequirednestedflatbuffer)
{
- $builder->startObject(48);
+ $builder->startObject(50);
self::addPos($builder, $pos);
self::addMana($builder, $mana);
self::addHp($builder, $hp);
@@ -737,6 +773,8 @@
self::addAnyAmbiguousType($builder, $any_ambiguous_type);
self::addAnyAmbiguous($builder, $any_ambiguous);
self::addVectorOfEnums($builder, $vector_of_enums);
+ self::addSignedEnum($builder, $signed_enum);
+ self::addTestrequirednestedflatbuffer($builder, $testrequirednestedflatbuffer);
$o = $builder->endObject();
$builder->required($o, 10); // name
return $o;
@@ -1631,6 +1669,50 @@
/**
* @param FlatBufferBuilder $builder
+ * @param sbyte
+ * @return void
+ */
+ public static function addSignedEnum(FlatBufferBuilder $builder, $signedEnum)
+ {
+ $builder->addSbyteX(48, $signedEnum, -1);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @param VectorOffset
+ * @return void
+ */
+ public static function addTestrequirednestedflatbuffer(FlatBufferBuilder $builder, $testrequirednestedflatbuffer)
+ {
+ $builder->addOffsetX(49, $testrequirednestedflatbuffer, 0);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @param array offset array
+ * @return int vector offset
+ */
+ public static function createTestrequirednestedflatbufferVector(FlatBufferBuilder $builder, array $data)
+ {
+ $builder->startVector(1, count($data), 1);
+ for ($i = count($data) - 1; $i >= 0; $i--) {
+ $builder->putByte($data[$i]);
+ }
+ return $builder->endVector();
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @param int $numElems
+ * @return void
+ */
+ public static function startTestrequirednestedflatbufferVector(FlatBufferBuilder $builder, $numElems)
+ {
+ $builder->startVector(1, $numElems, 1);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
* @return int table offset
*/
public static function endMonster(FlatBufferBuilder $builder)
diff --git a/tests/MyGame/Example/Monster.py b/tests/MyGame/Example/Monster.py
index 5baf64d..67f6e1b 100644
--- a/tests/MyGame/Example/Monster.py
+++ b/tests/MyGame/Example/Monster.py
@@ -3,8 +3,10 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
-# an example documentation comment: monster object
+# an example documentation comment: "monster object"
class Monster(object):
__slots__ = ['_tab']
@@ -28,7 +30,7 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
x = o + self._tab.Pos
- from .Vec3 import Vec3
+ from MyGame.Example.Vec3 import Vec3
obj = Vec3()
obj.Init(self._tab.Bytes, x)
return obj
@@ -78,6 +80,11 @@
return 0
# Monster
+ def InventoryIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
+ return o == 0
+
+ # Monster
def Color(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
if o != 0:
@@ -107,7 +114,7 @@
if o != 0:
x = self._tab.Vector(o)
x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
- from .Test import Test
+ from MyGame.Example.Test import Test
obj = Test()
obj.Init(self._tab.Bytes, x)
return obj
@@ -121,6 +128,11 @@
return 0
# Monster
+ def Test4IsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))
+ return o == 0
+
+ # Monster
def Testarrayofstring(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))
if o != 0:
@@ -135,6 +147,11 @@
return self._tab.VectorLen(o)
return 0
+ # Monster
+ def TestarrayofstringIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))
+ return o == 0
+
# an example documentation comment: this will end up in the generated code
# multiline too
# Monster
@@ -144,7 +161,7 @@
x = self._tab.Vector(o)
x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
x = self._tab.Indirect(x)
- from .Monster import Monster
+ from MyGame.Example.Monster import Monster
obj = Monster()
obj.Init(self._tab.Bytes, x)
return obj
@@ -158,11 +175,16 @@
return 0
# Monster
+ def TestarrayoftablesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))
+ return o == 0
+
+ # Monster
def Enemy(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .Monster import Monster
+ from MyGame.Example.Monster import Monster
obj = Monster()
obj.Init(self._tab.Bytes, x)
return obj
@@ -191,11 +213,16 @@
return 0
# Monster
+ def TestnestedflatbufferIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30))
+ return o == 0
+
+ # Monster
def Testempty(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .Stat import Stat
+ from MyGame.Example.Stat import Stat
obj = Stat()
obj.Init(self._tab.Bytes, x)
return obj
@@ -287,6 +314,11 @@
return 0
# Monster
+ def TestarrayofboolsIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(52))
+ return o == 0
+
+ # Monster
def Testf(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(54))
if o != 0:
@@ -323,12 +355,17 @@
return 0
# Monster
+ def Testarrayofstring2IsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))
+ return o == 0
+
+ # Monster
def Testarrayofsortedstruct(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))
if o != 0:
x = self._tab.Vector(o)
x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 8
- from .Ability import Ability
+ from MyGame.Example.Ability import Ability
obj = Ability()
obj.Init(self._tab.Bytes, x)
return obj
@@ -342,6 +379,11 @@
return 0
# Monster
+ def TestarrayofsortedstructIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))
+ return o == 0
+
+ # Monster
def Flex(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))
if o != 0:
@@ -364,12 +406,17 @@
return 0
# Monster
+ def FlexIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(64))
+ return o == 0
+
+ # 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
+ from MyGame.Example.Test import Test
obj = Test()
obj.Init(self._tab.Bytes, x)
return obj
@@ -383,6 +430,11 @@
return 0
# Monster
+ def Test5IsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(66))
+ return o == 0
+
+ # Monster
def VectorOfLongs(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))
if o != 0:
@@ -405,6 +457,11 @@
return 0
# Monster
+ def VectorOfLongsIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(68))
+ return o == 0
+
+ # Monster
def VectorOfDoubles(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))
if o != 0:
@@ -427,11 +484,16 @@
return 0
# Monster
+ def VectorOfDoublesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(70))
+ return o == 0
+
+ # Monster
def ParentNamespaceTest(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(72))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .InParentNamespace import InParentNamespace
+ from MyGame.InParentNamespace import InParentNamespace
obj = InParentNamespace()
obj.Init(self._tab.Bytes, x)
return obj
@@ -444,7 +506,7 @@
x = self._tab.Vector(o)
x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
x = self._tab.Indirect(x)
- from .Referrable import Referrable
+ from MyGame.Example.Referrable import Referrable
obj = Referrable()
obj.Init(self._tab.Bytes, x)
return obj
@@ -458,6 +520,11 @@
return 0
# Monster
+ def VectorOfReferrablesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(74))
+ return o == 0
+
+ # Monster
def SingleWeakReference(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(76))
if o != 0:
@@ -487,13 +554,18 @@
return 0
# Monster
+ def VectorOfWeakReferencesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(78))
+ return o == 0
+
+ # Monster
def VectorOfStrongReferrables(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))
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
+ from MyGame.Example.Referrable import Referrable
obj = Referrable()
obj.Init(self._tab.Bytes, x)
return obj
@@ -507,6 +579,11 @@
return 0
# Monster
+ def VectorOfStrongReferrablesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(80))
+ return o == 0
+
+ # Monster
def CoOwningReference(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(82))
if o != 0:
@@ -536,6 +613,11 @@
return 0
# Monster
+ def VectorOfCoOwningReferencesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(84))
+ return o == 0
+
+ # Monster
def NonOwningReference(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(86))
if o != 0:
@@ -565,6 +647,11 @@
return 0
# Monster
+ def VectorOfNonOwningReferencesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(88))
+ return o == 0
+
+ # Monster
def AnyUniqueType(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(90))
if o != 0:
@@ -620,7 +707,46 @@
return self._tab.VectorLen(o)
return 0
-def MonsterStart(builder): builder.StartObject(48)
+ # Monster
+ def VectorOfEnumsIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(98))
+ return o == 0
+
+ # Monster
+ def SignedEnum(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(100))
+ if o != 0:
+ return self._tab.Get(flatbuffers.number_types.Int8Flags, o + self._tab.Pos)
+ return -1
+
+ # Monster
+ def Testrequirednestedflatbuffer(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))
+ if o != 0:
+ a = self._tab.Vector(o)
+ return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))
+ return 0
+
+ # Monster
+ def TestrequirednestedflatbufferAsNumpy(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))
+ if o != 0:
+ return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)
+ return 0
+
+ # Monster
+ def TestrequirednestedflatbufferLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # Monster
+ def TestrequirednestedflatbufferIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(102))
+ return o == 0
+
+def MonsterStart(builder): builder.StartObject(50)
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)
@@ -686,4 +812,501 @@
def MonsterAddAnyAmbiguous(builder, anyAmbiguous): builder.PrependUOffsetTRelativeSlot(46, flatbuffers.number_types.UOffsetTFlags.py_type(anyAmbiguous), 0)
def MonsterAddVectorOfEnums(builder, vectorOfEnums): builder.PrependUOffsetTRelativeSlot(47, flatbuffers.number_types.UOffsetTFlags.py_type(vectorOfEnums), 0)
def MonsterStartVectorOfEnumsVector(builder, numElems): return builder.StartVector(1, numElems, 1)
+def MonsterAddSignedEnum(builder, signedEnum): builder.PrependInt8Slot(48, signedEnum, -1)
+def MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer): builder.PrependUOffsetTRelativeSlot(49, flatbuffers.number_types.UOffsetTFlags.py_type(testrequirednestedflatbuffer), 0)
+def MonsterStartTestrequirednestedflatbufferVector(builder, numElems): return builder.StartVector(1, numElems, 1)
def MonsterEnd(builder): return builder.EndObject()
+
+import MyGame.Example.Ability
+import MyGame.Example.Any
+import MyGame.Example.AnyAmbiguousAliases
+import MyGame.Example.AnyUniqueAliases
+import MyGame.Example.Referrable
+import MyGame.Example.Stat
+import MyGame.Example.Test
+import MyGame.Example.TestSimpleTableWithEnum
+import MyGame.Example.Vec3
+import MyGame.Example2.Monster
+import MyGame.InParentNamespace
+try:
+ from typing import List, Optional, Union
+except:
+ pass
+
+class MonsterT(object):
+
+ # MonsterT
+ def __init__(self):
+ self.pos = None # type: Optional[MyGame.Example.Vec3.Vec3T]
+ self.mana = 150 # type: int
+ self.hp = 100 # type: int
+ self.name = None # type: str
+ self.inventory = None # type: List[int]
+ self.color = 8 # type: int
+ self.testType = 0 # type: int
+ self.test = None # type: Union[None, MyGame.Example.Monster.MonsterT, MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT, MyGame.Example2.Monster.MonsterT]
+ self.test4 = None # type: List[MyGame.Example.Test.TestT]
+ self.testarrayofstring = None # type: List[str]
+ self.testarrayoftables = None # type: List[MyGame.Example.Monster.MonsterT]
+ self.enemy = None # type: Optional[MyGame.Example.Monster.MonsterT]
+ self.testnestedflatbuffer = None # type: List[int]
+ self.testempty = None # type: Optional[MyGame.Example.Stat.StatT]
+ self.testbool = False # type: bool
+ self.testhashs32Fnv1 = 0 # type: int
+ self.testhashu32Fnv1 = 0 # type: int
+ self.testhashs64Fnv1 = 0 # type: int
+ self.testhashu64Fnv1 = 0 # type: int
+ self.testhashs32Fnv1a = 0 # type: int
+ self.testhashu32Fnv1a = 0 # type: int
+ self.testhashs64Fnv1a = 0 # type: int
+ self.testhashu64Fnv1a = 0 # type: int
+ self.testarrayofbools = None # type: List[bool]
+ self.testf = 3.14159 # type: float
+ self.testf2 = 3.0 # type: float
+ self.testf3 = 0.0 # type: float
+ self.testarrayofstring2 = None # type: List[str]
+ self.testarrayofsortedstruct = None # type: List[MyGame.Example.Ability.AbilityT]
+ self.flex = None # type: List[int]
+ self.test5 = None # type: List[MyGame.Example.Test.TestT]
+ self.vectorOfLongs = None # type: List[int]
+ self.vectorOfDoubles = None # type: List[float]
+ self.parentNamespaceTest = None # type: Optional[MyGame.InParentNamespace.InParentNamespaceT]
+ self.vectorOfReferrables = None # type: List[MyGame.Example.Referrable.ReferrableT]
+ self.singleWeakReference = 0 # type: int
+ self.vectorOfWeakReferences = None # type: List[int]
+ self.vectorOfStrongReferrables = None # type: List[MyGame.Example.Referrable.ReferrableT]
+ self.coOwningReference = 0 # type: int
+ self.vectorOfCoOwningReferences = None # type: List[int]
+ self.nonOwningReference = 0 # type: int
+ self.vectorOfNonOwningReferences = None # type: List[int]
+ self.anyUniqueType = 0 # type: int
+ self.anyUnique = None # type: Union[None, MyGame.Example.Monster.MonsterT, MyGame.Example.TestSimpleTableWithEnum.TestSimpleTableWithEnumT, MyGame.Example2.Monster.MonsterT]
+ self.anyAmbiguousType = 0 # type: int
+ self.anyAmbiguous = None # type: Union[None, MyGame.Example.Monster.MonsterT, MyGame.Example.Monster.MonsterT, MyGame.Example.Monster.MonsterT]
+ self.vectorOfEnums = None # type: List[int]
+ self.signedEnum = -1 # type: int
+ self.testrequirednestedflatbuffer = None # type: List[int]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ monster = Monster()
+ monster.Init(buf, pos)
+ return cls.InitFromObj(monster)
+
+ @classmethod
+ def InitFromObj(cls, monster):
+ x = MonsterT()
+ x._UnPack(monster)
+ return x
+
+ # MonsterT
+ def _UnPack(self, monster):
+ if monster is None:
+ return
+ if monster.Pos() is not None:
+ self.pos = MyGame.Example.Vec3.Vec3T.InitFromObj(monster.Pos())
+ self.mana = monster.Mana()
+ self.hp = monster.Hp()
+ self.name = monster.Name()
+ if not monster.InventoryIsNone():
+ if np is None:
+ self.inventory = []
+ for i in range(monster.InventoryLength()):
+ self.inventory.append(monster.Inventory(i))
+ else:
+ self.inventory = monster.InventoryAsNumpy()
+ self.color = monster.Color()
+ self.testType = monster.TestType()
+ self.test = MyGame.Example.Any.AnyCreator(self.testType, monster.Test())
+ if not monster.Test4IsNone():
+ self.test4 = []
+ for i in range(monster.Test4Length()):
+ if monster.Test4(i) is None:
+ self.test4.append(None)
+ else:
+ test_ = MyGame.Example.Test.TestT.InitFromObj(monster.Test4(i))
+ self.test4.append(test_)
+ if not monster.TestarrayofstringIsNone():
+ self.testarrayofstring = []
+ for i in range(monster.TestarrayofstringLength()):
+ self.testarrayofstring.append(monster.Testarrayofstring(i))
+ if not monster.TestarrayoftablesIsNone():
+ self.testarrayoftables = []
+ for i in range(monster.TestarrayoftablesLength()):
+ if monster.Testarrayoftables(i) is None:
+ self.testarrayoftables.append(None)
+ else:
+ monster_ = MyGame.Example.Monster.MonsterT.InitFromObj(monster.Testarrayoftables(i))
+ self.testarrayoftables.append(monster_)
+ if monster.Enemy() is not None:
+ self.enemy = MyGame.Example.Monster.MonsterT.InitFromObj(monster.Enemy())
+ if not monster.TestnestedflatbufferIsNone():
+ if np is None:
+ self.testnestedflatbuffer = []
+ for i in range(monster.TestnestedflatbufferLength()):
+ self.testnestedflatbuffer.append(monster.Testnestedflatbuffer(i))
+ else:
+ self.testnestedflatbuffer = monster.TestnestedflatbufferAsNumpy()
+ if monster.Testempty() is not None:
+ self.testempty = MyGame.Example.Stat.StatT.InitFromObj(monster.Testempty())
+ self.testbool = monster.Testbool()
+ self.testhashs32Fnv1 = monster.Testhashs32Fnv1()
+ self.testhashu32Fnv1 = monster.Testhashu32Fnv1()
+ self.testhashs64Fnv1 = monster.Testhashs64Fnv1()
+ self.testhashu64Fnv1 = monster.Testhashu64Fnv1()
+ self.testhashs32Fnv1a = monster.Testhashs32Fnv1a()
+ self.testhashu32Fnv1a = monster.Testhashu32Fnv1a()
+ self.testhashs64Fnv1a = monster.Testhashs64Fnv1a()
+ self.testhashu64Fnv1a = monster.Testhashu64Fnv1a()
+ if not monster.TestarrayofboolsIsNone():
+ if np is None:
+ self.testarrayofbools = []
+ for i in range(monster.TestarrayofboolsLength()):
+ self.testarrayofbools.append(monster.Testarrayofbools(i))
+ else:
+ self.testarrayofbools = monster.TestarrayofboolsAsNumpy()
+ self.testf = monster.Testf()
+ self.testf2 = monster.Testf2()
+ self.testf3 = monster.Testf3()
+ if not monster.Testarrayofstring2IsNone():
+ self.testarrayofstring2 = []
+ for i in range(monster.Testarrayofstring2Length()):
+ self.testarrayofstring2.append(monster.Testarrayofstring2(i))
+ if not monster.TestarrayofsortedstructIsNone():
+ self.testarrayofsortedstruct = []
+ for i in range(monster.TestarrayofsortedstructLength()):
+ if monster.Testarrayofsortedstruct(i) is None:
+ self.testarrayofsortedstruct.append(None)
+ else:
+ ability_ = MyGame.Example.Ability.AbilityT.InitFromObj(monster.Testarrayofsortedstruct(i))
+ self.testarrayofsortedstruct.append(ability_)
+ if not monster.FlexIsNone():
+ if np is None:
+ self.flex = []
+ for i in range(monster.FlexLength()):
+ self.flex.append(monster.Flex(i))
+ else:
+ self.flex = monster.FlexAsNumpy()
+ if not monster.Test5IsNone():
+ self.test5 = []
+ for i in range(monster.Test5Length()):
+ if monster.Test5(i) is None:
+ self.test5.append(None)
+ else:
+ test_ = MyGame.Example.Test.TestT.InitFromObj(monster.Test5(i))
+ self.test5.append(test_)
+ if not monster.VectorOfLongsIsNone():
+ if np is None:
+ self.vectorOfLongs = []
+ for i in range(monster.VectorOfLongsLength()):
+ self.vectorOfLongs.append(monster.VectorOfLongs(i))
+ else:
+ self.vectorOfLongs = monster.VectorOfLongsAsNumpy()
+ if not monster.VectorOfDoublesIsNone():
+ if np is None:
+ self.vectorOfDoubles = []
+ for i in range(monster.VectorOfDoublesLength()):
+ self.vectorOfDoubles.append(monster.VectorOfDoubles(i))
+ else:
+ self.vectorOfDoubles = monster.VectorOfDoublesAsNumpy()
+ if monster.ParentNamespaceTest() is not None:
+ self.parentNamespaceTest = MyGame.InParentNamespace.InParentNamespaceT.InitFromObj(monster.ParentNamespaceTest())
+ if not monster.VectorOfReferrablesIsNone():
+ self.vectorOfReferrables = []
+ for i in range(monster.VectorOfReferrablesLength()):
+ if monster.VectorOfReferrables(i) is None:
+ self.vectorOfReferrables.append(None)
+ else:
+ referrable_ = MyGame.Example.Referrable.ReferrableT.InitFromObj(monster.VectorOfReferrables(i))
+ self.vectorOfReferrables.append(referrable_)
+ self.singleWeakReference = monster.SingleWeakReference()
+ if not monster.VectorOfWeakReferencesIsNone():
+ if np is None:
+ self.vectorOfWeakReferences = []
+ for i in range(monster.VectorOfWeakReferencesLength()):
+ self.vectorOfWeakReferences.append(monster.VectorOfWeakReferences(i))
+ else:
+ self.vectorOfWeakReferences = monster.VectorOfWeakReferencesAsNumpy()
+ if not monster.VectorOfStrongReferrablesIsNone():
+ self.vectorOfStrongReferrables = []
+ for i in range(monster.VectorOfStrongReferrablesLength()):
+ if monster.VectorOfStrongReferrables(i) is None:
+ self.vectorOfStrongReferrables.append(None)
+ else:
+ referrable_ = MyGame.Example.Referrable.ReferrableT.InitFromObj(monster.VectorOfStrongReferrables(i))
+ self.vectorOfStrongReferrables.append(referrable_)
+ self.coOwningReference = monster.CoOwningReference()
+ if not monster.VectorOfCoOwningReferencesIsNone():
+ if np is None:
+ self.vectorOfCoOwningReferences = []
+ for i in range(monster.VectorOfCoOwningReferencesLength()):
+ self.vectorOfCoOwningReferences.append(monster.VectorOfCoOwningReferences(i))
+ else:
+ self.vectorOfCoOwningReferences = monster.VectorOfCoOwningReferencesAsNumpy()
+ self.nonOwningReference = monster.NonOwningReference()
+ if not monster.VectorOfNonOwningReferencesIsNone():
+ if np is None:
+ self.vectorOfNonOwningReferences = []
+ for i in range(monster.VectorOfNonOwningReferencesLength()):
+ self.vectorOfNonOwningReferences.append(monster.VectorOfNonOwningReferences(i))
+ else:
+ self.vectorOfNonOwningReferences = monster.VectorOfNonOwningReferencesAsNumpy()
+ self.anyUniqueType = monster.AnyUniqueType()
+ self.anyUnique = MyGame.Example.AnyUniqueAliases.AnyUniqueAliasesCreator(self.anyUniqueType, monster.AnyUnique())
+ self.anyAmbiguousType = monster.AnyAmbiguousType()
+ self.anyAmbiguous = MyGame.Example.AnyAmbiguousAliases.AnyAmbiguousAliasesCreator(self.anyAmbiguousType, monster.AnyAmbiguous())
+ if not monster.VectorOfEnumsIsNone():
+ if np is None:
+ self.vectorOfEnums = []
+ for i in range(monster.VectorOfEnumsLength()):
+ self.vectorOfEnums.append(monster.VectorOfEnums(i))
+ else:
+ self.vectorOfEnums = monster.VectorOfEnumsAsNumpy()
+ self.signedEnum = monster.SignedEnum()
+ if not monster.TestrequirednestedflatbufferIsNone():
+ if np is None:
+ self.testrequirednestedflatbuffer = []
+ for i in range(monster.TestrequirednestedflatbufferLength()):
+ self.testrequirednestedflatbuffer.append(monster.Testrequirednestedflatbuffer(i))
+ else:
+ self.testrequirednestedflatbuffer = monster.TestrequirednestedflatbufferAsNumpy()
+
+ # MonsterT
+ def Pack(self, builder):
+ if self.name is not None:
+ name = builder.CreateString(self.name)
+ if self.inventory is not None:
+ if np is not None and type(self.inventory) is np.ndarray:
+ inventory = builder.CreateNumpyVector(self.inventory)
+ else:
+ MonsterStartInventoryVector(builder, len(self.inventory))
+ for i in reversed(range(len(self.inventory))):
+ builder.PrependUint8(self.inventory[i])
+ inventory = builder.EndVector(len(self.inventory))
+ if self.test is not None:
+ test = self.test.Pack(builder)
+ if self.test4 is not None:
+ MonsterStartTest4Vector(builder, len(self.test4))
+ for i in reversed(range(len(self.test4))):
+ self.test4[i].Pack(builder)
+ test4 = builder.EndVector(len(self.test4))
+ if self.testarrayofstring is not None:
+ testarrayofstringlist = []
+ for i in range(len(self.testarrayofstring)):
+ testarrayofstringlist.append(builder.CreateString(self.testarrayofstring[i]))
+ MonsterStartTestarrayofstringVector(builder, len(self.testarrayofstring))
+ for i in reversed(range(len(self.testarrayofstring))):
+ builder.PrependUOffsetTRelative(testarrayofstringlist[i])
+ testarrayofstring = builder.EndVector(len(self.testarrayofstring))
+ if self.testarrayoftables is not None:
+ testarrayoftableslist = []
+ for i in range(len(self.testarrayoftables)):
+ testarrayoftableslist.append(self.testarrayoftables[i].Pack(builder))
+ MonsterStartTestarrayoftablesVector(builder, len(self.testarrayoftables))
+ for i in reversed(range(len(self.testarrayoftables))):
+ builder.PrependUOffsetTRelative(testarrayoftableslist[i])
+ testarrayoftables = builder.EndVector(len(self.testarrayoftables))
+ if self.enemy is not None:
+ enemy = self.enemy.Pack(builder)
+ if self.testnestedflatbuffer is not None:
+ if np is not None and type(self.testnestedflatbuffer) is np.ndarray:
+ testnestedflatbuffer = builder.CreateNumpyVector(self.testnestedflatbuffer)
+ else:
+ MonsterStartTestnestedflatbufferVector(builder, len(self.testnestedflatbuffer))
+ for i in reversed(range(len(self.testnestedflatbuffer))):
+ builder.PrependUint8(self.testnestedflatbuffer[i])
+ testnestedflatbuffer = builder.EndVector(len(self.testnestedflatbuffer))
+ if self.testempty is not None:
+ testempty = self.testempty.Pack(builder)
+ if self.testarrayofbools is not None:
+ if np is not None and type(self.testarrayofbools) is np.ndarray:
+ testarrayofbools = builder.CreateNumpyVector(self.testarrayofbools)
+ else:
+ MonsterStartTestarrayofboolsVector(builder, len(self.testarrayofbools))
+ for i in reversed(range(len(self.testarrayofbools))):
+ builder.PrependBool(self.testarrayofbools[i])
+ testarrayofbools = builder.EndVector(len(self.testarrayofbools))
+ if self.testarrayofstring2 is not None:
+ testarrayofstring2list = []
+ for i in range(len(self.testarrayofstring2)):
+ testarrayofstring2list.append(builder.CreateString(self.testarrayofstring2[i]))
+ MonsterStartTestarrayofstring2Vector(builder, len(self.testarrayofstring2))
+ for i in reversed(range(len(self.testarrayofstring2))):
+ builder.PrependUOffsetTRelative(testarrayofstring2list[i])
+ testarrayofstring2 = builder.EndVector(len(self.testarrayofstring2))
+ if self.testarrayofsortedstruct is not None:
+ MonsterStartTestarrayofsortedstructVector(builder, len(self.testarrayofsortedstruct))
+ for i in reversed(range(len(self.testarrayofsortedstruct))):
+ self.testarrayofsortedstruct[i].Pack(builder)
+ testarrayofsortedstruct = builder.EndVector(len(self.testarrayofsortedstruct))
+ if self.flex is not None:
+ if np is not None and type(self.flex) is np.ndarray:
+ flex = builder.CreateNumpyVector(self.flex)
+ else:
+ MonsterStartFlexVector(builder, len(self.flex))
+ for i in reversed(range(len(self.flex))):
+ builder.PrependUint8(self.flex[i])
+ flex = builder.EndVector(len(self.flex))
+ if self.test5 is not None:
+ MonsterStartTest5Vector(builder, len(self.test5))
+ for i in reversed(range(len(self.test5))):
+ self.test5[i].Pack(builder)
+ test5 = builder.EndVector(len(self.test5))
+ if self.vectorOfLongs is not None:
+ if np is not None and type(self.vectorOfLongs) is np.ndarray:
+ vectorOfLongs = builder.CreateNumpyVector(self.vectorOfLongs)
+ else:
+ MonsterStartVectorOfLongsVector(builder, len(self.vectorOfLongs))
+ for i in reversed(range(len(self.vectorOfLongs))):
+ builder.PrependInt64(self.vectorOfLongs[i])
+ vectorOfLongs = builder.EndVector(len(self.vectorOfLongs))
+ if self.vectorOfDoubles is not None:
+ if np is not None and type(self.vectorOfDoubles) is np.ndarray:
+ vectorOfDoubles = builder.CreateNumpyVector(self.vectorOfDoubles)
+ else:
+ MonsterStartVectorOfDoublesVector(builder, len(self.vectorOfDoubles))
+ for i in reversed(range(len(self.vectorOfDoubles))):
+ builder.PrependFloat64(self.vectorOfDoubles[i])
+ vectorOfDoubles = builder.EndVector(len(self.vectorOfDoubles))
+ if self.parentNamespaceTest is not None:
+ parentNamespaceTest = self.parentNamespaceTest.Pack(builder)
+ if self.vectorOfReferrables is not None:
+ vectorOfReferrableslist = []
+ for i in range(len(self.vectorOfReferrables)):
+ vectorOfReferrableslist.append(self.vectorOfReferrables[i].Pack(builder))
+ MonsterStartVectorOfReferrablesVector(builder, len(self.vectorOfReferrables))
+ for i in reversed(range(len(self.vectorOfReferrables))):
+ builder.PrependUOffsetTRelative(vectorOfReferrableslist[i])
+ vectorOfReferrables = builder.EndVector(len(self.vectorOfReferrables))
+ if self.vectorOfWeakReferences is not None:
+ if np is not None and type(self.vectorOfWeakReferences) is np.ndarray:
+ vectorOfWeakReferences = builder.CreateNumpyVector(self.vectorOfWeakReferences)
+ else:
+ MonsterStartVectorOfWeakReferencesVector(builder, len(self.vectorOfWeakReferences))
+ for i in reversed(range(len(self.vectorOfWeakReferences))):
+ builder.PrependUint64(self.vectorOfWeakReferences[i])
+ vectorOfWeakReferences = builder.EndVector(len(self.vectorOfWeakReferences))
+ if self.vectorOfStrongReferrables is not None:
+ vectorOfStrongReferrableslist = []
+ for i in range(len(self.vectorOfStrongReferrables)):
+ vectorOfStrongReferrableslist.append(self.vectorOfStrongReferrables[i].Pack(builder))
+ MonsterStartVectorOfStrongReferrablesVector(builder, len(self.vectorOfStrongReferrables))
+ for i in reversed(range(len(self.vectorOfStrongReferrables))):
+ builder.PrependUOffsetTRelative(vectorOfStrongReferrableslist[i])
+ vectorOfStrongReferrables = builder.EndVector(len(self.vectorOfStrongReferrables))
+ if self.vectorOfCoOwningReferences is not None:
+ if np is not None and type(self.vectorOfCoOwningReferences) is np.ndarray:
+ vectorOfCoOwningReferences = builder.CreateNumpyVector(self.vectorOfCoOwningReferences)
+ else:
+ MonsterStartVectorOfCoOwningReferencesVector(builder, len(self.vectorOfCoOwningReferences))
+ for i in reversed(range(len(self.vectorOfCoOwningReferences))):
+ builder.PrependUint64(self.vectorOfCoOwningReferences[i])
+ vectorOfCoOwningReferences = builder.EndVector(len(self.vectorOfCoOwningReferences))
+ if self.vectorOfNonOwningReferences is not None:
+ if np is not None and type(self.vectorOfNonOwningReferences) is np.ndarray:
+ vectorOfNonOwningReferences = builder.CreateNumpyVector(self.vectorOfNonOwningReferences)
+ else:
+ MonsterStartVectorOfNonOwningReferencesVector(builder, len(self.vectorOfNonOwningReferences))
+ for i in reversed(range(len(self.vectorOfNonOwningReferences))):
+ builder.PrependUint64(self.vectorOfNonOwningReferences[i])
+ vectorOfNonOwningReferences = builder.EndVector(len(self.vectorOfNonOwningReferences))
+ if self.anyUnique is not None:
+ anyUnique = self.anyUnique.Pack(builder)
+ if self.anyAmbiguous is not None:
+ anyAmbiguous = self.anyAmbiguous.Pack(builder)
+ if self.vectorOfEnums is not None:
+ if np is not None and type(self.vectorOfEnums) is np.ndarray:
+ vectorOfEnums = builder.CreateNumpyVector(self.vectorOfEnums)
+ else:
+ MonsterStartVectorOfEnumsVector(builder, len(self.vectorOfEnums))
+ for i in reversed(range(len(self.vectorOfEnums))):
+ builder.PrependUint8(self.vectorOfEnums[i])
+ vectorOfEnums = builder.EndVector(len(self.vectorOfEnums))
+ if self.testrequirednestedflatbuffer is not None:
+ if np is not None and type(self.testrequirednestedflatbuffer) is np.ndarray:
+ testrequirednestedflatbuffer = builder.CreateNumpyVector(self.testrequirednestedflatbuffer)
+ else:
+ MonsterStartTestrequirednestedflatbufferVector(builder, len(self.testrequirednestedflatbuffer))
+ for i in reversed(range(len(self.testrequirednestedflatbuffer))):
+ builder.PrependUint8(self.testrequirednestedflatbuffer[i])
+ testrequirednestedflatbuffer = builder.EndVector(len(self.testrequirednestedflatbuffer))
+ MonsterStart(builder)
+ if self.pos is not None:
+ pos = self.pos.Pack(builder)
+ MonsterAddPos(builder, pos)
+ MonsterAddMana(builder, self.mana)
+ MonsterAddHp(builder, self.hp)
+ if self.name is not None:
+ MonsterAddName(builder, name)
+ if self.inventory is not None:
+ MonsterAddInventory(builder, inventory)
+ MonsterAddColor(builder, self.color)
+ MonsterAddTestType(builder, self.testType)
+ if self.test is not None:
+ MonsterAddTest(builder, test)
+ if self.test4 is not None:
+ MonsterAddTest4(builder, test4)
+ if self.testarrayofstring is not None:
+ MonsterAddTestarrayofstring(builder, testarrayofstring)
+ if self.testarrayoftables is not None:
+ MonsterAddTestarrayoftables(builder, testarrayoftables)
+ if self.enemy is not None:
+ MonsterAddEnemy(builder, enemy)
+ if self.testnestedflatbuffer is not None:
+ MonsterAddTestnestedflatbuffer(builder, testnestedflatbuffer)
+ if self.testempty is not None:
+ MonsterAddTestempty(builder, testempty)
+ MonsterAddTestbool(builder, self.testbool)
+ MonsterAddTesthashs32Fnv1(builder, self.testhashs32Fnv1)
+ MonsterAddTesthashu32Fnv1(builder, self.testhashu32Fnv1)
+ MonsterAddTesthashs64Fnv1(builder, self.testhashs64Fnv1)
+ MonsterAddTesthashu64Fnv1(builder, self.testhashu64Fnv1)
+ MonsterAddTesthashs32Fnv1a(builder, self.testhashs32Fnv1a)
+ MonsterAddTesthashu32Fnv1a(builder, self.testhashu32Fnv1a)
+ MonsterAddTesthashs64Fnv1a(builder, self.testhashs64Fnv1a)
+ MonsterAddTesthashu64Fnv1a(builder, self.testhashu64Fnv1a)
+ if self.testarrayofbools is not None:
+ MonsterAddTestarrayofbools(builder, testarrayofbools)
+ MonsterAddTestf(builder, self.testf)
+ MonsterAddTestf2(builder, self.testf2)
+ MonsterAddTestf3(builder, self.testf3)
+ if self.testarrayofstring2 is not None:
+ MonsterAddTestarrayofstring2(builder, testarrayofstring2)
+ if self.testarrayofsortedstruct is not None:
+ MonsterAddTestarrayofsortedstruct(builder, testarrayofsortedstruct)
+ if self.flex is not None:
+ MonsterAddFlex(builder, flex)
+ if self.test5 is not None:
+ MonsterAddTest5(builder, test5)
+ if self.vectorOfLongs is not None:
+ MonsterAddVectorOfLongs(builder, vectorOfLongs)
+ if self.vectorOfDoubles is not None:
+ MonsterAddVectorOfDoubles(builder, vectorOfDoubles)
+ if self.parentNamespaceTest is not None:
+ MonsterAddParentNamespaceTest(builder, parentNamespaceTest)
+ if self.vectorOfReferrables is not None:
+ MonsterAddVectorOfReferrables(builder, vectorOfReferrables)
+ MonsterAddSingleWeakReference(builder, self.singleWeakReference)
+ if self.vectorOfWeakReferences is not None:
+ MonsterAddVectorOfWeakReferences(builder, vectorOfWeakReferences)
+ if self.vectorOfStrongReferrables is not None:
+ MonsterAddVectorOfStrongReferrables(builder, vectorOfStrongReferrables)
+ MonsterAddCoOwningReference(builder, self.coOwningReference)
+ if self.vectorOfCoOwningReferences is not None:
+ MonsterAddVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences)
+ MonsterAddNonOwningReference(builder, self.nonOwningReference)
+ if self.vectorOfNonOwningReferences is not None:
+ MonsterAddVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences)
+ MonsterAddAnyUniqueType(builder, self.anyUniqueType)
+ if self.anyUnique is not None:
+ MonsterAddAnyUnique(builder, anyUnique)
+ MonsterAddAnyAmbiguousType(builder, self.anyAmbiguousType)
+ if self.anyAmbiguous is not None:
+ MonsterAddAnyAmbiguous(builder, anyAmbiguous)
+ if self.vectorOfEnums is not None:
+ MonsterAddVectorOfEnums(builder, vectorOfEnums)
+ MonsterAddSignedEnum(builder, self.signedEnum)
+ if self.testrequirednestedflatbuffer is not None:
+ MonsterAddTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer)
+ monster = MonsterEnd(builder)
+ return monster
diff --git a/tests/MyGame/Example/MonsterStorageGrpc.java b/tests/MyGame/Example/MonsterStorageGrpc.java
index b9f070f..8e468d4 100644
--- a/tests/MyGame/Example/MonsterStorageGrpc.java
+++ b/tests/MyGame/Example/MonsterStorageGrpc.java
@@ -1,4 +1,4 @@
-//Generated by flatc compiler (version 1.11.0)
+//Generated by flatc compiler (version 1.12.0)
//If you make any local changes, they will be lost
//source: monster_test.fbs
diff --git a/tests/MyGame/Example/NestedStruct.cs b/tests/MyGame/Example/NestedStruct.cs
index 3f1f2f0..13e3498 100644
--- a/tests/MyGame/Example/NestedStruct.cs
+++ b/tests/MyGame/Example/NestedStruct.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct NestedStruct : IFlatbufferObject
@@ -21,10 +22,15 @@
public void MutateB(MyGame.Example.TestEnum b) { __p.bb.PutSbyte(__p.bb_pos + 8, (sbyte)b); }
public MyGame.Example.TestEnum C(int j) { return (MyGame.Example.TestEnum)__p.bb.GetSbyte(__p.bb_pos + 9 + j * 1); }
public void MutateC(int j, MyGame.Example.TestEnum c) { __p.bb.PutSbyte(__p.bb_pos + 9 + j * 1, (sbyte)c); }
+ public long D(int j) { return __p.bb.GetLong(__p.bb_pos + 16 + j * 8); }
+ public void MutateD(int j, long d) { __p.bb.PutLong(__p.bb_pos + 16 + j * 8, d); }
- public static Offset<MyGame.Example.NestedStruct> CreateNestedStruct(FlatBufferBuilder builder, int[] A, MyGame.Example.TestEnum B, MyGame.Example.TestEnum[] C) {
- builder.Prep(4, 12);
- builder.Pad(1);
+ public static Offset<MyGame.Example.NestedStruct> CreateNestedStruct(FlatBufferBuilder builder, int[] A, MyGame.Example.TestEnum B, MyGame.Example.TestEnum[] C, long[] D) {
+ builder.Prep(8, 32);
+ for (int _idx0 = 2; _idx0 > 0; _idx0--) {
+ builder.PutLong(D[_idx0-1]);
+ }
+ builder.Pad(5);
for (int _idx0 = 2; _idx0 > 0; _idx0--) {
builder.PutSbyte((sbyte)C[_idx0-1]);
}
@@ -34,7 +40,52 @@
}
return new Offset<MyGame.Example.NestedStruct>(builder.Offset);
}
+ public NestedStructT UnPack() {
+ var _o = new NestedStructT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(NestedStructT _o) {
+ _o.A = new int[2];
+ for (var _j = 0; _j < 2; ++_j) { _o.A[_j] = this.A(_j); }
+ _o.B = this.B;
+ _o.C = new MyGame.Example.TestEnum[2];
+ for (var _j = 0; _j < 2; ++_j) { _o.C[_j] = this.C(_j); }
+ _o.D = new long[2];
+ for (var _j = 0; _j < 2; ++_j) { _o.D[_j] = this.D(_j); }
+ }
+ public static Offset<MyGame.Example.NestedStruct> Pack(FlatBufferBuilder builder, NestedStructT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.NestedStruct>);
+ var _a = _o.A;
+ var _c = _o.C;
+ var _d = _o.D;
+ return CreateNestedStruct(
+ builder,
+ _a,
+ _o.B,
+ _c,
+ _d);
+ }
};
+public class NestedStructT
+{
+ [Newtonsoft.Json.JsonProperty("a")]
+ public int[] A { get; set; }
+ [Newtonsoft.Json.JsonProperty("b")]
+ public MyGame.Example.TestEnum B { get; set; }
+ [Newtonsoft.Json.JsonProperty("c")]
+ public MyGame.Example.TestEnum[] C { get; set; }
+ [Newtonsoft.Json.JsonProperty("d")]
+ public long[] D { get; set; }
+
+ public NestedStructT() {
+ this.A = new int[2];
+ this.B = MyGame.Example.TestEnum.A;
+ this.C = new MyGame.Example.TestEnum[2];
+ this.D = new long[2];
+ }
+}
+
}
diff --git a/tests/MyGame/Example/NestedStruct.java b/tests/MyGame/Example/NestedStruct.java
index 3c8a8f6..fbfedd8 100644
--- a/tests/MyGame/Example/NestedStruct.java
+++ b/tests/MyGame/Example/NestedStruct.java
@@ -18,10 +18,15 @@
public void mutateB(byte b) { bb.put(bb_pos + 8, b); }
public byte c(int j) { return bb.get(bb_pos + 9 + j * 1); }
public void mutateC(int j, byte c) { bb.put(bb_pos + 9 + j * 1, c); }
+ public long d(int j) { return bb.getLong(bb_pos + 16 + j * 8); }
+ public void mutateD(int j, long d) { bb.putLong(bb_pos + 16 + j * 8, d); }
- public static int createNestedStruct(FlatBufferBuilder builder, int[] a, byte b, byte[] c) {
- builder.prep(4, 12);
- builder.pad(1);
+ public static int createNestedStruct(FlatBufferBuilder builder, int[] a, byte b, byte[] c, long[] d) {
+ builder.prep(8, 32);
+ for (int _idx0 = 2; _idx0 > 0; _idx0--) {
+ builder.putLong(d[_idx0-1]);
+ }
+ builder.pad(5);
for (int _idx0 = 2; _idx0 > 0; _idx0--) {
builder.putByte(c[_idx0-1]);
}
@@ -31,5 +36,12 @@
}
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public NestedStruct get(int j) { return get(new NestedStruct(), j); }
+ public NestedStruct get(NestedStruct obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/MyGame/Example/NestedStruct.py b/tests/MyGame/Example/NestedStruct.py
index aa742f4..a9db014 100644
--- a/tests/MyGame/Example/NestedStruct.py
+++ b/tests/MyGame/Example/NestedStruct.py
@@ -3,10 +3,16 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class NestedStruct(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 32
+
# NestedStruct
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -14,16 +20,113 @@
# NestedStruct
def A(self): return [self._tab.Get(flatbuffers.number_types.Int32Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(0 + i * 4)) for i in range(2)]
# NestedStruct
+ def ALength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(0))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # NestedStruct
+ def AIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(0))
+ return o == 0
+
+ # NestedStruct
def B(self): return self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(8))
# NestedStruct
def C(self): return [self._tab.Get(flatbuffers.number_types.Int8Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(9 + i * 1)) for i in range(2)]
+ # NestedStruct
+ def CLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(9))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
-def CreateNestedStruct(builder, a, b, c):
- builder.Prep(4, 12)
- builder.Pad(1)
+ # NestedStruct
+ def CIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(9))
+ return o == 0
+
+ # NestedStruct
+ def D(self): return [self._tab.Get(flatbuffers.number_types.Int64Flags, self._tab.Pos + flatbuffers.number_types.UOffsetTFlags.py_type(16 + i * 8)) for i in range(2)]
+ # NestedStruct
+ def DLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # NestedStruct
+ def DIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
+ return o == 0
+
+
+def CreateNestedStruct(builder, a, b, c, d):
+ builder.Prep(8, 32)
+ for _idx0 in range(2 , 0, -1):
+ builder.PrependInt64(d[_idx0-1])
+ builder.Pad(5)
for _idx0 in range(2 , 0, -1):
builder.PrependInt8(c[_idx0-1])
builder.PrependInt8(b)
for _idx0 in range(2 , 0, -1):
builder.PrependInt32(a[_idx0-1])
return builder.Offset()
+
+try:
+ from typing import List
+except:
+ pass
+
+class NestedStructT(object):
+
+ # NestedStructT
+ def __init__(self):
+ self.a = None # type: List[int]
+ self.b = 0 # type: int
+ self.c = None # type: List[int]
+ self.d = None # type: List[int]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ nestedStruct = NestedStruct()
+ nestedStruct.Init(buf, pos)
+ return cls.InitFromObj(nestedStruct)
+
+ @classmethod
+ def InitFromObj(cls, nestedStruct):
+ x = NestedStructT()
+ x._UnPack(nestedStruct)
+ return x
+
+ # NestedStructT
+ def _UnPack(self, nestedStruct):
+ if nestedStruct is None:
+ return
+ if not nestedStruct.AIsNone():
+ if np is None:
+ self.a = []
+ for i in range(nestedStruct.ALength()):
+ self.a.append(nestedStruct.A(i))
+ else:
+ self.a = nestedStruct.AAsNumpy()
+ self.b = nestedStruct.B()
+ if not nestedStruct.CIsNone():
+ if np is None:
+ self.c = []
+ for i in range(nestedStruct.CLength()):
+ self.c.append(nestedStruct.C(i))
+ else:
+ self.c = nestedStruct.CAsNumpy()
+ if not nestedStruct.DIsNone():
+ if np is None:
+ self.d = []
+ for i in range(nestedStruct.DLength()):
+ self.d.append(nestedStruct.D(i))
+ else:
+ self.d = nestedStruct.DAsNumpy()
+
+ # NestedStructT
+ def Pack(self, builder):
+ return CreateNestedStruct(builder, self.a, self.b, self.c, self.d)
diff --git a/tests/MyGame/Example/Race.cs b/tests/MyGame/Example/Race.cs
new file mode 100644
index 0000000..8a1959a
--- /dev/null
+++ b/tests/MyGame/Example/Race.cs
@@ -0,0 +1,18 @@
+// <auto-generated>
+// automatically generated by the FlatBuffers compiler, do not modify
+// </auto-generated>
+
+namespace MyGame.Example
+{
+
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
+public enum Race : sbyte
+{
+ None = -1,
+ Human = 0,
+ Dwarf = 1,
+ Elf = 2,
+};
+
+
+}
diff --git a/tests/MyGame/Example/Race.go b/tests/MyGame/Example/Race.go
new file mode 100644
index 0000000..0762bca
--- /dev/null
+++ b/tests/MyGame/Example/Race.go
@@ -0,0 +1,35 @@
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package Example
+
+import "strconv"
+
+type Race int8
+
+const (
+ RaceNone Race = -1
+ RaceHuman Race = 0
+ RaceDwarf Race = 1
+ RaceElf Race = 2
+)
+
+var EnumNamesRace = map[Race]string{
+ RaceNone: "None",
+ RaceHuman: "Human",
+ RaceDwarf: "Dwarf",
+ RaceElf: "Elf",
+}
+
+var EnumValuesRace = map[string]Race{
+ "None": RaceNone,
+ "Human": RaceHuman,
+ "Dwarf": RaceDwarf,
+ "Elf": RaceElf,
+}
+
+func (v Race) String() string {
+ if s, ok := EnumNamesRace[v]; ok {
+ return s
+ }
+ return "Race(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/tests/MyGame/Example/Race.java b/tests/MyGame/Example/Race.java
new file mode 100644
index 0000000..0dfd80b
--- /dev/null
+++ b/tests/MyGame/Example/Race.java
@@ -0,0 +1,16 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package MyGame.Example;
+
+public final class Race {
+ private Race() { }
+ public static final byte None = -1;
+ public static final byte Human = 0;
+ public static final byte Dwarf = 1;
+ public static final byte Elf = 2;
+
+ public static final String[] names = { "None", "Human", "Dwarf", "Elf", };
+
+ public static String name(int e) { return names[e - None]; }
+}
+
diff --git a/tests/MyGame/Example/Race.kt b/tests/MyGame/Example/Race.kt
new file mode 100644
index 0000000..6eb9534
--- /dev/null
+++ b/tests/MyGame/Example/Race.kt
@@ -0,0 +1,16 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package MyGame.Example
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class Race private constructor() {
+ companion object {
+ const val None: Byte = -1
+ const val Human: Byte = 0
+ const val Dwarf: Byte = 1
+ const val Elf: Byte = 2
+ val names : Array<String> = arrayOf("None", "Human", "Dwarf", "Elf")
+ fun name(e: Int) : String = names[e - None.toInt()]
+ }
+}
diff --git a/tests/MyGame/Example/Race.lua b/tests/MyGame/Example/Race.lua
new file mode 100644
index 0000000..646f374
--- /dev/null
+++ b/tests/MyGame/Example/Race.lua
@@ -0,0 +1,12 @@
+-- automatically generated by the FlatBuffers compiler, do not modify
+
+-- namespace: Example
+
+local Race = {
+ None = -1,
+ Human = 0,
+ Dwarf = 1,
+ Elf = 2,
+}
+
+return Race -- return the module
\ No newline at end of file
diff --git a/tests/MyGame/Example/Race.php b/tests/MyGame/Example/Race.php
new file mode 100644
index 0000000..3f05c43
--- /dev/null
+++ b/tests/MyGame/Example/Race.php
@@ -0,0 +1,27 @@
+<?php
+// automatically generated by the FlatBuffers compiler, do not modify
+
+namespace MyGame\Example;
+
+class Race
+{
+ const None = -1;
+ const Human = 0;
+ const Dwarf = 1;
+ const Elf = 2;
+
+ private static $names = array(
+ Race::None=>"None",
+ Race::Human=>"Human",
+ Race::Dwarf=>"Dwarf",
+ Race::Elf=>"Elf",
+ );
+
+ public static function Name($e)
+ {
+ if (!isset(self::$names[$e])) {
+ throw new \Exception();
+ }
+ return self::$names[$e];
+ }
+}
diff --git a/tests/MyGame/Example/Race.py b/tests/MyGame/Example/Race.py
new file mode 100644
index 0000000..a39c6ea
--- /dev/null
+++ b/tests/MyGame/Example/Race.py
@@ -0,0 +1,10 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Example
+
+class Race(object):
+ None_ = -1
+ Human = 0
+ Dwarf = 1
+ Elf = 2
+
diff --git a/tests/MyGame/Example/Referrable.cs b/tests/MyGame/Example/Referrable.cs
index 5a79f91..81394ad 100644
--- a/tests/MyGame/Example/Referrable.cs
+++ b/tests/MyGame/Example/Referrable.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Referrable : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Referrable GetRootAsReferrable(ByteBuffer _bb) { return GetRootAsReferrable(_bb, new Referrable()); }
public static Referrable GetRootAsReferrable(ByteBuffer _bb, Referrable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -59,7 +60,32 @@
}
return null;
}
+ public ReferrableT UnPack() {
+ var _o = new ReferrableT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(ReferrableT _o) {
+ _o.Id = this.Id;
+ }
+ public static Offset<MyGame.Example.Referrable> Pack(FlatBufferBuilder builder, ReferrableT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Referrable>);
+ return CreateReferrable(
+ builder,
+ _o.Id);
+ }
};
+public class ReferrableT
+{
+ [Newtonsoft.Json.JsonProperty("id")]
+ [Newtonsoft.Json.JsonIgnore()]
+ public ulong Id { get; set; }
+
+ public ReferrableT() {
+ this.Id = 0;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Referrable.go b/tests/MyGame/Example/Referrable.go
index 0fb06fb..66c5972 100644
--- a/tests/MyGame/Example/Referrable.go
+++ b/tests/MyGame/Example/Referrable.go
@@ -6,6 +6,28 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type ReferrableT struct {
+ Id uint64
+}
+
+func (t *ReferrableT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ ReferrableStart(builder)
+ ReferrableAddId(builder, t.Id)
+ return ReferrableEnd(builder)
+}
+
+func (rcv *Referrable) UnPackTo(t *ReferrableT) {
+ t.Id = rcv.Id()
+}
+
+func (rcv *Referrable) UnPack() *ReferrableT {
+ if rcv == nil { return nil }
+ t := &ReferrableT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Referrable struct {
_tab flatbuffers.Table
}
@@ -17,6 +39,13 @@
return x
}
+func GetSizePrefixedRootAsReferrable(buf []byte, offset flatbuffers.UOffsetT) *Referrable {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &Referrable{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *Referrable) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/Example/Referrable.java b/tests/MyGame/Example/Referrable.java
index f154857..1f92958 100644
--- a/tests/MyGame/Example/Referrable.java
+++ b/tests/MyGame/Example/Referrable.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class Referrable extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Referrable getRootAsReferrable(ByteBuffer _bb) { return getRootAsReferrable(_bb, new Referrable()); }
public static Referrable getRootAsReferrable(ByteBuffer _bb, Referrable obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -59,5 +59,14 @@
}
return null;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Referrable get(int j) { return get(new Referrable(), j); }
+ public Referrable get(Referrable obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ public Referrable getByKey(long key) { return __lookup_by_key(null, __vector(), key, bb); }
+ public Referrable getByKey(Referrable obj, long key) { return __lookup_by_key(obj, __vector(), key, bb); }
+ }
}
diff --git a/tests/MyGame/Example/Referrable.kt b/tests/MyGame/Example/Referrable.kt
index 55ff1d8..2e78c93 100644
--- a/tests/MyGame/Example/Referrable.kt
+++ b/tests/MyGame/Example/Referrable.kt
@@ -37,7 +37,7 @@
return (val_1 - val_2).sign
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsReferrable(_bb: ByteBuffer): Referrable = getRootAsReferrable(_bb, Referrable())
fun getRootAsReferrable(_bb: ByteBuffer, obj: Referrable): Referrable {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/Example/Referrable.py b/tests/MyGame/Example/Referrable.py
index eaec09b..44bf50f 100644
--- a/tests/MyGame/Example/Referrable.py
+++ b/tests/MyGame/Example/Referrable.py
@@ -3,6 +3,8 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Referrable(object):
__slots__ = ['_tab']
@@ -32,3 +34,35 @@
def ReferrableStart(builder): builder.StartObject(1)
def ReferrableAddId(builder, id): builder.PrependUint64Slot(0, id, 0)
def ReferrableEnd(builder): return builder.EndObject()
+
+
+class ReferrableT(object):
+
+ # ReferrableT
+ def __init__(self):
+ self.id = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ referrable = Referrable()
+ referrable.Init(buf, pos)
+ return cls.InitFromObj(referrable)
+
+ @classmethod
+ def InitFromObj(cls, referrable):
+ x = ReferrableT()
+ x._UnPack(referrable)
+ return x
+
+ # ReferrableT
+ def _UnPack(self, referrable):
+ if referrable is None:
+ return
+ self.id = referrable.Id()
+
+ # ReferrableT
+ def Pack(self, builder):
+ ReferrableStart(builder)
+ ReferrableAddId(builder, self.id)
+ referrable = ReferrableEnd(builder)
+ return referrable
diff --git a/tests/MyGame/Example/Stat.cs b/tests/MyGame/Example/Stat.cs
index bcd1004..6f19ed4 100644
--- a/tests/MyGame/Example/Stat.cs
+++ b/tests/MyGame/Example/Stat.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Stat : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Stat GetRootAsStat(ByteBuffer _bb) { return GetRootAsStat(_bb, new Stat()); }
public static Stat GetRootAsStat(ByteBuffer _bb, Stat obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -20,7 +21,7 @@
public string Id { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } }
#if ENABLE_SPAN_T
- public Span<byte> GetIdBytes() { return __p.__vector_as_span(4); }
+ public Span<byte> GetIdBytes() { return __p.__vector_as_span<byte>(4, 1); }
#else
public ArraySegment<byte>? GetIdBytes() { return __p.__vector_as_arraysegment(4); }
#endif
@@ -49,7 +50,42 @@
int o = builder.EndTable();
return new Offset<MyGame.Example.Stat>(o);
}
+ public StatT UnPack() {
+ var _o = new StatT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(StatT _o) {
+ _o.Id = this.Id;
+ _o.Val = this.Val;
+ _o.Count = this.Count;
+ }
+ public static Offset<MyGame.Example.Stat> Pack(FlatBufferBuilder builder, StatT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Stat>);
+ var _id = _o.Id == null ? default(StringOffset) : builder.CreateString(_o.Id);
+ return CreateStat(
+ builder,
+ _id,
+ _o.Val,
+ _o.Count);
+ }
};
+public class StatT
+{
+ [Newtonsoft.Json.JsonProperty("id")]
+ public string Id { get; set; }
+ [Newtonsoft.Json.JsonProperty("val")]
+ public long Val { get; set; }
+ [Newtonsoft.Json.JsonProperty("count")]
+ public ushort Count { get; set; }
+
+ public StatT() {
+ this.Id = null;
+ this.Val = 0;
+ this.Count = 0;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Stat.go b/tests/MyGame/Example/Stat.go
index 401712f..5c060d1 100644
--- a/tests/MyGame/Example/Stat.go
+++ b/tests/MyGame/Example/Stat.go
@@ -6,6 +6,35 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type StatT struct {
+ Id string
+ Val int64
+ Count uint16
+}
+
+func (t *StatT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ idOffset := builder.CreateString(t.Id)
+ StatStart(builder)
+ StatAddId(builder, idOffset)
+ StatAddVal(builder, t.Val)
+ StatAddCount(builder, t.Count)
+ return StatEnd(builder)
+}
+
+func (rcv *Stat) UnPackTo(t *StatT) {
+ t.Id = string(rcv.Id())
+ t.Val = rcv.Val()
+ t.Count = rcv.Count()
+}
+
+func (rcv *Stat) UnPack() *StatT {
+ if rcv == nil { return nil }
+ t := &StatT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Stat struct {
_tab flatbuffers.Table
}
@@ -17,6 +46,13 @@
return x
}
+func GetSizePrefixedRootAsStat(buf []byte, offset flatbuffers.UOffsetT) *Stat {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &Stat{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *Stat) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/Example/Stat.java b/tests/MyGame/Example/Stat.java
index 58d34f3..116c211 100644
--- a/tests/MyGame/Example/Stat.java
+++ b/tests/MyGame/Example/Stat.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class Stat extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Stat getRootAsStat(ByteBuffer _bb) { return getRootAsStat(_bb, new Stat()); }
public static Stat getRootAsStat(ByteBuffer _bb, Stat obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -42,5 +42,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Stat get(int j) { return get(new Stat(), j); }
+ public Stat get(Stat obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/Example/Stat.kt b/tests/MyGame/Example/Stat.kt
index 26b293c..e72f553 100644
--- a/tests/MyGame/Example/Stat.kt
+++ b/tests/MyGame/Example/Stat.kt
@@ -53,7 +53,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsStat(_bb: ByteBuffer): Stat = getRootAsStat(_bb, Stat())
fun getRootAsStat(_bb: ByteBuffer, obj: Stat): Stat {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/Example/Stat.py b/tests/MyGame/Example/Stat.py
index 0fbd2a7..7d3362f 100644
--- a/tests/MyGame/Example/Stat.py
+++ b/tests/MyGame/Example/Stat.py
@@ -3,6 +3,8 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Stat(object):
__slots__ = ['_tab']
@@ -48,3 +50,44 @@
def StatAddVal(builder, val): builder.PrependInt64Slot(1, val, 0)
def StatAddCount(builder, count): builder.PrependUint16Slot(2, count, 0)
def StatEnd(builder): return builder.EndObject()
+
+
+class StatT(object):
+
+ # StatT
+ def __init__(self):
+ self.id = None # type: str
+ self.val = 0 # type: int
+ self.count = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ stat = Stat()
+ stat.Init(buf, pos)
+ return cls.InitFromObj(stat)
+
+ @classmethod
+ def InitFromObj(cls, stat):
+ x = StatT()
+ x._UnPack(stat)
+ return x
+
+ # StatT
+ def _UnPack(self, stat):
+ if stat is None:
+ return
+ self.id = stat.Id()
+ self.val = stat.Val()
+ self.count = stat.Count()
+
+ # StatT
+ def Pack(self, builder):
+ if self.id is not None:
+ id = builder.CreateString(self.id)
+ StatStart(builder)
+ if self.id is not None:
+ StatAddId(builder, id)
+ StatAddVal(builder, self.val)
+ StatAddCount(builder, self.count)
+ stat = StatEnd(builder)
+ return stat
diff --git a/tests/MyGame/Example/Test.cs b/tests/MyGame/Example/Test.cs
index cd91454..a6419ed 100644
--- a/tests/MyGame/Example/Test.cs
+++ b/tests/MyGame/Example/Test.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Test : IFlatbufferObject
@@ -27,7 +28,36 @@
builder.PutShort(A);
return new Offset<MyGame.Example.Test>(builder.Offset);
}
+ public TestT UnPack() {
+ var _o = new TestT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TestT _o) {
+ _o.A = this.A;
+ _o.B = this.B;
+ }
+ public static Offset<MyGame.Example.Test> Pack(FlatBufferBuilder builder, TestT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Test>);
+ return CreateTest(
+ builder,
+ _o.A,
+ _o.B);
+ }
};
+public class TestT
+{
+ [Newtonsoft.Json.JsonProperty("a")]
+ public short A { get; set; }
+ [Newtonsoft.Json.JsonProperty("b")]
+ public sbyte B { get; set; }
+
+ public TestT() {
+ this.A = 0;
+ this.B = 0;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Test.go b/tests/MyGame/Example/Test.go
index 53f53fd..cbf7e29 100644
--- a/tests/MyGame/Example/Test.go
+++ b/tests/MyGame/Example/Test.go
@@ -6,6 +6,27 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type TestT struct {
+ A int16
+ B int8
+}
+
+func (t *TestT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ return CreateTest(builder, t.A, t.B)
+}
+func (rcv *Test) UnPackTo(t *TestT) {
+ t.A = rcv.A()
+ t.B = rcv.B()
+}
+
+func (rcv *Test) UnPack() *TestT {
+ if rcv == nil { return nil }
+ t := &TestT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Test struct {
_tab flatbuffers.Struct
}
diff --git a/tests/MyGame/Example/Test.java b/tests/MyGame/Example/Test.java
index 83fdeb0..c4ffc41 100644
--- a/tests/MyGame/Example/Test.java
+++ b/tests/MyGame/Example/Test.java
@@ -24,5 +24,12 @@
builder.putShort(a);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Test get(int j) { return get(new Test(), j); }
+ public Test get(Test obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/MyGame/Example/Test.py b/tests/MyGame/Example/Test.py
index 3b2fd45..8357ec2 100644
--- a/tests/MyGame/Example/Test.py
+++ b/tests/MyGame/Example/Test.py
@@ -3,10 +3,16 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Test(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 4
+
# Test
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -22,3 +28,34 @@
builder.PrependInt8(b)
builder.PrependInt16(a)
return builder.Offset()
+
+
+class TestT(object):
+
+ # TestT
+ def __init__(self):
+ self.a = 0 # type: int
+ self.b = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ test = Test()
+ test.Init(buf, pos)
+ return cls.InitFromObj(test)
+
+ @classmethod
+ def InitFromObj(cls, test):
+ x = TestT()
+ x._UnPack(test)
+ return x
+
+ # TestT
+ def _UnPack(self, test):
+ if test is None:
+ return
+ self.a = test.A()
+ self.b = test.B()
+
+ # TestT
+ def Pack(self, builder):
+ return CreateTest(builder, self.a, self.b)
diff --git a/tests/MyGame/Example/TestEnum.cs b/tests/MyGame/Example/TestEnum.cs
index 22e83b3..6dfd6b5 100644
--- a/tests/MyGame/Example/TestEnum.cs
+++ b/tests/MyGame/Example/TestEnum.cs
@@ -5,6 +5,7 @@
namespace MyGame.Example
{
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum TestEnum : sbyte
{
A = 0,
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.cs b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
index f9ac42e..c8ef08e 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.cs
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
internal partial struct TestSimpleTableWithEnum : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb) { return GetRootAsTestSimpleTableWithEnum(_bb, new TestSimpleTableWithEnum()); }
public static TestSimpleTableWithEnum GetRootAsTestSimpleTableWithEnum(ByteBuffer _bb, TestSimpleTableWithEnum obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -34,7 +35,31 @@
int o = builder.EndTable();
return new Offset<MyGame.Example.TestSimpleTableWithEnum>(o);
}
+ public TestSimpleTableWithEnumT UnPack() {
+ var _o = new TestSimpleTableWithEnumT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TestSimpleTableWithEnumT _o) {
+ _o.Color = this.Color;
+ }
+ public static Offset<MyGame.Example.TestSimpleTableWithEnum> Pack(FlatBufferBuilder builder, TestSimpleTableWithEnumT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.TestSimpleTableWithEnum>);
+ return CreateTestSimpleTableWithEnum(
+ builder,
+ _o.Color);
+ }
};
+internal partial class TestSimpleTableWithEnumT
+{
+ [Newtonsoft.Json.JsonProperty("color")]
+ public MyGame.Example.Color Color { get; set; }
+
+ public TestSimpleTableWithEnumT() {
+ this.Color = MyGame.Example.Color.Green;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.go b/tests/MyGame/Example/TestSimpleTableWithEnum.go
index 35a6c7c..b8cde12 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.go
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.go
@@ -6,6 +6,28 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type TestSimpleTableWithEnumT struct {
+ Color Color
+}
+
+func (t *TestSimpleTableWithEnumT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ TestSimpleTableWithEnumStart(builder)
+ TestSimpleTableWithEnumAddColor(builder, t.Color)
+ return TestSimpleTableWithEnumEnd(builder)
+}
+
+func (rcv *TestSimpleTableWithEnum) UnPackTo(t *TestSimpleTableWithEnumT) {
+ t.Color = rcv.Color()
+}
+
+func (rcv *TestSimpleTableWithEnum) UnPack() *TestSimpleTableWithEnumT {
+ if rcv == nil { return nil }
+ t := &TestSimpleTableWithEnumT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type TestSimpleTableWithEnum struct {
_tab flatbuffers.Table
}
@@ -17,6 +39,13 @@
return x
}
+func GetSizePrefixedRootAsTestSimpleTableWithEnum(buf []byte, offset flatbuffers.UOffsetT) *TestSimpleTableWithEnum {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &TestSimpleTableWithEnum{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *TestSimpleTableWithEnum) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.java b/tests/MyGame/Example/TestSimpleTableWithEnum.java
index c9f1c63..7e72c22 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.java
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
final class TestSimpleTableWithEnum extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static TestSimpleTableWithEnum getRootAsTestSimpleTableWithEnum(ByteBuffer _bb) { return getRootAsTestSimpleTableWithEnum(_bb, new TestSimpleTableWithEnum()); }
public static TestSimpleTableWithEnum getRootAsTestSimpleTableWithEnum(ByteBuffer _bb, TestSimpleTableWithEnum obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -31,5 +31,12 @@
int o = builder.endTable();
return o;
}
+
+ static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public TestSimpleTableWithEnum get(int j) { return get(new TestSimpleTableWithEnum(), j); }
+ public TestSimpleTableWithEnum get(TestSimpleTableWithEnum obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.kt b/tests/MyGame/Example/TestSimpleTableWithEnum.kt
index 68c6abf..125f889 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.kt
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.kt
@@ -32,7 +32,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsTestSimpleTableWithEnum(_bb: ByteBuffer): TestSimpleTableWithEnum = getRootAsTestSimpleTableWithEnum(_bb, TestSimpleTableWithEnum())
fun getRootAsTestSimpleTableWithEnum(_bb: ByteBuffer, obj: TestSimpleTableWithEnum): TestSimpleTableWithEnum {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/Example/TestSimpleTableWithEnum.py b/tests/MyGame/Example/TestSimpleTableWithEnum.py
index cb9c631..d91947a 100644
--- a/tests/MyGame/Example/TestSimpleTableWithEnum.py
+++ b/tests/MyGame/Example/TestSimpleTableWithEnum.py
@@ -3,6 +3,8 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class TestSimpleTableWithEnum(object):
__slots__ = ['_tab']
@@ -32,3 +34,35 @@
def TestSimpleTableWithEnumStart(builder): builder.StartObject(1)
def TestSimpleTableWithEnumAddColor(builder, color): builder.PrependUint8Slot(0, color, 2)
def TestSimpleTableWithEnumEnd(builder): return builder.EndObject()
+
+
+class TestSimpleTableWithEnumT(object):
+
+ # TestSimpleTableWithEnumT
+ def __init__(self):
+ self.color = 2 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ testSimpleTableWithEnum = TestSimpleTableWithEnum()
+ testSimpleTableWithEnum.Init(buf, pos)
+ return cls.InitFromObj(testSimpleTableWithEnum)
+
+ @classmethod
+ def InitFromObj(cls, testSimpleTableWithEnum):
+ x = TestSimpleTableWithEnumT()
+ x._UnPack(testSimpleTableWithEnum)
+ return x
+
+ # TestSimpleTableWithEnumT
+ def _UnPack(self, testSimpleTableWithEnum):
+ if testSimpleTableWithEnum is None:
+ return
+ self.color = testSimpleTableWithEnum.Color()
+
+ # TestSimpleTableWithEnumT
+ def Pack(self, builder):
+ TestSimpleTableWithEnumStart(builder)
+ TestSimpleTableWithEnumAddColor(builder, self.color)
+ testSimpleTableWithEnum = TestSimpleTableWithEnumEnd(builder)
+ return testSimpleTableWithEnum
diff --git a/tests/MyGame/Example/TypeAliases.cs b/tests/MyGame/Example/TypeAliases.cs
index a7b54d5..79ffb07 100644
--- a/tests/MyGame/Example/TypeAliases.cs
+++ b/tests/MyGame/Example/TypeAliases.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct TypeAliases : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static TypeAliases GetRootAsTypeAliases(ByteBuffer _bb) { return GetRootAsTypeAliases(_bb, new TypeAliases()); }
public static TypeAliases GetRootAsTypeAliases(ByteBuffer _bb, TypeAliases obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -41,7 +42,7 @@
public sbyte V8(int j) { int o = __p.__offset(24); return o != 0 ? __p.bb.GetSbyte(__p.__vector(o) + j * 1) : (sbyte)0; }
public int V8Length { get { int o = __p.__offset(24); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetV8Bytes() { return __p.__vector_as_span(24); }
+ public Span<sbyte> GetV8Bytes() { return __p.__vector_as_span<sbyte>(24, 1); }
#else
public ArraySegment<byte>? GetV8Bytes() { return __p.__vector_as_arraysegment(24); }
#endif
@@ -50,7 +51,7 @@
public double Vf64(int j) { int o = __p.__offset(26); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }
public int Vf64Length { get { int o = __p.__offset(26); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetVf64Bytes() { return __p.__vector_as_span(26); }
+ public Span<double> GetVf64Bytes() { return __p.__vector_as_span<double>(26, 8); }
#else
public ArraySegment<byte>? GetVf64Bytes() { return __p.__vector_as_arraysegment(26); }
#endif
@@ -109,7 +110,98 @@
int o = builder.EndTable();
return new Offset<MyGame.Example.TypeAliases>(o);
}
+ public TypeAliasesT UnPack() {
+ var _o = new TypeAliasesT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TypeAliasesT _o) {
+ _o.I8 = this.I8;
+ _o.U8 = this.U8;
+ _o.I16 = this.I16;
+ _o.U16 = this.U16;
+ _o.I32 = this.I32;
+ _o.U32 = this.U32;
+ _o.I64 = this.I64;
+ _o.U64 = this.U64;
+ _o.F32 = this.F32;
+ _o.F64 = this.F64;
+ _o.V8 = new List<sbyte>();
+ for (var _j = 0; _j < this.V8Length; ++_j) {_o.V8.Add(this.V8(_j));}
+ _o.Vf64 = new List<double>();
+ for (var _j = 0; _j < this.Vf64Length; ++_j) {_o.Vf64.Add(this.Vf64(_j));}
+ }
+ public static Offset<MyGame.Example.TypeAliases> Pack(FlatBufferBuilder builder, TypeAliasesT _o) {
+ if (_o == null) return default(Offset<MyGame.Example.TypeAliases>);
+ var _v8 = default(VectorOffset);
+ if (_o.V8 != null) {
+ var __v8 = _o.V8.ToArray();
+ _v8 = CreateV8Vector(builder, __v8);
+ }
+ var _vf64 = default(VectorOffset);
+ if (_o.Vf64 != null) {
+ var __vf64 = _o.Vf64.ToArray();
+ _vf64 = CreateVf64Vector(builder, __vf64);
+ }
+ return CreateTypeAliases(
+ builder,
+ _o.I8,
+ _o.U8,
+ _o.I16,
+ _o.U16,
+ _o.I32,
+ _o.U32,
+ _o.I64,
+ _o.U64,
+ _o.F32,
+ _o.F64,
+ _v8,
+ _vf64);
+ }
};
+public class TypeAliasesT
+{
+ [Newtonsoft.Json.JsonProperty("i8")]
+ public sbyte I8 { get; set; }
+ [Newtonsoft.Json.JsonProperty("u8")]
+ public byte U8 { get; set; }
+ [Newtonsoft.Json.JsonProperty("i16")]
+ public short I16 { get; set; }
+ [Newtonsoft.Json.JsonProperty("u16")]
+ public ushort U16 { get; set; }
+ [Newtonsoft.Json.JsonProperty("i32")]
+ public int I32 { get; set; }
+ [Newtonsoft.Json.JsonProperty("u32")]
+ public uint U32 { get; set; }
+ [Newtonsoft.Json.JsonProperty("i64")]
+ public long I64 { get; set; }
+ [Newtonsoft.Json.JsonProperty("u64")]
+ public ulong U64 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f32")]
+ public float F32 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f64")]
+ public double F64 { get; set; }
+ [Newtonsoft.Json.JsonProperty("v8")]
+ public List<sbyte> V8 { get; set; }
+ [Newtonsoft.Json.JsonProperty("vf64")]
+ public List<double> Vf64 { get; set; }
+
+ public TypeAliasesT() {
+ this.I8 = 0;
+ this.U8 = 0;
+ this.I16 = 0;
+ this.U16 = 0;
+ this.I32 = 0;
+ this.U32 = 0;
+ this.I64 = 0;
+ this.U64 = 0;
+ this.F32 = 0.0f;
+ this.F64 = 0.0;
+ this.V8 = null;
+ this.Vf64 = null;
+ }
+}
+
}
diff --git a/tests/MyGame/Example/TypeAliases.go b/tests/MyGame/Example/TypeAliases.go
index d017b5b..d018fa1 100644
--- a/tests/MyGame/Example/TypeAliases.go
+++ b/tests/MyGame/Example/TypeAliases.go
@@ -6,6 +6,87 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type TypeAliasesT struct {
+ I8 int8
+ U8 byte
+ I16 int16
+ U16 uint16
+ I32 int32
+ U32 uint32
+ I64 int64
+ U64 uint64
+ F32 float32
+ F64 float64
+ V8 []int8
+ Vf64 []float64
+}
+
+func (t *TypeAliasesT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ v8Offset := flatbuffers.UOffsetT(0)
+ if t.V8 != nil {
+ v8Length := len(t.V8)
+ TypeAliasesStartV8Vector(builder, v8Length)
+ for j := v8Length - 1; j >= 0; j-- {
+ builder.PrependInt8(t.V8[j])
+ }
+ v8Offset = builder.EndVector(v8Length)
+ }
+ vf64Offset := flatbuffers.UOffsetT(0)
+ if t.Vf64 != nil {
+ vf64Length := len(t.Vf64)
+ TypeAliasesStartVf64Vector(builder, vf64Length)
+ for j := vf64Length - 1; j >= 0; j-- {
+ builder.PrependFloat64(t.Vf64[j])
+ }
+ vf64Offset = builder.EndVector(vf64Length)
+ }
+ TypeAliasesStart(builder)
+ TypeAliasesAddI8(builder, t.I8)
+ TypeAliasesAddU8(builder, t.U8)
+ TypeAliasesAddI16(builder, t.I16)
+ TypeAliasesAddU16(builder, t.U16)
+ TypeAliasesAddI32(builder, t.I32)
+ TypeAliasesAddU32(builder, t.U32)
+ TypeAliasesAddI64(builder, t.I64)
+ TypeAliasesAddU64(builder, t.U64)
+ TypeAliasesAddF32(builder, t.F32)
+ TypeAliasesAddF64(builder, t.F64)
+ TypeAliasesAddV8(builder, v8Offset)
+ TypeAliasesAddVf64(builder, vf64Offset)
+ return TypeAliasesEnd(builder)
+}
+
+func (rcv *TypeAliases) UnPackTo(t *TypeAliasesT) {
+ t.I8 = rcv.I8()
+ t.U8 = rcv.U8()
+ t.I16 = rcv.I16()
+ t.U16 = rcv.U16()
+ t.I32 = rcv.I32()
+ t.U32 = rcv.U32()
+ t.I64 = rcv.I64()
+ t.U64 = rcv.U64()
+ t.F32 = rcv.F32()
+ t.F64 = rcv.F64()
+ v8Length := rcv.V8Length()
+ t.V8 = make([]int8, v8Length)
+ for j := 0; j < v8Length; j++ {
+ t.V8[j] = rcv.V8(j)
+ }
+ vf64Length := rcv.Vf64Length()
+ t.Vf64 = make([]float64, vf64Length)
+ for j := 0; j < vf64Length; j++ {
+ t.Vf64[j] = rcv.Vf64(j)
+ }
+}
+
+func (rcv *TypeAliases) UnPack() *TypeAliasesT {
+ if rcv == nil { return nil }
+ t := &TypeAliasesT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type TypeAliases struct {
_tab flatbuffers.Table
}
@@ -17,6 +98,13 @@
return x
}
+func GetSizePrefixedRootAsTypeAliases(buf []byte, offset flatbuffers.UOffsetT) *TypeAliases {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &TypeAliases{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *TypeAliases) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/Example/TypeAliases.java b/tests/MyGame/Example/TypeAliases.java
index dde6acb..1112658 100644
--- a/tests/MyGame/Example/TypeAliases.java
+++ b/tests/MyGame/Example/TypeAliases.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class TypeAliases extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static TypeAliases getRootAsTypeAliases(ByteBuffer _bb) { return getRootAsTypeAliases(_bb, new TypeAliases()); }
public static TypeAliases getRootAsTypeAliases(ByteBuffer _bb, TypeAliases obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -37,11 +37,15 @@
public boolean mutateF64(double f64) { int o = __offset(22); if (o != 0) { bb.putDouble(o + bb_pos, f64); return true; } else { return false; } }
public byte v8(int j) { int o = __offset(24); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; }
public int v8Length() { int o = __offset(24); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector v8Vector() { return v8Vector(new ByteVector()); }
+ public ByteVector v8Vector(ByteVector obj) { int o = __offset(24); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer v8AsByteBuffer() { return __vector_as_bytebuffer(24, 1); }
public ByteBuffer v8InByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 24, 1); }
public boolean mutateV8(int j, byte v8) { int o = __offset(24); if (o != 0) { bb.put(__vector(o) + j * 1, v8); return true; } else { return false; } }
public double vf64(int j) { int o = __offset(26); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }
public int vf64Length() { int o = __offset(26); return o != 0 ? __vector_len(o) : 0; }
+ public DoubleVector vf64Vector() { return vf64Vector(new DoubleVector()); }
+ public DoubleVector vf64Vector(DoubleVector obj) { int o = __offset(26); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer vf64AsByteBuffer() { return __vector_as_bytebuffer(26, 8); }
public ByteBuffer vf64InByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 26, 8); }
public boolean mutateVf64(int j, double vf64) { int o = __offset(26); if (o != 0) { bb.putDouble(__vector(o) + j * 8, vf64); return true; } else { return false; } }
@@ -87,7 +91,8 @@
public static void addF32(FlatBufferBuilder builder, float f32) { builder.addFloat(8, f32, 0.0f); }
public static void addF64(FlatBufferBuilder builder, double f64) { builder.addDouble(9, f64, 0.0); }
public static void addV8(FlatBufferBuilder builder, int v8Offset) { builder.addOffset(10, v8Offset, 0); }
- public static int createV8Vector(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 int createV8Vector(FlatBufferBuilder builder, byte[] data) { return builder.createByteVector(data); }
+ public static int createV8Vector(FlatBufferBuilder builder, ByteBuffer data) { return builder.createByteVector(data); }
public static void startV8Vector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); }
public static void addVf64(FlatBufferBuilder builder, int vf64Offset) { builder.addOffset(11, vf64Offset, 0); }
public static int createVf64Vector(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(); }
@@ -96,5 +101,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public TypeAliases get(int j) { return get(new TypeAliases(), j); }
+ public TypeAliases get(TypeAliases obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/Example/TypeAliases.kt b/tests/MyGame/Example/TypeAliases.kt
index d1e8816..d279d14 100644
--- a/tests/MyGame/Example/TypeAliases.kt
+++ b/tests/MyGame/Example/TypeAliases.kt
@@ -204,7 +204,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsTypeAliases(_bb: ByteBuffer): TypeAliases = getRootAsTypeAliases(_bb, TypeAliases())
fun getRootAsTypeAliases(_bb: ByteBuffer, obj: TypeAliases): TypeAliases {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/Example/TypeAliases.py b/tests/MyGame/Example/TypeAliases.py
index 81e9b06..0567212 100644
--- a/tests/MyGame/Example/TypeAliases.py
+++ b/tests/MyGame/Example/TypeAliases.py
@@ -3,6 +3,8 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class TypeAliases(object):
__slots__ = ['_tab']
@@ -115,6 +117,11 @@
return 0
# TypeAliases
+ def V8IsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24))
+ return o == 0
+
+ # TypeAliases
def Vf64(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))
if o != 0:
@@ -136,6 +143,11 @@
return self._tab.VectorLen(o)
return 0
+ # TypeAliases
+ def Vf64IsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26))
+ return o == 0
+
def TypeAliasesStart(builder): builder.StartObject(12)
def TypeAliasesAddI8(builder, i8): builder.PrependInt8Slot(0, i8, 0)
def TypeAliasesAddU8(builder, u8): builder.PrependUint8Slot(1, u8, 0)
@@ -152,3 +164,102 @@
def TypeAliasesAddVf64(builder, vf64): builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(vf64), 0)
def TypeAliasesStartVf64Vector(builder, numElems): return builder.StartVector(8, numElems, 8)
def TypeAliasesEnd(builder): return builder.EndObject()
+
+try:
+ from typing import List
+except:
+ pass
+
+class TypeAliasesT(object):
+
+ # TypeAliasesT
+ def __init__(self):
+ self.i8 = 0 # type: int
+ self.u8 = 0 # type: int
+ self.i16 = 0 # type: int
+ self.u16 = 0 # type: int
+ self.i32 = 0 # type: int
+ self.u32 = 0 # type: int
+ self.i64 = 0 # type: int
+ self.u64 = 0 # type: int
+ self.f32 = 0.0 # type: float
+ self.f64 = 0.0 # type: float
+ self.v8 = None # type: List[int]
+ self.vf64 = None # type: List[float]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ typeAliases = TypeAliases()
+ typeAliases.Init(buf, pos)
+ return cls.InitFromObj(typeAliases)
+
+ @classmethod
+ def InitFromObj(cls, typeAliases):
+ x = TypeAliasesT()
+ x._UnPack(typeAliases)
+ return x
+
+ # TypeAliasesT
+ def _UnPack(self, typeAliases):
+ if typeAliases is None:
+ return
+ self.i8 = typeAliases.I8()
+ self.u8 = typeAliases.U8()
+ self.i16 = typeAliases.I16()
+ self.u16 = typeAliases.U16()
+ self.i32 = typeAliases.I32()
+ self.u32 = typeAliases.U32()
+ self.i64 = typeAliases.I64()
+ self.u64 = typeAliases.U64()
+ self.f32 = typeAliases.F32()
+ self.f64 = typeAliases.F64()
+ if not typeAliases.V8IsNone():
+ if np is None:
+ self.v8 = []
+ for i in range(typeAliases.V8Length()):
+ self.v8.append(typeAliases.V8(i))
+ else:
+ self.v8 = typeAliases.V8AsNumpy()
+ if not typeAliases.Vf64IsNone():
+ if np is None:
+ self.vf64 = []
+ for i in range(typeAliases.Vf64Length()):
+ self.vf64.append(typeAliases.Vf64(i))
+ else:
+ self.vf64 = typeAliases.Vf64AsNumpy()
+
+ # TypeAliasesT
+ def Pack(self, builder):
+ if self.v8 is not None:
+ if np is not None and type(self.v8) is np.ndarray:
+ v8 = builder.CreateNumpyVector(self.v8)
+ else:
+ TypeAliasesStartV8Vector(builder, len(self.v8))
+ for i in reversed(range(len(self.v8))):
+ builder.PrependByte(self.v8[i])
+ v8 = builder.EndVector(len(self.v8))
+ if self.vf64 is not None:
+ if np is not None and type(self.vf64) is np.ndarray:
+ vf64 = builder.CreateNumpyVector(self.vf64)
+ else:
+ TypeAliasesStartVf64Vector(builder, len(self.vf64))
+ for i in reversed(range(len(self.vf64))):
+ builder.PrependFloat64(self.vf64[i])
+ vf64 = builder.EndVector(len(self.vf64))
+ TypeAliasesStart(builder)
+ TypeAliasesAddI8(builder, self.i8)
+ TypeAliasesAddU8(builder, self.u8)
+ TypeAliasesAddI16(builder, self.i16)
+ TypeAliasesAddU16(builder, self.u16)
+ TypeAliasesAddI32(builder, self.i32)
+ TypeAliasesAddU32(builder, self.u32)
+ TypeAliasesAddI64(builder, self.i64)
+ TypeAliasesAddU64(builder, self.u64)
+ TypeAliasesAddF32(builder, self.f32)
+ TypeAliasesAddF64(builder, self.f64)
+ if self.v8 is not None:
+ TypeAliasesAddV8(builder, v8)
+ if self.vf64 is not None:
+ TypeAliasesAddVf64(builder, vf64)
+ typeAliases = TypeAliasesEnd(builder)
+ return typeAliases
diff --git a/tests/MyGame/Example/Vec3.cs b/tests/MyGame/Example/Vec3.cs
index 1dbb315..54fc8f9 100644
--- a/tests/MyGame/Example/Vec3.cs
+++ b/tests/MyGame/Example/Vec3.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Vec3 : IFlatbufferObject
@@ -43,7 +44,59 @@
builder.PutFloat(X);
return new Offset<MyGame.Example.Vec3>(builder.Offset);
}
+ public Vec3T UnPack() {
+ var _o = new Vec3T();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(Vec3T _o) {
+ _o.X = this.X;
+ _o.Y = this.Y;
+ _o.Z = this.Z;
+ _o.Test1 = this.Test1;
+ _o.Test2 = this.Test2;
+ _o.Test3 = this.Test3.UnPack();
+ }
+ public static Offset<MyGame.Example.Vec3> Pack(FlatBufferBuilder builder, Vec3T _o) {
+ if (_o == null) return default(Offset<MyGame.Example.Vec3>);
+ var _test3_a = _o.Test3.A;
+ var _test3_b = _o.Test3.B;
+ return CreateVec3(
+ builder,
+ _o.X,
+ _o.Y,
+ _o.Z,
+ _o.Test1,
+ _o.Test2,
+ _test3_a,
+ _test3_b);
+ }
};
+public class Vec3T
+{
+ [Newtonsoft.Json.JsonProperty("x")]
+ public float X { get; set; }
+ [Newtonsoft.Json.JsonProperty("y")]
+ public float Y { get; set; }
+ [Newtonsoft.Json.JsonProperty("z")]
+ public float Z { get; set; }
+ [Newtonsoft.Json.JsonProperty("test1")]
+ public double Test1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("test2")]
+ public MyGame.Example.Color Test2 { get; set; }
+ [Newtonsoft.Json.JsonProperty("test3")]
+ public MyGame.Example.TestT Test3 { get; set; }
+
+ public Vec3T() {
+ this.X = 0.0f;
+ this.Y = 0.0f;
+ this.Z = 0.0f;
+ this.Test1 = 0.0;
+ this.Test2 = 0;
+ this.Test3 = new MyGame.Example.TestT();
+ }
+}
+
}
diff --git a/tests/MyGame/Example/Vec3.go b/tests/MyGame/Example/Vec3.go
index 9131afd..08311ed 100644
--- a/tests/MyGame/Example/Vec3.go
+++ b/tests/MyGame/Example/Vec3.go
@@ -6,6 +6,35 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type Vec3T struct {
+ X float32
+ Y float32
+ Z float32
+ Test1 float64
+ Test2 Color
+ Test3 *TestT
+}
+
+func (t *Vec3T) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ return CreateVec3(builder, t.X, t.Y, t.Z, t.Test1, t.Test2, t.Test3.A, t.Test3.B)
+}
+func (rcv *Vec3) UnPackTo(t *Vec3T) {
+ t.X = rcv.X()
+ t.Y = rcv.Y()
+ t.Z = rcv.Z()
+ t.Test1 = rcv.Test1()
+ t.Test2 = rcv.Test2()
+ t.Test3 = rcv.Test3(nil).UnPack()
+}
+
+func (rcv *Vec3) UnPack() *Vec3T {
+ if rcv == nil { return nil }
+ t := &Vec3T{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Vec3 struct {
_tab flatbuffers.Struct
}
diff --git a/tests/MyGame/Example/Vec3.java b/tests/MyGame/Example/Vec3.java
index 0b67c74..89d38a1 100644
--- a/tests/MyGame/Example/Vec3.java
+++ b/tests/MyGame/Example/Vec3.java
@@ -41,5 +41,12 @@
builder.putFloat(x);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Vec3 get(int j) { return get(new Vec3(), j); }
+ public Vec3 get(Vec3 obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/MyGame/Example/Vec3.py b/tests/MyGame/Example/Vec3.py
index 1f32390..69cd511 100644
--- a/tests/MyGame/Example/Vec3.py
+++ b/tests/MyGame/Example/Vec3.py
@@ -3,10 +3,16 @@
# namespace: Example
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Vec3(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 32
+
# Vec3
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -42,3 +48,48 @@
builder.PrependFloat32(y)
builder.PrependFloat32(x)
return builder.Offset()
+
+import MyGame.Example.Test
+try:
+ from typing import Optional
+except:
+ pass
+
+class Vec3T(object):
+
+ # Vec3T
+ def __init__(self):
+ self.x = 0.0 # type: float
+ self.y = 0.0 # type: float
+ self.z = 0.0 # type: float
+ self.test1 = 0.0 # type: float
+ self.test2 = 0 # type: int
+ self.test3 = None # type: Optional[MyGame.Example.Test.TestT]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ vec3 = Vec3()
+ vec3.Init(buf, pos)
+ return cls.InitFromObj(vec3)
+
+ @classmethod
+ def InitFromObj(cls, vec3):
+ x = Vec3T()
+ x._UnPack(vec3)
+ return x
+
+ # Vec3T
+ def _UnPack(self, vec3):
+ if vec3 is None:
+ return
+ self.x = vec3.X()
+ self.y = vec3.Y()
+ self.z = vec3.Z()
+ self.test1 = vec3.Test1()
+ self.test2 = vec3.Test2()
+ if vec3.Test3(MyGame.Example.Test.Test()) is not None:
+ self.test3 = MyGame.Example.Test.TestT.InitFromObj(vec3.Test3(MyGame.Example.Test.Test()))
+
+ # Vec3T
+ def Pack(self, builder):
+ return CreateVec3(builder, self.x, self.y, self.z, self.test1, self.test2, self.test3.a, self.test3.b)
diff --git a/tests/MyGame/Example/monster_test_grpc_fb.py b/tests/MyGame/Example/monster_test_grpc_fb.py
new file mode 100644
index 0000000..8375c98
--- /dev/null
+++ b/tests/MyGame/Example/monster_test_grpc_fb.py
@@ -0,0 +1,241 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+
+class MonsterStorageStub(object):
+
+ def __init__(self, channel):
+ """Constructor.
+
+ Args:
+ channel: A grpc.Channel.
+ """
+ self.Store = channel.unary_unary(
+ '/MyGame.Example.MonsterStorage/Store',
+
+
+ )
+ self.Retrieve = channel.unary_stream(
+ '/MyGame.Example.MonsterStorage/Retrieve',
+
+
+ )
+ self.GetMaxHitPoint = channel.stream_unary(
+ '/MyGame.Example.MonsterStorage/GetMaxHitPoint',
+
+
+ )
+ self.GetMinMaxHitPoints = channel.unary_unary(
+ '/MyGame.Example.MonsterStorage/GetMinMaxHitPoints',
+
+
+ )
+
+
+class MonsterStorageServicer(object):
+
+ def Store(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def Retrieve(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def GetMaxHitPoint(self, request_iterator, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def GetMinMaxHitPoints(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+
+def add_MonsterStorageServicer_to_server(servicer, server):
+ rpc_method_handlers = {
+ 'Store': grpc.unary_unary_rpc_method_handler(
+ servicer.Store,
+
+
+ ),
+ 'Retrieve': grpc.unary_stream_rpc_method_handler(
+ servicer.Retrieve,
+
+
+ ),
+ 'GetMaxHitPoint': grpc.stream_unary_rpc_method_handler(
+ servicer.GetMaxHitPoint,
+
+
+ ),
+ 'GetMinMaxHitPoints': grpc.unary_unary_rpc_method_handler(
+ servicer.GetMinMaxHitPoints,
+
+
+ ),
+ }
+ generic_handler = grpc.method_handlers_generic_handler(
+ 'MyGame.Example.MonsterStorage', rpc_method_handlers)
+ server.add_generic_rpc_handlers((generic_handler,))
+try:
+ # THESE ELEMENTS WILL BE DEPRECATED.
+ # Please use the generated *_pb2_grpc.py files instead.
+ import grpc
+ from grpc.beta import implementations as beta_implementations
+ from grpc.beta import interfaces as beta_interfaces
+ from grpc.framework.common import cardinality
+ from grpc.framework.interfaces.face import utilities as face_utilities
+
+
+ class MonsterStorageStub(object):
+
+ def __init__(self, channel):
+ """Constructor.
+
+ Args:
+ channel: A grpc.Channel.
+ """
+ self.Store = channel.unary_unary(
+ '/MyGame.Example.MonsterStorage/Store',
+
+
+ )
+ self.Retrieve = channel.unary_stream(
+ '/MyGame.Example.MonsterStorage/Retrieve',
+
+
+ )
+ self.GetMaxHitPoint = channel.stream_unary(
+ '/MyGame.Example.MonsterStorage/GetMaxHitPoint',
+
+
+ )
+ self.GetMinMaxHitPoints = channel.unary_unary(
+ '/MyGame.Example.MonsterStorage/GetMinMaxHitPoints',
+
+
+ )
+
+
+ class MonsterStorageServicer(object):
+
+ def Store(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def Retrieve(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def GetMaxHitPoint(self, request_iterator, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def GetMinMaxHitPoints(self, request, context):
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+
+ def add_MonsterStorageServicer_to_server(servicer, server):
+ rpc_method_handlers = {
+ 'Store': grpc.unary_unary_rpc_method_handler(
+ servicer.Store,
+
+
+ ),
+ 'Retrieve': grpc.unary_stream_rpc_method_handler(
+ servicer.Retrieve,
+
+
+ ),
+ 'GetMaxHitPoint': grpc.stream_unary_rpc_method_handler(
+ servicer.GetMaxHitPoint,
+
+
+ ),
+ 'GetMinMaxHitPoints': grpc.unary_unary_rpc_method_handler(
+ servicer.GetMinMaxHitPoints,
+
+
+ ),
+ }
+ generic_handler = grpc.method_handlers_generic_handler(
+ 'MyGame.Example.MonsterStorage', rpc_method_handlers)
+ server.add_generic_rpc_handlers((generic_handler,))
+
+
+ class BetaMonsterStorageServicer(object):
+ """The Beta API is deprecated for 0.15.0 and later.
+
+ It is recommended to use the GA API (classes and functions in this
+ file not marked beta) for all further purposes. This class was generated
+ only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
+ def Store(self, request, context):
+ context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+ def Retrieve(self, request, context):
+ context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+ def GetMaxHitPoint(self, request_iterator, context):
+ context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+ def GetMinMaxHitPoints(self, request, context):
+ context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+ class BetaMonsterStorageStub(object):
+ """The Beta API is deprecated for 0.15.0 and later.
+
+ It is recommended to use the GA API (classes and functions in this
+ file not marked beta) for all further purposes. This class was generated
+ only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
+ def Store(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+ raise NotImplementedError()
+ Store.future = None
+ def Retrieve(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+ raise NotImplementedError()
+ def GetMaxHitPoint(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
+ raise NotImplementedError()
+ GetMaxHitPoint.future = None
+ def GetMinMaxHitPoints(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+ raise NotImplementedError()
+ GetMinMaxHitPoints.future = None
+
+
+ def beta_create_MonsterStorage_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+ """The Beta API is deprecated for 0.15.0 and later.
+
+ It is recommended to use the GA API (classes and functions in this
+ file not marked beta) for all further purposes. This function was
+ generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
+ method_implementations = {
+ ('MyGame.Example.MonsterStorage', 'GetMaxHitPoint'): face_utilities.stream_unary_inline(servicer.GetMaxHitPoint),
+ ('MyGame.Example.MonsterStorage', 'GetMinMaxHitPoints'): face_utilities.unary_unary_inline(servicer.GetMinMaxHitPoints),
+ ('MyGame.Example.MonsterStorage', 'Retrieve'): face_utilities.unary_stream_inline(servicer.Retrieve),
+ ('MyGame.Example.MonsterStorage', 'Store'): face_utilities.unary_unary_inline(servicer.Store),
+ }
+ server_options = beta_implementations.server_options(thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+ return beta_implementations.server(method_implementations, options=server_options)
+
+
+ def beta_create_MonsterStorage_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+ """The Beta API is deprecated for 0.15.0 and later.
+
+ It is recommended to use the GA API (classes and functions in this
+ file not marked beta) for all further purposes. This function was
+ generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
+ cardinalities = {
+ 'GetMaxHitPoint': cardinality.Cardinality.STREAM_UNARY,
+ 'GetMinMaxHitPoints': cardinality.Cardinality.UNARY_UNARY,
+ 'Retrieve': cardinality.Cardinality.UNARY_STREAM,
+ 'Store': cardinality.Cardinality.UNARY_UNARY,
+ }
+ stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, thread_pool=pool, thread_pool_size=pool_size)
+ return beta_implementations.dynamic_stub(channel, 'MyGame.Example.MonsterStorage', cardinalities, options=stub_options)
+except ImportError:
+ pass
\ No newline at end of file
diff --git a/tests/MyGame/Example2/Monster.cs b/tests/MyGame/Example2/Monster.cs
index a6e9dce..3291ee8 100644
--- a/tests/MyGame/Example2/Monster.cs
+++ b/tests/MyGame/Example2/Monster.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Monster : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }
public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -24,7 +25,26 @@
int o = builder.EndTable();
return new Offset<MyGame.Example2.Monster>(o);
}
+ public MonsterT UnPack() {
+ var _o = new MonsterT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(MonsterT _o) {
+ }
+ public static Offset<MyGame.Example2.Monster> Pack(FlatBufferBuilder builder, MonsterT _o) {
+ if (_o == null) return default(Offset<MyGame.Example2.Monster>);
+ StartMonster(builder);
+ return EndMonster(builder);
+ }
};
+public class MonsterT
+{
+
+ public MonsterT() {
+ }
+}
+
}
diff --git a/tests/MyGame/Example2/Monster.go b/tests/MyGame/Example2/Monster.go
index d0fae94..792011f 100644
--- a/tests/MyGame/Example2/Monster.go
+++ b/tests/MyGame/Example2/Monster.go
@@ -6,6 +6,25 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type MonsterT struct {
+}
+
+func (t *MonsterT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ MonsterStart(builder)
+ return MonsterEnd(builder)
+}
+
+func (rcv *Monster) UnPackTo(t *MonsterT) {
+}
+
+func (rcv *Monster) UnPack() *MonsterT {
+ if rcv == nil { return nil }
+ t := &MonsterT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type Monster struct {
_tab flatbuffers.Table
}
@@ -17,6 +36,13 @@
return x
}
+func GetSizePrefixedRootAsMonster(buf []byte, offset flatbuffers.UOffsetT) *Monster {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &Monster{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *Monster) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/Example2/Monster.java b/tests/MyGame/Example2/Monster.java
index 7e0cae1..950c427 100644
--- a/tests/MyGame/Example2/Monster.java
+++ b/tests/MyGame/Example2/Monster.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class Monster extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }
public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -21,5 +21,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Monster get(int j) { return get(new Monster(), j); }
+ public Monster get(Monster obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/Example2/Monster.kt b/tests/MyGame/Example2/Monster.kt
index de587ba..f1df2e0 100644
--- a/tests/MyGame/Example2/Monster.kt
+++ b/tests/MyGame/Example2/Monster.kt
@@ -18,7 +18,7 @@
return this
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsMonster(_bb: ByteBuffer): Monster = getRootAsMonster(_bb, Monster())
fun getRootAsMonster(_bb: ByteBuffer, obj: Monster): Monster {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/Example2/Monster.py b/tests/MyGame/Example2/Monster.py
index 44cc906..538b035 100644
--- a/tests/MyGame/Example2/Monster.py
+++ b/tests/MyGame/Example2/Monster.py
@@ -3,6 +3,8 @@
# namespace: Example2
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class Monster(object):
__slots__ = ['_tab']
@@ -24,3 +26,33 @@
def MonsterStart(builder): builder.StartObject(0)
def MonsterEnd(builder): return builder.EndObject()
+
+
+class MonsterT(object):
+
+ # MonsterT
+ def __init__(self):
+ pass
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ monster = Monster()
+ monster.Init(buf, pos)
+ return cls.InitFromObj(monster)
+
+ @classmethod
+ def InitFromObj(cls, monster):
+ x = MonsterT()
+ x._UnPack(monster)
+ return x
+
+ # MonsterT
+ def _UnPack(self, monster):
+ if monster is None:
+ return
+
+ # MonsterT
+ def Pack(self, builder):
+ MonsterStart(builder)
+ monster = MonsterEnd(builder)
+ return monster
diff --git a/tests/MyGame/InParentNamespace.cs b/tests/MyGame/InParentNamespace.cs
index 869c400..efefa34 100644
--- a/tests/MyGame/InParentNamespace.cs
+++ b/tests/MyGame/InParentNamespace.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct InParentNamespace : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static InParentNamespace GetRootAsInParentNamespace(ByteBuffer _bb) { return GetRootAsInParentNamespace(_bb, new InParentNamespace()); }
public static InParentNamespace GetRootAsInParentNamespace(ByteBuffer _bb, InParentNamespace obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -24,7 +25,26 @@
int o = builder.EndTable();
return new Offset<MyGame.InParentNamespace>(o);
}
+ public InParentNamespaceT UnPack() {
+ var _o = new InParentNamespaceT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(InParentNamespaceT _o) {
+ }
+ public static Offset<MyGame.InParentNamespace> Pack(FlatBufferBuilder builder, InParentNamespaceT _o) {
+ if (_o == null) return default(Offset<MyGame.InParentNamespace>);
+ StartInParentNamespace(builder);
+ return EndInParentNamespace(builder);
+ }
};
+public class InParentNamespaceT
+{
+
+ public InParentNamespaceT() {
+ }
+}
+
}
diff --git a/tests/MyGame/InParentNamespace.go b/tests/MyGame/InParentNamespace.go
index fc6ce32..2c4a4e0 100644
--- a/tests/MyGame/InParentNamespace.go
+++ b/tests/MyGame/InParentNamespace.go
@@ -6,6 +6,25 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type InParentNamespaceT struct {
+}
+
+func (t *InParentNamespaceT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ InParentNamespaceStart(builder)
+ return InParentNamespaceEnd(builder)
+}
+
+func (rcv *InParentNamespace) UnPackTo(t *InParentNamespaceT) {
+}
+
+func (rcv *InParentNamespace) UnPack() *InParentNamespaceT {
+ if rcv == nil { return nil }
+ t := &InParentNamespaceT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type InParentNamespace struct {
_tab flatbuffers.Table
}
@@ -17,6 +36,13 @@
return x
}
+func GetSizePrefixedRootAsInParentNamespace(buf []byte, offset flatbuffers.UOffsetT) *InParentNamespace {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &InParentNamespace{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *InParentNamespace) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/MyGame/InParentNamespace.java b/tests/MyGame/InParentNamespace.java
index fd10bc3..20a1ea8 100644
--- a/tests/MyGame/InParentNamespace.java
+++ b/tests/MyGame/InParentNamespace.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class InParentNamespace extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static InParentNamespace getRootAsInParentNamespace(ByteBuffer _bb) { return getRootAsInParentNamespace(_bb, new InParentNamespace()); }
public static InParentNamespace getRootAsInParentNamespace(ByteBuffer _bb, InParentNamespace obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -21,5 +21,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public InParentNamespace get(int j) { return get(new InParentNamespace(), j); }
+ public InParentNamespace get(InParentNamespace obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/InParentNamespace.kt b/tests/MyGame/InParentNamespace.kt
index 76779fc..02f078e 100644
--- a/tests/MyGame/InParentNamespace.kt
+++ b/tests/MyGame/InParentNamespace.kt
@@ -18,7 +18,7 @@
return this
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsInParentNamespace(_bb: ByteBuffer): InParentNamespace = getRootAsInParentNamespace(_bb, InParentNamespace())
fun getRootAsInParentNamespace(_bb: ByteBuffer, obj: InParentNamespace): InParentNamespace {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/MyGame/InParentNamespace.py b/tests/MyGame/InParentNamespace.py
index 3bfcca7..e78ea6a 100644
--- a/tests/MyGame/InParentNamespace.py
+++ b/tests/MyGame/InParentNamespace.py
@@ -3,6 +3,8 @@
# namespace: MyGame
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class InParentNamespace(object):
__slots__ = ['_tab']
@@ -24,3 +26,33 @@
def InParentNamespaceStart(builder): builder.StartObject(0)
def InParentNamespaceEnd(builder): return builder.EndObject()
+
+
+class InParentNamespaceT(object):
+
+ # InParentNamespaceT
+ def __init__(self):
+ pass
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ inParentNamespace = InParentNamespace()
+ inParentNamespace.Init(buf, pos)
+ return cls.InitFromObj(inParentNamespace)
+
+ @classmethod
+ def InitFromObj(cls, inParentNamespace):
+ x = InParentNamespaceT()
+ x._UnPack(inParentNamespace)
+ return x
+
+ # InParentNamespaceT
+ def _UnPack(self, inParentNamespace):
+ if inParentNamespace is None:
+ return
+
+ # InParentNamespaceT
+ def Pack(self, builder):
+ InParentNamespaceStart(builder)
+ inParentNamespace = InParentNamespaceEnd(builder)
+ return inParentNamespace
diff --git a/tests/MyGame/MonsterExtra.cs b/tests/MyGame/MonsterExtra.cs
index 5706390..d74ae8b 100644
--- a/tests/MyGame/MonsterExtra.cs
+++ b/tests/MyGame/MonsterExtra.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct MonsterExtra : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static MonsterExtra GetRootAsMonsterExtra(ByteBuffer _bb) { return GetRootAsMonsterExtra(_bb, new MonsterExtra()); }
public static MonsterExtra GetRootAsMonsterExtra(ByteBuffer _bb, MonsterExtra obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public static bool MonsterExtraBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "MONE"); }
@@ -38,7 +39,7 @@
public double Dvec(int j) { int o = __p.__offset(20); return o != 0 ? __p.bb.GetDouble(__p.__vector(o) + j * 8) : (double)0; }
public int DvecLength { get { int o = __p.__offset(20); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetDvecBytes() { return __p.__vector_as_span(20); }
+ public Span<double> GetDvecBytes() { return __p.__vector_as_span<double>(20, 8); }
#else
public ArraySegment<byte>? GetDvecBytes() { return __p.__vector_as_arraysegment(20); }
#endif
@@ -47,7 +48,7 @@
public float Fvec(int j) { int o = __p.__offset(22); return o != 0 ? __p.bb.GetFloat(__p.__vector(o) + j * 4) : (float)0; }
public int FvecLength { get { int o = __p.__offset(22); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetFvecBytes() { return __p.__vector_as_span(22); }
+ public Span<float> GetFvecBytes() { return __p.__vector_as_span<float>(22, 4); }
#else
public ArraySegment<byte>? GetFvecBytes() { return __p.__vector_as_arraysegment(22); }
#endif
@@ -65,7 +66,7 @@
float f3 = Single.NegativeInfinity,
VectorOffset dvecOffset = default(VectorOffset),
VectorOffset fvecOffset = default(VectorOffset)) {
- builder.StartTable(10);
+ builder.StartTable(11);
MonsterExtra.AddD3(builder, d3);
MonsterExtra.AddD2(builder, d2);
MonsterExtra.AddD1(builder, d1);
@@ -79,7 +80,7 @@
return MonsterExtra.EndMonsterExtra(builder);
}
- public static void StartMonsterExtra(FlatBufferBuilder builder) { builder.StartTable(10); }
+ public static void StartMonsterExtra(FlatBufferBuilder builder) { builder.StartTable(11); }
public static void AddD0(FlatBufferBuilder builder, double d0) { builder.AddDouble(0, d0, Double.NaN); }
public static void AddD1(FlatBufferBuilder builder, double d1) { builder.AddDouble(1, d1, Double.NaN); }
public static void AddD2(FlatBufferBuilder builder, double d2) { builder.AddDouble(2, d2, Double.PositiveInfinity); }
@@ -102,7 +103,103 @@
}
public static void FinishMonsterExtraBuffer(FlatBufferBuilder builder, Offset<MyGame.MonsterExtra> offset) { builder.Finish(offset.Value, "MONE"); }
public static void FinishSizePrefixedMonsterExtraBuffer(FlatBufferBuilder builder, Offset<MyGame.MonsterExtra> offset) { builder.FinishSizePrefixed(offset.Value, "MONE"); }
+ public MonsterExtraT UnPack() {
+ var _o = new MonsterExtraT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(MonsterExtraT _o) {
+ _o.D0 = this.D0;
+ _o.D1 = this.D1;
+ _o.D2 = this.D2;
+ _o.D3 = this.D3;
+ _o.F0 = this.F0;
+ _o.F1 = this.F1;
+ _o.F2 = this.F2;
+ _o.F3 = this.F3;
+ _o.Dvec = new List<double>();
+ for (var _j = 0; _j < this.DvecLength; ++_j) {_o.Dvec.Add(this.Dvec(_j));}
+ _o.Fvec = new List<float>();
+ for (var _j = 0; _j < this.FvecLength; ++_j) {_o.Fvec.Add(this.Fvec(_j));}
+ }
+ public static Offset<MyGame.MonsterExtra> Pack(FlatBufferBuilder builder, MonsterExtraT _o) {
+ if (_o == null) return default(Offset<MyGame.MonsterExtra>);
+ var _dvec = default(VectorOffset);
+ if (_o.Dvec != null) {
+ var __dvec = _o.Dvec.ToArray();
+ _dvec = CreateDvecVector(builder, __dvec);
+ }
+ var _fvec = default(VectorOffset);
+ if (_o.Fvec != null) {
+ var __fvec = _o.Fvec.ToArray();
+ _fvec = CreateFvecVector(builder, __fvec);
+ }
+ return CreateMonsterExtra(
+ builder,
+ _o.D0,
+ _o.D1,
+ _o.D2,
+ _o.D3,
+ _o.F0,
+ _o.F1,
+ _o.F2,
+ _o.F3,
+ _dvec,
+ _fvec);
+ }
};
+public class MonsterExtraT
+{
+ [Newtonsoft.Json.JsonProperty("d0")]
+ public double D0 { get; set; }
+ [Newtonsoft.Json.JsonProperty("d1")]
+ public double D1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("d2")]
+ public double D2 { get; set; }
+ [Newtonsoft.Json.JsonProperty("d3")]
+ public double D3 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f0")]
+ public float F0 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f1")]
+ public float F1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f2")]
+ public float F2 { get; set; }
+ [Newtonsoft.Json.JsonProperty("f3")]
+ public float F3 { get; set; }
+ [Newtonsoft.Json.JsonProperty("dvec")]
+ public List<double> Dvec { get; set; }
+ [Newtonsoft.Json.JsonProperty("fvec")]
+ public List<float> Fvec { get; set; }
+
+ public MonsterExtraT() {
+ this.D0 = Double.NaN;
+ this.D1 = Double.NaN;
+ this.D2 = Double.PositiveInfinity;
+ this.D3 = Double.NegativeInfinity;
+ this.F0 = Single.NaN;
+ this.F1 = Single.NaN;
+ this.F2 = Single.PositiveInfinity;
+ this.F3 = Single.NegativeInfinity;
+ this.Dvec = null;
+ this.Fvec = null;
+ }
+
+ public static MonsterExtraT DeserializeFromJson(string jsonText) {
+ return Newtonsoft.Json.JsonConvert.DeserializeObject<MonsterExtraT>(jsonText);
+ }
+ public string SerializeToJson() {
+ return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+ }
+ public static MonsterExtraT DeserializeFromBinary(byte[] fbBuffer) {
+ return MonsterExtra.GetRootAsMonsterExtra(new ByteBuffer(fbBuffer)).UnPack();
+ }
+ public byte[] SerializeToBinary() {
+ var fbb = new FlatBufferBuilder(0x10000);
+ MonsterExtra.FinishMonsterExtraBuffer(fbb, MonsterExtra.Pack(fbb, this));
+ return fbb.DataBuffer.ToSizedArray();
+ }
+}
+
}
diff --git a/tests/MyGame/MonsterExtra.java b/tests/MyGame/MonsterExtra.java
index 3022596..8a5fe75 100644
--- a/tests/MyGame/MonsterExtra.java
+++ b/tests/MyGame/MonsterExtra.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class MonsterExtra extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static MonsterExtra getRootAsMonsterExtra(ByteBuffer _bb) { return getRootAsMonsterExtra(_bb, new MonsterExtra()); }
public static MonsterExtra getRootAsMonsterExtra(ByteBuffer _bb, MonsterExtra obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public static boolean MonsterExtraBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "MONE"); }
@@ -34,11 +34,15 @@
public boolean mutateF3(float f3) { int o = __offset(18); if (o != 0) { bb.putFloat(o + bb_pos, f3); return true; } else { return false; } }
public double dvec(int j) { int o = __offset(20); return o != 0 ? bb.getDouble(__vector(o) + j * 8) : 0; }
public int dvecLength() { int o = __offset(20); return o != 0 ? __vector_len(o) : 0; }
+ public DoubleVector dvecVector() { return dvecVector(new DoubleVector()); }
+ public DoubleVector dvecVector(DoubleVector obj) { int o = __offset(20); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer dvecAsByteBuffer() { return __vector_as_bytebuffer(20, 8); }
public ByteBuffer dvecInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 20, 8); }
public boolean mutateDvec(int j, double dvec) { int o = __offset(20); if (o != 0) { bb.putDouble(__vector(o) + j * 8, dvec); return true; } else { return false; } }
public float fvec(int j) { int o = __offset(22); return o != 0 ? bb.getFloat(__vector(o) + j * 4) : 0; }
public int fvecLength() { int o = __offset(22); return o != 0 ? __vector_len(o) : 0; }
+ public FloatVector fvecVector() { return fvecVector(new FloatVector()); }
+ public FloatVector fvecVector(FloatVector obj) { int o = __offset(22); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer fvecAsByteBuffer() { return __vector_as_bytebuffer(22, 4); }
public ByteBuffer fvecInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 22, 4); }
public boolean mutateFvec(int j, float fvec) { int o = __offset(22); if (o != 0) { bb.putFloat(__vector(o) + j * 4, fvec); return true; } else { return false; } }
@@ -54,7 +58,7 @@
float f3,
int dvecOffset,
int fvecOffset) {
- builder.startTable(10);
+ builder.startTable(11);
MonsterExtra.addD3(builder, d3);
MonsterExtra.addD2(builder, d2);
MonsterExtra.addD1(builder, d1);
@@ -68,7 +72,7 @@
return MonsterExtra.endMonsterExtra(builder);
}
- public static void startMonsterExtra(FlatBufferBuilder builder) { builder.startTable(10); }
+ public static void startMonsterExtra(FlatBufferBuilder builder) { builder.startTable(11); }
public static void addD0(FlatBufferBuilder builder, double d0) { builder.addDouble(0, d0, Double.NaN); }
public static void addD1(FlatBufferBuilder builder, double d1) { builder.addDouble(1, d1, Double.NaN); }
public static void addD2(FlatBufferBuilder builder, double d2) { builder.addDouble(2, d2, Double.POSITIVE_INFINITY); }
@@ -89,5 +93,12 @@
}
public static void finishMonsterExtraBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, "MONE"); }
public static void finishSizePrefixedMonsterExtraBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, "MONE"); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public MonsterExtra get(int j) { return get(new MonsterExtra(), j); }
+ public MonsterExtra get(MonsterExtra obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/MyGame/MonsterExtra.kt b/tests/MyGame/MonsterExtra.kt
index 96ea731..e025c2f 100644
--- a/tests/MyGame/MonsterExtra.kt
+++ b/tests/MyGame/MonsterExtra.kt
@@ -176,7 +176,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsMonsterExtra(_bb: ByteBuffer): MonsterExtra = getRootAsMonsterExtra(_bb, MonsterExtra())
fun getRootAsMonsterExtra(_bb: ByteBuffer, obj: MonsterExtra): MonsterExtra {
_bb.order(ByteOrder.LITTLE_ENDIAN)
@@ -184,7 +184,7 @@
}
fun MonsterExtraBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "MONE")
fun createMonsterExtra(builder: FlatBufferBuilder, d0: Double, d1: Double, d2: Double, d3: Double, f0: Float, f1: Float, f2: Float, f3: Float, dvecOffset: Int, fvecOffset: Int) : Int {
- builder.startTable(10)
+ builder.startTable(11)
addD3(builder, d3)
addD2(builder, d2)
addD1(builder, d1)
@@ -197,7 +197,7 @@
addF0(builder, f0)
return endMonsterExtra(builder)
}
- fun startMonsterExtra(builder: FlatBufferBuilder) = builder.startTable(10)
+ fun startMonsterExtra(builder: FlatBufferBuilder) = builder.startTable(11)
fun addD0(builder: FlatBufferBuilder, d0: Double) = builder.addDouble(0, d0, Double.NaN)
fun addD1(builder: FlatBufferBuilder, d1: Double) = builder.addDouble(1, d1, Double.NaN)
fun addD2(builder: FlatBufferBuilder, d2: Double) = builder.addDouble(2, d2, Double.POSITIVE_INFINITY)
diff --git a/tests/MyGame/MonsterExtra.py b/tests/MyGame/MonsterExtra.py
index 1f7dcb2..eafea7c 100644
--- a/tests/MyGame/MonsterExtra.py
+++ b/tests/MyGame/MonsterExtra.py
@@ -3,6 +3,8 @@
# namespace: MyGame
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class MonsterExtra(object):
__slots__ = ['_tab']
@@ -101,6 +103,11 @@
return 0
# MonsterExtra
+ def DvecIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20))
+ return o == 0
+
+ # MonsterExtra
def Fvec(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))
if o != 0:
@@ -122,7 +129,12 @@
return self._tab.VectorLen(o)
return 0
-def MonsterExtraStart(builder): builder.StartObject(10)
+ # MonsterExtra
+ def FvecIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22))
+ return o == 0
+
+def MonsterExtraStart(builder): builder.StartObject(11)
def MonsterExtraAddD0(builder, d0): builder.PrependFloat64Slot(0, d0, float('nan'))
def MonsterExtraAddD1(builder, d1): builder.PrependFloat64Slot(1, d1, float('nan'))
def MonsterExtraAddD2(builder, d2): builder.PrependFloat64Slot(2, d2, float('inf'))
@@ -136,3 +148,96 @@
def MonsterExtraAddFvec(builder, fvec): builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(fvec), 0)
def MonsterExtraStartFvecVector(builder, numElems): return builder.StartVector(4, numElems, 4)
def MonsterExtraEnd(builder): return builder.EndObject()
+
+try:
+ from typing import List
+except:
+ pass
+
+class MonsterExtraT(object):
+
+ # MonsterExtraT
+ def __init__(self):
+ self.d0 = float('nan') # type: float
+ self.d1 = float('nan') # type: float
+ self.d2 = float('inf') # type: float
+ self.d3 = float('-inf') # type: float
+ self.f0 = float('nan') # type: float
+ self.f1 = float('nan') # type: float
+ self.f2 = float('inf') # type: float
+ self.f3 = float('-inf') # type: float
+ self.dvec = None # type: List[float]
+ self.fvec = None # type: List[float]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ monsterExtra = MonsterExtra()
+ monsterExtra.Init(buf, pos)
+ return cls.InitFromObj(monsterExtra)
+
+ @classmethod
+ def InitFromObj(cls, monsterExtra):
+ x = MonsterExtraT()
+ x._UnPack(monsterExtra)
+ return x
+
+ # MonsterExtraT
+ def _UnPack(self, monsterExtra):
+ if monsterExtra is None:
+ return
+ self.d0 = monsterExtra.D0()
+ self.d1 = monsterExtra.D1()
+ self.d2 = monsterExtra.D2()
+ self.d3 = monsterExtra.D3()
+ self.f0 = monsterExtra.F0()
+ self.f1 = monsterExtra.F1()
+ self.f2 = monsterExtra.F2()
+ self.f3 = monsterExtra.F3()
+ if not monsterExtra.DvecIsNone():
+ if np is None:
+ self.dvec = []
+ for i in range(monsterExtra.DvecLength()):
+ self.dvec.append(monsterExtra.Dvec(i))
+ else:
+ self.dvec = monsterExtra.DvecAsNumpy()
+ if not monsterExtra.FvecIsNone():
+ if np is None:
+ self.fvec = []
+ for i in range(monsterExtra.FvecLength()):
+ self.fvec.append(monsterExtra.Fvec(i))
+ else:
+ self.fvec = monsterExtra.FvecAsNumpy()
+
+ # MonsterExtraT
+ def Pack(self, builder):
+ if self.dvec is not None:
+ if np is not None and type(self.dvec) is np.ndarray:
+ dvec = builder.CreateNumpyVector(self.dvec)
+ else:
+ MonsterExtraStartDvecVector(builder, len(self.dvec))
+ for i in reversed(range(len(self.dvec))):
+ builder.PrependFloat64(self.dvec[i])
+ dvec = builder.EndVector(len(self.dvec))
+ if self.fvec is not None:
+ if np is not None and type(self.fvec) is np.ndarray:
+ fvec = builder.CreateNumpyVector(self.fvec)
+ else:
+ MonsterExtraStartFvecVector(builder, len(self.fvec))
+ for i in reversed(range(len(self.fvec))):
+ builder.PrependFloat32(self.fvec[i])
+ fvec = builder.EndVector(len(self.fvec))
+ MonsterExtraStart(builder)
+ MonsterExtraAddD0(builder, self.d0)
+ MonsterExtraAddD1(builder, self.d1)
+ MonsterExtraAddD2(builder, self.d2)
+ MonsterExtraAddD3(builder, self.d3)
+ MonsterExtraAddF0(builder, self.f0)
+ MonsterExtraAddF1(builder, self.f1)
+ MonsterExtraAddF2(builder, self.f2)
+ MonsterExtraAddF3(builder, self.f3)
+ if self.dvec is not None:
+ MonsterExtraAddDvec(builder, dvec)
+ if self.fvec is not None:
+ MonsterExtraAddFvec(builder, fvec)
+ monsterExtra = MonsterExtraEnd(builder)
+ return monsterExtra
diff --git a/tests/PythonTest.sh b/tests/PythonTest.sh
index e4dbe8d..ebe49bf 100755
--- a/tests/PythonTest.sh
+++ b/tests/PythonTest.sh
@@ -20,7 +20,7 @@
runtime_library_dir=${test_dir}/../python
# Emit Python code for the example schema in the test dir:
-${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_test.fbs
+${test_dir}/../flatc -p -o ${gen_code_path} -I include_test monster_test.fbs --gen-object-api
# Syntax: run_tests <interpreter> <benchmark vtable dedupes>
# <benchmark read count> <benchmark build count>
@@ -35,6 +35,11 @@
COMPARE_GENERATED_TO_GO=0 \
COMPARE_GENERATED_TO_JAVA=0 \
$1 py_test.py $2 $3 $4
+ if [ $1 = python3 ]; then
+ PYTHONDONTWRITEBYTECODE=1 \
+ PYTHONPATH=${runtime_library_dir}:${gen_code_path} \
+ $1 py_flexbuffers_test.py
+ fi
interpreters_tested+=(${1})
echo
fi
diff --git a/tests/RustTest.bat b/tests/RustTest.bat
index ba9cfd2..1473ffb 100644
--- a/tests/RustTest.bat
+++ b/tests/RustTest.bat
@@ -19,5 +19,7 @@
cd rust_usage_test
cargo test -- --quiet || exit /b 1
-cargo run --bin=alloc_check || exit /b 1
+cargo run --bin=flatbuffers_alloc_check || exit /b 1
+cargo run --bin=flexbuffers_alloc_check || exit /b 1
+cargo run --bin=monster_example || exit /b 1
cd ..
diff --git a/tests/RustTest.sh b/tests/RustTest.sh
index 0a3974b..7a7606b 100755
--- a/tests/RustTest.sh
+++ b/tests/RustTest.sh
@@ -31,7 +31,16 @@
exit 1
fi
-cargo run $TARGET_FLAG --bin=alloc_check
+cargo run $TARGET_FLAG --bin=flatbuffers_alloc_check
+TEST_RESULT=$?
+if [[ $TEST_RESULT == 0 ]]; then
+ echo "OK: Rust heap alloc test passed."
+else
+ echo "KO: Rust heap alloc test failed."
+ exit 1
+fi
+
+cargo run $TARGET_FLAG --bin=flexbuffers_alloc_check
TEST_RESULT=$?
if [[ $TEST_RESULT == 0 ]]; then
echo "OK: Rust heap alloc test passed."
diff --git a/tests/TestAll.sh b/tests/TestAll.sh
old mode 100644
new mode 100755
index 0fc0acd..e20431c3
--- a/tests/TestAll.sh
+++ b/tests/TestAll.sh
@@ -60,4 +60,6 @@
echo "************************ Swift:"
-echo "(in a different repo)"
+cd FlatBuffers.Test.Swift
+sh SwiftTest.sh
+cd ..
\ No newline at end of file
diff --git a/tests/TypeScriptTest.sh b/tests/TypeScriptTest.sh
index fa650a4..f114354 100755
--- a/tests/TypeScriptTest.sh
+++ b/tests/TypeScriptTest.sh
@@ -17,17 +17,19 @@
pushd "$(dirname $0)" >/dev/null
npm install @types/flatbuffers
+npm run pretest
-../flatc --ts --no-fb-import --gen-mutable -o ts -I include_test monster_test.fbs
-../flatc -b -I include_test monster_test.fbs unicode_test.json
+export FB_TS_TEST="TRUE"
+
+../flatc --ts --no-fb-import --gen-name-strings --gen-mutable --gen-object-api -o ts -I include_test monster_test.fbs
+../flatc --gen-object-api -b -I include_test monster_test.fbs unicode_test.json
tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/monster_test_generated.ts
node JavaScriptTest ./ts/monster_test_generated
-../flatc --ts --js --no-fb-import -o ts union_vector/union_vector.fbs
-
-# test JS version first, then transpile and rerun for TS
-node JavaScriptUnionVectorTest ./ts/union_vector_generated
+../flatc --ts --gen-name-strings --no-fb-import --gen-object-api -o ts union_vector/union_vector.fbs
tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/union_vector_generated.ts
node JavaScriptUnionVectorTest ./ts/union_vector_generated
+unset FB_TS_TEST
+
npm uninstall @types/flatbuffers
diff --git a/tests/arrays_test.bfbs b/tests/arrays_test.bfbs
index 2a89968..fe24507 100644
--- a/tests/arrays_test.bfbs
+++ b/tests/arrays_test.bfbs
Binary files differ
diff --git a/tests/arrays_test.fbs b/tests/arrays_test.fbs
index 40bce66..90cb0d7 100644
--- a/tests/arrays_test.fbs
+++ b/tests/arrays_test.fbs
@@ -6,6 +6,7 @@
a:[int:2];
b:TestEnum;
c:[TestEnum:2];
+ d:[int64:2];
}
struct ArrayStruct{
@@ -13,6 +14,8 @@
b:[int:0xF];
c:byte;
d:[NestedStruct:2];
+ e:int32;
+ f:[int64:2];
}
table ArrayTable{
diff --git a/tests/arrays_test.golden b/tests/arrays_test.golden
index c032688..c7037d7 100644
--- a/tests/arrays_test.golden
+++ b/tests/arrays_test.golden
@@ -7,13 +7,17 @@
{
a : [-1,2],
b : A,
- c : [C, B]
+ c : [C, B],
+ d : [0x1122334455667788, -0x1122334455667788]
},
{
a : [3,-4],
b : B,
- c : [B, A]
+ c : [B, A],
+ d : [-0x1122334455667788, 0x1122334455667788]
}
- ]
+ ],
+ e: 1,
+ f: [-0x8000000000000000, 0x7FFFFFFFFFFFFFFF]
}
}
\ No newline at end of file
diff --git a/tests/arrays_test.schema.json b/tests/arrays_test.schema.json
index 6803a1a..3497447 100644
--- a/tests/arrays_test.schema.json
+++ b/tests/arrays_test.schema.json
@@ -1,5 +1,5 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
"definitions": {
"MyGame_Example_TestEnum" : {
"type" : "string",
@@ -9,7 +9,7 @@
"type" : "object",
"properties" : {
"a" : {
- "type" : "array", "items" : { "type" : "number" },
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647},
"minItems": 2,
"maxItems": 2
},
@@ -20,6 +20,11 @@
"$ref" : "#/definitions/MyGame_Example_TestEnum",
"minItems": 2,
"maxItems": 2
+ },
+ "d" : {
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807},
+ "minItems": 2,
+ "maxItems": 2
}
},
"additionalProperties" : false
@@ -31,15 +36,23 @@
"type" : "number"
},
"b" : {
- "type" : "array", "items" : { "type" : "number" },
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647},
"minItems": 15,
"maxItems": 15
},
"c" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -128, "maximum" : 127"
},
"d" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_NestedStruct" },
+ "$ref" : "#/definitions/MyGame_Example_NestedStruct",
+ "minItems": 2,
+ "maxItems": 2
+ },
+ "e" : {
+ "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
+ },
+ "f" : {
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807},
"minItems": 2,
"maxItems": 2
}
diff --git a/tests/arrays_test_generated.h b/tests/arrays_test_generated.h
index 9875785..2f47a9c 100644
--- a/tests/arrays_test_generated.h
+++ b/tests/arrays_test_generated.h
@@ -14,6 +14,7 @@
struct ArrayStruct;
struct ArrayTable;
+struct ArrayTableBuilder;
struct ArrayTableT;
bool operator==(const NestedStruct &lhs, const NestedStruct &rhs);
@@ -57,36 +58,58 @@
}
inline const char *EnumNameTestEnum(TestEnum e) {
- if (e < TestEnum::A || e > TestEnum::C) return "";
+ if (flatbuffers::IsOutRange(e, TestEnum::A, TestEnum::C)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesTestEnum()[index];
}
-FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) NestedStruct FLATBUFFERS_FINAL_CLASS {
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) NestedStruct FLATBUFFERS_FINAL_CLASS {
private:
int32_t a_[2];
int8_t b_;
int8_t c_[2];
- int8_t padding0__;
+ int8_t padding0__; int32_t padding1__;
+ int64_t d_[2];
public:
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return NestedStructTypeTable();
}
- NestedStruct() {
- memset(static_cast<void *>(this), 0, sizeof(NestedStruct));
+ NestedStruct()
+ : a_(),
+ b_(0),
+ c_(),
+ padding0__(0),
+ padding1__(0),
+ d_() {
+ (void)padding0__;
+ (void)padding1__;
}
NestedStruct(MyGame::Example::TestEnum _b)
- : b_(flatbuffers::EndianScalar(static_cast<int8_t>(_b))) {
- std::memset(a_, 0, sizeof(a_));
- std::memset(c_, 0, sizeof(c_));
+ : a_(),
+ b_(flatbuffers::EndianScalar(static_cast<int8_t>(_b))),
+ c_(),
+ padding0__(0),
+ padding1__(0),
+ d_() {
(void)padding0__;
+ (void)padding1__;
+ }
+ NestedStruct(flatbuffers::span<const int32_t, 2> _a, MyGame::Example::TestEnum _b, flatbuffers::span<const MyGame::Example::TestEnum, 2> _c, flatbuffers::span<const int64_t, 2> _d)
+ : b_(flatbuffers::EndianScalar(static_cast<int8_t>(_b))),
+ padding0__(0),
+ padding1__(0) {
+ flatbuffers::CastToArray(a_).CopyFromSpan(_a);
+ flatbuffers::CastToArrayOfEnum<MyGame::Example::TestEnum>(c_).CopyFromSpan(_c);
+ (void)padding0__;
+ (void)padding1__;
+ flatbuffers::CastToArray(d_).CopyFromSpan(_d);
}
const flatbuffers::Array<int32_t, 2> *a() const {
- return reinterpret_cast<const flatbuffers::Array<int32_t, 2> *>(a_);
+ return &flatbuffers::CastToArray(a_);
}
flatbuffers::Array<int32_t, 2> *mutable_a() {
- return reinterpret_cast<flatbuffers::Array<int32_t, 2> *>(a_);
+ return &flatbuffers::CastToArray(a_);
}
MyGame::Example::TestEnum b() const {
return static_cast<MyGame::Example::TestEnum>(flatbuffers::EndianScalar(b_));
@@ -95,19 +118,26 @@
flatbuffers::WriteScalar(&b_, static_cast<int8_t>(_b));
}
const flatbuffers::Array<MyGame::Example::TestEnum, 2> *c() const {
- return reinterpret_cast<const flatbuffers::Array<MyGame::Example::TestEnum, 2> *>(c_);
+ return &flatbuffers::CastToArrayOfEnum<MyGame::Example::TestEnum>(c_);
}
flatbuffers::Array<MyGame::Example::TestEnum, 2> *mutable_c() {
- return reinterpret_cast<flatbuffers::Array<MyGame::Example::TestEnum, 2> *>(c_);
+ return &flatbuffers::CastToArrayOfEnum<MyGame::Example::TestEnum>(c_);
+ }
+ const flatbuffers::Array<int64_t, 2> *d() const {
+ return &flatbuffers::CastToArray(d_);
+ }
+ flatbuffers::Array<int64_t, 2> *mutable_d() {
+ return &flatbuffers::CastToArray(d_);
}
};
-FLATBUFFERS_STRUCT_END(NestedStruct, 12);
+FLATBUFFERS_STRUCT_END(NestedStruct, 32);
inline bool operator==(const NestedStruct &lhs, const NestedStruct &rhs) {
return
(lhs.a() == rhs.a()) &&
(lhs.b() == rhs.b()) &&
- (lhs.c() == rhs.c());
+ (lhs.c() == rhs.c()) &&
+ (lhs.d() == rhs.d());
}
inline bool operator!=(const NestedStruct &lhs, const NestedStruct &rhs) {
@@ -115,29 +145,68 @@
}
-FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) ArrayStruct FLATBUFFERS_FINAL_CLASS {
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) ArrayStruct FLATBUFFERS_FINAL_CLASS {
private:
float a_;
int32_t b_[15];
int8_t c_;
- int8_t padding0__; int16_t padding1__;
+ int8_t padding0__; int16_t padding1__; int32_t padding2__;
MyGame::Example::NestedStruct d_[2];
+ int32_t e_;
+ int32_t padding3__;
+ int64_t f_[2];
public:
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return ArrayStructTypeTable();
}
- ArrayStruct() {
- memset(static_cast<void *>(this), 0, sizeof(ArrayStruct));
+ ArrayStruct()
+ : a_(0),
+ b_(),
+ c_(0),
+ padding0__(0),
+ padding1__(0),
+ padding2__(0),
+ d_(),
+ e_(0),
+ padding3__(0),
+ f_() {
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
+ (void)padding3__;
}
- ArrayStruct(float _a, int8_t _c)
+ ArrayStruct(float _a, int8_t _c, int32_t _e)
+ : a_(flatbuffers::EndianScalar(_a)),
+ b_(),
+ c_(flatbuffers::EndianScalar(_c)),
+ padding0__(0),
+ padding1__(0),
+ padding2__(0),
+ d_(),
+ e_(flatbuffers::EndianScalar(_e)),
+ padding3__(0),
+ f_() {
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
+ (void)padding3__;
+ }
+ ArrayStruct(float _a, flatbuffers::span<const int32_t, 15> _b, int8_t _c, flatbuffers::span<const MyGame::Example::NestedStruct, 2> _d, int32_t _e, flatbuffers::span<const int64_t, 2> _f)
: a_(flatbuffers::EndianScalar(_a)),
c_(flatbuffers::EndianScalar(_c)),
padding0__(0),
- padding1__(0) {
- std::memset(b_, 0, sizeof(b_));
- (void)padding0__; (void)padding1__;
- std::memset(d_, 0, sizeof(d_));
+ padding1__(0),
+ padding2__(0),
+ e_(flatbuffers::EndianScalar(_e)),
+ padding3__(0) {
+ flatbuffers::CastToArray(b_).CopyFromSpan(_b);
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
+ flatbuffers::CastToArray(d_).CopyFromSpan(_d);
+ (void)padding3__;
+ flatbuffers::CastToArray(f_).CopyFromSpan(_f);
}
float a() const {
return flatbuffers::EndianScalar(a_);
@@ -146,10 +215,10 @@
flatbuffers::WriteScalar(&a_, _a);
}
const flatbuffers::Array<int32_t, 15> *b() const {
- return reinterpret_cast<const flatbuffers::Array<int32_t, 15> *>(b_);
+ return &flatbuffers::CastToArray(b_);
}
flatbuffers::Array<int32_t, 15> *mutable_b() {
- return reinterpret_cast<flatbuffers::Array<int32_t, 15> *>(b_);
+ return &flatbuffers::CastToArray(b_);
}
int8_t c() const {
return flatbuffers::EndianScalar(c_);
@@ -158,20 +227,34 @@
flatbuffers::WriteScalar(&c_, _c);
}
const flatbuffers::Array<MyGame::Example::NestedStruct, 2> *d() const {
- return reinterpret_cast<const flatbuffers::Array<MyGame::Example::NestedStruct, 2> *>(d_);
+ return &flatbuffers::CastToArray(d_);
}
flatbuffers::Array<MyGame::Example::NestedStruct, 2> *mutable_d() {
- return reinterpret_cast<flatbuffers::Array<MyGame::Example::NestedStruct, 2> *>(d_);
+ return &flatbuffers::CastToArray(d_);
+ }
+ int32_t e() const {
+ return flatbuffers::EndianScalar(e_);
+ }
+ void mutate_e(int32_t _e) {
+ flatbuffers::WriteScalar(&e_, _e);
+ }
+ const flatbuffers::Array<int64_t, 2> *f() const {
+ return &flatbuffers::CastToArray(f_);
+ }
+ flatbuffers::Array<int64_t, 2> *mutable_f() {
+ return &flatbuffers::CastToArray(f_);
}
};
-FLATBUFFERS_STRUCT_END(ArrayStruct, 92);
+FLATBUFFERS_STRUCT_END(ArrayStruct, 160);
inline bool operator==(const ArrayStruct &lhs, const ArrayStruct &rhs) {
return
(lhs.a() == rhs.a()) &&
(lhs.b() == rhs.b()) &&
(lhs.c() == rhs.c()) &&
- (lhs.d() == rhs.d());
+ (lhs.d() == rhs.d()) &&
+ (lhs.e() == rhs.e()) &&
+ (lhs.f() == rhs.f());
}
inline bool operator!=(const ArrayStruct &lhs, const ArrayStruct &rhs) {
@@ -198,6 +281,7 @@
struct ArrayTable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef ArrayTableT NativeTableType;
+ typedef ArrayTableBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return ArrayTableTypeTable();
}
@@ -221,6 +305,7 @@
};
struct ArrayTableBuilder {
+ typedef ArrayTable Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_a(const MyGame::Example::ArrayStruct *a) {
@@ -230,7 +315,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- ArrayTableBuilder &operator=(const ArrayTableBuilder &);
flatbuffers::Offset<ArrayTable> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<ArrayTable>(end);
@@ -249,15 +333,15 @@
flatbuffers::Offset<ArrayTable> CreateArrayTable(flatbuffers::FlatBufferBuilder &_fbb, const ArrayTableT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline ArrayTableT *ArrayTable::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new ArrayTableT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::ArrayTableT> _o = flatbuffers::unique_ptr<MyGame::Example::ArrayTableT>(new ArrayTableT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void ArrayTable::UnPackTo(ArrayTableT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = a(); if (_e) _o->a = flatbuffers::unique_ptr<MyGame::Example::ArrayStruct>(new MyGame::Example::ArrayStruct(*_e)); };
+ { auto _e = a(); if (_e) _o->a = flatbuffers::unique_ptr<MyGame::Example::ArrayStruct>(new MyGame::Example::ArrayStruct(*_e)); }
}
inline flatbuffers::Offset<ArrayTable> ArrayTable::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArrayTableT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -289,43 +373,23 @@
"C"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
inline const flatbuffers::TypeTable *NestedStructTypeTable() {
static const flatbuffers::TypeCode type_codes[] = {
- { flatbuffers::ET_SEQUENCE, 0, -1 },
+ { flatbuffers::ET_INT, 1, -1 },
{ flatbuffers::ET_CHAR, 0, 0 },
- { flatbuffers::ET_SEQUENCE, 0, 0 }
+ { flatbuffers::ET_CHAR, 1, 0 },
+ { flatbuffers::ET_LONG, 1, -1 }
};
static const flatbuffers::TypeFunction type_refs[] = {
MyGame::Example::TestEnumTypeTable
};
- static const int64_t values[] = { 0, 8, 9, 12 };
- static const char * const names[] = {
- "a",
- "b",
- "c"
- };
- static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 3, type_codes, type_refs, values, names
- };
- return &tt;
-}
-
-inline const flatbuffers::TypeTable *ArrayStructTypeTable() {
- static const flatbuffers::TypeCode type_codes[] = {
- { flatbuffers::ET_FLOAT, 0, -1 },
- { flatbuffers::ET_SEQUENCE, 0, -1 },
- { flatbuffers::ET_CHAR, 0, -1 },
- { flatbuffers::ET_SEQUENCE, 0, 0 }
- };
- static const flatbuffers::TypeFunction type_refs[] = {
- MyGame::Example::NestedStructTypeTable
- };
- static const int64_t values[] = { 0, 4, 64, 68, 92 };
+ static const int16_t array_sizes[] = { 2, 2, 2, };
+ static const int64_t values[] = { 0, 8, 9, 16, 32 };
static const char * const names[] = {
"a",
"b",
@@ -333,7 +397,35 @@
"d"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 4, type_codes, type_refs, values, names
+ flatbuffers::ST_STRUCT, 4, type_codes, type_refs, array_sizes, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *ArrayStructTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_INT, 1, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_SEQUENCE, 1, 0 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_LONG, 1, -1 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::NestedStructTypeTable
+ };
+ static const int16_t array_sizes[] = { 15, 2, 2, };
+ static const int64_t values[] = { 0, 4, 64, 72, 136, 144, 160 };
+ static const char * const names[] = {
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_STRUCT, 6, type_codes, type_refs, array_sizes, values, names
};
return &tt;
}
@@ -349,7 +441,7 @@
"a"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
diff --git a/tests/cpp17/generated_cpp17/monster_test_generated.h b/tests/cpp17/generated_cpp17/monster_test_generated.h
new file mode 100644
index 0000000..77bc011
--- /dev/null
+++ b/tests/cpp17/generated_cpp17/monster_test_generated.h
@@ -0,0 +1,3346 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
+#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
+
+#include "flatbuffers/flatbuffers.h"
+#include "flatbuffers/flexbuffers.h"
+
+namespace MyGame {
+
+struct InParentNamespace;
+struct InParentNamespaceBuilder;
+struct InParentNamespaceT;
+
+namespace Example2 {
+
+struct Monster;
+struct MonsterBuilder;
+struct MonsterT;
+
+} // namespace Example2
+
+namespace Example {
+
+struct Test;
+
+struct TestSimpleTableWithEnum;
+struct TestSimpleTableWithEnumBuilder;
+struct TestSimpleTableWithEnumT;
+
+struct Vec3;
+
+struct Ability;
+
+struct Stat;
+struct StatBuilder;
+struct StatT;
+
+struct Referrable;
+struct ReferrableBuilder;
+struct ReferrableT;
+
+struct Monster;
+struct MonsterBuilder;
+struct MonsterT;
+
+struct TypeAliases;
+struct TypeAliasesBuilder;
+struct TypeAliasesT;
+
+} // namespace Example
+
+inline const flatbuffers::TypeTable *InParentNamespaceTypeTable();
+
+namespace Example2 {
+
+inline const flatbuffers::TypeTable *MonsterTypeTable();
+
+} // namespace Example2
+
+namespace Example {
+
+inline const flatbuffers::TypeTable *TestTypeTable();
+
+inline const flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable();
+
+inline const flatbuffers::TypeTable *Vec3TypeTable();
+
+inline const flatbuffers::TypeTable *AbilityTypeTable();
+
+inline const flatbuffers::TypeTable *StatTypeTable();
+
+inline const flatbuffers::TypeTable *ReferrableTypeTable();
+
+inline const flatbuffers::TypeTable *MonsterTypeTable();
+
+inline const flatbuffers::TypeTable *TypeAliasesTypeTable();
+
+/// Composite components of Monster color.
+enum class Color : uint8_t {
+ Red = 1,
+ /// \brief color Green
+ /// Green is bit_flag with value (1u << 1)
+ Green = 2,
+ /// \brief color Blue (1u << 3)
+ Blue = 8,
+ NONE = 0,
+ ANY = 11
+};
+FLATBUFFERS_DEFINE_BITMASK_OPERATORS(Color, uint8_t)
+
+inline const Color (&EnumValuesColor())[3] {
+ static const Color values[] = {
+ Color::Red,
+ Color::Green,
+ Color::Blue
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesColor() {
+ static const char * const names[9] = {
+ "Red",
+ "Green",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Blue",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameColor(Color e) {
+ if (flatbuffers::IsOutRange(e, Color::Red, Color::Blue)) return "";
+ const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color::Red);
+ return EnumNamesColor()[index];
+}
+
+enum class Race : int8_t {
+ None = -1,
+ Human = 0,
+ Dwarf = 1,
+ Elf = 2,
+ MIN = None,
+ MAX = Elf
+};
+
+inline const Race (&EnumValuesRace())[4] {
+ static const Race values[] = {
+ Race::None,
+ Race::Human,
+ Race::Dwarf,
+ Race::Elf
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesRace() {
+ static const char * const names[5] = {
+ "None",
+ "Human",
+ "Dwarf",
+ "Elf",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameRace(Race e) {
+ if (flatbuffers::IsOutRange(e, Race::None, Race::Elf)) return "";
+ const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race::None);
+ return EnumNamesRace()[index];
+}
+
+enum class Any : uint8_t {
+ NONE = 0,
+ Monster = 1,
+ TestSimpleTableWithEnum = 2,
+ MyGame_Example2_Monster = 3,
+ MIN = NONE,
+ MAX = MyGame_Example2_Monster
+};
+
+inline const Any (&EnumValuesAny())[4] {
+ static const Any values[] = {
+ Any::NONE,
+ Any::Monster,
+ Any::TestSimpleTableWithEnum,
+ Any::MyGame_Example2_Monster
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesAny() {
+ static const char * const names[5] = {
+ "NONE",
+ "Monster",
+ "TestSimpleTableWithEnum",
+ "MyGame_Example2_Monster",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameAny(Any e) {
+ if (flatbuffers::IsOutRange(e, Any::NONE, Any::MyGame_Example2_Monster)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesAny()[index];
+}
+
+template<typename T> struct AnyTraits {
+ static const Any enum_value = Any::NONE;
+};
+
+template<> struct AnyTraits<MyGame::Example::Monster> {
+ static const Any enum_value = Any::Monster;
+};
+
+template<> struct AnyTraits<MyGame::Example::TestSimpleTableWithEnum> {
+ static const Any enum_value = Any::TestSimpleTableWithEnum;
+};
+
+template<> struct AnyTraits<MyGame::Example2::Monster> {
+ static const Any enum_value = Any::MyGame_Example2_Monster;
+};
+
+struct AnyUnion {
+ Any type;
+ void *value;
+
+ AnyUnion() : type(Any::NONE), value(nullptr) {}
+ AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :
+ type(Any::NONE), value(nullptr)
+ { std::swap(type, u.type); std::swap(value, u.value); }
+ AnyUnion(const AnyUnion &);
+ AnyUnion &operator=(const AnyUnion &u)
+ { AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
+ AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT
+ { std::swap(type, u.type); std::swap(value, u.value); return *this; }
+ ~AnyUnion() { Reset(); }
+
+ void Reset();
+
+#ifndef FLATBUFFERS_CPP98_STL
+ template <typename T>
+ void Set(T&& val) {
+ using RT = typename std::remove_reference<T>::type;
+ Reset();
+ type = AnyTraits<typename RT::TableType>::enum_value;
+ if (type != Any::NONE) {
+ value = new RT(std::forward<T>(val));
+ }
+ }
+#endif // FLATBUFFERS_CPP98_STL
+
+ static void *UnPack(const void *obj, Any type, const flatbuffers::resolver_function_t *resolver);
+ flatbuffers::Offset<void> Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const;
+
+ MyGame::Example::MonsterT *AsMonster() {
+ return type == Any::Monster ?
+ reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example::MonsterT *AsMonster() const {
+ return type == Any::Monster ?
+ reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() {
+ return type == Any::TestSimpleTableWithEnum ?
+ reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
+ }
+ const MyGame::Example::TestSimpleTableWithEnumT *AsTestSimpleTableWithEnum() const {
+ return type == Any::TestSimpleTableWithEnum ?
+ reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
+ }
+ MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() {
+ return type == Any::MyGame_Example2_Monster ?
+ reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example2::MonsterT *AsMyGame_Example2_Monster() const {
+ return type == Any::MyGame_Example2_Monster ?
+ reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;
+ }
+};
+
+bool VerifyAny(flatbuffers::Verifier &verifier, const void *obj, Any type);
+bool VerifyAnyVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+enum class AnyUniqueAliases : uint8_t {
+ NONE = 0,
+ M = 1,
+ TS = 2,
+ M2 = 3,
+ MIN = NONE,
+ MAX = M2
+};
+
+inline const AnyUniqueAliases (&EnumValuesAnyUniqueAliases())[4] {
+ static const AnyUniqueAliases values[] = {
+ AnyUniqueAliases::NONE,
+ AnyUniqueAliases::M,
+ AnyUniqueAliases::TS,
+ AnyUniqueAliases::M2
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesAnyUniqueAliases() {
+ static const char * const names[5] = {
+ "NONE",
+ "M",
+ "TS",
+ "M2",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {
+ if (flatbuffers::IsOutRange(e, AnyUniqueAliases::NONE, AnyUniqueAliases::M2)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesAnyUniqueAliases()[index];
+}
+
+template<typename T> struct AnyUniqueAliasesTraits {
+ static const AnyUniqueAliases enum_value = AnyUniqueAliases::NONE;
+};
+
+template<> struct AnyUniqueAliasesTraits<MyGame::Example::Monster> {
+ static const AnyUniqueAliases enum_value = AnyUniqueAliases::M;
+};
+
+template<> struct AnyUniqueAliasesTraits<MyGame::Example::TestSimpleTableWithEnum> {
+ static const AnyUniqueAliases enum_value = AnyUniqueAliases::TS;
+};
+
+template<> struct AnyUniqueAliasesTraits<MyGame::Example2::Monster> {
+ static const AnyUniqueAliases enum_value = AnyUniqueAliases::M2;
+};
+
+struct AnyUniqueAliasesUnion {
+ AnyUniqueAliases type;
+ void *value;
+
+ AnyUniqueAliasesUnion() : type(AnyUniqueAliases::NONE), value(nullptr) {}
+ AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
+ type(AnyUniqueAliases::NONE), value(nullptr)
+ { std::swap(type, u.type); std::swap(value, u.value); }
+ AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);
+ AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)
+ { AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
+ AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
+ { std::swap(type, u.type); std::swap(value, u.value); return *this; }
+ ~AnyUniqueAliasesUnion() { Reset(); }
+
+ void Reset();
+
+#ifndef FLATBUFFERS_CPP98_STL
+ template <typename T>
+ void Set(T&& val) {
+ using RT = typename std::remove_reference<T>::type;
+ Reset();
+ type = AnyUniqueAliasesTraits<typename RT::TableType>::enum_value;
+ if (type != AnyUniqueAliases::NONE) {
+ value = new RT(std::forward<T>(val));
+ }
+ }
+#endif // FLATBUFFERS_CPP98_STL
+
+ static void *UnPack(const void *obj, AnyUniqueAliases type, const flatbuffers::resolver_function_t *resolver);
+ flatbuffers::Offset<void> Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const;
+
+ MyGame::Example::MonsterT *AsM() {
+ return type == AnyUniqueAliases::M ?
+ reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example::MonsterT *AsM() const {
+ return type == AnyUniqueAliases::M ?
+ reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ MyGame::Example::TestSimpleTableWithEnumT *AsTS() {
+ return type == AnyUniqueAliases::TS ?
+ reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
+ }
+ const MyGame::Example::TestSimpleTableWithEnumT *AsTS() const {
+ return type == AnyUniqueAliases::TS ?
+ reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value) : nullptr;
+ }
+ MyGame::Example2::MonsterT *AsM2() {
+ return type == AnyUniqueAliases::M2 ?
+ reinterpret_cast<MyGame::Example2::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example2::MonsterT *AsM2() const {
+ return type == AnyUniqueAliases::M2 ?
+ reinterpret_cast<const MyGame::Example2::MonsterT *>(value) : nullptr;
+ }
+};
+
+bool VerifyAnyUniqueAliases(flatbuffers::Verifier &verifier, const void *obj, AnyUniqueAliases type);
+bool VerifyAnyUniqueAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+enum class AnyAmbiguousAliases : uint8_t {
+ NONE = 0,
+ M1 = 1,
+ M2 = 2,
+ M3 = 3,
+ MIN = NONE,
+ MAX = M3
+};
+
+inline const AnyAmbiguousAliases (&EnumValuesAnyAmbiguousAliases())[4] {
+ static const AnyAmbiguousAliases values[] = {
+ AnyAmbiguousAliases::NONE,
+ AnyAmbiguousAliases::M1,
+ AnyAmbiguousAliases::M2,
+ AnyAmbiguousAliases::M3
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesAnyAmbiguousAliases() {
+ static const char * const names[5] = {
+ "NONE",
+ "M1",
+ "M2",
+ "M3",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {
+ if (flatbuffers::IsOutRange(e, AnyAmbiguousAliases::NONE, AnyAmbiguousAliases::M3)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesAnyAmbiguousAliases()[index];
+}
+
+struct AnyAmbiguousAliasesUnion {
+ AnyAmbiguousAliases type;
+ void *value;
+
+ AnyAmbiguousAliasesUnion() : type(AnyAmbiguousAliases::NONE), value(nullptr) {}
+ AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
+ type(AnyAmbiguousAliases::NONE), value(nullptr)
+ { std::swap(type, u.type); std::swap(value, u.value); }
+ AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);
+ AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)
+ { AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
+ AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
+ { std::swap(type, u.type); std::swap(value, u.value); return *this; }
+ ~AnyAmbiguousAliasesUnion() { Reset(); }
+
+ void Reset();
+
+ static void *UnPack(const void *obj, AnyAmbiguousAliases type, const flatbuffers::resolver_function_t *resolver);
+ flatbuffers::Offset<void> Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const;
+
+ MyGame::Example::MonsterT *AsM1() {
+ return type == AnyAmbiguousAliases::M1 ?
+ reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example::MonsterT *AsM1() const {
+ return type == AnyAmbiguousAliases::M1 ?
+ reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ MyGame::Example::MonsterT *AsM2() {
+ return type == AnyAmbiguousAliases::M2 ?
+ reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example::MonsterT *AsM2() const {
+ return type == AnyAmbiguousAliases::M2 ?
+ reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ MyGame::Example::MonsterT *AsM3() {
+ return type == AnyAmbiguousAliases::M3 ?
+ reinterpret_cast<MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+ const MyGame::Example::MonsterT *AsM3() const {
+ return type == AnyAmbiguousAliases::M3 ?
+ reinterpret_cast<const MyGame::Example::MonsterT *>(value) : nullptr;
+ }
+};
+
+bool VerifyAnyAmbiguousAliases(flatbuffers::Verifier &verifier, const void *obj, AnyAmbiguousAliases type);
+bool VerifyAnyAmbiguousAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(2) Test FLATBUFFERS_FINAL_CLASS {
+ private:
+ int16_t a_;
+ int8_t b_;
+ int8_t padding0__;
+
+ public:
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return TestTypeTable();
+ }
+ Test()
+ : a_(0),
+ b_(0),
+ padding0__(0) {
+ (void)padding0__;
+ }
+ Test(int16_t _a, int8_t _b)
+ : a_(flatbuffers::EndianScalar(_a)),
+ b_(flatbuffers::EndianScalar(_b)),
+ padding0__(0) {
+ (void)padding0__;
+ }
+ int16_t a() const {
+ return flatbuffers::EndianScalar(a_);
+ }
+ void mutate_a(int16_t _a) {
+ flatbuffers::WriteScalar(&a_, _a);
+ }
+ int8_t b() const {
+ return flatbuffers::EndianScalar(b_);
+ }
+ void mutate_b(int8_t _b) {
+ flatbuffers::WriteScalar(&b_, _b);
+ }
+};
+FLATBUFFERS_STRUCT_END(Test, 4);
+
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Vec3 FLATBUFFERS_FINAL_CLASS {
+ private:
+ float x_;
+ float y_;
+ float z_;
+ int32_t padding0__;
+ double test1_;
+ uint8_t test2_;
+ int8_t padding1__;
+ MyGame::Example::Test test3_;
+ int16_t padding2__;
+
+ public:
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return Vec3TypeTable();
+ }
+ Vec3()
+ : x_(0),
+ y_(0),
+ z_(0),
+ padding0__(0),
+ test1_(0),
+ test2_(0),
+ padding1__(0),
+ test3_(),
+ padding2__(0) {
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
+ }
+ Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)
+ : x_(flatbuffers::EndianScalar(_x)),
+ y_(flatbuffers::EndianScalar(_y)),
+ z_(flatbuffers::EndianScalar(_z)),
+ padding0__(0),
+ test1_(flatbuffers::EndianScalar(_test1)),
+ test2_(flatbuffers::EndianScalar(static_cast<uint8_t>(_test2))),
+ padding1__(0),
+ test3_(_test3),
+ padding2__(0) {
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
+ }
+ float x() const {
+ return flatbuffers::EndianScalar(x_);
+ }
+ void mutate_x(float _x) {
+ flatbuffers::WriteScalar(&x_, _x);
+ }
+ float y() const {
+ return flatbuffers::EndianScalar(y_);
+ }
+ void mutate_y(float _y) {
+ flatbuffers::WriteScalar(&y_, _y);
+ }
+ float z() const {
+ return flatbuffers::EndianScalar(z_);
+ }
+ void mutate_z(float _z) {
+ flatbuffers::WriteScalar(&z_, _z);
+ }
+ double test1() const {
+ return flatbuffers::EndianScalar(test1_);
+ }
+ void mutate_test1(double _test1) {
+ flatbuffers::WriteScalar(&test1_, _test1);
+ }
+ MyGame::Example::Color test2() const {
+ return static_cast<MyGame::Example::Color>(flatbuffers::EndianScalar(test2_));
+ }
+ void mutate_test2(MyGame::Example::Color _test2) {
+ flatbuffers::WriteScalar(&test2_, static_cast<uint8_t>(_test2));
+ }
+ const MyGame::Example::Test &test3() const {
+ return test3_;
+ }
+ MyGame::Example::Test &mutable_test3() {
+ return test3_;
+ }
+};
+FLATBUFFERS_STRUCT_END(Vec3, 32);
+
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Ability FLATBUFFERS_FINAL_CLASS {
+ private:
+ uint32_t id_;
+ uint32_t distance_;
+
+ public:
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return AbilityTypeTable();
+ }
+ Ability()
+ : id_(0),
+ distance_(0) {
+ }
+ Ability(uint32_t _id, uint32_t _distance)
+ : id_(flatbuffers::EndianScalar(_id)),
+ distance_(flatbuffers::EndianScalar(_distance)) {
+ }
+ uint32_t id() const {
+ return flatbuffers::EndianScalar(id_);
+ }
+ void mutate_id(uint32_t _id) {
+ flatbuffers::WriteScalar(&id_, _id);
+ }
+ bool KeyCompareLessThan(const Ability *o) const {
+ return id() < o->id();
+ }
+ int KeyCompareWithValue(uint32_t val) const {
+ return static_cast<int>(id() > val) - static_cast<int>(id() < val);
+ }
+ uint32_t distance() const {
+ return flatbuffers::EndianScalar(distance_);
+ }
+ void mutate_distance(uint32_t _distance) {
+ flatbuffers::WriteScalar(&distance_, _distance);
+ }
+};
+FLATBUFFERS_STRUCT_END(Ability, 8);
+
+} // namespace Example
+
+struct InParentNamespaceT : public flatbuffers::NativeTable {
+ typedef InParentNamespace TableType;
+};
+
+struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef InParentNamespaceT NativeTableType;
+ typedef InParentNamespaceBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return InParentNamespaceTypeTable();
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ verifier.EndTable();
+ }
+ InParentNamespaceT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(InParentNamespaceT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<InParentNamespace> Pack(flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct InParentNamespaceBuilder {
+ typedef InParentNamespace Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ explicit InParentNamespaceBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<InParentNamespace> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<InParentNamespace>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(
+ flatbuffers::FlatBufferBuilder &_fbb) {
+ InParentNamespaceBuilder builder_(_fbb);
+ return builder_.Finish();
+}
+
+struct InParentNamespace::Traits {
+ using type = InParentNamespace;
+ static auto constexpr Create = CreateInParentNamespace;
+};
+
+flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+namespace Example2 {
+
+struct MonsterT : public flatbuffers::NativeTable {
+ typedef Monster TableType;
+};
+
+struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef MonsterT NativeTableType;
+ typedef MonsterBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return MonsterTypeTable();
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ verifier.EndTable();
+ }
+ MonsterT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<Monster> Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct MonsterBuilder {
+ typedef Monster Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<Monster> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<Monster>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Monster> CreateMonster(
+ flatbuffers::FlatBufferBuilder &_fbb) {
+ MonsterBuilder builder_(_fbb);
+ return builder_.Finish();
+}
+
+struct Monster::Traits {
+ using type = Monster;
+ static auto constexpr Create = CreateMonster;
+};
+
+flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+} // namespace Example2
+
+namespace Example {
+
+struct TestSimpleTableWithEnumT : public flatbuffers::NativeTable {
+ typedef TestSimpleTableWithEnum TableType;
+ MyGame::Example::Color color = MyGame::Example::Color::Green;
+};
+
+struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TestSimpleTableWithEnumT NativeTableType;
+ typedef TestSimpleTableWithEnumBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return TestSimpleTableWithEnumTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_COLOR = 4
+ };
+ MyGame::Example::Color color() const {
+ return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 2));
+ }
+ bool mutate_color(MyGame::Example::Color _color) {
+ return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 2);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<uint8_t>(verifier, VT_COLOR) &&
+ verifier.EndTable();
+ }
+ TestSimpleTableWithEnumT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(TestSimpleTableWithEnumT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<TestSimpleTableWithEnum> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct TestSimpleTableWithEnumBuilder {
+ typedef TestSimpleTableWithEnum Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_color(MyGame::Example::Color color) {
+ fbb_.AddElement<uint8_t>(TestSimpleTableWithEnum::VT_COLOR, static_cast<uint8_t>(color), 2);
+ }
+ explicit TestSimpleTableWithEnumBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TestSimpleTableWithEnum>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ MyGame::Example::Color color = MyGame::Example::Color::Green) {
+ TestSimpleTableWithEnumBuilder builder_(_fbb);
+ builder_.add_color(color);
+ return builder_.Finish();
+}
+
+struct TestSimpleTableWithEnum::Traits {
+ using type = TestSimpleTableWithEnum;
+ static auto constexpr Create = CreateTestSimpleTableWithEnum;
+};
+
+flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+struct StatT : public flatbuffers::NativeTable {
+ typedef Stat TableType;
+ std::string id{};
+ int64_t val = 0;
+ uint16_t count = 0;
+};
+
+struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef StatT NativeTableType;
+ typedef StatBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return StatTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_ID = 4,
+ VT_VAL = 6,
+ VT_COUNT = 8
+ };
+ const flatbuffers::String *id() const {
+ return GetPointer<const flatbuffers::String *>(VT_ID);
+ }
+ flatbuffers::String *mutable_id() {
+ return GetPointer<flatbuffers::String *>(VT_ID);
+ }
+ int64_t val() const {
+ return GetField<int64_t>(VT_VAL, 0);
+ }
+ bool mutate_val(int64_t _val) {
+ return SetField<int64_t>(VT_VAL, _val, 0);
+ }
+ uint16_t count() const {
+ return GetField<uint16_t>(VT_COUNT, 0);
+ }
+ bool mutate_count(uint16_t _count) {
+ return SetField<uint16_t>(VT_COUNT, _count, 0);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyOffset(verifier, VT_ID) &&
+ verifier.VerifyString(id()) &&
+ VerifyField<int64_t>(verifier, VT_VAL) &&
+ VerifyField<uint16_t>(verifier, VT_COUNT) &&
+ verifier.EndTable();
+ }
+ StatT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(StatT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<Stat> Pack(flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct StatBuilder {
+ typedef Stat Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_id(flatbuffers::Offset<flatbuffers::String> id) {
+ fbb_.AddOffset(Stat::VT_ID, id);
+ }
+ void add_val(int64_t val) {
+ fbb_.AddElement<int64_t>(Stat::VT_VAL, val, 0);
+ }
+ void add_count(uint16_t count) {
+ fbb_.AddElement<uint16_t>(Stat::VT_COUNT, count, 0);
+ }
+ explicit StatBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<Stat> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<Stat>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Stat> CreateStat(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ flatbuffers::Offset<flatbuffers::String> id = 0,
+ int64_t val = 0,
+ uint16_t count = 0) {
+ StatBuilder builder_(_fbb);
+ builder_.add_val(val);
+ builder_.add_id(id);
+ builder_.add_count(count);
+ return builder_.Finish();
+}
+
+struct Stat::Traits {
+ using type = Stat;
+ static auto constexpr Create = CreateStat;
+};
+
+inline flatbuffers::Offset<Stat> CreateStatDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ const char *id = nullptr,
+ int64_t val = 0,
+ uint16_t count = 0) {
+ auto id__ = id ? _fbb.CreateString(id) : 0;
+ return MyGame::Example::CreateStat(
+ _fbb,
+ id__,
+ val,
+ count);
+}
+
+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 = 0;
+};
+
+struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef ReferrableT NativeTableType;
+ typedef ReferrableBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return ReferrableTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ 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 {
+ return static_cast<int>(id() > val) - static_cast<int>(id() < val);
+ }
+ 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 {
+ typedef Referrable Table;
+ 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();
+ }
+ 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();
+}
+
+struct Referrable::Traits {
+ using type = Referrable;
+ static auto constexpr Create = CreateReferrable;
+};
+
+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;
+ std::unique_ptr<MyGame::Example::Vec3> pos{};
+ int16_t mana = 150;
+ int16_t hp = 100;
+ std::string name{};
+ std::vector<uint8_t> inventory{};
+ MyGame::Example::Color color = MyGame::Example::Color::Blue;
+ MyGame::Example::AnyUnion test{};
+ std::vector<MyGame::Example::Test> test4{};
+ std::vector<std::string> testarrayofstring{};
+ std::vector<std::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables{};
+ std::unique_ptr<MyGame::Example::MonsterT> enemy{};
+ std::vector<uint8_t> testnestedflatbuffer{};
+ std::unique_ptr<MyGame::Example::StatT> testempty{};
+ bool testbool = false;
+ int32_t testhashs32_fnv1 = 0;
+ uint32_t testhashu32_fnv1 = 0;
+ int64_t testhashs64_fnv1 = 0;
+ uint64_t testhashu64_fnv1 = 0;
+ int32_t testhashs32_fnv1a = 0;
+ Stat *testhashu32_fnv1a = nullptr;
+ int64_t testhashs64_fnv1a = 0;
+ uint64_t testhashu64_fnv1a = 0;
+ std::vector<bool> testarrayofbools{};
+ float testf = 3.14159f;
+ float testf2 = 3.0f;
+ float testf3 = 0.0f;
+ std::vector<std::string> testarrayofstring2{};
+ std::vector<MyGame::Example::Ability> testarrayofsortedstruct{};
+ std::vector<uint8_t> flex{};
+ std::vector<MyGame::Example::Test> test5{};
+ std::vector<int64_t> vector_of_longs{};
+ std::vector<double> vector_of_doubles{};
+ std::unique_ptr<MyGame::InParentNamespaceT> parent_namespace_test{};
+ std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_referrables{};
+ ReferrableT *single_weak_reference = nullptr;
+ std::vector<ReferrableT *> vector_of_weak_references{};
+ std::vector<std::unique_ptr<MyGame::Example::ReferrableT>> vector_of_strong_referrables{};
+ ReferrableT *co_owning_reference = nullptr;
+ std::vector<std::unique_ptr<ReferrableT>> vector_of_co_owning_references{};
+ ReferrableT *non_owning_reference = nullptr;
+ std::vector<ReferrableT *> vector_of_non_owning_references{};
+ MyGame::Example::AnyUniqueAliasesUnion any_unique{};
+ MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous{};
+ std::vector<MyGame::Example::Color> vector_of_enums{};
+ MyGame::Example::Race signed_enum = MyGame::Example::Race::None;
+ std::vector<uint8_t> testrequirednestedflatbuffer{};
+};
+
+/// an example documentation comment: "monster object"
+struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef MonsterT NativeTableType;
+ typedef MonsterBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return MonsterTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_POS = 4,
+ VT_MANA = 6,
+ VT_HP = 8,
+ VT_NAME = 10,
+ VT_INVENTORY = 14,
+ VT_COLOR = 16,
+ VT_TEST_TYPE = 18,
+ VT_TEST = 20,
+ VT_TEST4 = 22,
+ VT_TESTARRAYOFSTRING = 24,
+ VT_TESTARRAYOFTABLES = 26,
+ VT_ENEMY = 28,
+ VT_TESTNESTEDFLATBUFFER = 30,
+ VT_TESTEMPTY = 32,
+ VT_TESTBOOL = 34,
+ VT_TESTHASHS32_FNV1 = 36,
+ VT_TESTHASHU32_FNV1 = 38,
+ VT_TESTHASHS64_FNV1 = 40,
+ VT_TESTHASHU64_FNV1 = 42,
+ VT_TESTHASHS32_FNV1A = 44,
+ VT_TESTHASHU32_FNV1A = 46,
+ VT_TESTHASHS64_FNV1A = 48,
+ VT_TESTHASHU64_FNV1A = 50,
+ VT_TESTARRAYOFBOOLS = 52,
+ VT_TESTF = 54,
+ VT_TESTF2 = 56,
+ VT_TESTF3 = 58,
+ VT_TESTARRAYOFSTRING2 = 60,
+ VT_TESTARRAYOFSORTEDSTRUCT = 62,
+ VT_FLEX = 64,
+ VT_TEST5 = 66,
+ VT_VECTOR_OF_LONGS = 68,
+ VT_VECTOR_OF_DOUBLES = 70,
+ VT_PARENT_NAMESPACE_TEST = 72,
+ VT_VECTOR_OF_REFERRABLES = 74,
+ VT_SINGLE_WEAK_REFERENCE = 76,
+ VT_VECTOR_OF_WEAK_REFERENCES = 78,
+ VT_VECTOR_OF_STRONG_REFERRABLES = 80,
+ VT_CO_OWNING_REFERENCE = 82,
+ VT_VECTOR_OF_CO_OWNING_REFERENCES = 84,
+ VT_NON_OWNING_REFERENCE = 86,
+ VT_VECTOR_OF_NON_OWNING_REFERENCES = 88,
+ VT_ANY_UNIQUE_TYPE = 90,
+ VT_ANY_UNIQUE = 92,
+ VT_ANY_AMBIGUOUS_TYPE = 94,
+ VT_ANY_AMBIGUOUS = 96,
+ VT_VECTOR_OF_ENUMS = 98,
+ VT_SIGNED_ENUM = 100,
+ VT_TESTREQUIREDNESTEDFLATBUFFER = 102
+ };
+ const MyGame::Example::Vec3 *pos() const {
+ return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);
+ }
+ MyGame::Example::Vec3 *mutable_pos() {
+ return GetStruct<MyGame::Example::Vec3 *>(VT_POS);
+ }
+ int16_t mana() const {
+ return GetField<int16_t>(VT_MANA, 150);
+ }
+ bool mutate_mana(int16_t _mana) {
+ return SetField<int16_t>(VT_MANA, _mana, 150);
+ }
+ int16_t hp() const {
+ return GetField<int16_t>(VT_HP, 100);
+ }
+ bool mutate_hp(int16_t _hp) {
+ return SetField<int16_t>(VT_HP, _hp, 100);
+ }
+ const flatbuffers::String *name() const {
+ return GetPointer<const flatbuffers::String *>(VT_NAME);
+ }
+ flatbuffers::String *mutable_name() {
+ return GetPointer<flatbuffers::String *>(VT_NAME);
+ }
+ bool KeyCompareLessThan(const Monster *o) const {
+ return *name() < *o->name();
+ }
+ int KeyCompareWithValue(const char *val) const {
+ return strcmp(name()->c_str(), val);
+ }
+ const flatbuffers::Vector<uint8_t> *inventory() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_inventory() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_INVENTORY);
+ }
+ MyGame::Example::Color color() const {
+ return static_cast<MyGame::Example::Color>(GetField<uint8_t>(VT_COLOR, 8));
+ }
+ bool mutate_color(MyGame::Example::Color _color) {
+ return SetField<uint8_t>(VT_COLOR, static_cast<uint8_t>(_color), 8);
+ }
+ MyGame::Example::Any test_type() const {
+ return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));
+ }
+ const void *test() const {
+ return GetPointer<const void *>(VT_TEST);
+ }
+ template<typename T> const T *test_as() const;
+ const MyGame::Example::Monster *test_as_Monster() const {
+ return test_type() == MyGame::Example::Any::Monster ? static_cast<const MyGame::Example::Monster *>(test()) : nullptr;
+ }
+ const MyGame::Example::TestSimpleTableWithEnum *test_as_TestSimpleTableWithEnum() const {
+ return test_type() == MyGame::Example::Any::TestSimpleTableWithEnum ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(test()) : nullptr;
+ }
+ const MyGame::Example2::Monster *test_as_MyGame_Example2_Monster() const {
+ return test_type() == MyGame::Example::Any::MyGame_Example2_Monster ? static_cast<const MyGame::Example2::Monster *>(test()) : nullptr;
+ }
+ void *mutable_test() {
+ return GetPointer<void *>(VT_TEST);
+ }
+ const flatbuffers::Vector<const MyGame::Example::Test *> *test4() const {
+ return GetPointer<const flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);
+ }
+ flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test4() {
+ return GetPointer<flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST4);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);
+ }
+ flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *mutable_testarrayofstring() {
+ return GetPointer<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TESTARRAYOFSTRING);
+ }
+ /// an example documentation comment: this will end up in the generated code
+ /// multiline too
+ const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);
+ }
+ flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>> *mutable_testarrayoftables() {
+ return GetPointer<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>> *>(VT_TESTARRAYOFTABLES);
+ }
+ const MyGame::Example::Monster *enemy() const {
+ return GetPointer<const MyGame::Example::Monster *>(VT_ENEMY);
+ }
+ MyGame::Example::Monster *mutable_enemy() {
+ return GetPointer<MyGame::Example::Monster *>(VT_ENEMY);
+ }
+ const flatbuffers::Vector<uint8_t> *testnestedflatbuffer() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_testnestedflatbuffer() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_TESTNESTEDFLATBUFFER);
+ }
+ const MyGame::Example::Monster *testnestedflatbuffer_nested_root() const {
+ return flatbuffers::GetRoot<MyGame::Example::Monster>(testnestedflatbuffer()->Data());
+ }
+ const MyGame::Example::Stat *testempty() const {
+ return GetPointer<const MyGame::Example::Stat *>(VT_TESTEMPTY);
+ }
+ MyGame::Example::Stat *mutable_testempty() {
+ return GetPointer<MyGame::Example::Stat *>(VT_TESTEMPTY);
+ }
+ bool testbool() const {
+ return GetField<uint8_t>(VT_TESTBOOL, 0) != 0;
+ }
+ bool mutate_testbool(bool _testbool) {
+ return SetField<uint8_t>(VT_TESTBOOL, static_cast<uint8_t>(_testbool), 0);
+ }
+ int32_t testhashs32_fnv1() const {
+ return GetField<int32_t>(VT_TESTHASHS32_FNV1, 0);
+ }
+ bool mutate_testhashs32_fnv1(int32_t _testhashs32_fnv1) {
+ return SetField<int32_t>(VT_TESTHASHS32_FNV1, _testhashs32_fnv1, 0);
+ }
+ uint32_t testhashu32_fnv1() const {
+ return GetField<uint32_t>(VT_TESTHASHU32_FNV1, 0);
+ }
+ bool mutate_testhashu32_fnv1(uint32_t _testhashu32_fnv1) {
+ return SetField<uint32_t>(VT_TESTHASHU32_FNV1, _testhashu32_fnv1, 0);
+ }
+ int64_t testhashs64_fnv1() const {
+ return GetField<int64_t>(VT_TESTHASHS64_FNV1, 0);
+ }
+ bool mutate_testhashs64_fnv1(int64_t _testhashs64_fnv1) {
+ return SetField<int64_t>(VT_TESTHASHS64_FNV1, _testhashs64_fnv1, 0);
+ }
+ uint64_t testhashu64_fnv1() const {
+ return GetField<uint64_t>(VT_TESTHASHU64_FNV1, 0);
+ }
+ bool mutate_testhashu64_fnv1(uint64_t _testhashu64_fnv1) {
+ return SetField<uint64_t>(VT_TESTHASHU64_FNV1, _testhashu64_fnv1, 0);
+ }
+ int32_t testhashs32_fnv1a() const {
+ return GetField<int32_t>(VT_TESTHASHS32_FNV1A, 0);
+ }
+ bool mutate_testhashs32_fnv1a(int32_t _testhashs32_fnv1a) {
+ return SetField<int32_t>(VT_TESTHASHS32_FNV1A, _testhashs32_fnv1a, 0);
+ }
+ uint32_t testhashu32_fnv1a() const {
+ return GetField<uint32_t>(VT_TESTHASHU32_FNV1A, 0);
+ }
+ bool mutate_testhashu32_fnv1a(uint32_t _testhashu32_fnv1a) {
+ return SetField<uint32_t>(VT_TESTHASHU32_FNV1A, _testhashu32_fnv1a, 0);
+ }
+ int64_t testhashs64_fnv1a() const {
+ return GetField<int64_t>(VT_TESTHASHS64_FNV1A, 0);
+ }
+ bool mutate_testhashs64_fnv1a(int64_t _testhashs64_fnv1a) {
+ return SetField<int64_t>(VT_TESTHASHS64_FNV1A, _testhashs64_fnv1a, 0);
+ }
+ uint64_t testhashu64_fnv1a() const {
+ return GetField<uint64_t>(VT_TESTHASHU64_FNV1A, 0);
+ }
+ bool mutate_testhashu64_fnv1a(uint64_t _testhashu64_fnv1a) {
+ return SetField<uint64_t>(VT_TESTHASHU64_FNV1A, _testhashu64_fnv1a, 0);
+ }
+ const flatbuffers::Vector<uint8_t> *testarrayofbools() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_testarrayofbools() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_TESTARRAYOFBOOLS);
+ }
+ float testf() const {
+ return GetField<float>(VT_TESTF, 3.14159f);
+ }
+ bool mutate_testf(float _testf) {
+ return SetField<float>(VT_TESTF, _testf, 3.14159f);
+ }
+ float testf2() const {
+ return GetField<float>(VT_TESTF2, 3.0f);
+ }
+ bool mutate_testf2(float _testf2) {
+ return SetField<float>(VT_TESTF2, _testf2, 3.0f);
+ }
+ float testf3() const {
+ return GetField<float>(VT_TESTF3, 0.0f);
+ }
+ bool mutate_testf3(float _testf3) {
+ return SetField<float>(VT_TESTF3, _testf3, 0.0f);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring2() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);
+ }
+ flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *mutable_testarrayofstring2() {
+ return GetPointer<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_TESTARRAYOFSTRING2);
+ }
+ const flatbuffers::Vector<const MyGame::Example::Ability *> *testarrayofsortedstruct() const {
+ return GetPointer<const flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);
+ }
+ flatbuffers::Vector<const MyGame::Example::Ability *> *mutable_testarrayofsortedstruct() {
+ return GetPointer<flatbuffers::Vector<const MyGame::Example::Ability *> *>(VT_TESTARRAYOFSORTEDSTRUCT);
+ }
+ const flatbuffers::Vector<uint8_t> *flex() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_FLEX);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_flex() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_FLEX);
+ }
+ flexbuffers::Reference flex_flexbuffer_root() const {
+ return flexbuffers::GetRoot(flex()->Data(), flex()->size());
+ }
+ const flatbuffers::Vector<const MyGame::Example::Test *> *test5() const {
+ return GetPointer<const flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);
+ }
+ flatbuffers::Vector<const MyGame::Example::Test *> *mutable_test5() {
+ return GetPointer<flatbuffers::Vector<const MyGame::Example::Test *> *>(VT_TEST5);
+ }
+ const flatbuffers::Vector<int64_t> *vector_of_longs() const {
+ return GetPointer<const flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);
+ }
+ flatbuffers::Vector<int64_t> *mutable_vector_of_longs() {
+ return GetPointer<flatbuffers::Vector<int64_t> *>(VT_VECTOR_OF_LONGS);
+ }
+ const flatbuffers::Vector<double> *vector_of_doubles() const {
+ return GetPointer<const flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);
+ }
+ flatbuffers::Vector<double> *mutable_vector_of_doubles() {
+ return GetPointer<flatbuffers::Vector<double> *>(VT_VECTOR_OF_DOUBLES);
+ }
+ const MyGame::InParentNamespace *parent_namespace_test() const {
+ return GetPointer<const MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);
+ }
+ MyGame::InParentNamespace *mutable_parent_namespace_test() {
+ return GetPointer<MyGame::InParentNamespace *>(VT_PARENT_NAMESPACE_TEST);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_REFERRABLES);
+ }
+ flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_referrables() {
+ return GetPointer<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::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);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);
+ }
+ flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *mutable_vector_of_strong_referrables() {
+ return GetPointer<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>> *>(VT_VECTOR_OF_STRONG_REFERRABLES);
+ }
+ uint64_t co_owning_reference() const {
+ return GetField<uint64_t>(VT_CO_OWNING_REFERENCE, 0);
+ }
+ bool mutate_co_owning_reference(uint64_t _co_owning_reference) {
+ return SetField<uint64_t>(VT_CO_OWNING_REFERENCE, _co_owning_reference, 0);
+ }
+ const flatbuffers::Vector<uint64_t> *vector_of_co_owning_references() const {
+ return GetPointer<const flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);
+ }
+ flatbuffers::Vector<uint64_t> *mutable_vector_of_co_owning_references() {
+ return GetPointer<flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_CO_OWNING_REFERENCES);
+ }
+ uint64_t non_owning_reference() const {
+ return GetField<uint64_t>(VT_NON_OWNING_REFERENCE, 0);
+ }
+ bool mutate_non_owning_reference(uint64_t _non_owning_reference) {
+ return SetField<uint64_t>(VT_NON_OWNING_REFERENCE, _non_owning_reference, 0);
+ }
+ const flatbuffers::Vector<uint64_t> *vector_of_non_owning_references() const {
+ return GetPointer<const flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);
+ }
+ flatbuffers::Vector<uint64_t> *mutable_vector_of_non_owning_references() {
+ return GetPointer<flatbuffers::Vector<uint64_t> *>(VT_VECTOR_OF_NON_OWNING_REFERENCES);
+ }
+ MyGame::Example::AnyUniqueAliases any_unique_type() const {
+ return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));
+ }
+ const void *any_unique() const {
+ return GetPointer<const void *>(VT_ANY_UNIQUE);
+ }
+ template<typename T> const T *any_unique_as() const;
+ const MyGame::Example::Monster *any_unique_as_M() const {
+ return any_unique_type() == MyGame::Example::AnyUniqueAliases::M ? static_cast<const MyGame::Example::Monster *>(any_unique()) : nullptr;
+ }
+ const MyGame::Example::TestSimpleTableWithEnum *any_unique_as_TS() const {
+ return any_unique_type() == MyGame::Example::AnyUniqueAliases::TS ? static_cast<const MyGame::Example::TestSimpleTableWithEnum *>(any_unique()) : nullptr;
+ }
+ const MyGame::Example2::Monster *any_unique_as_M2() const {
+ return any_unique_type() == MyGame::Example::AnyUniqueAliases::M2 ? static_cast<const MyGame::Example2::Monster *>(any_unique()) : nullptr;
+ }
+ void *mutable_any_unique() {
+ return GetPointer<void *>(VT_ANY_UNIQUE);
+ }
+ MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {
+ return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));
+ }
+ const void *any_ambiguous() const {
+ return GetPointer<const void *>(VT_ANY_AMBIGUOUS);
+ }
+ const MyGame::Example::Monster *any_ambiguous_as_M1() const {
+ return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases::M1 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
+ }
+ const MyGame::Example::Monster *any_ambiguous_as_M2() const {
+ return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases::M2 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
+ }
+ const MyGame::Example::Monster *any_ambiguous_as_M3() const {
+ return any_ambiguous_type() == MyGame::Example::AnyAmbiguousAliases::M3 ? static_cast<const MyGame::Example::Monster *>(any_ambiguous()) : nullptr;
+ }
+ void *mutable_any_ambiguous() {
+ return GetPointer<void *>(VT_ANY_AMBIGUOUS);
+ }
+ const flatbuffers::Vector<MyGame::Example::Color> *vector_of_enums() const {
+ return GetPointer<const flatbuffers::Vector<MyGame::Example::Color> *>(VT_VECTOR_OF_ENUMS);
+ }
+ flatbuffers::Vector<MyGame::Example::Color> *mutable_vector_of_enums() {
+ return GetPointer<flatbuffers::Vector<MyGame::Example::Color> *>(VT_VECTOR_OF_ENUMS);
+ }
+ MyGame::Example::Race signed_enum() const {
+ return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));
+ }
+ bool mutate_signed_enum(MyGame::Example::Race _signed_enum) {
+ return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);
+ }
+ const flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
+ }
+ const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {
+ return flatbuffers::GetRoot<MyGame::Example::Monster>(testrequirednestedflatbuffer()->Data());
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<MyGame::Example::Vec3>(verifier, VT_POS) &&
+ VerifyField<int16_t>(verifier, VT_MANA) &&
+ VerifyField<int16_t>(verifier, VT_HP) &&
+ VerifyOffsetRequired(verifier, VT_NAME) &&
+ verifier.VerifyString(name()) &&
+ VerifyOffset(verifier, VT_INVENTORY) &&
+ verifier.VerifyVector(inventory()) &&
+ VerifyField<uint8_t>(verifier, VT_COLOR) &&
+ VerifyField<uint8_t>(verifier, VT_TEST_TYPE) &&
+ VerifyOffset(verifier, VT_TEST) &&
+ VerifyAny(verifier, test(), test_type()) &&
+ VerifyOffset(verifier, VT_TEST4) &&
+ verifier.VerifyVector(test4()) &&
+ VerifyOffset(verifier, VT_TESTARRAYOFSTRING) &&
+ verifier.VerifyVector(testarrayofstring()) &&
+ verifier.VerifyVectorOfStrings(testarrayofstring()) &&
+ VerifyOffset(verifier, VT_TESTARRAYOFTABLES) &&
+ verifier.VerifyVector(testarrayoftables()) &&
+ verifier.VerifyVectorOfTables(testarrayoftables()) &&
+ VerifyOffset(verifier, VT_ENEMY) &&
+ verifier.VerifyTable(enemy()) &&
+ VerifyOffset(verifier, VT_TESTNESTEDFLATBUFFER) &&
+ verifier.VerifyVector(testnestedflatbuffer()) &&
+ VerifyOffset(verifier, VT_TESTEMPTY) &&
+ verifier.VerifyTable(testempty()) &&
+ VerifyField<uint8_t>(verifier, VT_TESTBOOL) &&
+ VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1) &&
+ VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1) &&
+ VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1) &&
+ VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1) &&
+ VerifyField<int32_t>(verifier, VT_TESTHASHS32_FNV1A) &&
+ VerifyField<uint32_t>(verifier, VT_TESTHASHU32_FNV1A) &&
+ VerifyField<int64_t>(verifier, VT_TESTHASHS64_FNV1A) &&
+ VerifyField<uint64_t>(verifier, VT_TESTHASHU64_FNV1A) &&
+ VerifyOffset(verifier, VT_TESTARRAYOFBOOLS) &&
+ verifier.VerifyVector(testarrayofbools()) &&
+ VerifyField<float>(verifier, VT_TESTF) &&
+ VerifyField<float>(verifier, VT_TESTF2) &&
+ VerifyField<float>(verifier, VT_TESTF3) &&
+ VerifyOffset(verifier, VT_TESTARRAYOFSTRING2) &&
+ verifier.VerifyVector(testarrayofstring2()) &&
+ verifier.VerifyVectorOfStrings(testarrayofstring2()) &&
+ VerifyOffset(verifier, VT_TESTARRAYOFSORTEDSTRUCT) &&
+ verifier.VerifyVector(testarrayofsortedstruct()) &&
+ VerifyOffset(verifier, VT_FLEX) &&
+ verifier.VerifyVector(flex()) &&
+ VerifyOffset(verifier, VT_TEST5) &&
+ verifier.VerifyVector(test5()) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_LONGS) &&
+ verifier.VerifyVector(vector_of_longs()) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_DOUBLES) &&
+ verifier.VerifyVector(vector_of_doubles()) &&
+ VerifyOffset(verifier, VT_PARENT_NAMESPACE_TEST) &&
+ verifier.VerifyTable(parent_namespace_test()) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_REFERRABLES) &&
+ verifier.VerifyVector(vector_of_referrables()) &&
+ verifier.VerifyVectorOfTables(vector_of_referrables()) &&
+ VerifyField<uint64_t>(verifier, VT_SINGLE_WEAK_REFERENCE) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_WEAK_REFERENCES) &&
+ verifier.VerifyVector(vector_of_weak_references()) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_STRONG_REFERRABLES) &&
+ verifier.VerifyVector(vector_of_strong_referrables()) &&
+ verifier.VerifyVectorOfTables(vector_of_strong_referrables()) &&
+ VerifyField<uint64_t>(verifier, VT_CO_OWNING_REFERENCE) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_CO_OWNING_REFERENCES) &&
+ verifier.VerifyVector(vector_of_co_owning_references()) &&
+ VerifyField<uint64_t>(verifier, VT_NON_OWNING_REFERENCE) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_NON_OWNING_REFERENCES) &&
+ verifier.VerifyVector(vector_of_non_owning_references()) &&
+ VerifyField<uint8_t>(verifier, VT_ANY_UNIQUE_TYPE) &&
+ VerifyOffset(verifier, VT_ANY_UNIQUE) &&
+ VerifyAnyUniqueAliases(verifier, any_unique(), any_unique_type()) &&
+ VerifyField<uint8_t>(verifier, VT_ANY_AMBIGUOUS_TYPE) &&
+ VerifyOffset(verifier, VT_ANY_AMBIGUOUS) &&
+ VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&
+ VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&
+ verifier.VerifyVector(vector_of_enums()) &&
+ VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
+ VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
+ verifier.VerifyVector(testrequirednestedflatbuffer()) &&
+ verifier.EndTable();
+ }
+ MonsterT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<Monster> Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+template<> inline const MyGame::Example::Monster *Monster::test_as<MyGame::Example::Monster>() const {
+ return test_as_Monster();
+}
+
+template<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::test_as<MyGame::Example::TestSimpleTableWithEnum>() const {
+ return test_as_TestSimpleTableWithEnum();
+}
+
+template<> inline const MyGame::Example2::Monster *Monster::test_as<MyGame::Example2::Monster>() const {
+ return test_as_MyGame_Example2_Monster();
+}
+
+template<> inline const MyGame::Example::Monster *Monster::any_unique_as<MyGame::Example::Monster>() const {
+ return any_unique_as_M();
+}
+
+template<> inline const MyGame::Example::TestSimpleTableWithEnum *Monster::any_unique_as<MyGame::Example::TestSimpleTableWithEnum>() const {
+ return any_unique_as_TS();
+}
+
+template<> inline const MyGame::Example2::Monster *Monster::any_unique_as<MyGame::Example2::Monster>() const {
+ return any_unique_as_M2();
+}
+
+struct MonsterBuilder {
+ typedef Monster Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_pos(const MyGame::Example::Vec3 *pos) {
+ fbb_.AddStruct(Monster::VT_POS, pos);
+ }
+ void add_mana(int16_t mana) {
+ fbb_.AddElement<int16_t>(Monster::VT_MANA, mana, 150);
+ }
+ void add_hp(int16_t hp) {
+ fbb_.AddElement<int16_t>(Monster::VT_HP, hp, 100);
+ }
+ void add_name(flatbuffers::Offset<flatbuffers::String> name) {
+ fbb_.AddOffset(Monster::VT_NAME, name);
+ }
+ void add_inventory(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory) {
+ fbb_.AddOffset(Monster::VT_INVENTORY, inventory);
+ }
+ void add_color(MyGame::Example::Color color) {
+ fbb_.AddElement<uint8_t>(Monster::VT_COLOR, static_cast<uint8_t>(color), 8);
+ }
+ void add_test_type(MyGame::Example::Any test_type) {
+ fbb_.AddElement<uint8_t>(Monster::VT_TEST_TYPE, static_cast<uint8_t>(test_type), 0);
+ }
+ void add_test(flatbuffers::Offset<void> test) {
+ fbb_.AddOffset(Monster::VT_TEST, test);
+ }
+ void add_test4(flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::Test *>> test4) {
+ fbb_.AddOffset(Monster::VT_TEST4, test4);
+ }
+ void add_testarrayofstring(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring) {
+ fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING, testarrayofstring);
+ }
+ void add_testarrayoftables(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables) {
+ fbb_.AddOffset(Monster::VT_TESTARRAYOFTABLES, testarrayoftables);
+ }
+ void add_enemy(flatbuffers::Offset<MyGame::Example::Monster> enemy) {
+ fbb_.AddOffset(Monster::VT_ENEMY, enemy);
+ }
+ void add_testnestedflatbuffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testnestedflatbuffer) {
+ fbb_.AddOffset(Monster::VT_TESTNESTEDFLATBUFFER, testnestedflatbuffer);
+ }
+ void add_testempty(flatbuffers::Offset<MyGame::Example::Stat> testempty) {
+ fbb_.AddOffset(Monster::VT_TESTEMPTY, testempty);
+ }
+ void add_testbool(bool testbool) {
+ fbb_.AddElement<uint8_t>(Monster::VT_TESTBOOL, static_cast<uint8_t>(testbool), 0);
+ }
+ void add_testhashs32_fnv1(int32_t testhashs32_fnv1) {
+ fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1, testhashs32_fnv1, 0);
+ }
+ void add_testhashu32_fnv1(uint32_t testhashu32_fnv1) {
+ fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1, testhashu32_fnv1, 0);
+ }
+ void add_testhashs64_fnv1(int64_t testhashs64_fnv1) {
+ fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1, testhashs64_fnv1, 0);
+ }
+ void add_testhashu64_fnv1(uint64_t testhashu64_fnv1) {
+ fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1, testhashu64_fnv1, 0);
+ }
+ void add_testhashs32_fnv1a(int32_t testhashs32_fnv1a) {
+ fbb_.AddElement<int32_t>(Monster::VT_TESTHASHS32_FNV1A, testhashs32_fnv1a, 0);
+ }
+ void add_testhashu32_fnv1a(uint32_t testhashu32_fnv1a) {
+ fbb_.AddElement<uint32_t>(Monster::VT_TESTHASHU32_FNV1A, testhashu32_fnv1a, 0);
+ }
+ void add_testhashs64_fnv1a(int64_t testhashs64_fnv1a) {
+ fbb_.AddElement<int64_t>(Monster::VT_TESTHASHS64_FNV1A, testhashs64_fnv1a, 0);
+ }
+ void add_testhashu64_fnv1a(uint64_t testhashu64_fnv1a) {
+ fbb_.AddElement<uint64_t>(Monster::VT_TESTHASHU64_FNV1A, testhashu64_fnv1a, 0);
+ }
+ void add_testarrayofbools(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testarrayofbools) {
+ fbb_.AddOffset(Monster::VT_TESTARRAYOFBOOLS, testarrayofbools);
+ }
+ void add_testf(float testf) {
+ fbb_.AddElement<float>(Monster::VT_TESTF, testf, 3.14159f);
+ }
+ void add_testf2(float testf2) {
+ fbb_.AddElement<float>(Monster::VT_TESTF2, testf2, 3.0f);
+ }
+ void add_testf3(float testf3) {
+ fbb_.AddElement<float>(Monster::VT_TESTF3, testf3, 0.0f);
+ }
+ void add_testarrayofstring2(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring2) {
+ fbb_.AddOffset(Monster::VT_TESTARRAYOFSTRING2, testarrayofstring2);
+ }
+ void add_testarrayofsortedstruct(flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct) {
+ fbb_.AddOffset(Monster::VT_TESTARRAYOFSORTEDSTRUCT, testarrayofsortedstruct);
+ }
+ void add_flex(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> flex) {
+ fbb_.AddOffset(Monster::VT_FLEX, flex);
+ }
+ void add_test5(flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::Test *>> test5) {
+ fbb_.AddOffset(Monster::VT_TEST5, test5);
+ }
+ void add_vector_of_longs(flatbuffers::Offset<flatbuffers::Vector<int64_t>> vector_of_longs) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_LONGS, vector_of_longs);
+ }
+ void add_vector_of_doubles(flatbuffers::Offset<flatbuffers::Vector<double>> vector_of_doubles) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_DOUBLES, vector_of_doubles);
+ }
+ 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<MyGame::Example::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);
+ }
+ void add_vector_of_strong_referrables(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_STRONG_REFERRABLES, vector_of_strong_referrables);
+ }
+ void add_co_owning_reference(uint64_t co_owning_reference) {
+ fbb_.AddElement<uint64_t>(Monster::VT_CO_OWNING_REFERENCE, co_owning_reference, 0);
+ }
+ void add_vector_of_co_owning_references(flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_co_owning_references) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_CO_OWNING_REFERENCES, vector_of_co_owning_references);
+ }
+ void add_non_owning_reference(uint64_t non_owning_reference) {
+ fbb_.AddElement<uint64_t>(Monster::VT_NON_OWNING_REFERENCE, non_owning_reference, 0);
+ }
+ void add_vector_of_non_owning_references(flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_non_owning_references) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_NON_OWNING_REFERENCES, vector_of_non_owning_references);
+ }
+ void add_any_unique_type(MyGame::Example::AnyUniqueAliases any_unique_type) {
+ fbb_.AddElement<uint8_t>(Monster::VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(any_unique_type), 0);
+ }
+ void add_any_unique(flatbuffers::Offset<void> any_unique) {
+ fbb_.AddOffset(Monster::VT_ANY_UNIQUE, any_unique);
+ }
+ void add_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases any_ambiguous_type) {
+ fbb_.AddElement<uint8_t>(Monster::VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(any_ambiguous_type), 0);
+ }
+ void add_any_ambiguous(flatbuffers::Offset<void> any_ambiguous) {
+ fbb_.AddOffset(Monster::VT_ANY_AMBIGUOUS, any_ambiguous);
+ }
+ void add_vector_of_enums(flatbuffers::Offset<flatbuffers::Vector<MyGame::Example::Color>> vector_of_enums) {
+ fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);
+ }
+ void add_signed_enum(MyGame::Example::Race signed_enum) {
+ fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);
+ }
+ void add_testrequirednestedflatbuffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {
+ fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);
+ }
+ explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<Monster> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<Monster>(end);
+ fbb_.Required(o, Monster::VT_NAME);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Monster> CreateMonster(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ const MyGame::Example::Vec3 *pos = 0,
+ int16_t mana = 150,
+ int16_t hp = 100,
+ flatbuffers::Offset<flatbuffers::String> name = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> inventory = 0,
+ MyGame::Example::Color color = MyGame::Example::Color::Blue,
+ MyGame::Example::Any test_type = MyGame::Example::Any::NONE,
+ flatbuffers::Offset<void> test = 0,
+ flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::Test *>> test4 = 0,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring = 0,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Monster>>> testarrayoftables = 0,
+ flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testnestedflatbuffer = 0,
+ flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,
+ bool testbool = false,
+ int32_t testhashs32_fnv1 = 0,
+ uint32_t testhashu32_fnv1 = 0,
+ int64_t testhashs64_fnv1 = 0,
+ uint64_t testhashu64_fnv1 = 0,
+ int32_t testhashs32_fnv1a = 0,
+ uint32_t testhashu32_fnv1a = 0,
+ int64_t testhashs64_fnv1a = 0,
+ uint64_t testhashu64_fnv1a = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testarrayofbools = 0,
+ float testf = 3.14159f,
+ float testf2 = 3.0f,
+ float testf3 = 0.0f,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> testarrayofstring2 = 0,
+ flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::Ability *>> testarrayofsortedstruct = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> flex = 0,
+ flatbuffers::Offset<flatbuffers::Vector<const MyGame::Example::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<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_referrables = 0,
+ uint64_t single_weak_reference = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_weak_references = 0,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<MyGame::Example::Referrable>>> vector_of_strong_referrables = 0,
+ uint64_t co_owning_reference = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_co_owning_references = 0,
+ uint64_t non_owning_reference = 0,
+ flatbuffers::Offset<flatbuffers::Vector<uint64_t>> vector_of_non_owning_references = 0,
+ MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases::NONE,
+ flatbuffers::Offset<void> any_unique = 0,
+ MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases::NONE,
+ flatbuffers::Offset<void> any_ambiguous = 0,
+ flatbuffers::Offset<flatbuffers::Vector<MyGame::Example::Color>> vector_of_enums = 0,
+ MyGame::Example::Race signed_enum = MyGame::Example::Race::None,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0) {
+ MonsterBuilder builder_(_fbb);
+ builder_.add_non_owning_reference(non_owning_reference);
+ builder_.add_co_owning_reference(co_owning_reference);
+ 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_testrequirednestedflatbuffer(testrequirednestedflatbuffer);
+ builder_.add_vector_of_enums(vector_of_enums);
+ builder_.add_any_ambiguous(any_ambiguous);
+ builder_.add_any_unique(any_unique);
+ builder_.add_vector_of_non_owning_references(vector_of_non_owning_references);
+ builder_.add_vector_of_co_owning_references(vector_of_co_owning_references);
+ builder_.add_vector_of_strong_referrables(vector_of_strong_referrables);
+ 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);
+ builder_.add_test5(test5);
+ builder_.add_flex(flex);
+ builder_.add_testarrayofsortedstruct(testarrayofsortedstruct);
+ builder_.add_testarrayofstring2(testarrayofstring2);
+ builder_.add_testf3(testf3);
+ builder_.add_testf2(testf2);
+ builder_.add_testf(testf);
+ builder_.add_testarrayofbools(testarrayofbools);
+ builder_.add_testhashu32_fnv1a(testhashu32_fnv1a);
+ builder_.add_testhashs32_fnv1a(testhashs32_fnv1a);
+ builder_.add_testhashu32_fnv1(testhashu32_fnv1);
+ builder_.add_testhashs32_fnv1(testhashs32_fnv1);
+ builder_.add_testempty(testempty);
+ builder_.add_testnestedflatbuffer(testnestedflatbuffer);
+ builder_.add_enemy(enemy);
+ builder_.add_testarrayoftables(testarrayoftables);
+ builder_.add_testarrayofstring(testarrayofstring);
+ builder_.add_test4(test4);
+ builder_.add_test(test);
+ builder_.add_inventory(inventory);
+ builder_.add_name(name);
+ builder_.add_pos(pos);
+ builder_.add_hp(hp);
+ builder_.add_mana(mana);
+ builder_.add_signed_enum(signed_enum);
+ builder_.add_any_ambiguous_type(any_ambiguous_type);
+ builder_.add_any_unique_type(any_unique_type);
+ builder_.add_testbool(testbool);
+ builder_.add_test_type(test_type);
+ builder_.add_color(color);
+ return builder_.Finish();
+}
+
+struct Monster::Traits {
+ using type = Monster;
+ static auto constexpr Create = CreateMonster;
+};
+
+inline flatbuffers::Offset<Monster> CreateMonsterDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ const MyGame::Example::Vec3 *pos = 0,
+ int16_t mana = 150,
+ int16_t hp = 100,
+ const char *name = nullptr,
+ const std::vector<uint8_t> *inventory = nullptr,
+ MyGame::Example::Color color = MyGame::Example::Color::Blue,
+ MyGame::Example::Any test_type = MyGame::Example::Any::NONE,
+ flatbuffers::Offset<void> test = 0,
+ const std::vector<MyGame::Example::Test> *test4 = nullptr,
+ const std::vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring = nullptr,
+ std::vector<flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,
+ flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,
+ const std::vector<uint8_t> *testnestedflatbuffer = nullptr,
+ flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,
+ bool testbool = false,
+ int32_t testhashs32_fnv1 = 0,
+ uint32_t testhashu32_fnv1 = 0,
+ int64_t testhashs64_fnv1 = 0,
+ uint64_t testhashu64_fnv1 = 0,
+ int32_t testhashs32_fnv1a = 0,
+ uint32_t testhashu32_fnv1a = 0,
+ int64_t testhashs64_fnv1a = 0,
+ uint64_t testhashu64_fnv1a = 0,
+ const std::vector<uint8_t> *testarrayofbools = nullptr,
+ float testf = 3.14159f,
+ float testf2 = 3.0f,
+ float testf3 = 0.0f,
+ const std::vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring2 = nullptr,
+ std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,
+ const std::vector<uint8_t> *flex = nullptr,
+ const std::vector<MyGame::Example::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,
+ std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,
+ uint64_t single_weak_reference = 0,
+ const std::vector<uint64_t> *vector_of_weak_references = nullptr,
+ std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,
+ uint64_t co_owning_reference = 0,
+ const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,
+ uint64_t non_owning_reference = 0,
+ const std::vector<uint64_t> *vector_of_non_owning_references = nullptr,
+ MyGame::Example::AnyUniqueAliases any_unique_type = MyGame::Example::AnyUniqueAliases::NONE,
+ flatbuffers::Offset<void> any_unique = 0,
+ MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases::NONE,
+ flatbuffers::Offset<void> any_ambiguous = 0,
+ const std::vector<MyGame::Example::Color> *vector_of_enums = nullptr,
+ MyGame::Example::Race signed_enum = MyGame::Example::Race::None,
+ const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr) {
+ auto name__ = name ? _fbb.CreateString(name) : 0;
+ auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;
+ auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;
+ auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*testarrayofstring) : 0;
+ auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;
+ auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;
+ auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;
+ auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*testarrayofstring2) : 0;
+ auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;
+ auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;
+ auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;
+ auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;
+ auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;
+ auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;
+ auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;
+ auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;
+ auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;
+ auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;
+ auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<MyGame::Example::Color>(*vector_of_enums) : 0;
+ auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;
+ return MyGame::Example::CreateMonster(
+ _fbb,
+ 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__,
+ vector_of_strong_referrables__,
+ co_owning_reference,
+ vector_of_co_owning_references__,
+ non_owning_reference,
+ vector_of_non_owning_references__,
+ any_unique_type,
+ any_unique,
+ any_ambiguous_type,
+ any_ambiguous,
+ vector_of_enums__,
+ signed_enum,
+ testrequirednestedflatbuffer__);
+}
+
+flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+struct TypeAliasesT : public flatbuffers::NativeTable {
+ typedef TypeAliases TableType;
+ int8_t i8 = 0;
+ uint8_t u8 = 0;
+ int16_t i16 = 0;
+ uint16_t u16 = 0;
+ int32_t i32 = 0;
+ uint32_t u32 = 0;
+ int64_t i64 = 0;
+ uint64_t u64 = 0;
+ float f32 = 0.0f;
+ double f64 = 0.0;
+ std::vector<int8_t> v8{};
+ std::vector<double> vf64{};
+};
+
+struct TypeAliases FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TypeAliasesT NativeTableType;
+ typedef TypeAliasesBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return TypeAliasesTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_I8 = 4,
+ VT_U8 = 6,
+ VT_I16 = 8,
+ VT_U16 = 10,
+ VT_I32 = 12,
+ VT_U32 = 14,
+ VT_I64 = 16,
+ VT_U64 = 18,
+ VT_F32 = 20,
+ VT_F64 = 22,
+ VT_V8 = 24,
+ VT_VF64 = 26
+ };
+ int8_t i8() const {
+ return GetField<int8_t>(VT_I8, 0);
+ }
+ bool mutate_i8(int8_t _i8) {
+ return SetField<int8_t>(VT_I8, _i8, 0);
+ }
+ uint8_t u8() const {
+ return GetField<uint8_t>(VT_U8, 0);
+ }
+ bool mutate_u8(uint8_t _u8) {
+ return SetField<uint8_t>(VT_U8, _u8, 0);
+ }
+ int16_t i16() const {
+ return GetField<int16_t>(VT_I16, 0);
+ }
+ bool mutate_i16(int16_t _i16) {
+ return SetField<int16_t>(VT_I16, _i16, 0);
+ }
+ uint16_t u16() const {
+ return GetField<uint16_t>(VT_U16, 0);
+ }
+ bool mutate_u16(uint16_t _u16) {
+ return SetField<uint16_t>(VT_U16, _u16, 0);
+ }
+ int32_t i32() const {
+ return GetField<int32_t>(VT_I32, 0);
+ }
+ bool mutate_i32(int32_t _i32) {
+ return SetField<int32_t>(VT_I32, _i32, 0);
+ }
+ uint32_t u32() const {
+ return GetField<uint32_t>(VT_U32, 0);
+ }
+ bool mutate_u32(uint32_t _u32) {
+ return SetField<uint32_t>(VT_U32, _u32, 0);
+ }
+ int64_t i64() const {
+ return GetField<int64_t>(VT_I64, 0);
+ }
+ bool mutate_i64(int64_t _i64) {
+ return SetField<int64_t>(VT_I64, _i64, 0);
+ }
+ uint64_t u64() const {
+ return GetField<uint64_t>(VT_U64, 0);
+ }
+ bool mutate_u64(uint64_t _u64) {
+ return SetField<uint64_t>(VT_U64, _u64, 0);
+ }
+ float f32() const {
+ return GetField<float>(VT_F32, 0.0f);
+ }
+ bool mutate_f32(float _f32) {
+ return SetField<float>(VT_F32, _f32, 0.0f);
+ }
+ double f64() const {
+ return GetField<double>(VT_F64, 0.0);
+ }
+ bool mutate_f64(double _f64) {
+ return SetField<double>(VT_F64, _f64, 0.0);
+ }
+ const flatbuffers::Vector<int8_t> *v8() const {
+ return GetPointer<const flatbuffers::Vector<int8_t> *>(VT_V8);
+ }
+ flatbuffers::Vector<int8_t> *mutable_v8() {
+ return GetPointer<flatbuffers::Vector<int8_t> *>(VT_V8);
+ }
+ const flatbuffers::Vector<double> *vf64() const {
+ return GetPointer<const flatbuffers::Vector<double> *>(VT_VF64);
+ }
+ flatbuffers::Vector<double> *mutable_vf64() {
+ return GetPointer<flatbuffers::Vector<double> *>(VT_VF64);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int8_t>(verifier, VT_I8) &&
+ VerifyField<uint8_t>(verifier, VT_U8) &&
+ VerifyField<int16_t>(verifier, VT_I16) &&
+ VerifyField<uint16_t>(verifier, VT_U16) &&
+ VerifyField<int32_t>(verifier, VT_I32) &&
+ VerifyField<uint32_t>(verifier, VT_U32) &&
+ VerifyField<int64_t>(verifier, VT_I64) &&
+ VerifyField<uint64_t>(verifier, VT_U64) &&
+ VerifyField<float>(verifier, VT_F32) &&
+ VerifyField<double>(verifier, VT_F64) &&
+ VerifyOffset(verifier, VT_V8) &&
+ verifier.VerifyVector(v8()) &&
+ VerifyOffset(verifier, VT_VF64) &&
+ verifier.VerifyVector(vf64()) &&
+ verifier.EndTable();
+ }
+ TypeAliasesT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(TypeAliasesT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<TypeAliases> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct TypeAliasesBuilder {
+ typedef TypeAliases Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_i8(int8_t i8) {
+ fbb_.AddElement<int8_t>(TypeAliases::VT_I8, i8, 0);
+ }
+ void add_u8(uint8_t u8) {
+ fbb_.AddElement<uint8_t>(TypeAliases::VT_U8, u8, 0);
+ }
+ void add_i16(int16_t i16) {
+ fbb_.AddElement<int16_t>(TypeAliases::VT_I16, i16, 0);
+ }
+ void add_u16(uint16_t u16) {
+ fbb_.AddElement<uint16_t>(TypeAliases::VT_U16, u16, 0);
+ }
+ void add_i32(int32_t i32) {
+ fbb_.AddElement<int32_t>(TypeAliases::VT_I32, i32, 0);
+ }
+ void add_u32(uint32_t u32) {
+ fbb_.AddElement<uint32_t>(TypeAliases::VT_U32, u32, 0);
+ }
+ void add_i64(int64_t i64) {
+ fbb_.AddElement<int64_t>(TypeAliases::VT_I64, i64, 0);
+ }
+ void add_u64(uint64_t u64) {
+ fbb_.AddElement<uint64_t>(TypeAliases::VT_U64, u64, 0);
+ }
+ void add_f32(float f32) {
+ fbb_.AddElement<float>(TypeAliases::VT_F32, f32, 0.0f);
+ }
+ void add_f64(double f64) {
+ fbb_.AddElement<double>(TypeAliases::VT_F64, f64, 0.0);
+ }
+ void add_v8(flatbuffers::Offset<flatbuffers::Vector<int8_t>> v8) {
+ fbb_.AddOffset(TypeAliases::VT_V8, v8);
+ }
+ void add_vf64(flatbuffers::Offset<flatbuffers::Vector<double>> vf64) {
+ fbb_.AddOffset(TypeAliases::VT_VF64, vf64);
+ }
+ explicit TypeAliasesBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TypeAliases> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TypeAliases>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TypeAliases> CreateTypeAliases(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int8_t i8 = 0,
+ uint8_t u8 = 0,
+ int16_t i16 = 0,
+ uint16_t u16 = 0,
+ int32_t i32 = 0,
+ uint32_t u32 = 0,
+ int64_t i64 = 0,
+ uint64_t u64 = 0,
+ float f32 = 0.0f,
+ double f64 = 0.0,
+ flatbuffers::Offset<flatbuffers::Vector<int8_t>> v8 = 0,
+ flatbuffers::Offset<flatbuffers::Vector<double>> vf64 = 0) {
+ TypeAliasesBuilder builder_(_fbb);
+ builder_.add_f64(f64);
+ builder_.add_u64(u64);
+ builder_.add_i64(i64);
+ builder_.add_vf64(vf64);
+ builder_.add_v8(v8);
+ builder_.add_f32(f32);
+ builder_.add_u32(u32);
+ builder_.add_i32(i32);
+ builder_.add_u16(u16);
+ builder_.add_i16(i16);
+ builder_.add_u8(u8);
+ builder_.add_i8(i8);
+ return builder_.Finish();
+}
+
+struct TypeAliases::Traits {
+ using type = TypeAliases;
+ static auto constexpr Create = CreateTypeAliases;
+};
+
+inline flatbuffers::Offset<TypeAliases> CreateTypeAliasesDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int8_t i8 = 0,
+ uint8_t u8 = 0,
+ int16_t i16 = 0,
+ uint16_t u16 = 0,
+ int32_t i32 = 0,
+ uint32_t u32 = 0,
+ int64_t i64 = 0,
+ uint64_t u64 = 0,
+ float f32 = 0.0f,
+ double f64 = 0.0,
+ const std::vector<int8_t> *v8 = nullptr,
+ const std::vector<double> *vf64 = nullptr) {
+ auto v8__ = v8 ? _fbb.CreateVector<int8_t>(*v8) : 0;
+ auto vf64__ = vf64 ? _fbb.CreateVector<double>(*vf64) : 0;
+ return MyGame::Example::CreateTypeAliases(
+ _fbb,
+ i8,
+ u8,
+ i16,
+ u16,
+ i32,
+ u32,
+ i64,
+ u64,
+ f32,
+ f64,
+ v8__,
+ vf64__);
+}
+
+flatbuffers::Offset<TypeAliases> CreateTypeAliases(flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+} // namespace Example
+
+inline InParentNamespaceT *InParentNamespace::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<InParentNamespaceT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+}
+
+inline flatbuffers::Offset<InParentNamespace> InParentNamespace::Pack(flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateInParentNamespace(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<InParentNamespace> CreateInParentNamespace(flatbuffers::FlatBufferBuilder &_fbb, const InParentNamespaceT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const InParentNamespaceT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ return MyGame::CreateInParentNamespace(
+ _fbb);
+}
+
+namespace Example2 {
+
+inline MonsterT *Monster::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<MonsterT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+}
+
+inline flatbuffers::Offset<Monster> Monster::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateMonster(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ return MyGame::Example2::CreateMonster(
+ _fbb);
+}
+
+} // namespace Example2
+
+namespace Example {
+
+inline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<TestSimpleTableWithEnumT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = color(); _o->color = _e; }
+}
+
+inline flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateTestSimpleTableWithEnum(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<TestSimpleTableWithEnum> CreateTestSimpleTableWithEnum(flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TestSimpleTableWithEnumT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _color = _o->color;
+ return MyGame::Example::CreateTestSimpleTableWithEnum(
+ _fbb,
+ _color);
+}
+
+inline StatT *Stat::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<StatT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void Stat::UnPackTo(StatT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = id(); if (_e) _o->id = _e->str(); }
+ { auto _e = val(); _o->val = _e; }
+ { auto _e = count(); _o->count = _e; }
+}
+
+inline flatbuffers::Offset<Stat> Stat::Pack(flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateStat(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<Stat> CreateStat(flatbuffers::FlatBufferBuilder &_fbb, const StatT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const StatT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _id = _o->id.empty() ? 0 : _fbb.CreateString(_o->id);
+ auto _val = _o->val;
+ auto _count = _o->count;
+ return MyGame::Example::CreateStat(
+ _fbb,
+ _id,
+ _val,
+ _count);
+}
+
+inline ReferrableT *Referrable::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<ReferrableT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+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 = std::make_unique<MonsterT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = pos(); if (_e) _o->pos = std::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }
+ { auto _e = mana(); _o->mana = _e; }
+ { auto _e = hp(); _o->hp = _e; }
+ { auto _e = name(); if (_e) _o->name = _e->str(); }
+ { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }
+ { auto _e = color(); _o->color = _e; }
+ { auto _e = test_type(); _o->test.type = _e; }
+ { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }
+ { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } }
+ { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } }
+ { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayoftables[_i] = std::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } }
+ { auto _e = enemy(); if (_e) _o->enemy = std::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); }
+ { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }
+ { auto _e = testempty(); if (_e) _o->testempty = std::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); }
+ { auto _e = testbool(); _o->testbool = _e; }
+ { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }
+ { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }
+ { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }
+ { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }
+ { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }
+ { auto _e = testhashu32_fnv1a(); //scalar resolver, naked
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }
+ { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }
+ { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }
+ { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } }
+ { auto _e = testf(); _o->testf = _e; }
+ { auto _e = testf2(); _o->testf2 = _e; }
+ { auto _e = testf3(); _o->testf3 = _e; }
+ { 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()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }
+ { 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); } } }
+ { 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 = std::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] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } }
+ { auto _e = single_weak_reference(); //scalar resolver, naked
+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++) { //vector resolver, naked
+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; } } }
+ { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_strong_referrables[_i] = std::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } }
+ { auto _e = co_owning_reference(); //scalar resolver, naked
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }
+ { auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, default_ptr_type
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */; } } }
+ { auto _e = non_owning_reference(); //scalar resolver, naked
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }
+ { auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, naked
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } }
+ { auto _e = any_unique_type(); _o->any_unique.type = _e; }
+ { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }
+ { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }
+ { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }
+ { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } }
+ { auto _e = signed_enum(); _o->signed_enum = _e; }
+ { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }
+}
+
+inline flatbuffers::Offset<Monster> Monster::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateMonster(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MonsterT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _pos = _o->pos ? _o->pos.get() : 0;
+ auto _mana = _o->mana;
+ auto _hp = _o->hp;
+ auto _name = _fbb.CreateString(_o->name);
+ auto _inventory = _o->inventory.size() ? _fbb.CreateVector(_o->inventory) : 0;
+ auto _color = _o->color;
+ auto _test_type = _o->test.type;
+ auto _test = _o->test.Pack(_fbb);
+ auto _test4 = _o->test4.size() ? _fbb.CreateVectorOfStructs(_o->test4) : 0;
+ auto _testarrayofstring = _o->testarrayofstring.size() ? _fbb.CreateVectorOfStrings(_o->testarrayofstring) : 0;
+ auto _testarrayoftables = _o->testarrayoftables.size() ? _fbb.CreateVector<flatbuffers::Offset<MyGame::Example::Monster>> (_o->testarrayoftables.size(), [](size_t i, _VectorArgs *__va) { return CreateMonster(*__va->__fbb, __va->__o->testarrayoftables[i].get(), __va->__rehasher); }, &_va ) : 0;
+ auto _enemy = _o->enemy ? CreateMonster(_fbb, _o->enemy.get(), _rehasher) : 0;
+ auto _testnestedflatbuffer = _o->testnestedflatbuffer.size() ? _fbb.CreateVector(_o->testnestedflatbuffer) : 0;
+ auto _testempty = _o->testempty ? CreateStat(_fbb, _o->testempty.get(), _rehasher) : 0;
+ auto _testbool = _o->testbool;
+ auto _testhashs32_fnv1 = _o->testhashs32_fnv1;
+ auto _testhashu32_fnv1 = _o->testhashu32_fnv1;
+ auto _testhashs64_fnv1 = _o->testhashs64_fnv1;
+ auto _testhashu64_fnv1 = _o->testhashu64_fnv1;
+ auto _testhashs32_fnv1a = _o->testhashs32_fnv1a;
+ auto _testhashu32_fnv1a = _rehasher ? static_cast<uint32_t>((*_rehasher)(_o->testhashu32_fnv1a)) : 0;
+ auto _testhashs64_fnv1a = _o->testhashs64_fnv1a;
+ auto _testhashu64_fnv1a = _o->testhashu64_fnv1a;
+ auto _testarrayofbools = _o->testarrayofbools.size() ? _fbb.CreateVector(_o->testarrayofbools) : 0;
+ auto _testf = _o->testf;
+ auto _testf2 = _o->testf2;
+ auto _testf3 = _o->testf3;
+ 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;
+ 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<MyGame::Example::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;
+ auto _vector_of_strong_referrables = _o->vector_of_strong_referrables.size() ? _fbb.CreateVector<flatbuffers::Offset<MyGame::Example::Referrable>> (_o->vector_of_strong_referrables.size(), [](size_t i, _VectorArgs *__va) { return CreateReferrable(*__va->__fbb, __va->__o->vector_of_strong_referrables[i].get(), __va->__rehasher); }, &_va ) : 0;
+ auto _co_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->co_owning_reference)) : 0;
+ auto _vector_of_co_owning_references = _o->vector_of_co_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_co_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_co_owning_references[i].get())) : 0; }, &_va ) : 0;
+ auto _non_owning_reference = _rehasher ? static_cast<uint64_t>((*_rehasher)(_o->non_owning_reference)) : 0;
+ auto _vector_of_non_owning_references = _o->vector_of_non_owning_references.size() ? _fbb.CreateVector<uint64_t>(_o->vector_of_non_owning_references.size(), [](size_t i, _VectorArgs *__va) { return __va->__rehasher ? static_cast<uint64_t>((*__va->__rehasher)(__va->__o->vector_of_non_owning_references[i])) : 0; }, &_va ) : 0;
+ auto _any_unique_type = _o->any_unique.type;
+ auto _any_unique = _o->any_unique.Pack(_fbb);
+ auto _any_ambiguous_type = _o->any_ambiguous.type;
+ auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);
+ auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVector(_o->vector_of_enums) : 0;
+ auto _signed_enum = _o->signed_enum;
+ auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;
+ return MyGame::Example::CreateMonster(
+ _fbb,
+ _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,
+ _vector_of_strong_referrables,
+ _co_owning_reference,
+ _vector_of_co_owning_references,
+ _non_owning_reference,
+ _vector_of_non_owning_references,
+ _any_unique_type,
+ _any_unique,
+ _any_ambiguous_type,
+ _any_ambiguous,
+ _vector_of_enums,
+ _signed_enum,
+ _testrequirednestedflatbuffer);
+}
+
+inline TypeAliasesT *TypeAliases::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<TypeAliasesT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void TypeAliases::UnPackTo(TypeAliasesT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = i8(); _o->i8 = _e; }
+ { auto _e = u8(); _o->u8 = _e; }
+ { auto _e = i16(); _o->i16 = _e; }
+ { auto _e = u16(); _o->u16 = _e; }
+ { auto _e = i32(); _o->i32 = _e; }
+ { auto _e = u32(); _o->u32 = _e; }
+ { auto _e = i64(); _o->i64 = _e; }
+ { auto _e = u64(); _o->u64 = _e; }
+ { auto _e = f32(); _o->f32 = _e; }
+ { auto _e = f64(); _o->f64 = _e; }
+ { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }
+ { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } }
+}
+
+inline flatbuffers::Offset<TypeAliases> TypeAliases::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateTypeAliases(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<TypeAliases> CreateTypeAliases(flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TypeAliasesT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _i8 = _o->i8;
+ auto _u8 = _o->u8;
+ auto _i16 = _o->i16;
+ auto _u16 = _o->u16;
+ auto _i32 = _o->i32;
+ auto _u32 = _o->u32;
+ auto _i64 = _o->i64;
+ auto _u64 = _o->u64;
+ auto _f32 = _o->f32;
+ auto _f64 = _o->f64;
+ auto _v8 = _o->v8.size() ? _fbb.CreateVector(_o->v8) : 0;
+ auto _vf64 = _o->vf64.size() ? _fbb.CreateVector(_o->vf64) : 0;
+ return MyGame::Example::CreateTypeAliases(
+ _fbb,
+ _i8,
+ _u8,
+ _i16,
+ _u16,
+ _i32,
+ _u32,
+ _i64,
+ _u64,
+ _f32,
+ _f64,
+ _v8,
+ _vf64);
+}
+
+inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *obj, Any type) {
+ switch (type) {
+ case Any::NONE: {
+ return true;
+ }
+ case Any::Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case Any::TestSimpleTableWithEnum: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case Any::MyGame_Example2_Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ default: return true;
+ }
+}
+
+inline bool VerifyAnyVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+ if (!values || !types) return !values && !types;
+ if (values->size() != types->size()) return false;
+ for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+ if (!VerifyAny(
+ verifier, values->Get(i), types->GetEnum<Any>(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+inline void *AnyUnion::UnPack(const void *obj, Any type, const flatbuffers::resolver_function_t *resolver) {
+ switch (type) {
+ case Any::Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case Any::TestSimpleTableWithEnum: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case Any::MyGame_Example2_Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ default: return nullptr;
+ }
+}
+
+inline flatbuffers::Offset<void> AnyUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
+ switch (type) {
+ case Any::Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ case Any::TestSimpleTableWithEnum: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);
+ return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();
+ }
+ case Any::MyGame_Example2_Monster: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ default: return 0;
+ }
+}
+
+inline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {
+ switch (type) {
+ case Any::Monster: {
+ FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
+ break;
+ }
+ case Any::TestSimpleTableWithEnum: {
+ value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));
+ break;
+ }
+ case Any::MyGame_Example2_Monster: {
+ value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+inline void AnyUnion::Reset() {
+ switch (type) {
+ case Any::Monster: {
+ auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ case Any::TestSimpleTableWithEnum: {
+ auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);
+ delete ptr;
+ break;
+ }
+ case Any::MyGame_Example2_Monster: {
+ auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ default: break;
+ }
+ value = nullptr;
+ type = Any::NONE;
+}
+
+inline bool VerifyAnyUniqueAliases(flatbuffers::Verifier &verifier, const void *obj, AnyUniqueAliases type) {
+ switch (type) {
+ case AnyUniqueAliases::NONE: {
+ return true;
+ }
+ case AnyUniqueAliases::M: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case AnyUniqueAliases::TS: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case AnyUniqueAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ default: return true;
+ }
+}
+
+inline bool VerifyAnyUniqueAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+ if (!values || !types) return !values && !types;
+ if (values->size() != types->size()) return false;
+ for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+ if (!VerifyAnyUniqueAliases(
+ verifier, values->Get(i), types->GetEnum<AnyUniqueAliases>(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+inline void *AnyUniqueAliasesUnion::UnPack(const void *obj, AnyUniqueAliases type, const flatbuffers::resolver_function_t *resolver) {
+ switch (type) {
+ case AnyUniqueAliases::M: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case AnyUniqueAliases::TS: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnum *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case AnyUniqueAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ default: return nullptr;
+ }
+}
+
+inline flatbuffers::Offset<void> AnyUniqueAliasesUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
+ switch (type) {
+ case AnyUniqueAliases::M: {
+ auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ case AnyUniqueAliases::TS: {
+ auto ptr = reinterpret_cast<const MyGame::Example::TestSimpleTableWithEnumT *>(value);
+ return CreateTestSimpleTableWithEnum(_fbb, ptr, _rehasher).Union();
+ }
+ case AnyUniqueAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example2::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ default: return 0;
+ }
+}
+
+inline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {
+ switch (type) {
+ case AnyUniqueAliases::M: {
+ FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
+ break;
+ }
+ case AnyUniqueAliases::TS: {
+ value = new MyGame::Example::TestSimpleTableWithEnumT(*reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(u.value));
+ break;
+ }
+ case AnyUniqueAliases::M2: {
+ value = new MyGame::Example2::MonsterT(*reinterpret_cast<MyGame::Example2::MonsterT *>(u.value));
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+inline void AnyUniqueAliasesUnion::Reset() {
+ switch (type) {
+ case AnyUniqueAliases::M: {
+ auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ case AnyUniqueAliases::TS: {
+ auto ptr = reinterpret_cast<MyGame::Example::TestSimpleTableWithEnumT *>(value);
+ delete ptr;
+ break;
+ }
+ case AnyUniqueAliases::M2: {
+ auto ptr = reinterpret_cast<MyGame::Example2::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ default: break;
+ }
+ value = nullptr;
+ type = AnyUniqueAliases::NONE;
+}
+
+inline bool VerifyAnyAmbiguousAliases(flatbuffers::Verifier &verifier, const void *obj, AnyAmbiguousAliases type) {
+ switch (type) {
+ case AnyAmbiguousAliases::NONE: {
+ return true;
+ }
+ case AnyAmbiguousAliases::M1: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case AnyAmbiguousAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case AnyAmbiguousAliases::M3: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ default: return true;
+ }
+}
+
+inline bool VerifyAnyAmbiguousAliasesVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+ if (!values || !types) return !values && !types;
+ if (values->size() != types->size()) return false;
+ for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+ if (!VerifyAnyAmbiguousAliases(
+ verifier, values->Get(i), types->GetEnum<AnyAmbiguousAliases>(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+inline void *AnyAmbiguousAliasesUnion::UnPack(const void *obj, AnyAmbiguousAliases type, const flatbuffers::resolver_function_t *resolver) {
+ switch (type) {
+ case AnyAmbiguousAliases::M1: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case AnyAmbiguousAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ case AnyAmbiguousAliases::M3: {
+ auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
+ return ptr->UnPack(resolver);
+ }
+ default: return nullptr;
+ }
+}
+
+inline flatbuffers::Offset<void> AnyAmbiguousAliasesUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const {
+ switch (type) {
+ case AnyAmbiguousAliases::M1: {
+ auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ case AnyAmbiguousAliases::M2: {
+ auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ case AnyAmbiguousAliases::M3: {
+ auto ptr = reinterpret_cast<const MyGame::Example::MonsterT *>(value);
+ return CreateMonster(_fbb, ptr, _rehasher).Union();
+ }
+ default: return 0;
+ }
+}
+
+inline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {
+ switch (type) {
+ case AnyAmbiguousAliases::M1: {
+ FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
+ break;
+ }
+ case AnyAmbiguousAliases::M2: {
+ FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
+ break;
+ }
+ case AnyAmbiguousAliases::M3: {
+ FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+inline void AnyAmbiguousAliasesUnion::Reset() {
+ switch (type) {
+ case AnyAmbiguousAliases::M1: {
+ auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ case AnyAmbiguousAliases::M2: {
+ auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ case AnyAmbiguousAliases::M3: {
+ auto ptr = reinterpret_cast<MyGame::Example::MonsterT *>(value);
+ delete ptr;
+ break;
+ }
+ default: break;
+ }
+ value = nullptr;
+ type = AnyAmbiguousAliases::NONE;
+}
+
+inline const flatbuffers::TypeTable *ColorTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_UCHAR, 0, 0 },
+ { flatbuffers::ET_UCHAR, 0, 0 },
+ { flatbuffers::ET_UCHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::ColorTypeTable
+ };
+ static const int64_t values[] = { 1, 2, 8 };
+ static const char * const names[] = {
+ "Red",
+ "Green",
+ "Blue"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *RaceTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::RaceTypeTable
+ };
+ static const int64_t values[] = { -1, 0, 1, 2 };
+ static const char * const names[] = {
+ "None",
+ "Human",
+ "Dwarf",
+ "Elf"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *AnyTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_SEQUENCE, 0, -1 },
+ { flatbuffers::ET_SEQUENCE, 0, 0 },
+ { flatbuffers::ET_SEQUENCE, 0, 1 },
+ { flatbuffers::ET_SEQUENCE, 0, 2 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::MonsterTypeTable,
+ MyGame::Example::TestSimpleTableWithEnumTypeTable,
+ MyGame::Example2::MonsterTypeTable
+ };
+ static const char * const names[] = {
+ "NONE",
+ "Monster",
+ "TestSimpleTableWithEnum",
+ "MyGame_Example2_Monster"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *AnyUniqueAliasesTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_SEQUENCE, 0, -1 },
+ { flatbuffers::ET_SEQUENCE, 0, 0 },
+ { flatbuffers::ET_SEQUENCE, 0, 1 },
+ { flatbuffers::ET_SEQUENCE, 0, 2 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::MonsterTypeTable,
+ MyGame::Example::TestSimpleTableWithEnumTypeTable,
+ MyGame::Example2::MonsterTypeTable
+ };
+ static const char * const names[] = {
+ "NONE",
+ "M",
+ "TS",
+ "M2"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *AnyAmbiguousAliasesTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_SEQUENCE, 0, -1 },
+ { flatbuffers::ET_SEQUENCE, 0, 0 },
+ { flatbuffers::ET_SEQUENCE, 0, 0 },
+ { flatbuffers::ET_SEQUENCE, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::MonsterTypeTable
+ };
+ static const char * const names[] = {
+ "NONE",
+ "M1",
+ "M2",
+ "M3"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+} // namespace Example
+
+inline const flatbuffers::TypeTable *InParentNamespaceTypeTable() {
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
+ };
+ return &tt;
+}
+
+namespace Example2 {
+
+inline const flatbuffers::TypeTable *MonsterTypeTable() {
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
+ };
+ return &tt;
+}
+
+} // namespace Example2
+
+namespace Example {
+
+inline const flatbuffers::TypeTable *TestTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 }
+ };
+ static const int64_t values[] = { 0, 2, 4 };
+ static const char * const names[] = {
+ "a",
+ "b"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *TestSimpleTableWithEnumTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_UCHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::ColorTypeTable
+ };
+ static const char * const names[] = {
+ "color"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *Vec3TypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, 0 },
+ { flatbuffers::ET_SEQUENCE, 0, 1 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::ColorTypeTable,
+ MyGame::Example::TestTypeTable
+ };
+ static const int64_t values[] = { 0, 4, 8, 16, 24, 26, 32 };
+ static const char * const names[] = {
+ "x",
+ "y",
+ "z",
+ "test1",
+ "test2",
+ "test3"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *AbilityTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 }
+ };
+ static const int64_t values[] = { 0, 4, 8 };
+ static const char * const names[] = {
+ "id",
+ "distance"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *StatTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_STRING, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 }
+ };
+ static const char * const names[] = {
+ "id",
+ "val",
+ "count"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *ReferrableTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_ULONG, 0, -1 }
+ };
+ static const char * const names[] = {
+ "id"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *MonsterTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_SEQUENCE, 0, 0 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_STRING, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_UCHAR, 1, -1 },
+ { flatbuffers::ET_UCHAR, 0, 1 },
+ { flatbuffers::ET_UTYPE, 0, 2 },
+ { flatbuffers::ET_SEQUENCE, 0, 2 },
+ { flatbuffers::ET_SEQUENCE, 1, 3 },
+ { flatbuffers::ET_STRING, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 1, 4 },
+ { flatbuffers::ET_SEQUENCE, 0, 4 },
+ { flatbuffers::ET_UCHAR, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 0, 5 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_BOOL, 1, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_STRING, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 1, 6 },
+ { flatbuffers::ET_UCHAR, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 1, 3 },
+ { flatbuffers::ET_LONG, 1, -1 },
+ { flatbuffers::ET_DOUBLE, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 0, 7 },
+ { flatbuffers::ET_SEQUENCE, 1, 8 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 1, -1 },
+ { flatbuffers::ET_SEQUENCE, 1, 8 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 1, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 1, -1 },
+ { flatbuffers::ET_UTYPE, 0, 9 },
+ { flatbuffers::ET_SEQUENCE, 0, 9 },
+ { flatbuffers::ET_UTYPE, 0, 10 },
+ { flatbuffers::ET_SEQUENCE, 0, 10 },
+ { flatbuffers::ET_UCHAR, 1, 1 },
+ { flatbuffers::ET_CHAR, 0, 11 },
+ { flatbuffers::ET_UCHAR, 1, -1 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::Vec3TypeTable,
+ MyGame::Example::ColorTypeTable,
+ MyGame::Example::AnyTypeTable,
+ MyGame::Example::TestTypeTable,
+ MyGame::Example::MonsterTypeTable,
+ MyGame::Example::StatTypeTable,
+ MyGame::Example::AbilityTypeTable,
+ MyGame::InParentNamespaceTypeTable,
+ MyGame::Example::ReferrableTypeTable,
+ MyGame::Example::AnyUniqueAliasesTypeTable,
+ MyGame::Example::AnyAmbiguousAliasesTypeTable,
+ MyGame::Example::RaceTypeTable
+ };
+ static const char * const names[] = {
+ "pos",
+ "mana",
+ "hp",
+ "name",
+ "friendly",
+ "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",
+ "vector_of_strong_referrables",
+ "co_owning_reference",
+ "vector_of_co_owning_references",
+ "non_owning_reference",
+ "vector_of_non_owning_references",
+ "any_unique_type",
+ "any_unique",
+ "any_ambiguous_type",
+ "any_ambiguous",
+ "vector_of_enums",
+ "signed_enum",
+ "testrequirednestedflatbuffer"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 50, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *TypeAliasesTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_CHAR, 1, -1 },
+ { flatbuffers::ET_DOUBLE, 1, -1 }
+ };
+ static const char * const names[] = {
+ "i8",
+ "u8",
+ "i16",
+ "u16",
+ "i32",
+ "u32",
+ "i64",
+ "u64",
+ "f32",
+ "f64",
+ "v8",
+ "vf64"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const MyGame::Example::Monster *GetMonster(const void *buf) {
+ return flatbuffers::GetRoot<MyGame::Example::Monster>(buf);
+}
+
+inline const MyGame::Example::Monster *GetSizePrefixedMonster(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<MyGame::Example::Monster>(buf);
+}
+
+inline Monster *GetMutableMonster(void *buf) {
+ return flatbuffers::GetMutableRoot<Monster>(buf);
+}
+
+inline const char *MonsterIdentifier() {
+ return "MONS";
+}
+
+inline bool MonsterBufferHasIdentifier(const void *buf) {
+ return flatbuffers::BufferHasIdentifier(
+ buf, MonsterIdentifier());
+}
+
+inline bool VerifyMonsterBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<MyGame::Example::Monster>(MonsterIdentifier());
+}
+
+inline bool VerifySizePrefixedMonsterBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<MyGame::Example::Monster>(MonsterIdentifier());
+}
+
+inline const char *MonsterExtension() {
+ return "mon";
+}
+
+inline void FinishMonsterBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<MyGame::Example::Monster> root) {
+ fbb.Finish(root, MonsterIdentifier());
+}
+
+inline void FinishSizePrefixedMonsterBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<MyGame::Example::Monster> root) {
+ fbb.FinishSizePrefixed(root, MonsterIdentifier());
+}
+
+inline std::unique_ptr<MyGame::Example::MonsterT> UnPackMonster(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<MyGame::Example::MonsterT>(GetMonster(buf)->UnPack(res));
+}
+
+inline std::unique_ptr<MyGame::Example::MonsterT> UnPackSizePrefixedMonster(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<MyGame::Example::MonsterT>(GetSizePrefixedMonster(buf)->UnPack(res));
+}
+
+} // namespace Example
+} // namespace MyGame
+
+#endif // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_H_
diff --git a/tests/cpp17/generated_cpp17/optional_scalars2_generated.h b/tests/cpp17/generated_cpp17/optional_scalars2_generated.h
new file mode 100644
index 0000000..1aba093
--- /dev/null
+++ b/tests/cpp17/generated_cpp17/optional_scalars2_generated.h
@@ -0,0 +1,902 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_OPTIONALSCALARS2_OPTIONAL_SCALARS_H_
+#define FLATBUFFERS_GENERATED_OPTIONALSCALARS2_OPTIONAL_SCALARS_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace optional_scalars {
+
+struct ScalarStuff;
+struct ScalarStuffBuilder;
+struct ScalarStuffT;
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable();
+
+enum class OptionalByte : int8_t {
+ None = 0,
+ One = 1,
+ Two = 2,
+ MIN = None,
+ MAX = Two
+};
+
+inline const OptionalByte (&EnumValuesOptionalByte())[3] {
+ static const OptionalByte values[] = {
+ OptionalByte::None,
+ OptionalByte::One,
+ OptionalByte::Two
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesOptionalByte() {
+ static const char * const names[4] = {
+ "None",
+ "One",
+ "Two",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameOptionalByte(OptionalByte e) {
+ if (flatbuffers::IsOutRange(e, OptionalByte::None, OptionalByte::Two)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesOptionalByte()[index];
+}
+
+struct ScalarStuffT : public flatbuffers::NativeTable {
+ typedef ScalarStuff TableType;
+ int8_t just_i8 = 0;
+ flatbuffers::Optional<int8_t> maybe_i8 = flatbuffers::nullopt;
+ int8_t default_i8 = 42;
+ uint8_t just_u8 = 0;
+ flatbuffers::Optional<uint8_t> maybe_u8 = flatbuffers::nullopt;
+ uint8_t default_u8 = 42;
+ int16_t just_i16 = 0;
+ flatbuffers::Optional<int16_t> maybe_i16 = flatbuffers::nullopt;
+ int16_t default_i16 = 42;
+ uint16_t just_u16 = 0;
+ flatbuffers::Optional<uint16_t> maybe_u16 = flatbuffers::nullopt;
+ uint16_t default_u16 = 42;
+ int32_t just_i32 = 0;
+ flatbuffers::Optional<int32_t> maybe_i32 = flatbuffers::nullopt;
+ int32_t default_i32 = 42;
+ uint32_t just_u32 = 0;
+ flatbuffers::Optional<uint32_t> maybe_u32 = flatbuffers::nullopt;
+ uint32_t default_u32 = 42;
+ int64_t just_i64 = 0;
+ flatbuffers::Optional<int64_t> maybe_i64 = flatbuffers::nullopt;
+ int64_t default_i64 = 42LL;
+ uint64_t just_u64 = 0;
+ flatbuffers::Optional<uint64_t> maybe_u64 = flatbuffers::nullopt;
+ uint64_t default_u64 = 42ULL;
+ float just_f32 = 0.0f;
+ flatbuffers::Optional<float> maybe_f32 = flatbuffers::nullopt;
+ float default_f32 = 42.0f;
+ double just_f64 = 0.0;
+ flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
+ double default_f64 = 42.0;
+ bool just_bool = false;
+ flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt;
+ bool default_bool = true;
+ optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None;
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum = flatbuffers::nullopt;
+ optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One;
+};
+
+struct ScalarStuff FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef ScalarStuffT NativeTableType;
+ typedef ScalarStuffBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return ScalarStuffTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_JUST_I8 = 4,
+ VT_MAYBE_I8 = 6,
+ VT_DEFAULT_I8 = 8,
+ VT_JUST_U8 = 10,
+ VT_MAYBE_U8 = 12,
+ VT_DEFAULT_U8 = 14,
+ VT_JUST_I16 = 16,
+ VT_MAYBE_I16 = 18,
+ VT_DEFAULT_I16 = 20,
+ VT_JUST_U16 = 22,
+ VT_MAYBE_U16 = 24,
+ VT_DEFAULT_U16 = 26,
+ VT_JUST_I32 = 28,
+ VT_MAYBE_I32 = 30,
+ VT_DEFAULT_I32 = 32,
+ VT_JUST_U32 = 34,
+ VT_MAYBE_U32 = 36,
+ VT_DEFAULT_U32 = 38,
+ VT_JUST_I64 = 40,
+ VT_MAYBE_I64 = 42,
+ VT_DEFAULT_I64 = 44,
+ VT_JUST_U64 = 46,
+ VT_MAYBE_U64 = 48,
+ VT_DEFAULT_U64 = 50,
+ VT_JUST_F32 = 52,
+ VT_MAYBE_F32 = 54,
+ VT_DEFAULT_F32 = 56,
+ VT_JUST_F64 = 58,
+ VT_MAYBE_F64 = 60,
+ VT_DEFAULT_F64 = 62,
+ VT_JUST_BOOL = 64,
+ VT_MAYBE_BOOL = 66,
+ VT_DEFAULT_BOOL = 68,
+ VT_JUST_ENUM = 70,
+ VT_MAYBE_ENUM = 72,
+ VT_DEFAULT_ENUM = 74
+ };
+ int8_t just_i8() const {
+ return GetField<int8_t>(VT_JUST_I8, 0);
+ }
+ bool mutate_just_i8(int8_t _just_i8) {
+ return SetField<int8_t>(VT_JUST_I8, _just_i8, 0);
+ }
+ flatbuffers::Optional<int8_t> maybe_i8() const {
+ return GetOptional<int8_t, int8_t>(VT_MAYBE_I8);
+ }
+ bool mutate_maybe_i8(int8_t _maybe_i8) {
+ return SetField<int8_t>(VT_MAYBE_I8, _maybe_i8);
+ }
+ int8_t default_i8() const {
+ return GetField<int8_t>(VT_DEFAULT_I8, 42);
+ }
+ bool mutate_default_i8(int8_t _default_i8) {
+ return SetField<int8_t>(VT_DEFAULT_I8, _default_i8, 42);
+ }
+ uint8_t just_u8() const {
+ return GetField<uint8_t>(VT_JUST_U8, 0);
+ }
+ bool mutate_just_u8(uint8_t _just_u8) {
+ return SetField<uint8_t>(VT_JUST_U8, _just_u8, 0);
+ }
+ flatbuffers::Optional<uint8_t> maybe_u8() const {
+ return GetOptional<uint8_t, uint8_t>(VT_MAYBE_U8);
+ }
+ bool mutate_maybe_u8(uint8_t _maybe_u8) {
+ return SetField<uint8_t>(VT_MAYBE_U8, _maybe_u8);
+ }
+ uint8_t default_u8() const {
+ return GetField<uint8_t>(VT_DEFAULT_U8, 42);
+ }
+ bool mutate_default_u8(uint8_t _default_u8) {
+ return SetField<uint8_t>(VT_DEFAULT_U8, _default_u8, 42);
+ }
+ int16_t just_i16() const {
+ return GetField<int16_t>(VT_JUST_I16, 0);
+ }
+ bool mutate_just_i16(int16_t _just_i16) {
+ return SetField<int16_t>(VT_JUST_I16, _just_i16, 0);
+ }
+ flatbuffers::Optional<int16_t> maybe_i16() const {
+ return GetOptional<int16_t, int16_t>(VT_MAYBE_I16);
+ }
+ bool mutate_maybe_i16(int16_t _maybe_i16) {
+ return SetField<int16_t>(VT_MAYBE_I16, _maybe_i16);
+ }
+ int16_t default_i16() const {
+ return GetField<int16_t>(VT_DEFAULT_I16, 42);
+ }
+ bool mutate_default_i16(int16_t _default_i16) {
+ return SetField<int16_t>(VT_DEFAULT_I16, _default_i16, 42);
+ }
+ uint16_t just_u16() const {
+ return GetField<uint16_t>(VT_JUST_U16, 0);
+ }
+ bool mutate_just_u16(uint16_t _just_u16) {
+ return SetField<uint16_t>(VT_JUST_U16, _just_u16, 0);
+ }
+ flatbuffers::Optional<uint16_t> maybe_u16() const {
+ return GetOptional<uint16_t, uint16_t>(VT_MAYBE_U16);
+ }
+ bool mutate_maybe_u16(uint16_t _maybe_u16) {
+ return SetField<uint16_t>(VT_MAYBE_U16, _maybe_u16);
+ }
+ uint16_t default_u16() const {
+ return GetField<uint16_t>(VT_DEFAULT_U16, 42);
+ }
+ bool mutate_default_u16(uint16_t _default_u16) {
+ return SetField<uint16_t>(VT_DEFAULT_U16, _default_u16, 42);
+ }
+ int32_t just_i32() const {
+ return GetField<int32_t>(VT_JUST_I32, 0);
+ }
+ bool mutate_just_i32(int32_t _just_i32) {
+ return SetField<int32_t>(VT_JUST_I32, _just_i32, 0);
+ }
+ flatbuffers::Optional<int32_t> maybe_i32() const {
+ return GetOptional<int32_t, int32_t>(VT_MAYBE_I32);
+ }
+ bool mutate_maybe_i32(int32_t _maybe_i32) {
+ return SetField<int32_t>(VT_MAYBE_I32, _maybe_i32);
+ }
+ int32_t default_i32() const {
+ return GetField<int32_t>(VT_DEFAULT_I32, 42);
+ }
+ bool mutate_default_i32(int32_t _default_i32) {
+ return SetField<int32_t>(VT_DEFAULT_I32, _default_i32, 42);
+ }
+ uint32_t just_u32() const {
+ return GetField<uint32_t>(VT_JUST_U32, 0);
+ }
+ bool mutate_just_u32(uint32_t _just_u32) {
+ return SetField<uint32_t>(VT_JUST_U32, _just_u32, 0);
+ }
+ flatbuffers::Optional<uint32_t> maybe_u32() const {
+ return GetOptional<uint32_t, uint32_t>(VT_MAYBE_U32);
+ }
+ bool mutate_maybe_u32(uint32_t _maybe_u32) {
+ return SetField<uint32_t>(VT_MAYBE_U32, _maybe_u32);
+ }
+ uint32_t default_u32() const {
+ return GetField<uint32_t>(VT_DEFAULT_U32, 42);
+ }
+ bool mutate_default_u32(uint32_t _default_u32) {
+ return SetField<uint32_t>(VT_DEFAULT_U32, _default_u32, 42);
+ }
+ int64_t just_i64() const {
+ return GetField<int64_t>(VT_JUST_I64, 0);
+ }
+ bool mutate_just_i64(int64_t _just_i64) {
+ return SetField<int64_t>(VT_JUST_I64, _just_i64, 0);
+ }
+ flatbuffers::Optional<int64_t> maybe_i64() const {
+ return GetOptional<int64_t, int64_t>(VT_MAYBE_I64);
+ }
+ bool mutate_maybe_i64(int64_t _maybe_i64) {
+ return SetField<int64_t>(VT_MAYBE_I64, _maybe_i64);
+ }
+ int64_t default_i64() const {
+ return GetField<int64_t>(VT_DEFAULT_I64, 42LL);
+ }
+ bool mutate_default_i64(int64_t _default_i64) {
+ return SetField<int64_t>(VT_DEFAULT_I64, _default_i64, 42LL);
+ }
+ uint64_t just_u64() const {
+ return GetField<uint64_t>(VT_JUST_U64, 0);
+ }
+ bool mutate_just_u64(uint64_t _just_u64) {
+ return SetField<uint64_t>(VT_JUST_U64, _just_u64, 0);
+ }
+ flatbuffers::Optional<uint64_t> maybe_u64() const {
+ return GetOptional<uint64_t, uint64_t>(VT_MAYBE_U64);
+ }
+ bool mutate_maybe_u64(uint64_t _maybe_u64) {
+ return SetField<uint64_t>(VT_MAYBE_U64, _maybe_u64);
+ }
+ uint64_t default_u64() const {
+ return GetField<uint64_t>(VT_DEFAULT_U64, 42ULL);
+ }
+ bool mutate_default_u64(uint64_t _default_u64) {
+ return SetField<uint64_t>(VT_DEFAULT_U64, _default_u64, 42ULL);
+ }
+ float just_f32() const {
+ return GetField<float>(VT_JUST_F32, 0.0f);
+ }
+ bool mutate_just_f32(float _just_f32) {
+ return SetField<float>(VT_JUST_F32, _just_f32, 0.0f);
+ }
+ flatbuffers::Optional<float> maybe_f32() const {
+ return GetOptional<float, float>(VT_MAYBE_F32);
+ }
+ bool mutate_maybe_f32(float _maybe_f32) {
+ return SetField<float>(VT_MAYBE_F32, _maybe_f32);
+ }
+ float default_f32() const {
+ return GetField<float>(VT_DEFAULT_F32, 42.0f);
+ }
+ bool mutate_default_f32(float _default_f32) {
+ return SetField<float>(VT_DEFAULT_F32, _default_f32, 42.0f);
+ }
+ double just_f64() const {
+ return GetField<double>(VT_JUST_F64, 0.0);
+ }
+ bool mutate_just_f64(double _just_f64) {
+ return SetField<double>(VT_JUST_F64, _just_f64, 0.0);
+ }
+ flatbuffers::Optional<double> maybe_f64() const {
+ return GetOptional<double, double>(VT_MAYBE_F64);
+ }
+ bool mutate_maybe_f64(double _maybe_f64) {
+ return SetField<double>(VT_MAYBE_F64, _maybe_f64);
+ }
+ double default_f64() const {
+ return GetField<double>(VT_DEFAULT_F64, 42.0);
+ }
+ bool mutate_default_f64(double _default_f64) {
+ return SetField<double>(VT_DEFAULT_F64, _default_f64, 42.0);
+ }
+ bool just_bool() const {
+ return GetField<uint8_t>(VT_JUST_BOOL, 0) != 0;
+ }
+ bool mutate_just_bool(bool _just_bool) {
+ return SetField<uint8_t>(VT_JUST_BOOL, static_cast<uint8_t>(_just_bool), 0);
+ }
+ flatbuffers::Optional<bool> maybe_bool() const {
+ return GetOptional<uint8_t, bool>(VT_MAYBE_BOOL);
+ }
+ bool mutate_maybe_bool(bool _maybe_bool) {
+ return SetField<uint8_t>(VT_MAYBE_BOOL, static_cast<uint8_t>(_maybe_bool));
+ }
+ bool default_bool() const {
+ return GetField<uint8_t>(VT_DEFAULT_BOOL, 1) != 0;
+ }
+ bool mutate_default_bool(bool _default_bool) {
+ return SetField<uint8_t>(VT_DEFAULT_BOOL, static_cast<uint8_t>(_default_bool), 1);
+ }
+ optional_scalars::OptionalByte just_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_JUST_ENUM, 0));
+ }
+ bool mutate_just_enum(optional_scalars::OptionalByte _just_enum) {
+ return SetField<int8_t>(VT_JUST_ENUM, static_cast<int8_t>(_just_enum), 0);
+ }
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum() const {
+ return GetOptional<int8_t, optional_scalars::OptionalByte>(VT_MAYBE_ENUM);
+ }
+ bool mutate_maybe_enum(optional_scalars::OptionalByte _maybe_enum) {
+ return SetField<int8_t>(VT_MAYBE_ENUM, static_cast<int8_t>(_maybe_enum));
+ }
+ optional_scalars::OptionalByte default_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_DEFAULT_ENUM, 1));
+ }
+ bool mutate_default_enum(optional_scalars::OptionalByte _default_enum) {
+ return SetField<int8_t>(VT_DEFAULT_ENUM, static_cast<int8_t>(_default_enum), 1);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int8_t>(verifier, VT_JUST_I8) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_I8) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_I8) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_U8) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_U8) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_U8) &&
+ VerifyField<int16_t>(verifier, VT_JUST_I16) &&
+ VerifyField<int16_t>(verifier, VT_MAYBE_I16) &&
+ VerifyField<int16_t>(verifier, VT_DEFAULT_I16) &&
+ VerifyField<uint16_t>(verifier, VT_JUST_U16) &&
+ VerifyField<uint16_t>(verifier, VT_MAYBE_U16) &&
+ VerifyField<uint16_t>(verifier, VT_DEFAULT_U16) &&
+ VerifyField<int32_t>(verifier, VT_JUST_I32) &&
+ VerifyField<int32_t>(verifier, VT_MAYBE_I32) &&
+ VerifyField<int32_t>(verifier, VT_DEFAULT_I32) &&
+ VerifyField<uint32_t>(verifier, VT_JUST_U32) &&
+ VerifyField<uint32_t>(verifier, VT_MAYBE_U32) &&
+ VerifyField<uint32_t>(verifier, VT_DEFAULT_U32) &&
+ VerifyField<int64_t>(verifier, VT_JUST_I64) &&
+ VerifyField<int64_t>(verifier, VT_MAYBE_I64) &&
+ VerifyField<int64_t>(verifier, VT_DEFAULT_I64) &&
+ VerifyField<uint64_t>(verifier, VT_JUST_U64) &&
+ VerifyField<uint64_t>(verifier, VT_MAYBE_U64) &&
+ VerifyField<uint64_t>(verifier, VT_DEFAULT_U64) &&
+ VerifyField<float>(verifier, VT_JUST_F32) &&
+ VerifyField<float>(verifier, VT_MAYBE_F32) &&
+ VerifyField<float>(verifier, VT_DEFAULT_F32) &&
+ VerifyField<double>(verifier, VT_JUST_F64) &&
+ VerifyField<double>(verifier, VT_MAYBE_F64) &&
+ VerifyField<double>(verifier, VT_DEFAULT_F64) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_BOOL) &&
+ VerifyField<int8_t>(verifier, VT_JUST_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_ENUM) &&
+ verifier.EndTable();
+ }
+ ScalarStuffT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<ScalarStuff> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct ScalarStuffBuilder {
+ typedef ScalarStuff Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_just_i8(int8_t just_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_I8, just_i8, 0);
+ }
+ void add_maybe_i8(int8_t maybe_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_I8, maybe_i8);
+ }
+ void add_default_i8(int8_t default_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_I8, default_i8, 42);
+ }
+ void add_just_u8(uint8_t just_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_U8, just_u8, 0);
+ }
+ void add_maybe_u8(uint8_t maybe_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_U8, maybe_u8);
+ }
+ void add_default_u8(uint8_t default_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_U8, default_u8, 42);
+ }
+ void add_just_i16(int16_t just_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_JUST_I16, just_i16, 0);
+ }
+ void add_maybe_i16(int16_t maybe_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_MAYBE_I16, maybe_i16);
+ }
+ void add_default_i16(int16_t default_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_DEFAULT_I16, default_i16, 42);
+ }
+ void add_just_u16(uint16_t just_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_JUST_U16, just_u16, 0);
+ }
+ void add_maybe_u16(uint16_t maybe_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_MAYBE_U16, maybe_u16);
+ }
+ void add_default_u16(uint16_t default_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_DEFAULT_U16, default_u16, 42);
+ }
+ void add_just_i32(int32_t just_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_JUST_I32, just_i32, 0);
+ }
+ void add_maybe_i32(int32_t maybe_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_MAYBE_I32, maybe_i32);
+ }
+ void add_default_i32(int32_t default_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_DEFAULT_I32, default_i32, 42);
+ }
+ void add_just_u32(uint32_t just_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_JUST_U32, just_u32, 0);
+ }
+ void add_maybe_u32(uint32_t maybe_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_MAYBE_U32, maybe_u32);
+ }
+ void add_default_u32(uint32_t default_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_DEFAULT_U32, default_u32, 42);
+ }
+ void add_just_i64(int64_t just_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_JUST_I64, just_i64, 0);
+ }
+ void add_maybe_i64(int64_t maybe_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_MAYBE_I64, maybe_i64);
+ }
+ void add_default_i64(int64_t default_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_DEFAULT_I64, default_i64, 42LL);
+ }
+ void add_just_u64(uint64_t just_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_JUST_U64, just_u64, 0);
+ }
+ void add_maybe_u64(uint64_t maybe_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_MAYBE_U64, maybe_u64);
+ }
+ void add_default_u64(uint64_t default_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_DEFAULT_U64, default_u64, 42ULL);
+ }
+ void add_just_f32(float just_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_JUST_F32, just_f32, 0.0f);
+ }
+ void add_maybe_f32(float maybe_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_MAYBE_F32, maybe_f32);
+ }
+ void add_default_f32(float default_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_DEFAULT_F32, default_f32, 42.0f);
+ }
+ void add_just_f64(double just_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_JUST_F64, just_f64, 0.0);
+ }
+ void add_maybe_f64(double maybe_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_MAYBE_F64, maybe_f64);
+ }
+ void add_default_f64(double default_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_DEFAULT_F64, default_f64, 42.0);
+ }
+ void add_just_bool(bool just_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_BOOL, static_cast<uint8_t>(just_bool), 0);
+ }
+ void add_maybe_bool(bool maybe_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_BOOL, static_cast<uint8_t>(maybe_bool));
+ }
+ void add_default_bool(bool default_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_BOOL, static_cast<uint8_t>(default_bool), 1);
+ }
+ void add_just_enum(optional_scalars::OptionalByte just_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_ENUM, static_cast<int8_t>(just_enum), 0);
+ }
+ void add_maybe_enum(optional_scalars::OptionalByte maybe_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_ENUM, static_cast<int8_t>(maybe_enum));
+ }
+ void add_default_enum(optional_scalars::OptionalByte default_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_ENUM, static_cast<int8_t>(default_enum), 1);
+ }
+ explicit ScalarStuffBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<ScalarStuff> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<ScalarStuff>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int8_t just_i8 = 0,
+ flatbuffers::Optional<int8_t> maybe_i8 = flatbuffers::nullopt,
+ int8_t default_i8 = 42,
+ uint8_t just_u8 = 0,
+ flatbuffers::Optional<uint8_t> maybe_u8 = flatbuffers::nullopt,
+ uint8_t default_u8 = 42,
+ int16_t just_i16 = 0,
+ flatbuffers::Optional<int16_t> maybe_i16 = flatbuffers::nullopt,
+ int16_t default_i16 = 42,
+ uint16_t just_u16 = 0,
+ flatbuffers::Optional<uint16_t> maybe_u16 = flatbuffers::nullopt,
+ uint16_t default_u16 = 42,
+ int32_t just_i32 = 0,
+ flatbuffers::Optional<int32_t> maybe_i32 = flatbuffers::nullopt,
+ int32_t default_i32 = 42,
+ uint32_t just_u32 = 0,
+ flatbuffers::Optional<uint32_t> maybe_u32 = flatbuffers::nullopt,
+ uint32_t default_u32 = 42,
+ int64_t just_i64 = 0,
+ flatbuffers::Optional<int64_t> maybe_i64 = flatbuffers::nullopt,
+ int64_t default_i64 = 42LL,
+ uint64_t just_u64 = 0,
+ flatbuffers::Optional<uint64_t> maybe_u64 = flatbuffers::nullopt,
+ uint64_t default_u64 = 42ULL,
+ float just_f32 = 0.0f,
+ flatbuffers::Optional<float> maybe_f32 = flatbuffers::nullopt,
+ float default_f32 = 42.0f,
+ double just_f64 = 0.0,
+ flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt,
+ double default_f64 = 42.0,
+ bool just_bool = false,
+ flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt,
+ bool default_bool = true,
+ optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None,
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum = flatbuffers::nullopt,
+ optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One) {
+ ScalarStuffBuilder builder_(_fbb);
+ builder_.add_default_f64(default_f64);
+ if(maybe_f64) { builder_.add_maybe_f64(*maybe_f64); }
+ builder_.add_just_f64(just_f64);
+ builder_.add_default_u64(default_u64);
+ if(maybe_u64) { builder_.add_maybe_u64(*maybe_u64); }
+ builder_.add_just_u64(just_u64);
+ builder_.add_default_i64(default_i64);
+ if(maybe_i64) { builder_.add_maybe_i64(*maybe_i64); }
+ builder_.add_just_i64(just_i64);
+ builder_.add_default_f32(default_f32);
+ if(maybe_f32) { builder_.add_maybe_f32(*maybe_f32); }
+ builder_.add_just_f32(just_f32);
+ builder_.add_default_u32(default_u32);
+ if(maybe_u32) { builder_.add_maybe_u32(*maybe_u32); }
+ builder_.add_just_u32(just_u32);
+ builder_.add_default_i32(default_i32);
+ if(maybe_i32) { builder_.add_maybe_i32(*maybe_i32); }
+ builder_.add_just_i32(just_i32);
+ builder_.add_default_u16(default_u16);
+ if(maybe_u16) { builder_.add_maybe_u16(*maybe_u16); }
+ builder_.add_just_u16(just_u16);
+ builder_.add_default_i16(default_i16);
+ if(maybe_i16) { builder_.add_maybe_i16(*maybe_i16); }
+ builder_.add_just_i16(just_i16);
+ builder_.add_default_enum(default_enum);
+ if(maybe_enum) { builder_.add_maybe_enum(*maybe_enum); }
+ builder_.add_just_enum(just_enum);
+ builder_.add_default_bool(default_bool);
+ if(maybe_bool) { builder_.add_maybe_bool(*maybe_bool); }
+ builder_.add_just_bool(just_bool);
+ builder_.add_default_u8(default_u8);
+ if(maybe_u8) { builder_.add_maybe_u8(*maybe_u8); }
+ builder_.add_just_u8(just_u8);
+ builder_.add_default_i8(default_i8);
+ if(maybe_i8) { builder_.add_maybe_i8(*maybe_i8); }
+ builder_.add_just_i8(just_i8);
+ return builder_.Finish();
+}
+
+struct ScalarStuff::Traits {
+ using type = ScalarStuff;
+ static auto constexpr Create = CreateScalarStuff;
+};
+
+flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+inline ScalarStuffT *ScalarStuff::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<ScalarStuffT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void ScalarStuff::UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = just_i8(); _o->just_i8 = _e; }
+ { auto _e = maybe_i8(); _o->maybe_i8 = _e; }
+ { auto _e = default_i8(); _o->default_i8 = _e; }
+ { auto _e = just_u8(); _o->just_u8 = _e; }
+ { auto _e = maybe_u8(); _o->maybe_u8 = _e; }
+ { auto _e = default_u8(); _o->default_u8 = _e; }
+ { auto _e = just_i16(); _o->just_i16 = _e; }
+ { auto _e = maybe_i16(); _o->maybe_i16 = _e; }
+ { auto _e = default_i16(); _o->default_i16 = _e; }
+ { auto _e = just_u16(); _o->just_u16 = _e; }
+ { auto _e = maybe_u16(); _o->maybe_u16 = _e; }
+ { auto _e = default_u16(); _o->default_u16 = _e; }
+ { auto _e = just_i32(); _o->just_i32 = _e; }
+ { auto _e = maybe_i32(); _o->maybe_i32 = _e; }
+ { auto _e = default_i32(); _o->default_i32 = _e; }
+ { auto _e = just_u32(); _o->just_u32 = _e; }
+ { auto _e = maybe_u32(); _o->maybe_u32 = _e; }
+ { auto _e = default_u32(); _o->default_u32 = _e; }
+ { auto _e = just_i64(); _o->just_i64 = _e; }
+ { auto _e = maybe_i64(); _o->maybe_i64 = _e; }
+ { auto _e = default_i64(); _o->default_i64 = _e; }
+ { auto _e = just_u64(); _o->just_u64 = _e; }
+ { auto _e = maybe_u64(); _o->maybe_u64 = _e; }
+ { auto _e = default_u64(); _o->default_u64 = _e; }
+ { auto _e = just_f32(); _o->just_f32 = _e; }
+ { auto _e = maybe_f32(); _o->maybe_f32 = _e; }
+ { auto _e = default_f32(); _o->default_f32 = _e; }
+ { auto _e = just_f64(); _o->just_f64 = _e; }
+ { auto _e = maybe_f64(); _o->maybe_f64 = _e; }
+ { auto _e = default_f64(); _o->default_f64 = _e; }
+ { auto _e = just_bool(); _o->just_bool = _e; }
+ { auto _e = maybe_bool(); _o->maybe_bool = _e; }
+ { auto _e = default_bool(); _o->default_bool = _e; }
+ { auto _e = just_enum(); _o->just_enum = _e; }
+ { auto _e = maybe_enum(); _o->maybe_enum = _e; }
+ { auto _e = default_enum(); _o->default_enum = _e; }
+}
+
+inline flatbuffers::Offset<ScalarStuff> ScalarStuff::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateScalarStuff(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ScalarStuffT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _just_i8 = _o->just_i8;
+ auto _maybe_i8 = _o->maybe_i8;
+ auto _default_i8 = _o->default_i8;
+ auto _just_u8 = _o->just_u8;
+ auto _maybe_u8 = _o->maybe_u8;
+ auto _default_u8 = _o->default_u8;
+ auto _just_i16 = _o->just_i16;
+ auto _maybe_i16 = _o->maybe_i16;
+ auto _default_i16 = _o->default_i16;
+ auto _just_u16 = _o->just_u16;
+ auto _maybe_u16 = _o->maybe_u16;
+ auto _default_u16 = _o->default_u16;
+ auto _just_i32 = _o->just_i32;
+ auto _maybe_i32 = _o->maybe_i32;
+ auto _default_i32 = _o->default_i32;
+ auto _just_u32 = _o->just_u32;
+ auto _maybe_u32 = _o->maybe_u32;
+ auto _default_u32 = _o->default_u32;
+ auto _just_i64 = _o->just_i64;
+ auto _maybe_i64 = _o->maybe_i64;
+ auto _default_i64 = _o->default_i64;
+ auto _just_u64 = _o->just_u64;
+ auto _maybe_u64 = _o->maybe_u64;
+ auto _default_u64 = _o->default_u64;
+ auto _just_f32 = _o->just_f32;
+ auto _maybe_f32 = _o->maybe_f32;
+ auto _default_f32 = _o->default_f32;
+ auto _just_f64 = _o->just_f64;
+ auto _maybe_f64 = _o->maybe_f64;
+ auto _default_f64 = _o->default_f64;
+ auto _just_bool = _o->just_bool;
+ auto _maybe_bool = _o->maybe_bool;
+ auto _default_bool = _o->default_bool;
+ auto _just_enum = _o->just_enum;
+ auto _maybe_enum = _o->maybe_enum;
+ auto _default_enum = _o->default_enum;
+ return optional_scalars::CreateScalarStuff(
+ _fbb,
+ _just_i8,
+ _maybe_i8,
+ _default_i8,
+ _just_u8,
+ _maybe_u8,
+ _default_u8,
+ _just_i16,
+ _maybe_i16,
+ _default_i16,
+ _just_u16,
+ _maybe_u16,
+ _default_u16,
+ _just_i32,
+ _maybe_i32,
+ _default_i32,
+ _just_u32,
+ _maybe_u32,
+ _default_u32,
+ _just_i64,
+ _maybe_i64,
+ _default_i64,
+ _just_u64,
+ _maybe_u64,
+ _default_u64,
+ _just_f32,
+ _maybe_f32,
+ _default_f32,
+ _just_f64,
+ _maybe_f64,
+ _default_f64,
+ _just_bool,
+ _maybe_bool,
+ _default_bool,
+ _just_enum,
+ _maybe_enum,
+ _default_enum);
+}
+
+inline const flatbuffers::TypeTable *OptionalByteTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "None",
+ "One",
+ "Two"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "just_i8",
+ "maybe_i8",
+ "default_i8",
+ "just_u8",
+ "maybe_u8",
+ "default_u8",
+ "just_i16",
+ "maybe_i16",
+ "default_i16",
+ "just_u16",
+ "maybe_u16",
+ "default_u16",
+ "just_i32",
+ "maybe_i32",
+ "default_i32",
+ "just_u32",
+ "maybe_u32",
+ "default_u32",
+ "just_i64",
+ "maybe_i64",
+ "default_i64",
+ "just_u64",
+ "maybe_u64",
+ "default_u64",
+ "just_f32",
+ "maybe_f32",
+ "default_f32",
+ "just_f64",
+ "maybe_f64",
+ "default_f64",
+ "just_bool",
+ "maybe_bool",
+ "default_bool",
+ "just_enum",
+ "maybe_enum",
+ "default_enum"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 36, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const optional_scalars::ScalarStuff *GetScalarStuff(const void *buf) {
+ return flatbuffers::GetRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline const optional_scalars::ScalarStuff *GetSizePrefixedScalarStuff(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline ScalarStuff *GetMutableScalarStuff(void *buf) {
+ return flatbuffers::GetMutableRoot<ScalarStuff>(buf);
+}
+
+inline const char *ScalarStuffIdentifier() {
+ return "NULL";
+}
+
+inline bool ScalarStuffBufferHasIdentifier(const void *buf) {
+ return flatbuffers::BufferHasIdentifier(
+ buf, ScalarStuffIdentifier());
+}
+
+inline bool VerifyScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline bool VerifySizePrefixedScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline const char *ScalarStuffExtension() {
+ return "mon";
+}
+
+inline void FinishScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.Finish(root, ScalarStuffIdentifier());
+}
+
+inline void FinishSizePrefixedScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.FinishSizePrefixed(root, ScalarStuffIdentifier());
+}
+
+inline std::unique_ptr<optional_scalars::ScalarStuffT> UnPackScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<optional_scalars::ScalarStuffT>(GetScalarStuff(buf)->UnPack(res));
+}
+
+inline std::unique_ptr<optional_scalars::ScalarStuffT> UnPackSizePrefixedScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<optional_scalars::ScalarStuffT>(GetSizePrefixedScalarStuff(buf)->UnPack(res));
+}
+
+} // namespace optional_scalars
+
+#endif // FLATBUFFERS_GENERATED_OPTIONALSCALARS2_OPTIONAL_SCALARS_H_
diff --git a/tests/cpp17/generated_cpp17/optional_scalars_generated.h b/tests/cpp17/generated_cpp17/optional_scalars_generated.h
new file mode 100644
index 0000000..7581e38
--- /dev/null
+++ b/tests/cpp17/generated_cpp17/optional_scalars_generated.h
@@ -0,0 +1,902 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
+#define FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace optional_scalars {
+
+struct ScalarStuff;
+struct ScalarStuffBuilder;
+struct ScalarStuffT;
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable();
+
+enum class OptionalByte : int8_t {
+ None = 0,
+ One = 1,
+ Two = 2,
+ MIN = None,
+ MAX = Two
+};
+
+inline const OptionalByte (&EnumValuesOptionalByte())[3] {
+ static const OptionalByte values[] = {
+ OptionalByte::None,
+ OptionalByte::One,
+ OptionalByte::Two
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesOptionalByte() {
+ static const char * const names[4] = {
+ "None",
+ "One",
+ "Two",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameOptionalByte(OptionalByte e) {
+ if (flatbuffers::IsOutRange(e, OptionalByte::None, OptionalByte::Two)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesOptionalByte()[index];
+}
+
+struct ScalarStuffT : public flatbuffers::NativeTable {
+ typedef ScalarStuff TableType;
+ int8_t just_i8 = 0;
+ flatbuffers::Optional<int8_t> maybe_i8 = flatbuffers::nullopt;
+ int8_t default_i8 = 42;
+ uint8_t just_u8 = 0;
+ flatbuffers::Optional<uint8_t> maybe_u8 = flatbuffers::nullopt;
+ uint8_t default_u8 = 42;
+ int16_t just_i16 = 0;
+ flatbuffers::Optional<int16_t> maybe_i16 = flatbuffers::nullopt;
+ int16_t default_i16 = 42;
+ uint16_t just_u16 = 0;
+ flatbuffers::Optional<uint16_t> maybe_u16 = flatbuffers::nullopt;
+ uint16_t default_u16 = 42;
+ int32_t just_i32 = 0;
+ flatbuffers::Optional<int32_t> maybe_i32 = flatbuffers::nullopt;
+ int32_t default_i32 = 42;
+ uint32_t just_u32 = 0;
+ flatbuffers::Optional<uint32_t> maybe_u32 = flatbuffers::nullopt;
+ uint32_t default_u32 = 42;
+ int64_t just_i64 = 0;
+ flatbuffers::Optional<int64_t> maybe_i64 = flatbuffers::nullopt;
+ int64_t default_i64 = 42LL;
+ uint64_t just_u64 = 0;
+ flatbuffers::Optional<uint64_t> maybe_u64 = flatbuffers::nullopt;
+ uint64_t default_u64 = 42ULL;
+ float just_f32 = 0.0f;
+ flatbuffers::Optional<float> maybe_f32 = flatbuffers::nullopt;
+ float default_f32 = 42.0f;
+ double just_f64 = 0.0;
+ flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
+ double default_f64 = 42.0;
+ bool just_bool = false;
+ flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt;
+ bool default_bool = true;
+ optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None;
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum = flatbuffers::nullopt;
+ optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One;
+};
+
+struct ScalarStuff FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef ScalarStuffT NativeTableType;
+ typedef ScalarStuffBuilder Builder;
+ struct Traits;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return ScalarStuffTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_JUST_I8 = 4,
+ VT_MAYBE_I8 = 6,
+ VT_DEFAULT_I8 = 8,
+ VT_JUST_U8 = 10,
+ VT_MAYBE_U8 = 12,
+ VT_DEFAULT_U8 = 14,
+ VT_JUST_I16 = 16,
+ VT_MAYBE_I16 = 18,
+ VT_DEFAULT_I16 = 20,
+ VT_JUST_U16 = 22,
+ VT_MAYBE_U16 = 24,
+ VT_DEFAULT_U16 = 26,
+ VT_JUST_I32 = 28,
+ VT_MAYBE_I32 = 30,
+ VT_DEFAULT_I32 = 32,
+ VT_JUST_U32 = 34,
+ VT_MAYBE_U32 = 36,
+ VT_DEFAULT_U32 = 38,
+ VT_JUST_I64 = 40,
+ VT_MAYBE_I64 = 42,
+ VT_DEFAULT_I64 = 44,
+ VT_JUST_U64 = 46,
+ VT_MAYBE_U64 = 48,
+ VT_DEFAULT_U64 = 50,
+ VT_JUST_F32 = 52,
+ VT_MAYBE_F32 = 54,
+ VT_DEFAULT_F32 = 56,
+ VT_JUST_F64 = 58,
+ VT_MAYBE_F64 = 60,
+ VT_DEFAULT_F64 = 62,
+ VT_JUST_BOOL = 64,
+ VT_MAYBE_BOOL = 66,
+ VT_DEFAULT_BOOL = 68,
+ VT_JUST_ENUM = 70,
+ VT_MAYBE_ENUM = 72,
+ VT_DEFAULT_ENUM = 74
+ };
+ int8_t just_i8() const {
+ return GetField<int8_t>(VT_JUST_I8, 0);
+ }
+ bool mutate_just_i8(int8_t _just_i8) {
+ return SetField<int8_t>(VT_JUST_I8, _just_i8, 0);
+ }
+ flatbuffers::Optional<int8_t> maybe_i8() const {
+ return GetOptional<int8_t, int8_t>(VT_MAYBE_I8);
+ }
+ bool mutate_maybe_i8(int8_t _maybe_i8) {
+ return SetField<int8_t>(VT_MAYBE_I8, _maybe_i8);
+ }
+ int8_t default_i8() const {
+ return GetField<int8_t>(VT_DEFAULT_I8, 42);
+ }
+ bool mutate_default_i8(int8_t _default_i8) {
+ return SetField<int8_t>(VT_DEFAULT_I8, _default_i8, 42);
+ }
+ uint8_t just_u8() const {
+ return GetField<uint8_t>(VT_JUST_U8, 0);
+ }
+ bool mutate_just_u8(uint8_t _just_u8) {
+ return SetField<uint8_t>(VT_JUST_U8, _just_u8, 0);
+ }
+ flatbuffers::Optional<uint8_t> maybe_u8() const {
+ return GetOptional<uint8_t, uint8_t>(VT_MAYBE_U8);
+ }
+ bool mutate_maybe_u8(uint8_t _maybe_u8) {
+ return SetField<uint8_t>(VT_MAYBE_U8, _maybe_u8);
+ }
+ uint8_t default_u8() const {
+ return GetField<uint8_t>(VT_DEFAULT_U8, 42);
+ }
+ bool mutate_default_u8(uint8_t _default_u8) {
+ return SetField<uint8_t>(VT_DEFAULT_U8, _default_u8, 42);
+ }
+ int16_t just_i16() const {
+ return GetField<int16_t>(VT_JUST_I16, 0);
+ }
+ bool mutate_just_i16(int16_t _just_i16) {
+ return SetField<int16_t>(VT_JUST_I16, _just_i16, 0);
+ }
+ flatbuffers::Optional<int16_t> maybe_i16() const {
+ return GetOptional<int16_t, int16_t>(VT_MAYBE_I16);
+ }
+ bool mutate_maybe_i16(int16_t _maybe_i16) {
+ return SetField<int16_t>(VT_MAYBE_I16, _maybe_i16);
+ }
+ int16_t default_i16() const {
+ return GetField<int16_t>(VT_DEFAULT_I16, 42);
+ }
+ bool mutate_default_i16(int16_t _default_i16) {
+ return SetField<int16_t>(VT_DEFAULT_I16, _default_i16, 42);
+ }
+ uint16_t just_u16() const {
+ return GetField<uint16_t>(VT_JUST_U16, 0);
+ }
+ bool mutate_just_u16(uint16_t _just_u16) {
+ return SetField<uint16_t>(VT_JUST_U16, _just_u16, 0);
+ }
+ flatbuffers::Optional<uint16_t> maybe_u16() const {
+ return GetOptional<uint16_t, uint16_t>(VT_MAYBE_U16);
+ }
+ bool mutate_maybe_u16(uint16_t _maybe_u16) {
+ return SetField<uint16_t>(VT_MAYBE_U16, _maybe_u16);
+ }
+ uint16_t default_u16() const {
+ return GetField<uint16_t>(VT_DEFAULT_U16, 42);
+ }
+ bool mutate_default_u16(uint16_t _default_u16) {
+ return SetField<uint16_t>(VT_DEFAULT_U16, _default_u16, 42);
+ }
+ int32_t just_i32() const {
+ return GetField<int32_t>(VT_JUST_I32, 0);
+ }
+ bool mutate_just_i32(int32_t _just_i32) {
+ return SetField<int32_t>(VT_JUST_I32, _just_i32, 0);
+ }
+ flatbuffers::Optional<int32_t> maybe_i32() const {
+ return GetOptional<int32_t, int32_t>(VT_MAYBE_I32);
+ }
+ bool mutate_maybe_i32(int32_t _maybe_i32) {
+ return SetField<int32_t>(VT_MAYBE_I32, _maybe_i32);
+ }
+ int32_t default_i32() const {
+ return GetField<int32_t>(VT_DEFAULT_I32, 42);
+ }
+ bool mutate_default_i32(int32_t _default_i32) {
+ return SetField<int32_t>(VT_DEFAULT_I32, _default_i32, 42);
+ }
+ uint32_t just_u32() const {
+ return GetField<uint32_t>(VT_JUST_U32, 0);
+ }
+ bool mutate_just_u32(uint32_t _just_u32) {
+ return SetField<uint32_t>(VT_JUST_U32, _just_u32, 0);
+ }
+ flatbuffers::Optional<uint32_t> maybe_u32() const {
+ return GetOptional<uint32_t, uint32_t>(VT_MAYBE_U32);
+ }
+ bool mutate_maybe_u32(uint32_t _maybe_u32) {
+ return SetField<uint32_t>(VT_MAYBE_U32, _maybe_u32);
+ }
+ uint32_t default_u32() const {
+ return GetField<uint32_t>(VT_DEFAULT_U32, 42);
+ }
+ bool mutate_default_u32(uint32_t _default_u32) {
+ return SetField<uint32_t>(VT_DEFAULT_U32, _default_u32, 42);
+ }
+ int64_t just_i64() const {
+ return GetField<int64_t>(VT_JUST_I64, 0);
+ }
+ bool mutate_just_i64(int64_t _just_i64) {
+ return SetField<int64_t>(VT_JUST_I64, _just_i64, 0);
+ }
+ flatbuffers::Optional<int64_t> maybe_i64() const {
+ return GetOptional<int64_t, int64_t>(VT_MAYBE_I64);
+ }
+ bool mutate_maybe_i64(int64_t _maybe_i64) {
+ return SetField<int64_t>(VT_MAYBE_I64, _maybe_i64);
+ }
+ int64_t default_i64() const {
+ return GetField<int64_t>(VT_DEFAULT_I64, 42LL);
+ }
+ bool mutate_default_i64(int64_t _default_i64) {
+ return SetField<int64_t>(VT_DEFAULT_I64, _default_i64, 42LL);
+ }
+ uint64_t just_u64() const {
+ return GetField<uint64_t>(VT_JUST_U64, 0);
+ }
+ bool mutate_just_u64(uint64_t _just_u64) {
+ return SetField<uint64_t>(VT_JUST_U64, _just_u64, 0);
+ }
+ flatbuffers::Optional<uint64_t> maybe_u64() const {
+ return GetOptional<uint64_t, uint64_t>(VT_MAYBE_U64);
+ }
+ bool mutate_maybe_u64(uint64_t _maybe_u64) {
+ return SetField<uint64_t>(VT_MAYBE_U64, _maybe_u64);
+ }
+ uint64_t default_u64() const {
+ return GetField<uint64_t>(VT_DEFAULT_U64, 42ULL);
+ }
+ bool mutate_default_u64(uint64_t _default_u64) {
+ return SetField<uint64_t>(VT_DEFAULT_U64, _default_u64, 42ULL);
+ }
+ float just_f32() const {
+ return GetField<float>(VT_JUST_F32, 0.0f);
+ }
+ bool mutate_just_f32(float _just_f32) {
+ return SetField<float>(VT_JUST_F32, _just_f32, 0.0f);
+ }
+ flatbuffers::Optional<float> maybe_f32() const {
+ return GetOptional<float, float>(VT_MAYBE_F32);
+ }
+ bool mutate_maybe_f32(float _maybe_f32) {
+ return SetField<float>(VT_MAYBE_F32, _maybe_f32);
+ }
+ float default_f32() const {
+ return GetField<float>(VT_DEFAULT_F32, 42.0f);
+ }
+ bool mutate_default_f32(float _default_f32) {
+ return SetField<float>(VT_DEFAULT_F32, _default_f32, 42.0f);
+ }
+ double just_f64() const {
+ return GetField<double>(VT_JUST_F64, 0.0);
+ }
+ bool mutate_just_f64(double _just_f64) {
+ return SetField<double>(VT_JUST_F64, _just_f64, 0.0);
+ }
+ flatbuffers::Optional<double> maybe_f64() const {
+ return GetOptional<double, double>(VT_MAYBE_F64);
+ }
+ bool mutate_maybe_f64(double _maybe_f64) {
+ return SetField<double>(VT_MAYBE_F64, _maybe_f64);
+ }
+ double default_f64() const {
+ return GetField<double>(VT_DEFAULT_F64, 42.0);
+ }
+ bool mutate_default_f64(double _default_f64) {
+ return SetField<double>(VT_DEFAULT_F64, _default_f64, 42.0);
+ }
+ bool just_bool() const {
+ return GetField<uint8_t>(VT_JUST_BOOL, 0) != 0;
+ }
+ bool mutate_just_bool(bool _just_bool) {
+ return SetField<uint8_t>(VT_JUST_BOOL, static_cast<uint8_t>(_just_bool), 0);
+ }
+ flatbuffers::Optional<bool> maybe_bool() const {
+ return GetOptional<uint8_t, bool>(VT_MAYBE_BOOL);
+ }
+ bool mutate_maybe_bool(bool _maybe_bool) {
+ return SetField<uint8_t>(VT_MAYBE_BOOL, static_cast<uint8_t>(_maybe_bool));
+ }
+ bool default_bool() const {
+ return GetField<uint8_t>(VT_DEFAULT_BOOL, 1) != 0;
+ }
+ bool mutate_default_bool(bool _default_bool) {
+ return SetField<uint8_t>(VT_DEFAULT_BOOL, static_cast<uint8_t>(_default_bool), 1);
+ }
+ optional_scalars::OptionalByte just_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_JUST_ENUM, 0));
+ }
+ bool mutate_just_enum(optional_scalars::OptionalByte _just_enum) {
+ return SetField<int8_t>(VT_JUST_ENUM, static_cast<int8_t>(_just_enum), 0);
+ }
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum() const {
+ return GetOptional<int8_t, optional_scalars::OptionalByte>(VT_MAYBE_ENUM);
+ }
+ bool mutate_maybe_enum(optional_scalars::OptionalByte _maybe_enum) {
+ return SetField<int8_t>(VT_MAYBE_ENUM, static_cast<int8_t>(_maybe_enum));
+ }
+ optional_scalars::OptionalByte default_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_DEFAULT_ENUM, 1));
+ }
+ bool mutate_default_enum(optional_scalars::OptionalByte _default_enum) {
+ return SetField<int8_t>(VT_DEFAULT_ENUM, static_cast<int8_t>(_default_enum), 1);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int8_t>(verifier, VT_JUST_I8) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_I8) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_I8) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_U8) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_U8) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_U8) &&
+ VerifyField<int16_t>(verifier, VT_JUST_I16) &&
+ VerifyField<int16_t>(verifier, VT_MAYBE_I16) &&
+ VerifyField<int16_t>(verifier, VT_DEFAULT_I16) &&
+ VerifyField<uint16_t>(verifier, VT_JUST_U16) &&
+ VerifyField<uint16_t>(verifier, VT_MAYBE_U16) &&
+ VerifyField<uint16_t>(verifier, VT_DEFAULT_U16) &&
+ VerifyField<int32_t>(verifier, VT_JUST_I32) &&
+ VerifyField<int32_t>(verifier, VT_MAYBE_I32) &&
+ VerifyField<int32_t>(verifier, VT_DEFAULT_I32) &&
+ VerifyField<uint32_t>(verifier, VT_JUST_U32) &&
+ VerifyField<uint32_t>(verifier, VT_MAYBE_U32) &&
+ VerifyField<uint32_t>(verifier, VT_DEFAULT_U32) &&
+ VerifyField<int64_t>(verifier, VT_JUST_I64) &&
+ VerifyField<int64_t>(verifier, VT_MAYBE_I64) &&
+ VerifyField<int64_t>(verifier, VT_DEFAULT_I64) &&
+ VerifyField<uint64_t>(verifier, VT_JUST_U64) &&
+ VerifyField<uint64_t>(verifier, VT_MAYBE_U64) &&
+ VerifyField<uint64_t>(verifier, VT_DEFAULT_U64) &&
+ VerifyField<float>(verifier, VT_JUST_F32) &&
+ VerifyField<float>(verifier, VT_MAYBE_F32) &&
+ VerifyField<float>(verifier, VT_DEFAULT_F32) &&
+ VerifyField<double>(verifier, VT_JUST_F64) &&
+ VerifyField<double>(verifier, VT_MAYBE_F64) &&
+ VerifyField<double>(verifier, VT_DEFAULT_F64) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_BOOL) &&
+ VerifyField<int8_t>(verifier, VT_JUST_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_ENUM) &&
+ verifier.EndTable();
+ }
+ ScalarStuffT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<ScalarStuff> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct ScalarStuffBuilder {
+ typedef ScalarStuff Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_just_i8(int8_t just_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_I8, just_i8, 0);
+ }
+ void add_maybe_i8(int8_t maybe_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_I8, maybe_i8);
+ }
+ void add_default_i8(int8_t default_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_I8, default_i8, 42);
+ }
+ void add_just_u8(uint8_t just_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_U8, just_u8, 0);
+ }
+ void add_maybe_u8(uint8_t maybe_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_U8, maybe_u8);
+ }
+ void add_default_u8(uint8_t default_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_U8, default_u8, 42);
+ }
+ void add_just_i16(int16_t just_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_JUST_I16, just_i16, 0);
+ }
+ void add_maybe_i16(int16_t maybe_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_MAYBE_I16, maybe_i16);
+ }
+ void add_default_i16(int16_t default_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_DEFAULT_I16, default_i16, 42);
+ }
+ void add_just_u16(uint16_t just_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_JUST_U16, just_u16, 0);
+ }
+ void add_maybe_u16(uint16_t maybe_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_MAYBE_U16, maybe_u16);
+ }
+ void add_default_u16(uint16_t default_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_DEFAULT_U16, default_u16, 42);
+ }
+ void add_just_i32(int32_t just_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_JUST_I32, just_i32, 0);
+ }
+ void add_maybe_i32(int32_t maybe_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_MAYBE_I32, maybe_i32);
+ }
+ void add_default_i32(int32_t default_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_DEFAULT_I32, default_i32, 42);
+ }
+ void add_just_u32(uint32_t just_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_JUST_U32, just_u32, 0);
+ }
+ void add_maybe_u32(uint32_t maybe_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_MAYBE_U32, maybe_u32);
+ }
+ void add_default_u32(uint32_t default_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_DEFAULT_U32, default_u32, 42);
+ }
+ void add_just_i64(int64_t just_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_JUST_I64, just_i64, 0);
+ }
+ void add_maybe_i64(int64_t maybe_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_MAYBE_I64, maybe_i64);
+ }
+ void add_default_i64(int64_t default_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_DEFAULT_I64, default_i64, 42LL);
+ }
+ void add_just_u64(uint64_t just_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_JUST_U64, just_u64, 0);
+ }
+ void add_maybe_u64(uint64_t maybe_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_MAYBE_U64, maybe_u64);
+ }
+ void add_default_u64(uint64_t default_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_DEFAULT_U64, default_u64, 42ULL);
+ }
+ void add_just_f32(float just_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_JUST_F32, just_f32, 0.0f);
+ }
+ void add_maybe_f32(float maybe_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_MAYBE_F32, maybe_f32);
+ }
+ void add_default_f32(float default_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_DEFAULT_F32, default_f32, 42.0f);
+ }
+ void add_just_f64(double just_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_JUST_F64, just_f64, 0.0);
+ }
+ void add_maybe_f64(double maybe_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_MAYBE_F64, maybe_f64);
+ }
+ void add_default_f64(double default_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_DEFAULT_F64, default_f64, 42.0);
+ }
+ void add_just_bool(bool just_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_BOOL, static_cast<uint8_t>(just_bool), 0);
+ }
+ void add_maybe_bool(bool maybe_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_BOOL, static_cast<uint8_t>(maybe_bool));
+ }
+ void add_default_bool(bool default_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_BOOL, static_cast<uint8_t>(default_bool), 1);
+ }
+ void add_just_enum(optional_scalars::OptionalByte just_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_ENUM, static_cast<int8_t>(just_enum), 0);
+ }
+ void add_maybe_enum(optional_scalars::OptionalByte maybe_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_ENUM, static_cast<int8_t>(maybe_enum));
+ }
+ void add_default_enum(optional_scalars::OptionalByte default_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_ENUM, static_cast<int8_t>(default_enum), 1);
+ }
+ explicit ScalarStuffBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<ScalarStuff> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<ScalarStuff>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int8_t just_i8 = 0,
+ flatbuffers::Optional<int8_t> maybe_i8 = flatbuffers::nullopt,
+ int8_t default_i8 = 42,
+ uint8_t just_u8 = 0,
+ flatbuffers::Optional<uint8_t> maybe_u8 = flatbuffers::nullopt,
+ uint8_t default_u8 = 42,
+ int16_t just_i16 = 0,
+ flatbuffers::Optional<int16_t> maybe_i16 = flatbuffers::nullopt,
+ int16_t default_i16 = 42,
+ uint16_t just_u16 = 0,
+ flatbuffers::Optional<uint16_t> maybe_u16 = flatbuffers::nullopt,
+ uint16_t default_u16 = 42,
+ int32_t just_i32 = 0,
+ flatbuffers::Optional<int32_t> maybe_i32 = flatbuffers::nullopt,
+ int32_t default_i32 = 42,
+ uint32_t just_u32 = 0,
+ flatbuffers::Optional<uint32_t> maybe_u32 = flatbuffers::nullopt,
+ uint32_t default_u32 = 42,
+ int64_t just_i64 = 0,
+ flatbuffers::Optional<int64_t> maybe_i64 = flatbuffers::nullopt,
+ int64_t default_i64 = 42LL,
+ uint64_t just_u64 = 0,
+ flatbuffers::Optional<uint64_t> maybe_u64 = flatbuffers::nullopt,
+ uint64_t default_u64 = 42ULL,
+ float just_f32 = 0.0f,
+ flatbuffers::Optional<float> maybe_f32 = flatbuffers::nullopt,
+ float default_f32 = 42.0f,
+ double just_f64 = 0.0,
+ flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt,
+ double default_f64 = 42.0,
+ bool just_bool = false,
+ flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt,
+ bool default_bool = true,
+ optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None,
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum = flatbuffers::nullopt,
+ optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One) {
+ ScalarStuffBuilder builder_(_fbb);
+ builder_.add_default_f64(default_f64);
+ if(maybe_f64) { builder_.add_maybe_f64(*maybe_f64); }
+ builder_.add_just_f64(just_f64);
+ builder_.add_default_u64(default_u64);
+ if(maybe_u64) { builder_.add_maybe_u64(*maybe_u64); }
+ builder_.add_just_u64(just_u64);
+ builder_.add_default_i64(default_i64);
+ if(maybe_i64) { builder_.add_maybe_i64(*maybe_i64); }
+ builder_.add_just_i64(just_i64);
+ builder_.add_default_f32(default_f32);
+ if(maybe_f32) { builder_.add_maybe_f32(*maybe_f32); }
+ builder_.add_just_f32(just_f32);
+ builder_.add_default_u32(default_u32);
+ if(maybe_u32) { builder_.add_maybe_u32(*maybe_u32); }
+ builder_.add_just_u32(just_u32);
+ builder_.add_default_i32(default_i32);
+ if(maybe_i32) { builder_.add_maybe_i32(*maybe_i32); }
+ builder_.add_just_i32(just_i32);
+ builder_.add_default_u16(default_u16);
+ if(maybe_u16) { builder_.add_maybe_u16(*maybe_u16); }
+ builder_.add_just_u16(just_u16);
+ builder_.add_default_i16(default_i16);
+ if(maybe_i16) { builder_.add_maybe_i16(*maybe_i16); }
+ builder_.add_just_i16(just_i16);
+ builder_.add_default_enum(default_enum);
+ if(maybe_enum) { builder_.add_maybe_enum(*maybe_enum); }
+ builder_.add_just_enum(just_enum);
+ builder_.add_default_bool(default_bool);
+ if(maybe_bool) { builder_.add_maybe_bool(*maybe_bool); }
+ builder_.add_just_bool(just_bool);
+ builder_.add_default_u8(default_u8);
+ if(maybe_u8) { builder_.add_maybe_u8(*maybe_u8); }
+ builder_.add_just_u8(just_u8);
+ builder_.add_default_i8(default_i8);
+ if(maybe_i8) { builder_.add_maybe_i8(*maybe_i8); }
+ builder_.add_just_i8(just_i8);
+ return builder_.Finish();
+}
+
+struct ScalarStuff::Traits {
+ using type = ScalarStuff;
+ static auto constexpr Create = CreateScalarStuff;
+};
+
+flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+inline ScalarStuffT *ScalarStuff::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ auto _o = std::make_unique<ScalarStuffT>();
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void ScalarStuff::UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = just_i8(); _o->just_i8 = _e; }
+ { auto _e = maybe_i8(); _o->maybe_i8 = _e; }
+ { auto _e = default_i8(); _o->default_i8 = _e; }
+ { auto _e = just_u8(); _o->just_u8 = _e; }
+ { auto _e = maybe_u8(); _o->maybe_u8 = _e; }
+ { auto _e = default_u8(); _o->default_u8 = _e; }
+ { auto _e = just_i16(); _o->just_i16 = _e; }
+ { auto _e = maybe_i16(); _o->maybe_i16 = _e; }
+ { auto _e = default_i16(); _o->default_i16 = _e; }
+ { auto _e = just_u16(); _o->just_u16 = _e; }
+ { auto _e = maybe_u16(); _o->maybe_u16 = _e; }
+ { auto _e = default_u16(); _o->default_u16 = _e; }
+ { auto _e = just_i32(); _o->just_i32 = _e; }
+ { auto _e = maybe_i32(); _o->maybe_i32 = _e; }
+ { auto _e = default_i32(); _o->default_i32 = _e; }
+ { auto _e = just_u32(); _o->just_u32 = _e; }
+ { auto _e = maybe_u32(); _o->maybe_u32 = _e; }
+ { auto _e = default_u32(); _o->default_u32 = _e; }
+ { auto _e = just_i64(); _o->just_i64 = _e; }
+ { auto _e = maybe_i64(); _o->maybe_i64 = _e; }
+ { auto _e = default_i64(); _o->default_i64 = _e; }
+ { auto _e = just_u64(); _o->just_u64 = _e; }
+ { auto _e = maybe_u64(); _o->maybe_u64 = _e; }
+ { auto _e = default_u64(); _o->default_u64 = _e; }
+ { auto _e = just_f32(); _o->just_f32 = _e; }
+ { auto _e = maybe_f32(); _o->maybe_f32 = _e; }
+ { auto _e = default_f32(); _o->default_f32 = _e; }
+ { auto _e = just_f64(); _o->just_f64 = _e; }
+ { auto _e = maybe_f64(); _o->maybe_f64 = _e; }
+ { auto _e = default_f64(); _o->default_f64 = _e; }
+ { auto _e = just_bool(); _o->just_bool = _e; }
+ { auto _e = maybe_bool(); _o->maybe_bool = _e; }
+ { auto _e = default_bool(); _o->default_bool = _e; }
+ { auto _e = just_enum(); _o->just_enum = _e; }
+ { auto _e = maybe_enum(); _o->maybe_enum = _e; }
+ { auto _e = default_enum(); _o->default_enum = _e; }
+}
+
+inline flatbuffers::Offset<ScalarStuff> ScalarStuff::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateScalarStuff(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ScalarStuffT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _just_i8 = _o->just_i8;
+ auto _maybe_i8 = _o->maybe_i8;
+ auto _default_i8 = _o->default_i8;
+ auto _just_u8 = _o->just_u8;
+ auto _maybe_u8 = _o->maybe_u8;
+ auto _default_u8 = _o->default_u8;
+ auto _just_i16 = _o->just_i16;
+ auto _maybe_i16 = _o->maybe_i16;
+ auto _default_i16 = _o->default_i16;
+ auto _just_u16 = _o->just_u16;
+ auto _maybe_u16 = _o->maybe_u16;
+ auto _default_u16 = _o->default_u16;
+ auto _just_i32 = _o->just_i32;
+ auto _maybe_i32 = _o->maybe_i32;
+ auto _default_i32 = _o->default_i32;
+ auto _just_u32 = _o->just_u32;
+ auto _maybe_u32 = _o->maybe_u32;
+ auto _default_u32 = _o->default_u32;
+ auto _just_i64 = _o->just_i64;
+ auto _maybe_i64 = _o->maybe_i64;
+ auto _default_i64 = _o->default_i64;
+ auto _just_u64 = _o->just_u64;
+ auto _maybe_u64 = _o->maybe_u64;
+ auto _default_u64 = _o->default_u64;
+ auto _just_f32 = _o->just_f32;
+ auto _maybe_f32 = _o->maybe_f32;
+ auto _default_f32 = _o->default_f32;
+ auto _just_f64 = _o->just_f64;
+ auto _maybe_f64 = _o->maybe_f64;
+ auto _default_f64 = _o->default_f64;
+ auto _just_bool = _o->just_bool;
+ auto _maybe_bool = _o->maybe_bool;
+ auto _default_bool = _o->default_bool;
+ auto _just_enum = _o->just_enum;
+ auto _maybe_enum = _o->maybe_enum;
+ auto _default_enum = _o->default_enum;
+ return optional_scalars::CreateScalarStuff(
+ _fbb,
+ _just_i8,
+ _maybe_i8,
+ _default_i8,
+ _just_u8,
+ _maybe_u8,
+ _default_u8,
+ _just_i16,
+ _maybe_i16,
+ _default_i16,
+ _just_u16,
+ _maybe_u16,
+ _default_u16,
+ _just_i32,
+ _maybe_i32,
+ _default_i32,
+ _just_u32,
+ _maybe_u32,
+ _default_u32,
+ _just_i64,
+ _maybe_i64,
+ _default_i64,
+ _just_u64,
+ _maybe_u64,
+ _default_u64,
+ _just_f32,
+ _maybe_f32,
+ _default_f32,
+ _just_f64,
+ _maybe_f64,
+ _default_f64,
+ _just_bool,
+ _maybe_bool,
+ _default_bool,
+ _just_enum,
+ _maybe_enum,
+ _default_enum);
+}
+
+inline const flatbuffers::TypeTable *OptionalByteTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "None",
+ "One",
+ "Two"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "just_i8",
+ "maybe_i8",
+ "default_i8",
+ "just_u8",
+ "maybe_u8",
+ "default_u8",
+ "just_i16",
+ "maybe_i16",
+ "default_i16",
+ "just_u16",
+ "maybe_u16",
+ "default_u16",
+ "just_i32",
+ "maybe_i32",
+ "default_i32",
+ "just_u32",
+ "maybe_u32",
+ "default_u32",
+ "just_i64",
+ "maybe_i64",
+ "default_i64",
+ "just_u64",
+ "maybe_u64",
+ "default_u64",
+ "just_f32",
+ "maybe_f32",
+ "default_f32",
+ "just_f64",
+ "maybe_f64",
+ "default_f64",
+ "just_bool",
+ "maybe_bool",
+ "default_bool",
+ "just_enum",
+ "maybe_enum",
+ "default_enum"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 36, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const optional_scalars::ScalarStuff *GetScalarStuff(const void *buf) {
+ return flatbuffers::GetRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline const optional_scalars::ScalarStuff *GetSizePrefixedScalarStuff(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline ScalarStuff *GetMutableScalarStuff(void *buf) {
+ return flatbuffers::GetMutableRoot<ScalarStuff>(buf);
+}
+
+inline const char *ScalarStuffIdentifier() {
+ return "NULL";
+}
+
+inline bool ScalarStuffBufferHasIdentifier(const void *buf) {
+ return flatbuffers::BufferHasIdentifier(
+ buf, ScalarStuffIdentifier());
+}
+
+inline bool VerifyScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline bool VerifySizePrefixedScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline const char *ScalarStuffExtension() {
+ return "mon";
+}
+
+inline void FinishScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.Finish(root, ScalarStuffIdentifier());
+}
+
+inline void FinishSizePrefixedScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.FinishSizePrefixed(root, ScalarStuffIdentifier());
+}
+
+inline std::unique_ptr<optional_scalars::ScalarStuffT> UnPackScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<optional_scalars::ScalarStuffT>(GetScalarStuff(buf)->UnPack(res));
+}
+
+inline std::unique_ptr<optional_scalars::ScalarStuffT> UnPackSizePrefixedScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return std::unique_ptr<optional_scalars::ScalarStuffT>(GetSizePrefixedScalarStuff(buf)->UnPack(res));
+}
+
+} // namespace optional_scalars
+
+#endif // FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
diff --git a/tests/cpp17/test_cpp17.cpp b/tests/cpp17/test_cpp17.cpp
new file mode 100644
index 0000000..9b47c10
--- /dev/null
+++ b/tests/cpp17/test_cpp17.cpp
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2014 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This is a sandbox for modeling C++17 code generator.
+// C++17 code generator: "flatc --cpp_std c++17".
+// Warning:
+// This is an experimental feature and could change at any time.
+
+#include "flatbuffers/flatbuffers.h"
+#include "flatbuffers/flexbuffers.h"
+#include "flatbuffers/idl.h"
+#include "flatbuffers/minireflect.h"
+#include "flatbuffers/registry.h"
+#include "flatbuffers/util.h"
+#include "test_assert.h"
+
+// Embed generated code into an isolated namespace.
+namespace cpp17 {
+#include "generated_cpp17/monster_test_generated.h"
+#include "generated_cpp17/optional_scalars_generated.h"
+} // namespace cpp17
+
+namespace cpp11 {
+#include "../monster_test_generated.h"
+#include "../optional_scalars_generated.h"
+} // namespace cpp11
+
+void CreateTableByTypeTest() {
+ flatbuffers::FlatBufferBuilder builder;
+
+ // We will create an object of this type using only the type.
+ using type_to_create_t = cpp17::MyGame::Example::Stat;
+
+ [&builder] {
+ auto id_str = builder.CreateString("my_id");
+ auto table = type_to_create_t::Traits::Create(builder, id_str, 42, 7);
+ // Be sure that the correct return type was inferred.
+ static_assert(
+ std::is_same_v<decltype(table), flatbuffers::Offset<type_to_create_t>>);
+ builder.Finish(table);
+ }();
+
+ // Access it.
+ auto stat =
+ flatbuffers::GetRoot<type_to_create_t>(builder.GetBufferPointer());
+ TEST_EQ_STR(stat->id()->c_str(), "my_id");
+ TEST_EQ(stat->val(), 42);
+ TEST_EQ(stat->count(), 7);
+}
+
+void OptionalScalarsTest() {
+ static_assert(std::is_same<flatbuffers::Optional<float>, std::optional<float>>::value);
+ static_assert(std::is_same<flatbuffers::nullopt_t, std::nullopt_t>::value);
+
+ // test C++ nullable
+ flatbuffers::FlatBufferBuilder fbb;
+ FinishScalarStuffBuffer(fbb, cpp17::optional_scalars::CreateScalarStuff(
+ fbb, 1, static_cast<int8_t>(2)));
+ auto opts =
+ cpp17::optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());
+ TEST_ASSERT(!opts->maybe_bool());
+ TEST_ASSERT(!opts->maybe_f32().has_value());
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 2);
+ TEST_ASSERT(opts->mutate_maybe_i8(3));
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 3);
+ TEST_ASSERT(!opts->mutate_maybe_i16(-10));
+
+ cpp17::optional_scalars::ScalarStuffT obj;
+ opts->UnPackTo(&obj);
+ TEST_ASSERT(!obj.maybe_bool);
+ TEST_ASSERT(!obj.maybe_f32.has_value());
+ TEST_ASSERT(obj.maybe_i8.has_value() && obj.maybe_i8.value() == 3);
+ TEST_ASSERT(obj.maybe_i8 && *obj.maybe_i8 == 3);
+ obj.maybe_i32 = -1;
+
+ fbb.Clear();
+ FinishScalarStuffBuffer(
+ fbb, cpp17::optional_scalars::ScalarStuff::Pack(fbb, &obj));
+ opts = cpp17::optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 3);
+ TEST_ASSERT(opts->maybe_i32().has_value());
+ TEST_EQ(opts->maybe_i32().value(), -1);
+
+ TEST_EQ(std::optional<int32_t>(opts->maybe_i32()).value(), -1);
+ TEST_EQ(std::optional<int64_t>(opts->maybe_i32()).value(), -1);
+ TEST_ASSERT(opts->maybe_i32() == std::optional<int64_t>(-1));
+}
+
+int FlatBufferCpp17Tests() {
+ CreateTableByTypeTest();
+ OptionalScalarsTest();
+ return 0;
+}
+
+int main(int /*argc*/, const char * /*argv*/[]) {
+ InitTestEngine();
+
+ FlatBufferCpp17Tests();
+
+ if (!testing_fails) {
+ TEST_OUTPUT_LINE("C++17: ALL TESTS PASSED");
+ } else {
+ TEST_OUTPUT_LINE("C++17: %d FAILED TESTS", testing_fails);
+ }
+ return CloseTestEngine();
+}
diff --git a/tests/docker/Dockerfile.testing.cpp.debian_buster b/tests/docker/Dockerfile.testing.cpp.debian_buster
new file mode 100644
index 0000000..7b0cce2
--- /dev/null
+++ b/tests/docker/Dockerfile.testing.cpp.debian_buster
@@ -0,0 +1,10 @@
+FROM debian:10.1-slim as base
+RUN apt -qq update >/dev/null
+RUN apt -qq install -y cmake make build-essential >/dev/null
+RUN apt -qq install -y autoconf git libtool >/dev/null
+RUN apt -qq install -y clang >/dev/null
+FROM base
+# Travis machines have 2 cores. Can be redefined with 'run --env PAR_JOBS=N'.
+ENV JOBS=2
+WORKDIR /flatbuffers
+ADD . .
diff --git a/tests/docker/build_flatc.run.sh b/tests/docker/build_flatc.run.sh
new file mode 100755
index 0000000..c8885b1
--- /dev/null
+++ b/tests/docker/build_flatc.run.sh
@@ -0,0 +1,15 @@
+set -e
+
+JOBS=${JOBS:-1}
+config=$1
+echo ""
+echo "Build 'flatc' compiler for '$config'"
+
+cmake . -DCMAKE_BUILD_TYPE=$config \
+ -DFLATBUFFERS_BUILD_FLATC=1 -DFLATBUFFERS_STATIC_FLATC=1 \
+ -DFLATBUFFERS_BUILD_TESTS=0 -DFLATBUFFERS_INSTALL=0
+cmake --build . --target flatc --clean-first -- -j$JOBS
+
+echo "Check generated code"
+.travis/check-generate-code.sh
+echo "Done"
diff --git a/tests/docker/cpp_test.run.sh b/tests/docker/cpp_test.run.sh
new file mode 100755
index 0000000..fa3b0fb
--- /dev/null
+++ b/tests/docker/cpp_test.run.sh
@@ -0,0 +1,20 @@
+set -e
+
+JOBS=${JOBS:-1}
+export UBSAN_OPTIONS=halt_on_error=1
+export ASAN_OPTIONS=halt_on_error=1
+export MAKEFLAGS="-j$JOBS"
+
+config=$1
+echo ""
+echo "Build Flatbuffers project for '$config' with jobs=$JOBS"
+
+cmake . -DCMAKE_BUILD_TYPE=$config \
+ -DFLATBUFFERS_BUILD_TESTS=ON -DFLATBUFFERS_CODE_SANITIZE=ON
+cmake --build . --target all --clean-first -- -j$JOBS
+ctest --extra-verbose --output-on-failure -j$JOBS
+
+echo "Check generated code"
+.travis/check-generate-code.sh
+
+echo "C++ tests done"
diff --git a/tests/docker/languages/Dockerfile.testing.node.10_13_0 b/tests/docker/languages/Dockerfile.testing.node.10_13_0
index b821105..8e48c23 100644
--- a/tests/docker/languages/Dockerfile.testing.node.10_13_0
+++ b/tests/docker/languages/Dockerfile.testing.node.10_13_0
@@ -5,4 +5,6 @@
WORKDIR /code/tests
RUN node --version
RUN ../flatc -b -I include_test monster_test.fbs unicode_test.json
+RUN npm install
+RUN npm run pretest
RUN node JavaScriptTest ./monster_test_generated
diff --git a/tests/docker/languages/Dockerfile.testing.node.11_2_0 b/tests/docker/languages/Dockerfile.testing.node.11_2_0
index f6b48e6..090bb45 100644
--- a/tests/docker/languages/Dockerfile.testing.node.11_2_0
+++ b/tests/docker/languages/Dockerfile.testing.node.11_2_0
@@ -5,4 +5,6 @@
WORKDIR /code/tests
RUN node --version
RUN ../flatc -b -I include_test monster_test.fbs unicode_test.json
+RUN npm install
+RUN npm run pretest
RUN node JavaScriptTest ./monster_test_generated
diff --git a/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_2_7_15 b/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_2_7_15
new file mode 100644
index 0000000..718c5ac
--- /dev/null
+++ b/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_2_7_15
@@ -0,0 +1,9 @@
+FROM python:2.7.15-slim-stretch as base
+WORKDIR /code
+ADD . .
+RUN cp flatc_debian_stretch flatc
+WORKDIR /code/tests
+RUN python --version
+RUN pip install numpy
+RUN pip install coverage
+RUN ./PythonTest.sh
diff --git a/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_3_7_1 b/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_3_7_1
new file mode 100644
index 0000000..1de2c26
--- /dev/null
+++ b/tests/docker/languages/Dockerfile.testing.python.numpy.cpython_3_7_1
@@ -0,0 +1,9 @@
+FROM python:3.7.1-slim-stretch as base
+WORKDIR /code
+ADD . .
+RUN cp flatc_debian_stretch flatc
+WORKDIR /code/tests
+RUN python --version
+RUN pip install numpy
+RUN pip install coverage
+RUN ./PythonTest.sh
diff --git a/tests/docker/languages/Dockerfile.testing.rust.1_30_1 b/tests/docker/languages/Dockerfile.testing.rust.1_40_0
similarity index 74%
rename from tests/docker/languages/Dockerfile.testing.rust.1_30_1
rename to tests/docker/languages/Dockerfile.testing.rust.1_40_0
index 4d1755c..849ad76 100644
--- a/tests/docker/languages/Dockerfile.testing.rust.1_30_1
+++ b/tests/docker/languages/Dockerfile.testing.rust.1_40_0
@@ -1,4 +1,4 @@
-FROM rust:1.30.1-slim-stretch as base
+FROM rust:1.40.0-slim-stretch as base
WORKDIR /code
ADD . .
RUN cp flatc_debian_stretch flatc
diff --git a/tests/docker/languages/Dockerfile.testing.rust.big_endian.1_30_1 b/tests/docker/languages/Dockerfile.testing.rust.big_endian.1_40_0
similarity index 89%
rename from tests/docker/languages/Dockerfile.testing.rust.big_endian.1_30_1
rename to tests/docker/languages/Dockerfile.testing.rust.big_endian.1_40_0
index f2e93f4..3abf8df 100644
--- a/tests/docker/languages/Dockerfile.testing.rust.big_endian.1_30_1
+++ b/tests/docker/languages/Dockerfile.testing.rust.big_endian.1_40_0
@@ -1,4 +1,4 @@
-FROM rust:1.30.1-slim-stretch as base
+FROM rust:1.40.0-slim-stretch as base
RUN apt -qq update -y && apt -qq install -y \
gcc-mips-linux-gnu \
libexpat1 \
diff --git a/tests/docker/languages/Dockerfile.testing.swift_5_2 b/tests/docker/languages/Dockerfile.testing.swift_5_2
new file mode 100644
index 0000000..b309477
--- /dev/null
+++ b/tests/docker/languages/Dockerfile.testing.swift_5_2
@@ -0,0 +1,8 @@
+FROM swift:5.2
+WORKDIR /code
+ADD . .
+RUN cp flatc_debian_stretch flatc
+WORKDIR /code/tests
+RUN swift --version
+WORKDIR /code/tests/FlatBuffers.Test.Swift
+RUN sh SwiftTest.sh
diff --git a/tests/evolution_test/evolution_v1.fbs b/tests/evolution_test/evolution_v1.fbs
new file mode 100644
index 0000000..e9d3b8d
--- /dev/null
+++ b/tests/evolution_test/evolution_v1.fbs
@@ -0,0 +1,40 @@
+namespace Evolution.V1;
+
+table TableA {
+ a:float;
+ b:int;
+}
+
+table TableB {
+ a:int;
+}
+
+enum Enum : byte {
+ King,
+ Queen
+}
+
+union Union {
+ TableA,
+ TableB
+}
+
+struct Struct {
+ a:int;
+ b:double;
+}
+
+table Root {
+ a:int;
+ b:bool;
+ c:Union;
+ d:Enum;
+ e:TableA;
+ f:Struct;
+ g:[int];
+ h:[TableB];
+ i:int = 1234;
+ j:Union;
+}
+
+root_type Root;
diff --git a/tests/evolution_test/evolution_v1.json b/tests/evolution_test/evolution_v1.json
new file mode 100644
index 0000000..c90fdb9
--- /dev/null
+++ b/tests/evolution_test/evolution_v1.json
@@ -0,0 +1,29 @@
+{
+ "a": 42,
+ "b": true,
+ "c_type": "TableB",
+ "c": {
+ "a": 15
+ },
+ "d": "King",
+ "e": {
+ "a": 3.1452,
+ "b": 325
+ },
+ "f":{
+ "a": 16,
+ "b": 243.980943
+ },
+ "g": [ 7, 8, 9],
+ "h": [
+ {
+ "a": 212
+ },
+ {
+ "a": 459
+ }
+ ],
+ "j": {
+ "a": 984
+ }
+}
diff --git a/tests/evolution_test/evolution_v1_generated.h b/tests/evolution_test/evolution_v1_generated.h
new file mode 100644
index 0000000..a9c2b7f
--- /dev/null
+++ b/tests/evolution_test/evolution_v1_generated.h
@@ -0,0 +1,513 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_EVOLUTIONV1_EVOLUTION_V1_H_
+#define FLATBUFFERS_GENERATED_EVOLUTIONV1_EVOLUTION_V1_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace Evolution {
+namespace V1 {
+
+struct TableA;
+struct TableABuilder;
+
+struct TableB;
+struct TableBBuilder;
+
+struct Struct;
+
+struct Root;
+struct RootBuilder;
+
+enum class Enum : int8_t {
+ King = 0,
+ Queen = 1,
+ MIN = King,
+ MAX = Queen
+};
+
+inline const Enum (&EnumValuesEnum())[2] {
+ static const Enum values[] = {
+ Enum::King,
+ Enum::Queen
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesEnum() {
+ static const char * const names[3] = {
+ "King",
+ "Queen",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameEnum(Enum e) {
+ if (flatbuffers::IsOutRange(e, Enum::King, Enum::Queen)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesEnum()[index];
+}
+
+enum class Union : uint8_t {
+ NONE = 0,
+ TableA = 1,
+ TableB = 2,
+ MIN = NONE,
+ MAX = TableB
+};
+
+inline const Union (&EnumValuesUnion())[3] {
+ static const Union values[] = {
+ Union::NONE,
+ Union::TableA,
+ Union::TableB
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesUnion() {
+ static const char * const names[4] = {
+ "NONE",
+ "TableA",
+ "TableB",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameUnion(Union e) {
+ if (flatbuffers::IsOutRange(e, Union::NONE, Union::TableB)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesUnion()[index];
+}
+
+template<typename T> struct UnionTraits {
+ static const Union enum_value = Union::NONE;
+};
+
+template<> struct UnionTraits<Evolution::V1::TableA> {
+ static const Union enum_value = Union::TableA;
+};
+
+template<> struct UnionTraits<Evolution::V1::TableB> {
+ static const Union enum_value = Union::TableB;
+};
+
+bool VerifyUnion(flatbuffers::Verifier &verifier, const void *obj, Union type);
+bool VerifyUnionVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Struct FLATBUFFERS_FINAL_CLASS {
+ private:
+ int32_t a_;
+ int32_t padding0__;
+ double b_;
+
+ public:
+ Struct()
+ : a_(0),
+ padding0__(0),
+ b_(0) {
+ (void)padding0__;
+ }
+ Struct(int32_t _a, double _b)
+ : a_(flatbuffers::EndianScalar(_a)),
+ padding0__(0),
+ b_(flatbuffers::EndianScalar(_b)) {
+ (void)padding0__;
+ }
+ int32_t a() const {
+ return flatbuffers::EndianScalar(a_);
+ }
+ double b() const {
+ return flatbuffers::EndianScalar(b_);
+ }
+};
+FLATBUFFERS_STRUCT_END(Struct, 16);
+
+inline bool operator==(const Struct &lhs, const Struct &rhs) {
+ return
+ (lhs.a() == rhs.a()) &&
+ (lhs.b() == rhs.b());
+}
+
+inline bool operator!=(const Struct &lhs, const Struct &rhs) {
+ return !(lhs == rhs);
+}
+
+
+struct TableA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableABuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4,
+ VT_B = 6
+ };
+ float a() const {
+ return GetField<float>(VT_A, 0.0f);
+ }
+ int32_t b() const {
+ return GetField<int32_t>(VT_B, 0);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<float>(verifier, VT_A) &&
+ VerifyField<int32_t>(verifier, VT_B) &&
+ verifier.EndTable();
+ }
+};
+
+struct TableABuilder {
+ typedef TableA Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(float a) {
+ fbb_.AddElement<float>(TableA::VT_A, a, 0.0f);
+ }
+ void add_b(int32_t b) {
+ fbb_.AddElement<int32_t>(TableA::VT_B, b, 0);
+ }
+ explicit TableABuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TableA> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TableA>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TableA> CreateTableA(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ float a = 0.0f,
+ int32_t b = 0) {
+ TableABuilder builder_(_fbb);
+ builder_.add_b(b);
+ builder_.add_a(a);
+ return builder_.Finish();
+}
+
+struct TableB FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableBBuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4
+ };
+ int32_t a() const {
+ return GetField<int32_t>(VT_A, 0);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int32_t>(verifier, VT_A) &&
+ verifier.EndTable();
+ }
+};
+
+struct TableBBuilder {
+ typedef TableB Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(int32_t a) {
+ fbb_.AddElement<int32_t>(TableB::VT_A, a, 0);
+ }
+ explicit TableBBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TableB> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TableB>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TableB> CreateTableB(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int32_t a = 0) {
+ TableBBuilder builder_(_fbb);
+ builder_.add_a(a);
+ return builder_.Finish();
+}
+
+struct Root FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef RootBuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4,
+ VT_B = 6,
+ VT_C_TYPE = 8,
+ VT_C = 10,
+ VT_D = 12,
+ VT_E = 14,
+ VT_F = 16,
+ VT_G = 18,
+ VT_H = 20,
+ VT_I = 22,
+ VT_J_TYPE = 24,
+ VT_J = 26
+ };
+ int32_t a() const {
+ return GetField<int32_t>(VT_A, 0);
+ }
+ bool b() const {
+ return GetField<uint8_t>(VT_B, 0) != 0;
+ }
+ Evolution::V1::Union c_type() const {
+ return static_cast<Evolution::V1::Union>(GetField<uint8_t>(VT_C_TYPE, 0));
+ }
+ const void *c() const {
+ return GetPointer<const void *>(VT_C);
+ }
+ template<typename T> const T *c_as() const;
+ const Evolution::V1::TableA *c_as_TableA() const {
+ return c_type() == Evolution::V1::Union::TableA ? static_cast<const Evolution::V1::TableA *>(c()) : nullptr;
+ }
+ const Evolution::V1::TableB *c_as_TableB() const {
+ return c_type() == Evolution::V1::Union::TableB ? static_cast<const Evolution::V1::TableB *>(c()) : nullptr;
+ }
+ Evolution::V1::Enum d() const {
+ return static_cast<Evolution::V1::Enum>(GetField<int8_t>(VT_D, 0));
+ }
+ const Evolution::V1::TableA *e() const {
+ return GetPointer<const Evolution::V1::TableA *>(VT_E);
+ }
+ const Evolution::V1::Struct *f() const {
+ return GetStruct<const Evolution::V1::Struct *>(VT_F);
+ }
+ const flatbuffers::Vector<int32_t> *g() const {
+ return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_G);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<Evolution::V1::TableB>> *h() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<Evolution::V1::TableB>> *>(VT_H);
+ }
+ int32_t i() const {
+ return GetField<int32_t>(VT_I, 1234);
+ }
+ Evolution::V1::Union j_type() const {
+ return static_cast<Evolution::V1::Union>(GetField<uint8_t>(VT_J_TYPE, 0));
+ }
+ const void *j() const {
+ return GetPointer<const void *>(VT_J);
+ }
+ template<typename T> const T *j_as() const;
+ const Evolution::V1::TableA *j_as_TableA() const {
+ return j_type() == Evolution::V1::Union::TableA ? static_cast<const Evolution::V1::TableA *>(j()) : nullptr;
+ }
+ const Evolution::V1::TableB *j_as_TableB() const {
+ return j_type() == Evolution::V1::Union::TableB ? static_cast<const Evolution::V1::TableB *>(j()) : nullptr;
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int32_t>(verifier, VT_A) &&
+ VerifyField<uint8_t>(verifier, VT_B) &&
+ VerifyField<uint8_t>(verifier, VT_C_TYPE) &&
+ VerifyOffset(verifier, VT_C) &&
+ VerifyUnion(verifier, c(), c_type()) &&
+ VerifyField<int8_t>(verifier, VT_D) &&
+ VerifyOffset(verifier, VT_E) &&
+ verifier.VerifyTable(e()) &&
+ VerifyField<Evolution::V1::Struct>(verifier, VT_F) &&
+ VerifyOffset(verifier, VT_G) &&
+ verifier.VerifyVector(g()) &&
+ VerifyOffset(verifier, VT_H) &&
+ verifier.VerifyVector(h()) &&
+ verifier.VerifyVectorOfTables(h()) &&
+ VerifyField<int32_t>(verifier, VT_I) &&
+ VerifyField<uint8_t>(verifier, VT_J_TYPE) &&
+ VerifyOffset(verifier, VT_J) &&
+ VerifyUnion(verifier, j(), j_type()) &&
+ verifier.EndTable();
+ }
+};
+
+template<> inline const Evolution::V1::TableA *Root::c_as<Evolution::V1::TableA>() const {
+ return c_as_TableA();
+}
+
+template<> inline const Evolution::V1::TableB *Root::c_as<Evolution::V1::TableB>() const {
+ return c_as_TableB();
+}
+
+template<> inline const Evolution::V1::TableA *Root::j_as<Evolution::V1::TableA>() const {
+ return j_as_TableA();
+}
+
+template<> inline const Evolution::V1::TableB *Root::j_as<Evolution::V1::TableB>() const {
+ return j_as_TableB();
+}
+
+struct RootBuilder {
+ typedef Root Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(int32_t a) {
+ fbb_.AddElement<int32_t>(Root::VT_A, a, 0);
+ }
+ void add_b(bool b) {
+ fbb_.AddElement<uint8_t>(Root::VT_B, static_cast<uint8_t>(b), 0);
+ }
+ void add_c_type(Evolution::V1::Union c_type) {
+ fbb_.AddElement<uint8_t>(Root::VT_C_TYPE, static_cast<uint8_t>(c_type), 0);
+ }
+ void add_c(flatbuffers::Offset<void> c) {
+ fbb_.AddOffset(Root::VT_C, c);
+ }
+ void add_d(Evolution::V1::Enum d) {
+ fbb_.AddElement<int8_t>(Root::VT_D, static_cast<int8_t>(d), 0);
+ }
+ void add_e(flatbuffers::Offset<Evolution::V1::TableA> e) {
+ fbb_.AddOffset(Root::VT_E, e);
+ }
+ void add_f(const Evolution::V1::Struct *f) {
+ fbb_.AddStruct(Root::VT_F, f);
+ }
+ void add_g(flatbuffers::Offset<flatbuffers::Vector<int32_t>> g) {
+ fbb_.AddOffset(Root::VT_G, g);
+ }
+ void add_h(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Evolution::V1::TableB>>> h) {
+ fbb_.AddOffset(Root::VT_H, h);
+ }
+ void add_i(int32_t i) {
+ fbb_.AddElement<int32_t>(Root::VT_I, i, 1234);
+ }
+ void add_j_type(Evolution::V1::Union j_type) {
+ fbb_.AddElement<uint8_t>(Root::VT_J_TYPE, static_cast<uint8_t>(j_type), 0);
+ }
+ void add_j(flatbuffers::Offset<void> j) {
+ fbb_.AddOffset(Root::VT_J, j);
+ }
+ explicit RootBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<Root> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<Root>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Root> CreateRoot(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int32_t a = 0,
+ bool b = false,
+ Evolution::V1::Union c_type = Evolution::V1::Union::NONE,
+ flatbuffers::Offset<void> c = 0,
+ Evolution::V1::Enum d = Evolution::V1::Enum::King,
+ flatbuffers::Offset<Evolution::V1::TableA> e = 0,
+ const Evolution::V1::Struct *f = 0,
+ flatbuffers::Offset<flatbuffers::Vector<int32_t>> g = 0,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Evolution::V1::TableB>>> h = 0,
+ int32_t i = 1234,
+ Evolution::V1::Union j_type = Evolution::V1::Union::NONE,
+ flatbuffers::Offset<void> j = 0) {
+ RootBuilder builder_(_fbb);
+ builder_.add_j(j);
+ builder_.add_i(i);
+ builder_.add_h(h);
+ builder_.add_g(g);
+ builder_.add_f(f);
+ builder_.add_e(e);
+ builder_.add_c(c);
+ builder_.add_a(a);
+ builder_.add_j_type(j_type);
+ builder_.add_d(d);
+ builder_.add_c_type(c_type);
+ builder_.add_b(b);
+ return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Root> CreateRootDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int32_t a = 0,
+ bool b = false,
+ Evolution::V1::Union c_type = Evolution::V1::Union::NONE,
+ flatbuffers::Offset<void> c = 0,
+ Evolution::V1::Enum d = Evolution::V1::Enum::King,
+ flatbuffers::Offset<Evolution::V1::TableA> e = 0,
+ const Evolution::V1::Struct *f = 0,
+ const std::vector<int32_t> *g = nullptr,
+ const std::vector<flatbuffers::Offset<Evolution::V1::TableB>> *h = nullptr,
+ int32_t i = 1234,
+ Evolution::V1::Union j_type = Evolution::V1::Union::NONE,
+ flatbuffers::Offset<void> j = 0) {
+ auto g__ = g ? _fbb.CreateVector<int32_t>(*g) : 0;
+ auto h__ = h ? _fbb.CreateVector<flatbuffers::Offset<Evolution::V1::TableB>>(*h) : 0;
+ return Evolution::V1::CreateRoot(
+ _fbb,
+ a,
+ b,
+ c_type,
+ c,
+ d,
+ e,
+ f,
+ g__,
+ h__,
+ i,
+ j_type,
+ j);
+}
+
+inline bool VerifyUnion(flatbuffers::Verifier &verifier, const void *obj, Union type) {
+ switch (type) {
+ case Union::NONE: {
+ return true;
+ }
+ case Union::TableA: {
+ auto ptr = reinterpret_cast<const Evolution::V1::TableA *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case Union::TableB: {
+ auto ptr = reinterpret_cast<const Evolution::V1::TableB *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ default: return true;
+ }
+}
+
+inline bool VerifyUnionVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+ if (!values || !types) return !values && !types;
+ if (values->size() != types->size()) return false;
+ for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+ if (!VerifyUnion(
+ verifier, values->Get(i), types->GetEnum<Union>(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+inline const Evolution::V1::Root *GetRoot(const void *buf) {
+ return flatbuffers::GetRoot<Evolution::V1::Root>(buf);
+}
+
+inline const Evolution::V1::Root *GetSizePrefixedRoot(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<Evolution::V1::Root>(buf);
+}
+
+inline bool VerifyRootBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<Evolution::V1::Root>(nullptr);
+}
+
+inline bool VerifySizePrefixedRootBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<Evolution::V1::Root>(nullptr);
+}
+
+inline void FinishRootBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<Evolution::V1::Root> root) {
+ fbb.Finish(root);
+}
+
+inline void FinishSizePrefixedRootBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<Evolution::V1::Root> root) {
+ fbb.FinishSizePrefixed(root);
+}
+
+} // namespace V1
+} // namespace Evolution
+
+#endif // FLATBUFFERS_GENERATED_EVOLUTIONV1_EVOLUTION_V1_H_
diff --git a/tests/evolution_test/evolution_v2.fbs b/tests/evolution_test/evolution_v2.fbs
new file mode 100644
index 0000000..c7e1ef9
--- /dev/null
+++ b/tests/evolution_test/evolution_v2.fbs
@@ -0,0 +1,51 @@
+namespace Evolution.V2;
+
+table TableA {
+ b:int (id: 1); // swapped with 'a'
+ a:float (id: 0); // swapped with 'b'
+ c:string (id: 2); // new in v2
+}
+
+table TableB {
+ a:int;
+}
+
+table TableC { // new in v2
+ a:double;
+ b:string;
+}
+
+enum Enum : byte {
+ King,
+ Queen,
+ Rook, // new in v2
+ Bishop // new in v2
+}
+
+union Union {
+ TableA,
+ TableB,
+ TableC
+}
+
+struct Struct {
+ a:int;
+ b:double;
+}
+
+table Root {
+ a:int (deprecated); // deprecated in v2
+ b:bool;
+ c:Union;
+ d:Enum;
+ e:TableA;
+ ff:Struct; // renamed from 'f' in v1
+ g:[int];
+ h:[TableB];
+ i:uint = 1234;
+ j:Union (deprecated); // deprecated in v2
+ k:TableC; // new in v2
+ l:uint8 = 56; // new in v2
+}
+
+root_type Root;
diff --git a/tests/evolution_test/evolution_v2.json b/tests/evolution_test/evolution_v2.json
new file mode 100644
index 0000000..b170eb2
--- /dev/null
+++ b/tests/evolution_test/evolution_v2.json
@@ -0,0 +1,34 @@
+{
+ "b": false,
+ "c_type": "TableC",
+ "c": {
+ "a": 984.2494
+ },
+ "d": "Bishop",
+ "e": {
+ "a": 3.1452,
+ "b": 435,
+ "c": "yummy yummy fig bar bar"
+ },
+ "ff":{
+ "a": 35,
+ "b": 243.980943
+ },
+ "g": [ 7, 8, 10],
+ "h": [
+ {
+ "a": 212
+ },
+ {
+ "a": 459
+ },
+ {
+ "a": 333
+ }
+ ],
+ "i": 4321,
+ "k": {
+ "a": 9874.342,
+ "b": "more please"
+ }
+}
diff --git a/tests/evolution_test/evolution_v2_generated.h b/tests/evolution_test/evolution_v2_generated.h
new file mode 100644
index 0000000..303d94d
--- /dev/null
+++ b/tests/evolution_test/evolution_v2_generated.h
@@ -0,0 +1,600 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_EVOLUTIONV2_EVOLUTION_V2_H_
+#define FLATBUFFERS_GENERATED_EVOLUTIONV2_EVOLUTION_V2_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace Evolution {
+namespace V2 {
+
+struct TableA;
+struct TableABuilder;
+
+struct TableB;
+struct TableBBuilder;
+
+struct TableC;
+struct TableCBuilder;
+
+struct Struct;
+
+struct Root;
+struct RootBuilder;
+
+enum class Enum : int8_t {
+ King = 0,
+ Queen = 1,
+ Rook = 2,
+ Bishop = 3,
+ MIN = King,
+ MAX = Bishop
+};
+
+inline const Enum (&EnumValuesEnum())[4] {
+ static const Enum values[] = {
+ Enum::King,
+ Enum::Queen,
+ Enum::Rook,
+ Enum::Bishop
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesEnum() {
+ static const char * const names[5] = {
+ "King",
+ "Queen",
+ "Rook",
+ "Bishop",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameEnum(Enum e) {
+ if (flatbuffers::IsOutRange(e, Enum::King, Enum::Bishop)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesEnum()[index];
+}
+
+enum class Union : uint8_t {
+ NONE = 0,
+ TableA = 1,
+ TableB = 2,
+ TableC = 3,
+ MIN = NONE,
+ MAX = TableC
+};
+
+inline const Union (&EnumValuesUnion())[4] {
+ static const Union values[] = {
+ Union::NONE,
+ Union::TableA,
+ Union::TableB,
+ Union::TableC
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesUnion() {
+ static const char * const names[5] = {
+ "NONE",
+ "TableA",
+ "TableB",
+ "TableC",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameUnion(Union e) {
+ if (flatbuffers::IsOutRange(e, Union::NONE, Union::TableC)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesUnion()[index];
+}
+
+template<typename T> struct UnionTraits {
+ static const Union enum_value = Union::NONE;
+};
+
+template<> struct UnionTraits<Evolution::V2::TableA> {
+ static const Union enum_value = Union::TableA;
+};
+
+template<> struct UnionTraits<Evolution::V2::TableB> {
+ static const Union enum_value = Union::TableB;
+};
+
+template<> struct UnionTraits<Evolution::V2::TableC> {
+ static const Union enum_value = Union::TableC;
+};
+
+bool VerifyUnion(flatbuffers::Verifier &verifier, const void *obj, Union type);
+bool VerifyUnionVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
+
+FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Struct FLATBUFFERS_FINAL_CLASS {
+ private:
+ int32_t a_;
+ int32_t padding0__;
+ double b_;
+
+ public:
+ Struct()
+ : a_(0),
+ padding0__(0),
+ b_(0) {
+ (void)padding0__;
+ }
+ Struct(int32_t _a, double _b)
+ : a_(flatbuffers::EndianScalar(_a)),
+ padding0__(0),
+ b_(flatbuffers::EndianScalar(_b)) {
+ (void)padding0__;
+ }
+ int32_t a() const {
+ return flatbuffers::EndianScalar(a_);
+ }
+ double b() const {
+ return flatbuffers::EndianScalar(b_);
+ }
+};
+FLATBUFFERS_STRUCT_END(Struct, 16);
+
+inline bool operator==(const Struct &lhs, const Struct &rhs) {
+ return
+ (lhs.a() == rhs.a()) &&
+ (lhs.b() == rhs.b());
+}
+
+inline bool operator!=(const Struct &lhs, const Struct &rhs) {
+ return !(lhs == rhs);
+}
+
+
+struct TableA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableABuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4,
+ VT_B = 6,
+ VT_C = 8
+ };
+ float a() const {
+ return GetField<float>(VT_A, 0.0f);
+ }
+ int32_t b() const {
+ return GetField<int32_t>(VT_B, 0);
+ }
+ const flatbuffers::String *c() const {
+ return GetPointer<const flatbuffers::String *>(VT_C);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<float>(verifier, VT_A) &&
+ VerifyField<int32_t>(verifier, VT_B) &&
+ VerifyOffset(verifier, VT_C) &&
+ verifier.VerifyString(c()) &&
+ verifier.EndTable();
+ }
+};
+
+struct TableABuilder {
+ typedef TableA Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(float a) {
+ fbb_.AddElement<float>(TableA::VT_A, a, 0.0f);
+ }
+ void add_b(int32_t b) {
+ fbb_.AddElement<int32_t>(TableA::VT_B, b, 0);
+ }
+ void add_c(flatbuffers::Offset<flatbuffers::String> c) {
+ fbb_.AddOffset(TableA::VT_C, c);
+ }
+ explicit TableABuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TableA> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TableA>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TableA> CreateTableA(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ float a = 0.0f,
+ int32_t b = 0,
+ flatbuffers::Offset<flatbuffers::String> c = 0) {
+ TableABuilder builder_(_fbb);
+ builder_.add_c(c);
+ builder_.add_b(b);
+ builder_.add_a(a);
+ return builder_.Finish();
+}
+
+inline flatbuffers::Offset<TableA> CreateTableADirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ float a = 0.0f,
+ int32_t b = 0,
+ const char *c = nullptr) {
+ auto c__ = c ? _fbb.CreateString(c) : 0;
+ return Evolution::V2::CreateTableA(
+ _fbb,
+ a,
+ b,
+ c__);
+}
+
+struct TableB FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableBBuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4
+ };
+ int32_t a() const {
+ return GetField<int32_t>(VT_A, 0);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int32_t>(verifier, VT_A) &&
+ verifier.EndTable();
+ }
+};
+
+struct TableBBuilder {
+ typedef TableB Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(int32_t a) {
+ fbb_.AddElement<int32_t>(TableB::VT_A, a, 0);
+ }
+ explicit TableBBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TableB> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TableB>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TableB> CreateTableB(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int32_t a = 0) {
+ TableBBuilder builder_(_fbb);
+ builder_.add_a(a);
+ return builder_.Finish();
+}
+
+struct TableC FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableCBuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_A = 4,
+ VT_B = 6
+ };
+ double a() const {
+ return GetField<double>(VT_A, 0.0);
+ }
+ const flatbuffers::String *b() const {
+ return GetPointer<const flatbuffers::String *>(VT_B);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<double>(verifier, VT_A) &&
+ VerifyOffset(verifier, VT_B) &&
+ verifier.VerifyString(b()) &&
+ verifier.EndTable();
+ }
+};
+
+struct TableCBuilder {
+ typedef TableC Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_a(double a) {
+ fbb_.AddElement<double>(TableC::VT_A, a, 0.0);
+ }
+ void add_b(flatbuffers::Offset<flatbuffers::String> b) {
+ fbb_.AddOffset(TableC::VT_B, b);
+ }
+ explicit TableCBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<TableC> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<TableC>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<TableC> CreateTableC(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ double a = 0.0,
+ flatbuffers::Offset<flatbuffers::String> b = 0) {
+ TableCBuilder builder_(_fbb);
+ builder_.add_a(a);
+ builder_.add_b(b);
+ return builder_.Finish();
+}
+
+inline flatbuffers::Offset<TableC> CreateTableCDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ double a = 0.0,
+ const char *b = nullptr) {
+ auto b__ = b ? _fbb.CreateString(b) : 0;
+ return Evolution::V2::CreateTableC(
+ _fbb,
+ a,
+ b__);
+}
+
+struct Root FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef RootBuilder Builder;
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_B = 6,
+ VT_C_TYPE = 8,
+ VT_C = 10,
+ VT_D = 12,
+ VT_E = 14,
+ VT_FF = 16,
+ VT_G = 18,
+ VT_H = 20,
+ VT_I = 22,
+ VT_K = 28,
+ VT_L = 30
+ };
+ bool b() const {
+ return GetField<uint8_t>(VT_B, 0) != 0;
+ }
+ Evolution::V2::Union c_type() const {
+ return static_cast<Evolution::V2::Union>(GetField<uint8_t>(VT_C_TYPE, 0));
+ }
+ const void *c() const {
+ return GetPointer<const void *>(VT_C);
+ }
+ template<typename T> const T *c_as() const;
+ const Evolution::V2::TableA *c_as_TableA() const {
+ return c_type() == Evolution::V2::Union::TableA ? static_cast<const Evolution::V2::TableA *>(c()) : nullptr;
+ }
+ const Evolution::V2::TableB *c_as_TableB() const {
+ return c_type() == Evolution::V2::Union::TableB ? static_cast<const Evolution::V2::TableB *>(c()) : nullptr;
+ }
+ const Evolution::V2::TableC *c_as_TableC() const {
+ return c_type() == Evolution::V2::Union::TableC ? static_cast<const Evolution::V2::TableC *>(c()) : nullptr;
+ }
+ Evolution::V2::Enum d() const {
+ return static_cast<Evolution::V2::Enum>(GetField<int8_t>(VT_D, 0));
+ }
+ const Evolution::V2::TableA *e() const {
+ return GetPointer<const Evolution::V2::TableA *>(VT_E);
+ }
+ const Evolution::V2::Struct *ff() const {
+ return GetStruct<const Evolution::V2::Struct *>(VT_FF);
+ }
+ const flatbuffers::Vector<int32_t> *g() const {
+ return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_G);
+ }
+ const flatbuffers::Vector<flatbuffers::Offset<Evolution::V2::TableB>> *h() const {
+ return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<Evolution::V2::TableB>> *>(VT_H);
+ }
+ uint32_t i() const {
+ return GetField<uint32_t>(VT_I, 1234);
+ }
+ const Evolution::V2::TableC *k() const {
+ return GetPointer<const Evolution::V2::TableC *>(VT_K);
+ }
+ uint8_t l() const {
+ return GetField<uint8_t>(VT_L, 56);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<uint8_t>(verifier, VT_B) &&
+ VerifyField<uint8_t>(verifier, VT_C_TYPE) &&
+ VerifyOffset(verifier, VT_C) &&
+ VerifyUnion(verifier, c(), c_type()) &&
+ VerifyField<int8_t>(verifier, VT_D) &&
+ VerifyOffset(verifier, VT_E) &&
+ verifier.VerifyTable(e()) &&
+ VerifyField<Evolution::V2::Struct>(verifier, VT_FF) &&
+ VerifyOffset(verifier, VT_G) &&
+ verifier.VerifyVector(g()) &&
+ VerifyOffset(verifier, VT_H) &&
+ verifier.VerifyVector(h()) &&
+ verifier.VerifyVectorOfTables(h()) &&
+ VerifyField<uint32_t>(verifier, VT_I) &&
+ VerifyOffset(verifier, VT_K) &&
+ verifier.VerifyTable(k()) &&
+ VerifyField<uint8_t>(verifier, VT_L) &&
+ verifier.EndTable();
+ }
+};
+
+template<> inline const Evolution::V2::TableA *Root::c_as<Evolution::V2::TableA>() const {
+ return c_as_TableA();
+}
+
+template<> inline const Evolution::V2::TableB *Root::c_as<Evolution::V2::TableB>() const {
+ return c_as_TableB();
+}
+
+template<> inline const Evolution::V2::TableC *Root::c_as<Evolution::V2::TableC>() const {
+ return c_as_TableC();
+}
+
+struct RootBuilder {
+ typedef Root Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_b(bool b) {
+ fbb_.AddElement<uint8_t>(Root::VT_B, static_cast<uint8_t>(b), 0);
+ }
+ void add_c_type(Evolution::V2::Union c_type) {
+ fbb_.AddElement<uint8_t>(Root::VT_C_TYPE, static_cast<uint8_t>(c_type), 0);
+ }
+ void add_c(flatbuffers::Offset<void> c) {
+ fbb_.AddOffset(Root::VT_C, c);
+ }
+ void add_d(Evolution::V2::Enum d) {
+ fbb_.AddElement<int8_t>(Root::VT_D, static_cast<int8_t>(d), 0);
+ }
+ void add_e(flatbuffers::Offset<Evolution::V2::TableA> e) {
+ fbb_.AddOffset(Root::VT_E, e);
+ }
+ void add_ff(const Evolution::V2::Struct *ff) {
+ fbb_.AddStruct(Root::VT_FF, ff);
+ }
+ void add_g(flatbuffers::Offset<flatbuffers::Vector<int32_t>> g) {
+ fbb_.AddOffset(Root::VT_G, g);
+ }
+ void add_h(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Evolution::V2::TableB>>> h) {
+ fbb_.AddOffset(Root::VT_H, h);
+ }
+ void add_i(uint32_t i) {
+ fbb_.AddElement<uint32_t>(Root::VT_I, i, 1234);
+ }
+ void add_k(flatbuffers::Offset<Evolution::V2::TableC> k) {
+ fbb_.AddOffset(Root::VT_K, k);
+ }
+ void add_l(uint8_t l) {
+ fbb_.AddElement<uint8_t>(Root::VT_L, l, 56);
+ }
+ explicit RootBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<Root> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<Root>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Root> CreateRoot(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ bool b = false,
+ Evolution::V2::Union c_type = Evolution::V2::Union::NONE,
+ flatbuffers::Offset<void> c = 0,
+ Evolution::V2::Enum d = Evolution::V2::Enum::King,
+ flatbuffers::Offset<Evolution::V2::TableA> e = 0,
+ const Evolution::V2::Struct *ff = 0,
+ flatbuffers::Offset<flatbuffers::Vector<int32_t>> g = 0,
+ flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Evolution::V2::TableB>>> h = 0,
+ uint32_t i = 1234,
+ flatbuffers::Offset<Evolution::V2::TableC> k = 0,
+ uint8_t l = 56) {
+ RootBuilder builder_(_fbb);
+ builder_.add_k(k);
+ builder_.add_i(i);
+ builder_.add_h(h);
+ builder_.add_g(g);
+ builder_.add_ff(ff);
+ builder_.add_e(e);
+ builder_.add_c(c);
+ builder_.add_l(l);
+ builder_.add_d(d);
+ builder_.add_c_type(c_type);
+ builder_.add_b(b);
+ return builder_.Finish();
+}
+
+inline flatbuffers::Offset<Root> CreateRootDirect(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ bool b = false,
+ Evolution::V2::Union c_type = Evolution::V2::Union::NONE,
+ flatbuffers::Offset<void> c = 0,
+ Evolution::V2::Enum d = Evolution::V2::Enum::King,
+ flatbuffers::Offset<Evolution::V2::TableA> e = 0,
+ const Evolution::V2::Struct *ff = 0,
+ const std::vector<int32_t> *g = nullptr,
+ const std::vector<flatbuffers::Offset<Evolution::V2::TableB>> *h = nullptr,
+ uint32_t i = 1234,
+ flatbuffers::Offset<Evolution::V2::TableC> k = 0,
+ uint8_t l = 56) {
+ auto g__ = g ? _fbb.CreateVector<int32_t>(*g) : 0;
+ auto h__ = h ? _fbb.CreateVector<flatbuffers::Offset<Evolution::V2::TableB>>(*h) : 0;
+ return Evolution::V2::CreateRoot(
+ _fbb,
+ b,
+ c_type,
+ c,
+ d,
+ e,
+ ff,
+ g__,
+ h__,
+ i,
+ k,
+ l);
+}
+
+inline bool VerifyUnion(flatbuffers::Verifier &verifier, const void *obj, Union type) {
+ switch (type) {
+ case Union::NONE: {
+ return true;
+ }
+ case Union::TableA: {
+ auto ptr = reinterpret_cast<const Evolution::V2::TableA *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case Union::TableB: {
+ auto ptr = reinterpret_cast<const Evolution::V2::TableB *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ case Union::TableC: {
+ auto ptr = reinterpret_cast<const Evolution::V2::TableC *>(obj);
+ return verifier.VerifyTable(ptr);
+ }
+ default: return true;
+ }
+}
+
+inline bool VerifyUnionVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
+ if (!values || !types) return !values && !types;
+ if (values->size() != types->size()) return false;
+ for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
+ if (!VerifyUnion(
+ verifier, values->Get(i), types->GetEnum<Union>(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+inline const Evolution::V2::Root *GetRoot(const void *buf) {
+ return flatbuffers::GetRoot<Evolution::V2::Root>(buf);
+}
+
+inline const Evolution::V2::Root *GetSizePrefixedRoot(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<Evolution::V2::Root>(buf);
+}
+
+inline bool VerifyRootBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<Evolution::V2::Root>(nullptr);
+}
+
+inline bool VerifySizePrefixedRootBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<Evolution::V2::Root>(nullptr);
+}
+
+inline void FinishRootBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<Evolution::V2::Root> root) {
+ fbb.Finish(root);
+}
+
+inline void FinishSizePrefixedRootBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<Evolution::V2::Root> root) {
+ fbb.FinishSizePrefixed(root);
+}
+
+} // namespace V2
+} // namespace Evolution
+
+#endif // FLATBUFFERS_GENERATED_EVOLUTIONV2_EVOLUTION_V2_H_
diff --git a/tests/fuzzer/CMakeLists.txt b/tests/fuzzer/CMakeLists.txt
index 7df5df2..fbd9295 100644
--- a/tests/fuzzer/CMakeLists.txt
+++ b/tests/fuzzer/CMakeLists.txt
@@ -1,91 +1,147 @@
cmake_minimum_required(VERSION 3.9)
set(CMAKE_VERBOSE_MAKEFILE ON)
-
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
project(FlatBuffersFuzzerTests)
-set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -pedantic -Werror -Wextra -Wno-unused-parameter -fsigned-char")
-
-set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -g -fsigned-char -fno-omit-frame-pointer")
-
-# Typical slowdown introduced by MemorySanitizer (memory) is 3x.
-# '-fsanitize=address' not allowed with '-fsanitize=memory'
-if(YES)
- set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer,address,undefined")
-else()
- set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer,memory,undefined -fsanitize-memory-track-origins=2")
-endif()
-
-set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -fsanitize-coverage=edge,trace-cmp")
-
-# enable link-time optimisation
-# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
-
-# https://llvm.org/docs/Passes.html
-# save IR to see call graph
-# make one bitcode file:> llvm-link *.bc -o out.bc
-# print call-graph:> opt out.bc -analyze -print-callgraph &> callgraph.txt
-# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -save-temps -flto")
-
-set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
-
-set(FLATBUFFERS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../")
-
-set(FlatBuffers_Library_SRCS
- ${FLATBUFFERS_DIR}/include/flatbuffers/code_generators.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/base.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffers.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/hash.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/idl.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/util.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/reflection.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/reflection_generated.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/stl_emulation.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/flexbuffers.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/registry.h
- ${FLATBUFFERS_DIR}/include/flatbuffers/minireflect.h
- ${FLATBUFFERS_DIR}/src/code_generators.cpp
- ${FLATBUFFERS_DIR}/src/idl_parser.cpp
- ${FLATBUFFERS_DIR}/src/idl_gen_text.cpp
- ${FLATBUFFERS_DIR}/src/reflection.cpp
- ${FLATBUFFERS_DIR}/src/util.cpp
- ${FLATBUFFERS_DIR}/tests/test_assert.cpp
-)
-
-include_directories(${FLATBUFFERS_DIR}/include)
-include_directories(${FLATBUFFERS_DIR}/tests)
-add_library(flatbuffers STATIC ${FlatBuffers_Library_SRCS})
-
-# FLATBUFFERS_ASSERT should assert in Release as well.
-# Redefine FLATBUFFERS_ASSERT macro definition.
-# Declare as PUBLIC to cover asserts in all included header files.
-target_compile_definitions(flatbuffers PUBLIC
- FLATBUFFERS_ASSERT=fuzzer_assert_impl)
-target_compile_definitions(flatbuffers PUBLIC
- FLATBUFFERS_ASSERT_INCLUDE="${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h")
+option(BUILD_DEBUGGER "Compile a debugger with main() and without libFuzzer" OFF)
if(NOT DEFINED FLATBUFFERS_MAX_PARSING_DEPTH)
# Force checking of RecursionError in the test
set(FLATBUFFERS_MAX_PARSING_DEPTH 8)
endif()
message(STATUS "FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}")
-target_compile_definitions(flatbuffers PRIVATE FLATBUFFERS_MAX_PARSING_DEPTH=8)
+
+# Usage '-fsanitize=address' doesn't allowed with '-fsanitize=memory'.
+# MemorySanitizer will not work out-of-the-box, and will instead report false
+# positives coming from uninstrumented code. Need to re-build both C++ standard
+# library: https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo
+option(USE_ASAN "Use fuzzers with ASASN" OFF)
+option(USE_MSAN "Use fuzzers with MSASN" OFF)
+option(OSS_FUZZ "Set this option to use flags by oss-fuzz" OFF)
+
+# Use Clang linker.
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
+
+# add_link_options(-stdlib=libc++)
+
+add_compile_options(
+ # -stdlib=libc++ # Use Clang libc++ instead of GNU.
+ -std=c++14
+ -Wall
+ -pedantic
+ -Werror
+ -Wextra
+ -Wno-unused-parameter
+ -fsigned-char
+ -fno-omit-frame-pointer
+ -g # Generate source-level debug information
+ # -flto # enable link-time optimisation
+)
+
+# https://llvm.org/docs/Passes.html save IR to see call graph make one bitcode
+# file:> llvm-link *.bc -o out.bc print call-graph:> opt out.bc -analyze -print-
+# callgraph &> callgraph.txt set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -save-temps
+# -flto")
+
+# A special target with fuzzer+sanitizer flags.
+add_library(fuzzer_config INTERFACE)
+
+target_compile_options(
+ fuzzer_config
+ INTERFACE
+ #-fsanitize-coverage=edge,trace-cmp
+ $<$<BOOL:${USE_ASAN}>:
+ -fsanitize=fuzzer,undefined,address
+ >
+ $<$<BOOL:${USE_MSAN}>:
+ -fsanitize=fuzzer,undefined,memory
+ -fsanitize-memory-track-origins=2
+ >
+ $<$<BOOL:${OSS_FUZZ}>:
+ ${CXX}
+ ${CXXFLAGS}
+ >
+)
+
+target_link_libraries(
+ fuzzer_config
+ INTERFACE
+ $<$<BOOL:${USE_ASAN}>:
+ -fsanitize=fuzzer,undefined,address
+ >
+ $<$<BOOL:${USE_MSAN}>:
+ -fsanitize=fuzzer,undefined,memory
+ >
+ $<$<BOOL:${OSS_FUZZ}>:
+ $ENV{LIB_FUZZING_ENGINE}
+ >
+)
+
+set(FLATBUFFERS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../")
+
+set(FlatBuffers_Library_SRCS
+ ${FLATBUFFERS_DIR}/include/flatbuffers/base.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffers.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/hash.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/idl.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/util.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/reflection.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/reflection_generated.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/stl_emulation.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/flexbuffers.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/registry.h
+ ${FLATBUFFERS_DIR}/include/flatbuffers/minireflect.h
+ ${FLATBUFFERS_DIR}/src/idl_parser.cpp
+ ${FLATBUFFERS_DIR}/src/idl_gen_text.cpp
+ ${FLATBUFFERS_DIR}/src/reflection.cpp
+ ${FLATBUFFERS_DIR}/src/util.cpp
+ ${FLATBUFFERS_DIR}/tests/test_assert.cpp
+)
+
+include_directories(${FLATBUFFERS_DIR}/include)
+include_directories(${FLATBUFFERS_DIR}/tests)
+
+add_library(flatbuffers_fuzzed STATIC ${FlatBuffers_Library_SRCS})
+# Use PUBLIC to force 'fuzzer_config' for all dependent targets
+target_link_libraries(flatbuffers_fuzzed PUBLIC fuzzer_config)
+
+# FLATBUFFERS_ASSERT should assert in Release as well. Redefine
+# FLATBUFFERS_ASSERT macro definition. Declare as PUBLIC to cover asserts in all
+# included header files.
+target_compile_definitions(
+ flatbuffers_fuzzed
+ PUBLIC
+ FLATBUFFERS_ASSERT=fuzzer_assert_impl
+ FLATBUFFERS_ASSERT_INCLUDE="${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h"
+ PRIVATE
+ FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH}
+)
# Setup fuzzer tests.
add_executable(scalar_fuzzer flatbuffers_scalar_fuzzer.cc)
-target_link_libraries(scalar_fuzzer PRIVATE flatbuffers)
+target_link_libraries(scalar_fuzzer PRIVATE flatbuffers_fuzzed)
add_executable(parser_fuzzer flatbuffers_parser_fuzzer.cc)
-target_link_libraries(parser_fuzzer PRIVATE flatbuffers)
+target_link_libraries(parser_fuzzer PRIVATE flatbuffers_fuzzed)
add_executable(verifier_fuzzer flatbuffers_verifier_fuzzer.cc)
-target_link_libraries(verifier_fuzzer PRIVATE flatbuffers)
+target_link_libraries(verifier_fuzzer PRIVATE flatbuffers_fuzzed)
+
+# Build debugger for weird cases found with fuzzer.
+if(BUILD_DEBUGGER)
+ add_library(flatbuffers_nonfuzz STATIC ${FlatBuffers_Library_SRCS})
+ target_compile_definitions(
+ flatbuffers_nonfuzz
+ PUBLIC
+ FLATBUFFERS_ASSERT=fuzzer_assert_impl
+ FLATBUFFERS_ASSERT_INCLUDE="${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h"
+ PRIVATE
+ FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH}
+ )
+ add_executable(scalar_debug flatbuffers_scalar_fuzzer.cc scalar_debug.cpp)
+ target_link_libraries(scalar_debug PRIVATE flatbuffers_nonfuzz)
+endif(BUILD_DEBUGGER)
diff --git a/tests/fuzzer/flatbuffers_parser_fuzzer.cc b/tests/fuzzer/flatbuffers_parser_fuzzer.cc
index 87dd2d2..6646cd6 100644
--- a/tests/fuzzer/flatbuffers_parser_fuzzer.cc
+++ b/tests/fuzzer/flatbuffers_parser_fuzzer.cc
@@ -26,7 +26,8 @@
if (size < 3) return 0;
const uint8_t flags = data[0];
// normalize to ascii alphabet
- const int extra_rep_number = data[1] >= '0' ? (data[1] - '0') : 0;
+ const int extra_rep_number =
+ std::max(5, (data[1] < '0' ? (data[1] - '0') : 0));
data += 2;
size -= 2; // bypass
diff --git a/tests/fuzzer/flatbuffers_scalar_fuzzer.cc b/tests/fuzzer/flatbuffers_scalar_fuzzer.cc
index 074a488..ea8878a 100644
--- a/tests/fuzzer/flatbuffers_scalar_fuzzer.cc
+++ b/tests/fuzzer/flatbuffers_scalar_fuzzer.cc
@@ -101,8 +101,8 @@
static const std::vector<std::regex> re_list = {
std::regex{ R"(^[-+]?[0-9]+$)", std::regex_constants::optimize },
- std::regex{
- R"(^[-+]?0[xX][0-9a-fA-F]+$)", std::regex_constants::optimize }
+ std::regex{ R"(^[-+]?0[xX][0-9a-fA-F]+$)",
+ std::regex_constants::optimize }
};
return MatchRegexList(input, re_list);
}
@@ -117,8 +117,8 @@
bool MatchNumber(const std::string &input) const override {
static const std::vector<std::regex> re_list = {
std::regex{ R"(^[+]?[0-9]+$)", std::regex_constants::optimize },
- std::regex{
- R"(^[+]?0[xX][0-9a-fA-F]+$)", std::regex_constants::optimize },
+ std::regex{ R"(^[+]?0[xX][0-9a-fA-F]+$)",
+ std::regex_constants::optimize },
// accept -0 number
std::regex{ R"(^[-](?:0[xX])?0+$)", std::regex_constants::optimize }
};
@@ -216,7 +216,8 @@
if (size < 3) return 0;
const uint8_t flags = data[0];
// normalize to ascii alphabet
- const int extra_rep_number = data[1] >= '0' ? (data[1] - '0') : 0;
+ const int extra_rep_number =
+ std::max(5, (data[1] < '0' ? (data[1] - '0') : 0));
data += 2;
size -= 2; // bypass
@@ -232,6 +233,9 @@
// We reject this by transform "/* text */ 12345" to "@* text */ 12345".
BreakSequence(input, "//", '@'); // "//" -> "@/"
BreakSequence(input, "/*", '@'); // "/*" -> "@*"
+ // { "$schema: "text" } is exceptional case.
+ // This key:value ignored by the parser. Numbers can not have $.
+ BreakSequence(input, "$schema", '@'); // "$schema" -> "@schema"
// Break all known scalar functions (todo: add them to regex?):
for (auto f : { "deg", "rad", "sin", "cos", "tan", "asin", "acos", "atan" }) {
BreakSequence(input, f, '_'); // ident -> ident
diff --git a/tests/fuzzer/scalar_debug.cpp b/tests/fuzzer/scalar_debug.cpp
new file mode 100644
index 0000000..9ce9e5e
--- /dev/null
+++ b/tests/fuzzer/scalar_debug.cpp
@@ -0,0 +1,28 @@
+#include <iostream>
+#include "flatbuffers/util.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+int main(int argc, char *argv[]) {
+ if (argc < 2) {
+ std::cerr << "Usage: scalar_debug <path to fuzzer crash file>\n";
+ return 0;
+ }
+ std::string crash_file_name(argv[1]);
+ std::string crash_file_data;
+ auto done =
+ flatbuffers::LoadFile(crash_file_name.c_str(), true, &crash_file_data);
+ if (!done) {
+ std::cerr << "Can not load file: '" << crash_file_name << "'";
+ return -1;
+ }
+ if (crash_file_data.size() < 3) {
+ std::cerr << "Invalid file data: '" << crash_file_data << "'";
+ return -2;
+ }
+ auto rc = LLVMFuzzerTestOneInput(
+ reinterpret_cast<const uint8_t *>(crash_file_data.data()),
+ crash_file_data.size());
+ std::cout << "LLVMFuzzerTestOneInput finished with code " << rc;
+ return rc;
+}
diff --git a/tests/fuzzer/test_init.h b/tests/fuzzer/test_init.h
index 3d8d07c..6c9113d 100644
--- a/tests/fuzzer/test_init.h
+++ b/tests/fuzzer/test_init.h
@@ -5,10 +5,6 @@
#include "fuzzer_assert.h"
#include "test_assert.h"
-static_assert(__has_feature(memory_sanitizer) ||
- __has_feature(address_sanitizer),
- "sanitizer disabled");
-
// Utility for test run.
struct OneTimeTestInit {
// Declare trap for the Flatbuffers test engine.
@@ -53,4 +49,4 @@
static OneTimeTestInit one_time_init_;
};
-#endif // !FUZZER_TEST_INIT_H_
\ No newline at end of file
+#endif // !FUZZER_TEST_INIT_H_
diff --git a/tests/generate_code.bat b/tests/generate_code.bat
index 59033b8..1fc96a2 100644
--- a/tests/generate_code.bat
+++ b/tests/generate_code.bat
@@ -12,27 +12,76 @@
:: See the License for the specific language governing permissions and
:: limitations under the License.
+@SETLOCAL
+
set buildtype=Release
if "%1"=="-b" set buildtype=%2
-..\%buildtype%\flatc.exe --cpp --java --csharp --dart --go --binary --lobster --lua --python --js --ts --php --rust --grpc --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes --cpp-ptr-type flatbuffers::unique_ptr --no-fb-import -I include_test monster_test.fbs monsterdata_test.json || goto FAIL
-..\%buildtype%\flatc.exe --cpp --java --csharp --dart --go --binary --lobster --lua --python --js --ts --php --rust --gen-mutable --reflect-names --no-fb-import --cpp-ptr-type flatbuffers::unique_ptr -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs || goto FAIL
-..\%buildtype%\flatc.exe --cpp --java --csharp --js --ts --php --gen-mutable --reflect-names --gen-object-api --gen-compare --cpp-ptr-type flatbuffers::unique_ptr -o union_vector ./union_vector/union_vector.fbs || goto FAIL
+set commandline=%*
+
+
+if NOT "%commandline%"=="%commandline:--cpp-std c++0x=%" (
+ set TEST_CPP_FLAGS=--cpp-std c++0x
+) else (
+ @rem --cpp-std is defined by flatc default settings.
+ set TEST_CPP_FLAGS=
+)
+
+set TEST_CPP_FLAGS=--gen-compare --cpp-ptr-type flatbuffers::unique_ptr %TEST_CPP_FLAGS%
+set TEST_CS_FLAGS=--cs-gen-json-serializer
+set TEST_JS_TS_FLAGS=--gen-name-strings
+set TEST_RUST_FLAGS=--gen-name-strings
+set TEST_BASE_FLAGS=--reflect-names --gen-mutable --gen-object-api
+set TEST_NOINCL_FLAGS=%TEST_BASE_FLAGS% --no-includes --no-fb-import
+
+..\%buildtype%\flatc.exe --binary --cpp --java --kotlin --csharp --dart --go --lobster --lua --js --ts --php --grpc ^
+%TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% -I include_test monster_test.fbs monsterdata_test.json || goto FAIL
+..\%buildtype%\flatc.exe --rust %TEST_NOINCL_FLAGS% %TEST_RUST_FLAGS% -I include_test monster_test.fbs monsterdata_test.json || goto FAIL
+
+..\%buildtype%\flatc.exe --python %TEST_BASE_FLAGS% --no-fb-import -I include_test monster_test.fbs monsterdata_test.json || goto FAIL
+
+..\%buildtype%\flatc.exe --binary --cpp --java --csharp --dart --go --lobster --lua --js --ts --php --python --rust ^
+%TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% %TEST_JS_TS_FLAGS% -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs || goto FAIL
+
+..\%buildtype%\flatc.exe --cpp --java --csharp --js --ts --php %TEST_BASE_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% %TEST_JS_TS_FLAGS% -o union_vector ./union_vector/union_vector.fbs || goto FAIL
+..\%buildtype%\flatc.exe --rust -I include_test -o include_test include_test/include_test1.fbs || goto FAIL
+..\%buildtype%\flatc.exe --rust -I include_test -o include_test/sub include_test/sub/include_test2.fbs || goto FAIL
..\%buildtype%\flatc.exe -b --schema --bfbs-comments --bfbs-builtins -I include_test monster_test.fbs || goto FAIL
+..\%buildtype%\flatc.exe --cpp --bfbs-comments --bfbs-builtins --bfbs-gen-embed %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% -I include_test monster_test.fbs || goto FAIL
..\%buildtype%\flatc.exe -b --schema --bfbs-comments --bfbs-builtins -I include_test arrays_test.fbs || goto FAIL
..\%buildtype%\flatc.exe --jsonschema --schema -I include_test monster_test.fbs || goto FAIL
-..\%buildtype%\flatc.exe --cpp --java --csharp --python --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes --scoped-enums --jsonschema --cpp-ptr-type flatbuffers::unique_ptr arrays_test.fbs || goto FAIL
-..\%buildtype%\flatc.exe --cpp --gen-mutable --gen-object-api --reflect-names --cpp-ptr-type flatbuffers::unique_ptr native_type_test.fbs || goto FAIL
+..\%buildtype%\flatc.exe --cpp --java --csharp --jsonschema %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% --scoped-enums arrays_test.fbs || goto FAIL
+..\%buildtype%\flatc.exe --python %TEST_BASE_FLAGS% arrays_test.fbs || goto FAIL
+..\%buildtype%\flatc.exe --cpp %TEST_BASE_FLAGS% --cpp-ptr-type flatbuffers::unique_ptr native_type_test.fbs || goto FAIL
-IF NOT "%MONSTER_EXTRA%"=="skip" (
+@rem Generate the optional scalar code for tests.
+..\%buildtype%\flatc.exe --csharp --java --kotlin --rust --lobster --ts --js optional_scalars.fbs || goto FAIL
+..\%buildtype%\flatc.exe %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% --cpp optional_scalars.fbs || goto FAIL
+
+@rem Generate the schema evolution tests
+..\%buildtype%\flatc.exe --cpp --scoped-enums %TEST_CPP_FLAGS% -o evolution_test ./evolution_test/evolution_v1.fbs ./evolution_test/evolution_v2.fbs || goto FAIL
+
+if NOT "%MONSTER_EXTRA%"=="skip" (
@echo Generate MosterExtra
- ..\%buildtype%\flatc.exe --cpp --java --csharp --python --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes monster_extra.fbs monsterdata_extra.json || goto FAIL
+ ..\%buildtype%\flatc.exe --cpp --java --csharp %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% monster_extra.fbs monsterdata_extra.json || goto FAIL
+ ..\%buildtype%\flatc.exe --python %TEST_BASE_FLAGS% monster_extra.fbs monsterdata_extra.json || goto FAIL
) else (
@echo monster_extra.fbs skipped (the strtod function from MSVC2013 or older doesn't support NaN/Inf arguments)
)
+set TEST_CPP17_FLAGS=--cpp --cpp-std c++17 -o ./cpp17/generated_cpp17 %TEST_NOINCL_FLAGS%
+if NOT "%MONSTER_EXTRA%"=="skip" (
+ @rem Flag c++17 requires Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher.
+ ..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% -I include_test monster_test.fbs || goto FAIL
+ ..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% optional_scalars.fbs || goto FAIL
+ @rem..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% arrays_test.fbs || goto FAIL
+ @rem..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% native_type_test.fbs || goto FAIL
+ @rem..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% monster_extra.fbs || goto FAIL
+ @rem..\%buildtype%\flatc.exe %TEST_CPP17_FLAGS% ./union_vector/union_vector.fbs || goto FAIL
+)
+
cd ../samples
-..\%buildtype%\flatc.exe --cpp --lobster --gen-mutable --reflect-names --gen-object-api --gen-compare --cpp-ptr-type flatbuffers::unique_ptr monster.fbs || goto FAIL
+..\%buildtype%\flatc.exe --cpp --lobster %TEST_BASE_FLAGS% %TEST_CPP_FLAGS% monster.fbs || goto FAIL
..\%buildtype%\flatc.exe -b --schema --bfbs-comments --bfbs-builtins monster.fbs || goto FAIL
cd ../reflection
call generate_code.bat %1 %2 || goto FAIL
diff --git a/tests/generate_code.sh b/tests/generate_code.sh
index d086c2f..89d9429 100755
--- a/tests/generate_code.sh
+++ b/tests/generate_code.sh
@@ -15,16 +15,80 @@
# limitations under the License.
set -e
-../flatc --cpp --java --kotlin --csharp --dart --go --binary --lobster --lua --python --js --ts --php --rust --grpc --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes --cpp-ptr-type flatbuffers::unique_ptr --no-fb-import -I include_test monster_test.fbs monsterdata_test.json
-../flatc --cpp --java --kotlin --csharp --dart --go --binary --lobster --lua --python --js --ts --php --rust --gen-mutable --reflect-names --no-fb-import --cpp-ptr-type flatbuffers::unique_ptr -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs
-../flatc --cpp --java --kotlin --csharp --js --ts --php --gen-mutable --reflect-names --gen-object-api --gen-compare --cpp-ptr-type flatbuffers::unique_ptr -o union_vector ./union_vector/union_vector.fbs
+commandline="'$*'"
+
+if [[ $commandline == *"--cpp-std c++0x"* ]]; then
+ TEST_CPP_FLAGS="--cpp-std c++0x"
+else
+ # --cpp-std is defined by flatc default settings.
+ TEST_CPP_FLAGS=
+fi
+
+TEST_CPP_FLAGS="--gen-compare --cpp-ptr-type flatbuffers::unique_ptr $TEST_CPP_FLAGS"
+TEST_CS_FLAGS="--cs-gen-json-serializer"
+TEST_JS_TS_FLAGS="--gen-name-strings"
+TEST_BASE_FLAGS="--reflect-names --gen-mutable --gen-object-api"
+TEST_RUST_FLAGS="$TEST_BASE_FLAGS --gen-name-strings"
+TEST_NOINCL_FLAGS="$TEST_BASE_FLAGS --no-includes --no-fb-import"
+
+../flatc --binary --cpp --java --kotlin --csharp --dart --go --lobster --lua --js --ts --php --grpc \
+$TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS -I include_test monster_test.fbs monsterdata_test.json
+../flatc --rust $TEST_RUST_FLAGS -I include_test monster_test.fbs monsterdata_test.json
+
+../flatc --python $TEST_BASE_FLAGS -I include_test monster_test.fbs monsterdata_test.json
+
+../flatc --cpp --java --kotlin --csharp --dart --go --binary --lobster --lua --js --ts --php --python --rust \
+$TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS $TEST_JS_TS_FLAGS -o namespace_test namespace_test/namespace_test1.fbs namespace_test/namespace_test2.fbs
+
+../flatc --cpp --java --kotlin --csharp --js --ts --php $TEST_BASE_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS $TEST_JS_TS_FLAGS -o union_vector ./union_vector/union_vector.fbs
+../flatc --rust -I include_test -o include_test include_test/include_test1.fbs
+../flatc --rust -I include_test -o include_test/sub include_test/sub/include_test2.fbs
../flatc -b --schema --bfbs-comments --bfbs-builtins -I include_test monster_test.fbs
+../flatc --cpp --bfbs-comments --bfbs-builtins --bfbs-gen-embed $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS -I include_test monster_test.fbs
../flatc -b --schema --bfbs-comments --bfbs-builtins -I include_test arrays_test.fbs
../flatc --jsonschema --schema -I include_test monster_test.fbs
-../flatc --cpp --java --kotlin --csharp --python --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes monster_extra.fbs monsterdata_extra.json
-../flatc --cpp --java --csharp --python --gen-mutable --reflect-names --gen-object-api --gen-compare --no-includes --scoped-enums --jsonschema --cpp-ptr-type flatbuffers::unique_ptr arrays_test.fbs
+../flatc --cpp --java --kotlin --csharp --python $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS monster_extra.fbs monsterdata_extra.json
+../flatc --cpp --java --csharp --jsonschema $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS --scoped-enums arrays_test.fbs
+../flatc --python $TEST_BASE_FLAGS arrays_test.fbs
+../flatc --dart monster_extra.fbs
+
+# Generate optional scalar code for tests.
+../flatc --csharp --java --kotlin --rust --lobster --ts --js optional_scalars.fbs
+../flatc $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS --cpp optional_scalars.fbs
+
+# Generate the schema evolution tests
+../flatc --cpp --scoped-enums $TEST_CPP_FLAGS -o evolution_test ./evolution_test/evolution_v*.fbs
+
+working_dir=`pwd`
+cd FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests
+$working_dir/../flatc --swift --grpc $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS -I ../../../include_test ../../../monster_test.fbs
+$working_dir/../flatc --swift $TEST_BASE_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS ../../../union_vector/union_vector.fbs
+$working_dir/../flatc --swift ../../../optional_scalars.fbs
+cd $working_dir
+
+cd FlatBuffers.GRPC.Swift/Sources/Model
+$working_dir/../flatc --swift --grpc greeter.fbs
+cd $working_dir
+
+# Tests if the --filename-suffix and --filename-ext works and produces the same
+# outputs.
+../flatc --cpp --filename-suffix _suffix --filename-ext hpp $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS -I include_test monster_test.fbs
+if [ -f "monster_test_suffix.hpp" ]; then
+ if ! cmp -s "monster_test_suffix.hpp" "monster_test_generated.h"; then
+ echo "[Error] Filename suffix option did not produce identical results"
+ fi
+ rm "monster_test_suffix.hpp"
+else
+ echo "[Error] Filename suffix option did not produce a file"
+fi
+
+# Flag c++17 requires Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher.
+TEST_CPP17_FLAGS="--cpp --cpp-std c++17 -o ./cpp17/generated_cpp17 $TEST_NOINCL_FLAGS"
+../flatc $TEST_CPP17_FLAGS -I include_test monster_test.fbs
+../flatc $TEST_CPP17_FLAGS optional_scalars.fbs
+
cd ../samples
-../flatc --cpp --kotlin --lobster --gen-mutable --reflect-names --gen-object-api --gen-compare --cpp-ptr-type flatbuffers::unique_ptr monster.fbs
+../flatc --cpp --rust --lobster $TEST_BASE_FLAGS $TEST_CPP_FLAGS monster.fbs
../flatc -b --schema --bfbs-comments --bfbs-builtins monster.fbs
cd ../reflection
-./generate_code.sh
+./generate_code.sh --cpp-std c++0x
diff --git a/tests/go_test.go b/tests/go_test.go
index 4784705..9e64cca 100644
--- a/tests/go_test.go
+++ b/tests/go_test.go
@@ -28,6 +28,7 @@
"reflect"
"sort"
"testing"
+ "testing/quick"
flatbuffers "github.com/google/flatbuffers/go"
)
@@ -77,6 +78,8 @@
CheckByteStringIsNestedError(t.Fatalf)
CheckStructIsNotInlineError(t.Fatalf)
CheckFinishedBytesError(t.Fatalf)
+ CheckSharedStrings(t.Fatalf)
+ CheckEmptiedBuilder(t.Fatalf)
// Verify that GetRootAs works for non-root tables
CheckGetRootAsForNonRootTable(t.Fatalf)
@@ -84,12 +87,13 @@
// Verify that using the generated Go code builds a buffer without
// returning errors:
- generated, off := CheckGeneratedBuild(t.Fatalf)
+ generated, off := CheckGeneratedBuild(false, t.Fatalf)
// Verify that the buffer generated by Go code is readable by the
// generated Go code:
- CheckReadBuffer(generated, off, t.Fatalf)
- CheckMutateBuffer(generated, off, t.Fatalf)
+ CheckReadBuffer(generated, off, false, t.Fatalf)
+ CheckMutateBuffer(generated, off, false, t.Fatalf)
+ CheckObjectAPI(generated, off, false, t.Fatalf)
// Verify that the buffer generated by C++ code is readable by the
// generated Go code:
@@ -97,8 +101,9 @@
if err != nil {
t.Fatal(err)
}
- CheckReadBuffer(monsterDataCpp, 0, t.Fatalf)
- CheckMutateBuffer(monsterDataCpp, 0, t.Fatalf)
+ CheckReadBuffer(monsterDataCpp, 0, false, t.Fatalf)
+ CheckMutateBuffer(monsterDataCpp, 0, false, t.Fatalf)
+ CheckObjectAPI(monsterDataCpp, 0, false, t.Fatalf)
// Verify that vtables are deduplicated when written:
CheckVtableDeduplication(t.Fatalf)
@@ -122,6 +127,9 @@
// Check a parent namespace import
CheckParentNamespace(t.Fatalf)
+ // Check size-prefixed flatbuffers
+ CheckSizePrefixedBuffer(t.Fatalf)
+
// If the filename of the FlatBuffers file generated by the Java test
// is given, check that Go code can read it, and that Go code
// generates an identical buffer when used to create the example data:
@@ -130,7 +138,7 @@
if err != nil {
t.Fatal(err)
}
- CheckReadBuffer(monsterDataJava, 0, t.Fatalf)
+ CheckReadBuffer(monsterDataJava, 0, false, t.Fatalf)
CheckByteEquality(generated[off:], monsterDataJava, t.Fatalf)
}
@@ -148,11 +156,19 @@
// CheckReadBuffer checks that the given buffer is evaluated correctly
// as the example Monster.
-func CheckReadBuffer(buf []byte, offset flatbuffers.UOffsetT, fail func(string, ...interface{})) {
+func CheckReadBuffer(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {
// try the two ways of generating a monster
- monster1 := example.GetRootAsMonster(buf, offset)
+ var monster1 *example.Monster
monster2 := &example.Monster{}
- flatbuffers.GetRootAs(buf, offset, monster2)
+
+ if sizePrefix {
+ monster1 = example.GetSizePrefixedRootAsMonster(buf, offset)
+ flatbuffers.GetSizePrefixedRootAs(buf, offset, monster2)
+ } else {
+ monster1 = example.GetRootAsMonster(buf, offset)
+ flatbuffers.GetRootAs(buf, offset, monster2)
+ }
+
for _, monster := range []*example.Monster{monster1, monster2} {
if got := monster.Hp(); 80 != got {
fail(FailString("hp", 80, got))
@@ -315,13 +331,18 @@
// CheckMutateBuffer checks that the given buffer can be mutated correctly
// as the example Monster. Only available scalar values are mutated.
-func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, fail func(string, ...interface{})) {
+func CheckMutateBuffer(org []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {
// make a copy to mutate
buf := make([]byte, len(org))
copy(buf, org)
// load monster data from the buffer
- monster := example.GetRootAsMonster(buf, offset)
+ var monster *example.Monster
+ if sizePrefix {
+ monster = example.GetSizePrefixedRootAsMonster(buf, offset)
+ } else {
+ monster = example.GetRootAsMonster(buf, offset)
+ }
// test case struct
type testcase struct {
@@ -404,7 +425,12 @@
// To make sure the buffer has changed accordingly
// Read data from the buffer and verify all fields
- monster = example.GetRootAsMonster(buf, offset)
+ if sizePrefix {
+ monster = example.GetSizePrefixedRootAsMonster(buf, offset)
+ } else {
+ monster = example.GetRootAsMonster(buf, offset)
+ }
+
for _, t := range testForMutatedValues {
if !t.testfn() {
fail("field '" + t.field + "' doesn't have the expected mutated value")
@@ -424,7 +450,12 @@
// back to their original values and compare buffers.
// This test is done to make sure mutations do not do
// any unnecessary changes to the buffer.
- monster = example.GetRootAsMonster(buf, offset)
+ if sizePrefix {
+ monster = example.GetSizePrefixedRootAsMonster(buf, offset)
+ } else {
+ monster = example.GetRootAsMonster(buf, offset)
+ }
+
monster.MutateHp(80)
monster.MutateTestbool(true)
monster.Pos(nil).MutateX(1.0)
@@ -448,6 +479,32 @@
}
}
+func CheckObjectAPI(buf []byte, offset flatbuffers.UOffsetT, sizePrefix bool, fail func(string, ...interface{})) {
+ var monster *example.MonsterT
+
+ if sizePrefix {
+ monster = example.GetSizePrefixedRootAsMonster(buf, offset).UnPack()
+ } else {
+ monster = example.GetRootAsMonster(buf, offset).UnPack()
+ }
+
+ if got := monster.Hp; 80 != got {
+ fail(FailString("hp", 80, got))
+ }
+
+ // default
+ if got := monster.Mana; 150 != got {
+ fail(FailString("mana", 150, got))
+ }
+
+ builder := flatbuffers.NewBuilder(0)
+ builder.Finish(monster.Pack(builder))
+ monster2 := example.GetRootAsMonster(builder.FinishedBytes(), 0).UnPack()
+ if !reflect.DeepEqual(monster, monster2) {
+ fail(FailString("Pack/Unpack()", monster, monster2))
+ }
+}
+
// Low level stress/fuzz test: serialize/deserialize a variety of
// different kinds of data in different combinations
func checkFuzz(fuzzFields, fuzzObjects int, fail func(string, ...interface{})) {
@@ -1158,7 +1215,7 @@
}
// CheckGeneratedBuild uses generated code to build the example Monster.
-func CheckGeneratedBuild(fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {
+func CheckGeneratedBuild(sizePrefix bool, fail func(string, ...interface{})) ([]byte, flatbuffers.UOffsetT) {
b := flatbuffers.NewBuilder(0)
str := b.CreateString("MyMonster")
test1 := b.CreateString("test1")
@@ -1202,7 +1259,11 @@
example.MonsterAddTestarrayofstring(b, testArrayOfString)
mon := example.MonsterEnd(b)
- b.Finish(mon)
+ if sizePrefix {
+ b.FinishSizePrefixed(mon)
+ } else {
+ b.Finish(mon)
+ }
return b.Bytes, b.Head()
}
@@ -1353,6 +1414,50 @@
b.CreateString("foo")
}
+func CheckEmptiedBuilder(fail func(string, ...interface{})) {
+ f := func(a, b string) bool {
+ if a == b {
+ return true
+ }
+
+ builder := flatbuffers.NewBuilder(0)
+
+ a1 := builder.CreateSharedString(a)
+ b1 := builder.CreateSharedString(b)
+ builder.Reset()
+ b2 := builder.CreateSharedString(b)
+ a2 := builder.CreateSharedString(a)
+
+ return !(a1 == a2 || b1 == b2)
+ }
+ if err := quick.Check(f, nil); err != nil {
+ fail("expected different offset")
+ }
+}
+
+func CheckSharedStrings(fail func(string, ...interface{})) {
+ f := func(strings []string) bool {
+ b := flatbuffers.NewBuilder(0)
+ for _, s1 := range strings {
+ for _, s2 := range strings {
+ off1 := b.CreateSharedString(s1)
+ off2 := b.CreateSharedString(s2)
+
+ if (s1 == s2) && (off1 != off2) {
+ return false
+ }
+ if (s1 != s2) && (off1 == off2) {
+ return false
+ }
+ }
+ }
+ return true
+ }
+ if err := quick.Check(f, nil); err != nil {
+ fail("expected same offset")
+ }
+}
+
// CheckByteStringIsNestedError verifies that a bytestring can not be created
// inside another object.
func CheckByteStringIsNestedError(fail func(string, ...interface{})) {
@@ -1557,6 +1662,27 @@
}
}
+func CheckSizePrefixedBuffer(fail func(string, ...interface{})) {
+ // Generate a size-prefixed flatbuffer
+ generated, off := CheckGeneratedBuild(true, fail)
+
+ // Check that the size prefix is the size of monsterdata_go_wire.mon minus 4
+ size := flatbuffers.GetSizePrefix(generated, off)
+ if size != 220 {
+ fail("mismatch between size prefix and expected size")
+ }
+
+ // Check that the buffer can be used as expected
+ CheckReadBuffer(generated, off, true, fail)
+ CheckMutateBuffer(generated, off, true, fail)
+ CheckObjectAPI(generated, off, true, fail)
+
+ // Write generated bfufer out to a file
+ if err := ioutil.WriteFile(outData+".sp", generated[off:], os.FileMode(0644)); err != nil {
+ fail("failed to write file: %s", err)
+ }
+}
+
// Include simple random number generator to ensure results will be the
// same cross platform.
// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator
@@ -1766,7 +1892,7 @@
// BenchmarkParseGold measures the speed of parsing the 'gold' data
// used throughout this test suite.
func BenchmarkParseGold(b *testing.B) {
- buf, offset := CheckGeneratedBuild(b.Fatalf)
+ buf, offset := CheckGeneratedBuild(false, b.Fatalf)
monster := example.GetRootAsMonster(buf, offset)
// use these to prevent allocations:
@@ -1828,7 +1954,7 @@
// BenchmarkBuildGold uses generated code to build the example Monster.
func BenchmarkBuildGold(b *testing.B) {
- buf, offset := CheckGeneratedBuild(b.Fatalf)
+ buf, offset := CheckGeneratedBuild(false, b.Fatalf)
bytes_length := int64(len(buf[offset:]))
reuse_str := "MyMonster"
diff --git a/tests/gold_flexbuffer_example.bin b/tests/gold_flexbuffer_example.bin
new file mode 100644
index 0000000..f9d24b1
--- /dev/null
+++ b/tests/gold_flexbuffer_example.bin
Binary files differ
diff --git a/tests/include_test/include_test1_generated.rs b/tests/include_test/include_test1_generated.rs
new file mode 100644
index 0000000..3c7b9bd
--- /dev/null
+++ b/tests/include_test/include_test1_generated.rs
@@ -0,0 +1,93 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#![allow(unused_imports, dead_code)]
+
+use crate::include_test2_generated::*;
+use std::mem;
+use std::cmp::Ordering;
+
+extern crate flatbuffers;
+use self::flatbuffers::EndianScalar;
+
+pub enum TableAOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct TableA<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for TableA<'a> {
+ type Inner = TableA<'a>;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table { buf, loc } }
+ }
+}
+
+impl<'a> TableA<'a> {
+ #[inline]
+ pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ TableA {
+ _tab: table,
+ }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
+ args: &'args TableAArgs<'args>) -> flatbuffers::WIPOffset<TableA<'bldr>> {
+ let mut builder = TableABuilder::new(_fbb);
+ if let Some(x) = args.b { builder.add_b(x); }
+ builder.finish()
+ }
+
+ pub const VT_B: flatbuffers::VOffsetT = 4;
+
+ #[inline]
+ pub fn b(&self) -> Option<my_game::other_name_space::TableB<'a>> {
+ self._tab.get::<flatbuffers::ForwardsUOffset<my_game::other_name_space::TableB<'a>>>(TableA::VT_B, None)
+ }
+}
+
+pub struct TableAArgs<'a> {
+ pub b: Option<flatbuffers::WIPOffset<my_game::other_name_space::TableB<'a>>>,
+}
+impl<'a> Default for TableAArgs<'a> {
+ #[inline]
+ fn default() -> Self {
+ TableAArgs {
+ b: None,
+ }
+ }
+}
+pub struct TableABuilder<'a: 'b, 'b> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+ start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
+}
+impl<'a: 'b, 'b> TableABuilder<'a, 'b> {
+ #[inline]
+ pub fn add_b(&mut self, b: flatbuffers::WIPOffset<my_game::other_name_space::TableB<'b >>) {
+ self.fbb_.push_slot_always::<flatbuffers::WIPOffset<my_game::other_name_space::TableB>>(TableA::VT_B, b);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TableABuilder<'a, 'b> {
+ let start = _fbb.start_table();
+ TableABuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset<TableA<'a>> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl std::fmt::Debug for TableA<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TableA");
+ ds.field("b", &self.b());
+ ds.finish()
+ }
+}
diff --git a/tests/include_test/sub/include_test2_generated.rs b/tests/include_test/sub/include_test2_generated.rs
new file mode 100644
index 0000000..892c652
--- /dev/null
+++ b/tests/include_test/sub/include_test2_generated.rs
@@ -0,0 +1,245 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#![allow(unused_imports, dead_code)]
+
+use crate::include_test1_generated::*;
+use std::mem;
+use std::cmp::Ordering;
+
+extern crate flatbuffers;
+use self::flatbuffers::EndianScalar;
+
+#[allow(unused_imports, dead_code)]
+pub mod my_game {
+
+ use crate::include_test1_generated::*;
+ use std::mem;
+ use std::cmp::Ordering;
+
+ extern crate flatbuffers;
+ use self::flatbuffers::EndianScalar;
+#[allow(unused_imports, dead_code)]
+pub mod other_name_space {
+
+ use crate::include_test1_generated::*;
+ use std::mem;
+ use std::cmp::Ordering;
+
+ extern crate flatbuffers;
+ use self::flatbuffers::EndianScalar;
+
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_FROM_INCLUDE: i64 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_FROM_INCLUDE: i64 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+#[allow(non_camel_case_types)]
+pub const ENUM_VALUES_FROM_INCLUDE: [FromInclude; 1] = [
+ FromInclude::IncludeVal,
+];
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct FromInclude(pub i64);
+#[allow(non_upper_case_globals)]
+impl FromInclude {
+ pub const IncludeVal: Self = Self(0);
+
+ pub const ENUM_MIN: i64 = 0;
+ pub const ENUM_MAX: i64 = 0;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::IncludeVal,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::IncludeVal => Some("IncludeVal"),
+ _ => None,
+ }
+ }
+}
+impl std::fmt::Debug for FromInclude {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
+impl<'a> flatbuffers::Follow<'a> for FromInclude {
+ type Inner = Self;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self(flatbuffers::read_scalar_at::<i64>(buf, loc))
+ }
+}
+
+impl flatbuffers::Push for FromInclude {
+ type Output = FromInclude;
+ #[inline]
+ fn push(&self, dst: &mut [u8], _rest: &[u8]) {
+ flatbuffers::emplace_scalar::<i64>(dst, self.0);
+ }
+}
+
+impl flatbuffers::EndianScalar for FromInclude {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(i64::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(i64::from_le(self.0))
+ }
+}
+
+// struct Unused, aligned to 4
+#[repr(C, align(4))]
+#[derive(Clone, Copy, PartialEq)]
+pub struct Unused {
+ a_: i32,
+} // pub struct Unused
+impl std::fmt::Debug for Unused {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_struct("Unused")
+ .field("a", &self.a())
+ .finish()
+ }
+}
+
+impl flatbuffers::SafeSliceAccess for Unused {}
+impl<'a> flatbuffers::Follow<'a> for Unused {
+ type Inner = &'a Unused;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ <&'a Unused>::follow(buf, loc)
+ }
+}
+impl<'a> flatbuffers::Follow<'a> for &'a Unused {
+ type Inner = &'a Unused;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ flatbuffers::follow_cast_ref::<Unused>(buf, loc)
+ }
+}
+impl<'b> flatbuffers::Push for Unused {
+ type Output = Unused;
+ #[inline]
+ fn push(&self, dst: &mut [u8], _rest: &[u8]) {
+ let src = unsafe {
+ ::std::slice::from_raw_parts(self as *const Unused as *const u8, Self::size())
+ };
+ dst.copy_from_slice(src);
+ }
+}
+impl<'b> flatbuffers::Push for &'b Unused {
+ type Output = Unused;
+
+ #[inline]
+ fn push(&self, dst: &mut [u8], _rest: &[u8]) {
+ let src = unsafe {
+ ::std::slice::from_raw_parts(*self as *const Unused as *const u8, Self::size())
+ };
+ dst.copy_from_slice(src);
+ }
+}
+
+
+impl Unused {
+ pub fn new(_a: i32) -> Self {
+ Unused {
+ a_: _a.to_little_endian(),
+
+ }
+ }
+ pub fn a(&self) -> i32 {
+ self.a_.from_little_endian()
+ }
+}
+
+pub enum TableBOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct TableB<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for TableB<'a> {
+ type Inner = TableB<'a>;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table { buf, loc } }
+ }
+}
+
+impl<'a> TableB<'a> {
+ #[inline]
+ pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ TableB {
+ _tab: table,
+ }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
+ args: &'args TableBArgs<'args>) -> flatbuffers::WIPOffset<TableB<'bldr>> {
+ let mut builder = TableBBuilder::new(_fbb);
+ if let Some(x) = args.a { builder.add_a(x); }
+ builder.finish()
+ }
+
+ pub const VT_A: flatbuffers::VOffsetT = 4;
+
+ #[inline]
+ pub fn a(&self) -> Option<super::super::TableA<'a>> {
+ self._tab.get::<flatbuffers::ForwardsUOffset<super::super::TableA<'a>>>(TableB::VT_A, None)
+ }
+}
+
+pub struct TableBArgs<'a> {
+ pub a: Option<flatbuffers::WIPOffset<super::super::TableA<'a>>>,
+}
+impl<'a> Default for TableBArgs<'a> {
+ #[inline]
+ fn default() -> Self {
+ TableBArgs {
+ a: None,
+ }
+ }
+}
+pub struct TableBBuilder<'a: 'b, 'b> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+ start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
+}
+impl<'a: 'b, 'b> TableBBuilder<'a, 'b> {
+ #[inline]
+ pub fn add_a(&mut self, a: flatbuffers::WIPOffset<super::super::TableA<'b >>) {
+ self.fbb_.push_slot_always::<flatbuffers::WIPOffset<super::super::TableA>>(TableB::VT_A, a);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> TableBBuilder<'a, 'b> {
+ let start = _fbb.start_table();
+ TableBBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset<TableB<'a>> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl std::fmt::Debug for TableB<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TableB");
+ ds.field("a", &self.a());
+ ds.finish()
+ }
+}
+} // pub mod OtherNameSpace
+} // pub mod MyGame
+
diff --git a/tests/lobstertest.lobster b/tests/lobstertest.lobster
index 7ea9b38..a0f81ce 100644
--- a/tests/lobstertest.lobster
+++ b/tests/lobstertest.lobster
@@ -14,6 +14,7 @@
import from "../lobster/"
import monster_test_generated
+import optional_scalars_generated
def check_read_buffer(buf):
// CheckReadBuffer checks that the given buffer is evaluated correctly as the example Monster.
@@ -108,6 +109,63 @@
return b.SizedCopy()
+def test_optional_scalars():
+ def build(add_fields):
+ let b = flatbuffers_builder {}
+ let ss = optional_scalars_ScalarStuffBuilder { b }.start()
+ if add_fields:
+ ss.add_just_i8(1)
+ ss.add_maybe_i8(1)
+ ss.add_default_i8(1)
+ ss.add_just_f64(1.0)
+ ss.add_maybe_f64(1.0)
+ ss.add_default_f64(1.0)
+ ss.add_just_bool(true)
+ ss.add_maybe_bool(true)
+ ss.add_default_bool(true)
+ ss.add_just_enum(optional_scalars_OptionalByte_Two)
+ ss.add_maybe_enum(optional_scalars_OptionalByte_Two)
+ ss.add_default_enum(optional_scalars_OptionalByte_Two)
+ b.Finish(ss.end())
+ return optional_scalars_GetRootAsScalarStuff(b.SizedCopy())
+
+ var root = build(true)
+
+ assert root.just_i8() == 1 and root.default_i8() == 1
+ var maybe_val_i8, maybe_present_i8 = root.maybe_i8()
+ assert maybe_val_i8 == 1 and maybe_present_i8 == true
+
+ assert root.just_f64() == 1.0 and root.default_f64() == 1.0
+ var maybe_val_f64, maybe_present_f64 = root.maybe_f64()
+ assert maybe_val_f64 == 1.0 and maybe_present_f64 == true
+
+ assert root.just_bool() == true and root.default_bool() == true
+ var maybe_val_bool, maybe_present_bool = root.maybe_bool()
+ assert maybe_val_bool == true and maybe_present_bool == true
+
+ assert root.just_enum() == optional_scalars_OptionalByte_Two and root.default_enum() == optional_scalars_OptionalByte_Two
+ var maybe_val_enum, maybe_present_enum = root.maybe_enum()
+ assert maybe_val_enum == optional_scalars_OptionalByte_Two and maybe_present_enum == true
+
+ root = build(false)
+
+ assert root.just_i8() == 0 and root.default_i8() == 42
+ maybe_val_i8, maybe_present_i8 = root.maybe_i8()
+ assert maybe_val_i8 == 0 and maybe_present_i8 == false
+
+ assert root.just_f64() == 0.0 and root.default_f64() == 42.0
+ maybe_val_f64, maybe_present_f64 = root.maybe_f64()
+ assert maybe_val_f64 == 0.0 and maybe_present_f64 == false
+
+ assert root.just_bool() == false and root.default_bool() == true
+ maybe_val_bool, maybe_present_bool = root.maybe_bool()
+ assert maybe_val_bool == false and maybe_present_bool == false
+
+ assert root.just_enum() == optional_scalars_OptionalByte_None and root.default_enum() == optional_scalars_OptionalByte_One
+ maybe_val_enum, maybe_present_enum = root.maybe_enum()
+ assert maybe_val_enum == optional_scalars_OptionalByte_None and maybe_present_enum == false
+
+
// Verify that the canonical flatbuffer file (produced by the C++ implementation)
// is readable by the generated Lobster code.
let fb2 = read_file("monsterdata_test.mon")
@@ -134,4 +192,7 @@
// Check the resulting binary again (full roundtrip test):
check_read_buffer(fb3)
-print "Lobster test succesful!"
\ No newline at end of file
+// Additional tests.
+test_optional_scalars()
+
+print "Lobster test succesful!"
diff --git a/tests/luatest.lua b/tests/luatest.lua
index c85a4ec..e60f837 100644
--- a/tests/luatest.lua
+++ b/tests/luatest.lua
@@ -81,8 +81,9 @@
assert(mon:Testempty() == nil)
end
-local function generateMonster(sizePrefix)
- local b = flatbuffers.Builder(0)
+local function generateMonster(sizePrefix, b)
+ if b then b:Clear() end
+ b = b or flatbuffers.Builder(0)
local str = b:CreateString("MyMonster")
local test1 = b:CreateString("test1")
local test2 = b:CreateString("test2")
@@ -156,6 +157,51 @@
checkReadBuffer(buf, offset, sizePrefix)
end
+local function fbbClear()
+ -- Generate a builder that will be 'cleared' and reused to create two different objects.
+ local fbb = flatbuffers.Builder(0)
+
+ -- First use the builder to read the normal monster data and verify it works
+ local buf, offset = generateMonster(false, fbb)
+ checkReadBuffer(buf, offset, false)
+
+ -- Then clear the builder to be used again
+ fbb:Clear()
+
+ -- Storage for the built monsters
+ local monsters = {}
+ local lastBuf
+
+ -- Make another builder that will be use identically to the 'cleared' one so outputs can be compared. Build both the
+ -- Cleared builder and new builder in the exact same way, so we can compare their results
+ for i, builder in ipairs({fbb, flatbuffers.Builder(0)}) do
+ local strOffset = builder:CreateString("Hi there")
+ monster.Start(builder)
+ monster.AddPos(builder, vec3.CreateVec3(builder, 3.0, 2.0, 1.0, 17.0, 3, 100, 123))
+ monster.AddName(builder, strOffset)
+ monster.AddMana(builder, 123)
+ builder:Finish(monster.End(builder))
+ local buf = builder:Output(false)
+ if not lastBuf then
+ lastBuf = buf
+ else
+ -- the output, sized-buffer should be identical
+ assert(lastBuf == buf, "Monster output buffers are not identical")
+ end
+ monsters[i] = monster.GetRootAsMonster(flatbuffers.binaryArray.New(buf), 0)
+ end
+
+ -- Check that all the fields for the generated monsters are as we expect
+ for i, monster in ipairs(monsters) do
+ assert(monster:Name() == "Hi there", "Monster Name is not 'Hi There' for monster "..i)
+ -- HP is default to 100 in the schema, but we change it in generateMonster to 80, so this is a good test to
+ -- see if the cleared builder really clears the data.
+ assert(monster:Hp() == 100, "HP doesn't equal the default value for monster "..i)
+ assert(monster:Mana() == 123, "Monster Mana is not '123' for monster "..i)
+ assert(monster:Pos():X() == 3.0, "Monster vec3.X is not '3' for monster "..i)
+ end
+end
+
local function testCanonicalData()
local f = assert(io.open('monsterdata_test.mon', 'rb'))
local wireData = f:read("*a")
@@ -163,26 +209,16 @@
checkReadBuffer(wireData)
end
-local function benchmarkMakeMonster(count)
- local length = #(generateMonster())
-
- --require("flatbuffers.profiler")
- --profiler = newProfiler("call")
- --profiler:start()
-
+local function benchmarkMakeMonster(count, reuseBuilder)
+ local fbb = reuseBuilder and flatbuffers.Builder(0)
+ local length = #(generateMonster(false, fbb))
+
local s = os.clock()
for i=1,count do
- generateMonster()
+ generateMonster(false, fbb)
end
local e = os.clock()
-
- --profiler:stop()
- --local outfile = io.open( "profile.txt", "w+" )
- --profiler:report( outfile, true)
- --outfile:close()
-
-
local dur = (e - s)
local rate = count / (dur * 1000)
local data = (length * count) / (1024 * 1024)
@@ -219,6 +255,10 @@
d = "Test size prefix",
args = {{true}, {false}}
},
+ {
+ f = fbbClear,
+ d = "FlatBufferBuilder Clear",
+ },
{
f = testCanonicalData,
d = "Tests Canonical flatbuffer file included in repo"
@@ -230,6 +270,7 @@
{100},
{1000},
{10000},
+ {10000, true}
}
},
{
@@ -241,7 +282,7 @@
{10000},
-- uncomment following to run 1 million to compare.
-- Took ~141 seconds on my machine
- --{1000000},
+ --{1000000},
}
},
}
diff --git a/tests/monster_extra.fbs b/tests/monster_extra.fbs
index d0fc7fe..7cadf45 100644
--- a/tests/monster_extra.fbs
+++ b/tests/monster_extra.fbs
@@ -13,6 +13,7 @@
f3:float = -inf;
dvec : [double];
fvec : [float];
+ deprec:int (deprecated);
}
root_type MonsterExtra;
diff --git a/tests/monster_extra_generated.h b/tests/monster_extra_generated.h
index d7ff900..5c4d8de 100644
--- a/tests/monster_extra_generated.h
+++ b/tests/monster_extra_generated.h
@@ -9,6 +9,7 @@
namespace MyGame {
struct MonsterExtra;
+struct MonsterExtraBuilder;
struct MonsterExtraT;
bool operator==(const MonsterExtraT &lhs, const MonsterExtraT &rhs);
@@ -61,6 +62,7 @@
struct MonsterExtra FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef MonsterExtraT NativeTableType;
+ typedef MonsterExtraBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return MonsterExtraTypeTable();
}
@@ -158,6 +160,7 @@
};
struct MonsterExtraBuilder {
+ typedef MonsterExtra Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_d0(double d0) {
@@ -194,7 +197,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- MonsterExtraBuilder &operator=(const MonsterExtraBuilder &);
flatbuffers::Offset<MonsterExtra> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<MonsterExtra>(end);
@@ -259,24 +261,24 @@
flatbuffers::Offset<MonsterExtra> CreateMonsterExtra(flatbuffers::FlatBufferBuilder &_fbb, const MonsterExtraT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline MonsterExtraT *MonsterExtra::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new MonsterExtraT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::MonsterExtraT> _o = flatbuffers::unique_ptr<MyGame::MonsterExtraT>(new MonsterExtraT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void MonsterExtra::UnPackTo(MonsterExtraT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = d0(); _o->d0 = _e; };
- { auto _e = d1(); _o->d1 = _e; };
- { auto _e = d2(); _o->d2 = _e; };
- { auto _e = d3(); _o->d3 = _e; };
- { auto _e = f0(); _o->f0 = _e; };
- { auto _e = f1(); _o->f1 = _e; };
- { auto _e = f2(); _o->f2 = _e; };
- { auto _e = f3(); _o->f3 = _e; };
- { auto _e = dvec(); if (_e) { _o->dvec.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->dvec[_i] = _e->Get(_i); } } };
- { auto _e = fvec(); if (_e) { _o->fvec.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->fvec[_i] = _e->Get(_i); } } };
+ { auto _e = d0(); _o->d0 = _e; }
+ { auto _e = d1(); _o->d1 = _e; }
+ { auto _e = d2(); _o->d2 = _e; }
+ { auto _e = d3(); _o->d3 = _e; }
+ { auto _e = f0(); _o->f0 = _e; }
+ { auto _e = f1(); _o->f1 = _e; }
+ { auto _e = f2(); _o->f2 = _e; }
+ { auto _e = f3(); _o->f3 = _e; }
+ { auto _e = dvec(); if (_e) { _o->dvec.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->dvec[_i] = _e->Get(_i); } } }
+ { auto _e = fvec(); if (_e) { _o->fvec.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->fvec[_i] = _e->Get(_i); } } }
}
inline flatbuffers::Offset<MonsterExtra> MonsterExtra::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterExtraT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -322,7 +324,8 @@
{ flatbuffers::ET_FLOAT, 0, -1 },
{ flatbuffers::ET_FLOAT, 0, -1 },
{ flatbuffers::ET_DOUBLE, 1, -1 },
- { flatbuffers::ET_FLOAT, 1, -1 }
+ { flatbuffers::ET_FLOAT, 1, -1 },
+ { flatbuffers::ET_INT, 0, -1 }
};
static const char * const names[] = {
"d0",
@@ -334,10 +337,11 @@
"f2",
"f3",
"dvec",
- "fvec"
+ "fvec",
+ "deprec"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 10, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 11, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
@@ -389,16 +393,16 @@
fbb.FinishSizePrefixed(root, MonsterExtraIdentifier());
}
-inline std::unique_ptr<MyGame::MonsterExtraT> UnPackMonsterExtra(
+inline flatbuffers::unique_ptr<MyGame::MonsterExtraT> UnPackMonsterExtra(
const void *buf,
const flatbuffers::resolver_function_t *res = nullptr) {
- return std::unique_ptr<MyGame::MonsterExtraT>(GetMonsterExtra(buf)->UnPack(res));
+ return flatbuffers::unique_ptr<MyGame::MonsterExtraT>(GetMonsterExtra(buf)->UnPack(res));
}
-inline std::unique_ptr<MyGame::MonsterExtraT> UnPackSizePrefixedMonsterExtra(
+inline flatbuffers::unique_ptr<MyGame::MonsterExtraT> UnPackSizePrefixedMonsterExtra(
const void *buf,
const flatbuffers::resolver_function_t *res = nullptr) {
- return std::unique_ptr<MyGame::MonsterExtraT>(GetSizePrefixedMonsterExtra(buf)->UnPack(res));
+ return flatbuffers::unique_ptr<MyGame::MonsterExtraT>(GetSizePrefixedMonsterExtra(buf)->UnPack(res));
}
} // namespace MyGame
diff --git a/tests/monster_extra_my_game_generated.dart b/tests/monster_extra_my_game_generated.dart
new file mode 100644
index 0000000..676641d
--- /dev/null
+++ b/tests/monster_extra_my_game_generated.dart
@@ -0,0 +1,176 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+// ignore_for_file: unused_import, unused_field, unused_local_variable
+
+library my_game;
+
+import 'dart:typed_data' show Uint8List;
+import 'package:flat_buffers/flat_buffers.dart' as fb;
+
+
+class MonsterExtra {
+ MonsterExtra._(this._bc, this._bcOffset);
+ factory MonsterExtra(List<int> bytes) {
+ fb.BufferContext rootRef = new fb.BufferContext.fromBytes(bytes);
+ return reader.read(rootRef, 0);
+ }
+
+ static const fb.Reader<MonsterExtra> reader = const _MonsterExtraReader();
+
+ final fb.BufferContext _bc;
+ final int _bcOffset;
+
+ double get d0 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 4, double.nan);
+ double get d1 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 6, double.nan);
+ double get d2 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 8, double.infinity);
+ double get d3 => const fb.Float64Reader().vTableGet(_bc, _bcOffset, 10, double.negativeInfinity);
+ double get f0 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 12, double.nan);
+ double get f1 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 14, double.nan);
+ double get f2 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 16, double.infinity);
+ double get f3 => const fb.Float32Reader().vTableGet(_bc, _bcOffset, 18, double.negativeInfinity);
+ List<double> get dvec => const fb.ListReader<double>(const fb.Float64Reader()).vTableGet(_bc, _bcOffset, 20, null);
+ List<double> get fvec => const fb.ListReader<double>(const fb.Float32Reader()).vTableGet(_bc, _bcOffset, 22, null);
+
+ @override
+ String toString() {
+ return 'MonsterExtra{d0: $d0, d1: $d1, d2: $d2, d3: $d3, f0: $f0, f1: $f1, f2: $f2, f3: $f3, dvec: $dvec, fvec: $fvec}';
+ }
+}
+
+class _MonsterExtraReader extends fb.TableReader<MonsterExtra> {
+ const _MonsterExtraReader();
+
+ @override
+ MonsterExtra createObject(fb.BufferContext bc, int offset) =>
+ new MonsterExtra._(bc, offset);
+}
+
+class MonsterExtraBuilder {
+ MonsterExtraBuilder(this.fbBuilder) {
+ assert(fbBuilder != null);
+ }
+
+ final fb.Builder fbBuilder;
+
+ void begin() {
+ fbBuilder.startTable();
+ }
+
+ int addD0(double d0) {
+ fbBuilder.addFloat64(0, d0);
+ return fbBuilder.offset;
+ }
+ int addD1(double d1) {
+ fbBuilder.addFloat64(1, d1);
+ return fbBuilder.offset;
+ }
+ int addD2(double d2) {
+ fbBuilder.addFloat64(2, d2);
+ return fbBuilder.offset;
+ }
+ int addD3(double d3) {
+ fbBuilder.addFloat64(3, d3);
+ return fbBuilder.offset;
+ }
+ int addF0(double f0) {
+ fbBuilder.addFloat32(4, f0);
+ return fbBuilder.offset;
+ }
+ int addF1(double f1) {
+ fbBuilder.addFloat32(5, f1);
+ return fbBuilder.offset;
+ }
+ int addF2(double f2) {
+ fbBuilder.addFloat32(6, f2);
+ return fbBuilder.offset;
+ }
+ int addF3(double f3) {
+ fbBuilder.addFloat32(7, f3);
+ return fbBuilder.offset;
+ }
+ int addDvecOffset(int offset) {
+ fbBuilder.addOffset(8, offset);
+ return fbBuilder.offset;
+ }
+ int addFvecOffset(int offset) {
+ fbBuilder.addOffset(9, offset);
+ return fbBuilder.offset;
+ }
+
+ int finish() {
+ return fbBuilder.endTable();
+ }
+}
+
+class MonsterExtraObjectBuilder extends fb.ObjectBuilder {
+ final double _d0;
+ final double _d1;
+ final double _d2;
+ final double _d3;
+ final double _f0;
+ final double _f1;
+ final double _f2;
+ final double _f3;
+ final List<double> _dvec;
+ final List<double> _fvec;
+
+ MonsterExtraObjectBuilder({
+ double d0,
+ double d1,
+ double d2,
+ double d3,
+ double f0,
+ double f1,
+ double f2,
+ double f3,
+ List<double> dvec,
+ List<double> fvec,
+ })
+ : _d0 = d0,
+ _d1 = d1,
+ _d2 = d2,
+ _d3 = d3,
+ _f0 = f0,
+ _f1 = f1,
+ _f2 = f2,
+ _f3 = f3,
+ _dvec = dvec,
+ _fvec = fvec;
+
+ /// Finish building, and store into the [fbBuilder].
+ @override
+ int finish(
+ fb.Builder fbBuilder) {
+ assert(fbBuilder != null);
+ final int dvecOffset = _dvec?.isNotEmpty == true
+ ? fbBuilder.writeListFloat64(_dvec)
+ : null;
+ final int fvecOffset = _fvec?.isNotEmpty == true
+ ? fbBuilder.writeListFloat32(_fvec)
+ : null;
+
+ fbBuilder.startTable();
+ fbBuilder.addFloat64(0, _d0);
+ fbBuilder.addFloat64(1, _d1);
+ fbBuilder.addFloat64(2, _d2);
+ fbBuilder.addFloat64(3, _d3);
+ fbBuilder.addFloat32(4, _f0);
+ fbBuilder.addFloat32(5, _f1);
+ fbBuilder.addFloat32(6, _f2);
+ fbBuilder.addFloat32(7, _f3);
+ if (dvecOffset != null) {
+ fbBuilder.addOffset(8, dvecOffset);
+ }
+ if (fvecOffset != null) {
+ fbBuilder.addOffset(9, fvecOffset);
+ }
+ return fbBuilder.endTable();
+ }
+
+ /// Convenience method to serialize to byte list.
+ @override
+ Uint8List toBytes([String fileIdentifier]) {
+ fb.Builder fbBuilder = new fb.Builder();
+ int offset = finish(fbBuilder);
+ return fbBuilder.finish(offset, fileIdentifier);
+ }
+}
diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs
index 02d618d..dc672d8 100644
--- a/tests/monster_test.bfbs
+++ b/tests/monster_test.bfbs
Binary files differ
diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs
index d791094..dde5137 100644
--- a/tests/monster_test.fbs
+++ b/tests/monster_test.fbs
@@ -15,13 +15,20 @@
attribute "priority";
/// Composite components of Monster color.
-enum Color:ubyte (bit_flags) {
+enum Color:ubyte (bit_flags) {
Red = 0, // color Red = (1u << 0)
/// \brief color Green
/// Green is bit_flag with value (1u << 1)
- Green,
+ Green,
/// \brief color Blue (1u << 3)
- Blue = 3,
+ Blue = 3,
+}
+
+enum Race:byte {
+ None = -1,
+ Human = 0,
+ Dwarf,
+ Elf,
}
union Any { Monster, TestSimpleTableWithEnum, MyGame.Example2.Monster }
@@ -59,7 +66,7 @@
id:ulong(key, hash:"fnv1a_64");
}
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
table Monster {
pos:Vec3 (id: 0);
hp:short = 100 (id: 2);
@@ -108,6 +115,8 @@
any_unique:AnyUniqueAliases(id:44);
any_ambiguous:AnyAmbiguousAliases (id:46);
vector_of_enums:[Color] (id:47);
+ signed_enum:Race = None (id:48);
+ testrequirednestedflatbuffer:[ubyte] (id:49, nested_flatbuffer: "Monster");
}
table TypeAliases {
diff --git a/tests/monster_test.schema.json b/tests/monster_test.schema.json
index 7fb7500..1e5177f 100644
--- a/tests/monster_test.schema.json
+++ b/tests/monster_test.schema.json
@@ -1,5 +1,5 @@
{
- "$schema": "http://json-schema.org/draft-04/schema#",
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
"definitions": {
"MyGame_OtherNameSpace_FromInclude" : {
"type" : "string",
@@ -9,6 +9,10 @@
"type" : "string",
"enum": ["Red", "Green", "Blue"]
},
+ "MyGame_Example_Race" : {
+ "type" : "string",
+ "enum": ["None", "Human", "Dwarf", "Elf"]
+ },
"MyGame_Example_Any" : {
"type" : "string",
"enum": ["NONE", "Monster", "TestSimpleTableWithEnum", "MyGame_Example2_Monster"]
@@ -25,7 +29,7 @@
"type" : "object",
"properties" : {
"a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
}
},
"additionalProperties" : false
@@ -64,10 +68,10 @@
"type" : "object",
"properties" : {
"a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -32768, "maximum" : 32767
},
"b" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -128, "maximum" : 127"
}
},
"additionalProperties" : false
@@ -109,10 +113,10 @@
"type" : "object",
"properties" : {
"id" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 4294967295
},
"distance" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 4294967295
}
},
"additionalProperties" : false
@@ -124,10 +128,10 @@
"type" : "string"
},
"val" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
},
"count" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 65535
}
},
"additionalProperties" : false
@@ -136,32 +140,33 @@
"type" : "object",
"properties" : {
"id" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
}
},
"additionalProperties" : false
},
"MyGame_Example_Monster" : {
"type" : "object",
- "description" : " an example documentation comment: monster object",
+ "description" : " an example documentation comment: \"monster object\"",
"properties" : {
"pos" : {
"$ref" : "#/definitions/MyGame_Example_Vec3"
},
"mana" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -32768, "maximum" : 32767
},
"hp" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -32768, "maximum" : 32767
},
"name" : {
"type" : "string"
},
"friendly" : {
- "type" : "boolean"
+ "type" : "boolean",
+ "deprecated" : true,
},
"inventory" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
},
"color" : {
"$ref" : "#/definitions/MyGame_Example_Color"
@@ -173,19 +178,19 @@
"anyOf": [{ "$ref" : "#/definitions/MyGame_Example_Monster" },{ "$ref" : "#/definitions/MyGame_Example_TestSimpleTableWithEnum" },{ "$ref" : "#/definitions/MyGame_Example2_Monster" }]
},
"test4" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" }
+ "$ref" : "#/definitions/MyGame_Example_Test"
},
"testarrayofstring" : {
- "type" : "array", "items" : { "type" : "string" }
+ "type" : "array", "items" : {"type" : "string"}
},
"testarrayoftables" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Monster" }
+ "$ref" : "#/definitions/MyGame_Example_Monster"
},
"enemy" : {
"$ref" : "#/definitions/MyGame_Example_Monster"
},
"testnestedflatbuffer" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
},
"testempty" : {
"$ref" : "#/definitions/MyGame_Example_Stat"
@@ -194,31 +199,31 @@
"type" : "boolean"
},
"testhashs32_fnv1" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
},
"testhashu32_fnv1" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 4294967295
},
"testhashs64_fnv1" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
},
"testhashu64_fnv1" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"testhashs32_fnv1a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
},
"testhashu32_fnv1a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 4294967295
},
"testhashs64_fnv1a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
},
"testhashu64_fnv1a" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"testarrayofbools" : {
- "type" : "array", "items" : { "type" : "boolean" }
+ "type" : "array", "items" : {"type" : "boolean"}
},
"testf" : {
"type" : "number"
@@ -230,49 +235,49 @@
"type" : "number"
},
"testarrayofstring2" : {
- "type" : "array", "items" : { "type" : "string" }
+ "type" : "array", "items" : {"type" : "string"}
},
"testarrayofsortedstruct" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Ability" }
+ "$ref" : "#/definitions/MyGame_Example_Ability"
},
"flex" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
},
"test5" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Test" }
+ "$ref" : "#/definitions/MyGame_Example_Test"
},
"vector_of_longs" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807}
},
"vector_of_doubles" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "number"}
},
"parent_namespace_test" : {
"$ref" : "#/definitions/MyGame_InParentNamespace"
},
"vector_of_referrables" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" }
+ "$ref" : "#/definitions/MyGame_Example_Referrable"
},
"single_weak_reference" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"vector_of_weak_references" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
},
"vector_of_strong_referrables" : {
- "type" : "array", "items" : { "$ref" : "#/definitions/MyGame_Example_Referrable" }
+ "$ref" : "#/definitions/MyGame_Example_Referrable"
},
"co_owning_reference" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"vector_of_co_owning_references" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
},
"non_owning_reference" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"vector_of_non_owning_references" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615}
},
"any_unique_type" : {
"$ref" : "#/definitions/MyGame_Example_AnyUniqueAliases"
@@ -288,6 +293,12 @@
},
"vector_of_enums" : {
"$ref" : "#/definitions/MyGame_Example_Color"
+ },
+ "signed_enum" : {
+ "$ref" : "#/definitions/MyGame_Example_Race"
+ },
+ "testrequirednestedflatbuffer" : {
+ "type" : "array", "items" : {"type" : "integer", "minimum" : 0, "maximum" :255"}
}
},
"required" : ["name"],
@@ -297,28 +308,28 @@
"type" : "object",
"properties" : {
"i8" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -128, "maximum" : 127"
},
"u8" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" :255"
},
"i16" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -32768, "maximum" : 32767
},
"u16" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 65535
},
"i32" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -2147483648, "maximum" : 2147483647
},
"u32" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 4294967295
},
"i64" : {
- "type" : "number"
+ "type" : "integer", "minimum" : -9223372036854775808, "maximum" : 9223372036854775807
},
"u64" : {
- "type" : "number"
+ "type" : "integer", "minimum" : 0, "maximum" : 18446744073709551615
},
"f32" : {
"type" : "number"
@@ -327,10 +338,10 @@
"type" : "number"
},
"v8" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "integer", "minimum" : -128, "maximum" : 127"}
},
"vf64" : {
- "type" : "array", "items" : { "type" : "number" }
+ "type" : "array", "items" : {"type" : "number"}
}
},
"additionalProperties" : false
diff --git a/tests/monster_test_bfbs_generated.h b/tests/monster_test_bfbs_generated.h
new file mode 100644
index 0000000..b034fff
--- /dev/null
+++ b/tests/monster_test_bfbs_generated.h
@@ -0,0 +1,659 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_BFBS_H_
+#define FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_BFBS_H_
+
+namespace MyGame {
+namespace Example {
+
+struct MonsterBinarySchema {
+ static const uint8_t *data() {
+ // Buffer containing the binary schema.
+ static const uint8_t bfbsData[12544] = {
+ 0x18,0x00,0x00,0x00,0x42,0x46,0x42,0x53,0x10,0x00,0x1C,0x00,0x04,0x00,0x08,0x00,0x0C,0x00,0x10,0x00,
+ 0x14,0x00,0x18,0x00,0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x1C,0x0C,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x6D,0x6F,0x6E,0x00,0x04,0x00,0x00,0x00,0x4D,0x4F,0x4E,0x53,0x00,0x00,0x00,0x00,
+ 0x06,0x00,0x00,0x00,0xCC,0x04,0x00,0x00,0x50,0x02,0x00,0x00,0x78,0x03,0x00,0x00,0x18,0x07,0x00,0x00,
+ 0x0C,0x06,0x00,0x00,0xE0,0x08,0x00,0x00,0x0D,0x00,0x00,0x00,0x24,0x2A,0x00,0x00,0xD4,0x0B,0x00,0x00,
+ 0x8C,0x28,0x00,0x00,0x5C,0x29,0x00,0x00,0xC0,0x2D,0x00,0x00,0xB8,0x2C,0x00,0x00,0x4C,0x09,0x00,0x00,
+ 0xFC,0x2A,0x00,0x00,0x5C,0x2E,0x00,0x00,0x90,0x2E,0x00,0x00,0x30,0x2F,0x00,0x00,0xD4,0x2F,0x00,0x00,
+ 0xC0,0x2E,0x00,0x00,0x0C,0x00,0x10,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,
+ 0x24,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x88,0x01,0x00,0x00,0xF4,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,
+ 0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x4D,0x6F,0x6E,0x73,0x74,
+ 0x65,0x72,0x53,0x74,0x6F,0x72,0x61,0x67,0x65,0x00,0x00,0x00,0xBA,0xFE,0xFF,0xFF,0x48,0x00,0x00,0x00,
+ 0x44,0x0B,0x00,0x00,0xD0,0x28,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9C,0xD3,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x62,0x69,0x64,0x69,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x73,0x74,0x72,0x65,
+ 0x61,0x6D,0x69,0x6E,0x67,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x47,0x65,0x74,0x4D,0x69,0x6E,0x4D,0x61,
+ 0x78,0x48,0x69,0x74,0x50,0x6F,0x69,0x6E,0x74,0x73,0x00,0x00,0x1E,0xFF,0xFF,0xFF,0x48,0x00,0x00,0x00,
+ 0xE0,0x0A,0x00,0x00,0x6C,0x28,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xD4,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x06,0x00,0x00,0x00,0x63,0x6C,0x69,0x65,0x6E,0x74,0x00,0x00,0x09,0x00,0x00,0x00,0x73,0x74,0x72,0x65,
+ 0x61,0x6D,0x69,0x6E,0x67,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x47,0x65,0x74,0x4D,0x61,0x78,0x48,0x69,
+ 0x74,0x50,0x6F,0x69,0x6E,0x74,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0x70,0x00,0x00,0x00,0x10,0x28,0x00,0x00,
+ 0x7C,0x0A,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xD4,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x06,0x00,0x00,0x00,0x73,0x65,0x72,0x76,0x65,0x72,0x00,0x00,0x09,0x00,0x00,0x00,0x73,0x74,0x72,0x65,
+ 0x61,0x6D,0x69,0x6E,0x67,0x00,0x00,0x00,0x8C,0xD4,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x69,0x64,0x65,0x6D,0x70,0x6F,0x74,0x65,
+ 0x6E,0x74,0x00,0x00,0x08,0x00,0x00,0x00,0x52,0x65,0x74,0x72,0x69,0x65,0x76,0x65,0x00,0x00,0x0E,0x00,
+ 0x18,0x00,0x04,0x00,0x08,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x0E,0x00,0x00,0x00,0x48,0x00,0x00,0x00,
+ 0xF0,0x09,0x00,0x00,0x7C,0x27,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF0,0xD4,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x6E,0x6F,0x6E,0x65,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x73,0x74,0x72,0x65,
+ 0x61,0x6D,0x69,0x6E,0x67,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x53,0x74,0x6F,0x72,0x65,0x00,0x00,0x00,
+ 0x98,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0xD2,0xFF,0xFF,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xDC,0x00,0x00,0x00,0xA4,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,
+ 0x22,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x41,
+ 0x6E,0x79,0x41,0x6D,0x62,0x69,0x67,0x75,0x6F,0x75,0x73,0x41,0x6C,0x69,0x61,0x73,0x65,0x73,0x00,0x00,
+ 0x66,0xFE,0xFF,0xFF,0x2C,0x00,0x00,0x00,0x34,0x09,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xD2,0xFF,0xFF,
+ 0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x4D,0x33,0x00,0x00,0x9E,0xFE,0xFF,0xFF,
+ 0x2C,0x00,0x00,0x00,0xFC,0x08,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0xD3,0xFF,0xFF,0x00,0x00,0x00,0x0F,
+ 0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x4D,0x32,0x00,0x00,0x76,0xFD,0xFF,0xFF,0x28,0x00,0x00,0x00,
+ 0xC4,0x08,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x5A,0xD3,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x4D,0x31,0x00,0x00,0x16,0xFA,0xFF,0xFF,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x08,0xFA,0xFF,0xFF,0x04,0x00,0x00,0x00,0x4E,0x4F,0x4E,0x45,0x00,0x00,0x00,0x00,
+ 0xC4,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAE,0xD3,0xFF,0xFF,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xEC,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x28,0x00,0x00,0x00,
+ 0x1F,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x41,
+ 0x6E,0x79,0x55,0x6E,0x69,0x71,0x75,0x65,0x41,0x6C,0x69,0x61,0x73,0x65,0x73,0x00,0x8E,0xFF,0xFF,0xFF,
+ 0x2C,0x00,0x00,0x00,0xB0,0x2A,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xD4,0xFF,0xFF,0x00,0x00,0x00,0x0F,
+ 0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x4D,0x32,0x00,0x00,0xC6,0xFF,0xFF,0xFF,0x2C,0x00,0x00,0x00,
+ 0xC8,0x28,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0xD4,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x05,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x54,0x53,0x00,0x00,0x00,0x00,0x0E,0x00,0x20,0x00,0x04,0x00,0x14,0x00,0x08,0x00,
+ 0x0C,0x00,0x10,0x00,0x0E,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x8C,0x07,0x00,0x00,0x18,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x96,0xD4,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4D,0x00,0x00,0x00,
+ 0x52,0xFB,0xFF,0xFF,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x44,0xFB,0xFF,0xFF,0x04,0x00,0x00,0x00,0x4E,0x4F,0x4E,0x45,0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,
+ 0x08,0x00,0x0C,0x00,0x07,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x34,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xFA,0xD4,0xFF,0xFF,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0xC4,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x41,0x6E,0x79,0x00,0x00,0x6E,0xFF,0xFF,0xFF,
+ 0x28,0x00,0x00,0x00,0x70,0x29,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0xD5,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x08,0x00,0x00,0x00,
+ 0x17,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x5F,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x32,0x5F,
+ 0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,0xB6,0xFF,0xFF,0xFF,0x28,0x00,0x00,0x00,0x78,0x27,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x9A,0xD5,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x05,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x54,0x65,0x73,0x74,
+ 0x53,0x69,0x6D,0x70,0x6C,0x65,0x54,0x61,0x62,0x6C,0x65,0x57,0x69,0x74,0x68,0x45,0x6E,0x75,0x6D,0x00,
+ 0x00,0x00,0x0E,0x00,0x1C,0x00,0x04,0x00,0x14,0x00,0x08,0x00,0x0C,0x00,0x10,0x00,0x0E,0x00,0x00,0x00,
+ 0x28,0x00,0x00,0x00,0x2C,0x06,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF2,0xD5,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,
+ 0x07,0x00,0x00,0x00,0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,0xB2,0xFC,0xFF,0xFF,0x14,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0xFC,0xFF,0xFF,0x04,0x00,0x00,0x00,
+ 0x4E,0x4F,0x4E,0x45,0x00,0x00,0x00,0x00,0x38,0xFD,0xFF,0xFF,0x34,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xD6,0xFF,0xFF,0x00,0x00,0x00,0x03,
+ 0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x48,0x00,0x00,0x00,
+ 0x1C,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,
+ 0x6C,0x65,0x2E,0x52,0x61,0x63,0x65,0x00,0xBE,0xFD,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x14,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xFD,0xFF,0xFF,
+ 0x03,0x00,0x00,0x00,0x45,0x6C,0x66,0x00,0xE6,0xFD,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x14,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xFD,0xFF,0xFF,
+ 0x05,0x00,0x00,0x00,0x44,0x77,0x61,0x72,0x66,0x00,0x00,0x00,0x7A,0xFD,0xFF,0xFF,0x14,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xFD,0xFF,0xFF,0x05,0x00,0x00,0x00,
+ 0x48,0x75,0x6D,0x61,0x6E,0x00,0x00,0x00,0xBE,0xFE,0xFF,0xFF,0x20,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x9C,0xFD,0xFF,0xFF,0x04,0x00,0x00,0x00,0x4E,0x6F,0x6E,0x65,0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,
+ 0x04,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x10,0x00,0x00,0x00,0x90,0x00,0x00,0x00,
+ 0x7C,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x20,0x43,0x6F,0x6D,0x70,0x6F,0x73,0x69,0x74,0x65,0x20,0x63,
+ 0x6F,0x6D,0x70,0x6F,0x6E,0x65,0x6E,0x74,0x73,0x20,0x6F,0x66,0x20,0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,
+ 0x20,0x63,0x6F,0x6C,0x6F,0x72,0x2E,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x48,0xDA,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+ 0x62,0x69,0x74,0x5F,0x66,0x6C,0x61,0x67,0x73,0x00,0x00,0x00,0xAE,0xD7,0xFF,0xFF,0x00,0x00,0x00,0x04,
+ 0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x84,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x43,
+ 0x6F,0x6C,0x6F,0x72,0x00,0x00,0x00,0x00,0x26,0xFF,0xFF,0xFF,0x44,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x1C,0x00,0x00,0x00,0x20,0x5C,0x62,0x72,0x69,0x65,0x66,0x20,0x63,0x6F,0x6C,0x6F,0x72,0x20,0x42,0x6C,
+ 0x75,0x65,0x20,0x28,0x31,0x75,0x20,0x3C,0x3C,0x20,0x33,0x29,0x00,0x00,0x00,0x00,0xB0,0xFE,0xFF,0xFF,
+ 0x04,0x00,0x00,0x00,0x42,0x6C,0x75,0x65,0x00,0x00,0x0E,0x00,0x1C,0x00,0x04,0x00,0x10,0x00,0x00,0x00,
+ 0x08,0x00,0x0C,0x00,0x0E,0x00,0x00,0x00,0x6C,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x20,0x47,0x72,0x65,0x65,0x6E,0x20,0x69,0x73,0x20,0x62,0x69,
+ 0x74,0x5F,0x66,0x6C,0x61,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x76,0x61,0x6C,0x75,0x65,0x20,0x28,0x31,
+ 0x75,0x20,0x3C,0x3C,0x20,0x31,0x29,0x00,0x13,0x00,0x00,0x00,0x20,0x5C,0x62,0x72,0x69,0x65,0x66,0x20,
+ 0x63,0x6F,0x6C,0x6F,0x72,0x20,0x47,0x72,0x65,0x65,0x6E,0x00,0x38,0xFF,0xFF,0xFF,0x05,0x00,0x00,0x00,
+ 0x47,0x72,0x65,0x65,0x6E,0x00,0x0E,0x00,0x18,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x0C,0x00,
+ 0x0E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x52,0x65,0x64,0x00,
+ 0x10,0x00,0x14,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,
+ 0x28,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1E,0xD9,0xFF,0xFF,0x00,0x00,0x00,0x09,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
+ 0x21,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x4F,0x74,0x68,0x65,0x72,0x4E,0x61,0x6D,0x65,
+ 0x53,0x70,0x61,0x63,0x65,0x2E,0x46,0x72,0x6F,0x6D,0x49,0x6E,0x63,0x6C,0x75,0x64,0x65,0x00,0x0E,0x00,
+ 0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0C,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
+ 0x0A,0x00,0x00,0x00,0x49,0x6E,0x63,0x6C,0x75,0x64,0x65,0x56,0x61,0x6C,0x00,0x00,0x1E,0xDA,0xFF,0xFF,
+ 0x48,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0xBC,0x01,0x00,0x00,0x68,0x01,0x00,0x00,
+ 0x14,0x01,0x00,0x00,0x1C,0x02,0x00,0x00,0x84,0x01,0x00,0x00,0x30,0x01,0x00,0x00,0xDC,0x00,0x00,0x00,
+ 0xC8,0x01,0x00,0x00,0x58,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x54,0x79,0x70,0x65,0x41,0x6C,0x69,0x61,0x73,
+ 0x65,0x73,0x00,0x00,0x34,0xDE,0xFF,0xFF,0x00,0x00,0x00,0x01,0x0B,0x00,0x1A,0x00,0x18,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xE4,0xFF,0xFF,0x00,0x00,0x0E,0x0C,
+ 0x04,0x00,0x00,0x00,0x76,0x66,0x36,0x34,0x00,0x00,0x00,0x00,0x64,0xDE,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x0A,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xE4,0xFF,0xFF,0x00,0x00,0x0E,0x03,0x02,0x00,0x00,0x00,0x76,0x38,0x00,0x00,0x16,0xDC,0xFF,0xFF,
+ 0x09,0x00,0x16,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xCA,0xD9,0xFF,0xFF,0x00,0x00,0x00,0x0C,0x03,0x00,0x00,0x00,0x66,0x36,0x34,0x00,0x3E,0xDC,0xFF,0xFF,
+ 0x08,0x00,0x14,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xF2,0xD9,0xFF,0xFF,0x00,0x00,0x00,0x0B,0x03,0x00,0x00,0x00,0x66,0x33,0x32,0x00,0x66,0xDC,0xFF,0xFF,
+ 0x07,0x00,0x12,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1A,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x0A,0x03,0x00,0x00,0x00,0x75,0x36,0x34,0x00,0x8E,0xDC,0xFF,0xFF,
+ 0x06,0x00,0x10,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x42,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x69,0x36,0x34,0x00,0xB6,0xDC,0xFF,0xFF,
+ 0x05,0x00,0x0E,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x6A,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x08,0x03,0x00,0x00,0x00,0x75,0x33,0x32,0x00,0xDE,0xDC,0xFF,0xFF,
+ 0x04,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x92,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x07,0x03,0x00,0x00,0x00,0x69,0x33,0x32,0x00,0x06,0xDD,0xFF,0xFF,
+ 0x03,0x00,0x0A,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xBA,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x75,0x31,0x36,0x00,0x2E,0xDD,0xFF,0xFF,
+ 0x02,0x00,0x08,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xE2,0xDA,0xFF,0xFF,0x00,0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x69,0x31,0x36,0x00,0x56,0xDD,0xFF,0xFF,
+ 0x01,0x00,0x06,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0A,0xDB,0xFF,0xFF,0x00,0x00,0x00,0x04,0x02,0x00,0x00,0x00,0x75,0x38,0x00,0x00,0x00,0x00,0x1A,0x00,
+ 0x14,0x00,0x08,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0xDB,0xFF,0xFF,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,
+ 0x69,0x38,0x00,0x00,0x92,0xDC,0xFF,0xFF,0x1C,0x01,0x00,0x00,0x4C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x20,0x61,0x6E,0x20,
+ 0x65,0x78,0x61,0x6D,0x70,0x6C,0x65,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x61,0x74,0x69,0x6F,
+ 0x6E,0x20,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x74,0x3A,0x20,0x22,0x6D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x20,
+ 0x6F,0x62,0x6A,0x65,0x63,0x74,0x22,0x00,0x32,0x00,0x00,0x00,0x54,0x02,0x00,0x00,0xB4,0x02,0x00,0x00,
+ 0x14,0x03,0x00,0x00,0x70,0x03,0x00,0x00,0x54,0x07,0x00,0x00,0x94,0x18,0x00,0x00,0xC4,0x15,0x00,0x00,
+ 0xC4,0x0C,0x00,0x00,0x84,0x19,0x00,0x00,0xFC,0x1A,0x00,0x00,0x00,0x19,0x00,0x00,0x6C,0x1B,0x00,0x00,
+ 0x38,0x1A,0x00,0x00,0xD4,0x04,0x00,0x00,0x1C,0x0B,0x00,0x00,0xD4,0x1B,0x00,0x00,0x48,0x01,0x00,0x00,
+ 0xB4,0x09,0x00,0x00,0x90,0x17,0x00,0x00,0x24,0x17,0x00,0x00,0x34,0x0C,0x00,0x00,0xF8,0x17,0x00,0x00,
+ 0x20,0x0F,0x00,0x00,0x04,0x0D,0x00,0x00,0xAC,0x16,0x00,0x00,0x68,0x0D,0x00,0x00,0xD0,0x15,0x00,0x00,
+ 0x1C,0x14,0x00,0x00,0x70,0x14,0x00,0x00,0xA4,0x0E,0x00,0x00,0x28,0x0E,0x00,0x00,0xB4,0x0D,0x00,0x00,
+ 0x80,0x13,0x00,0x00,0x58,0x11,0x00,0x00,0x68,0x12,0x00,0x00,0xDC,0x0F,0x00,0x00,0xE8,0x12,0x00,0x00,
+ 0x60,0x10,0x00,0x00,0xD0,0x11,0x00,0x00,0x40,0x0F,0x00,0x00,0xA0,0x14,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x80,0x05,0x00,0x00,0x14,0x0B,0x00,0x00,0x40,0x01,0x00,0x00,0x70,0x0B,0x00,0x00,0x24,0x03,0x00,0x00,
+ 0x2C,0x0A,0x00,0x00,0x90,0x07,0x00,0x00,0x3C,0x08,0x00,0x00,0x16,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,0x00,
+ 0xD8,0xE7,0xFF,0xFF,0x00,0x00,0x00,0x01,0x31,0x00,0x66,0x00,0x74,0x00,0x00,0x00,0x68,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x2C,0xE0,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
+ 0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,0x11,0x00,0x00,0x00,0x6E,0x65,0x73,0x74,0x65,0x64,0x5F,0x66,
+ 0x6C,0x61,0x74,0x62,0x75,0x66,0x66,0x65,0x72,0x00,0x00,0x00,0x5C,0xE0,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x39,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xF0,0xE7,0xFF,0xFF,0x00,0x00,0x0E,0x04,0x1C,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x72,0x65,0x71,0x75,
+ 0x69,0x72,0x65,0x64,0x6E,0x65,0x73,0x74,0x65,0x64,0x66,0x6C,0x61,0x74,0x62,0x75,0x66,0x66,0x65,0x72,
+ 0x00,0x00,0x00,0x00,0x82,0xE6,0xFF,0xFF,0x30,0x00,0x64,0x00,0x50,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xD4,0xE0,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x38,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x32,0xDE,0xFF,0xFF,0x00,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x73,0x69,0x67,0x6E,
+ 0x65,0x64,0x5F,0x65,0x6E,0x75,0x6D,0x00,0xE4,0xE8,0xFF,0xFF,0x00,0x00,0x00,0x01,0x2F,0x00,0x62,0x00,
+ 0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x34,0xE1,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x34,0x37,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x7E,0xEA,0xFF,0xFF,
+ 0x00,0x00,0x0E,0x04,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,
+ 0x66,0x5F,0x65,0x6E,0x75,0x6D,0x73,0x00,0x48,0xE9,0xFF,0xFF,0x00,0x00,0x00,0x01,0x2E,0x00,0x60,0x00,
+ 0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0xE1,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x34,0x36,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xF6,0xDE,0xFF,0xFF,
+ 0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0x61,0x6E,0x79,0x5F,0x61,0x6D,0x62,0x69,
+ 0x67,0x75,0x6F,0x75,0x73,0x00,0x00,0x00,0x86,0xEA,0xFF,0xFF,0x2D,0x00,0x5E,0x00,0x44,0x00,0x00,0x00,
+ 0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xF8,0xE1,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x34,0x35,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x56,0xDF,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x61,0x6E,0x79,0x5F,0x61,0x6D,0x62,0x69,0x67,0x75,0x6F,0x75,
+ 0x73,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x10,0xEA,0xFF,0xFF,0x00,0x00,0x00,0x01,0x2C,0x00,0x5C,0x00,
+ 0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0xE2,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x34,0x34,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xBE,0xDF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x10,0x02,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x61,0x6E,0x79,0x5F,0x75,0x6E,0x69,0x71,
+ 0x75,0x65,0x00,0x00,0x4A,0xEB,0xFF,0xFF,0x2B,0x00,0x5A,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xBC,0xE2,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x33,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x1A,0xE0,0xFF,0xFF,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,
+ 0x0F,0x00,0x00,0x00,0x61,0x6E,0x79,0x5F,0x75,0x6E,0x69,0x71,0x75,0x65,0x5F,0x74,0x79,0x70,0x65,0x00,
+ 0xD0,0xEA,0xFF,0xFF,0x00,0x00,0x00,0x01,0x2A,0x00,0x58,0x00,0xFC,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,
+ 0x80,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x30,0xE3,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x32,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0x4C,0xE3,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x66,0x6E,0x76,0x31,0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,
+ 0x00,0x00,0x00,0x00,0x74,0xE3,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
+ 0x52,0x65,0x66,0x65,0x72,0x72,0x61,0x62,0x6C,0x65,0x54,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0xA0,0xE3,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,
+ 0x74,0x79,0x70,0x65,0x5F,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0xCC,0xE3,0xFF,0xFF,0x14,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x6E,0x61,0x6B,0x65,0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0x70,0xEB,0xFF,0xFF,
+ 0x00,0x00,0x0E,0x0A,0x1F,0x00,0x00,0x00,0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x6E,0x6F,
+ 0x6E,0x5F,0x6F,0x77,0x6E,0x69,0x6E,0x67,0x5F,0x72,0x65,0x66,0x65,0x72,0x65,0x6E,0x63,0x65,0x73,0x00,
+ 0xD6,0xEC,0xFF,0xFF,0x29,0x00,0x56,0x00,0xFC,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x58,0xE4,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x31,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x74,0xE4,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0x9C,0xE4,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x52,0x65,0x66,0x65,
+ 0x72,0x72,0x61,0x62,0x6C,0x65,0x54,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x74,0x79,0x70,0x65,
+ 0x00,0x00,0x00,0x00,0xC8,0xE4,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,
+ 0x5F,0x67,0x65,0x74,0x00,0x00,0x00,0x00,0xF4,0xE4,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x05,0x00,0x00,0x00,0x6E,0x61,0x6B,0x65,0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,
+ 0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0xBA,0xE1,0xFF,0xFF,0x00,0x00,0x00,0x0A,
+ 0x14,0x00,0x00,0x00,0x6E,0x6F,0x6E,0x5F,0x6F,0x77,0x6E,0x69,0x6E,0x67,0x5F,0x72,0x65,0x66,0x65,0x72,
+ 0x65,0x6E,0x63,0x65,0x00,0x00,0x00,0x00,0x1C,0xED,0xFF,0xFF,0x00,0x00,0x00,0x01,0x28,0x00,0x54,0x00,
+ 0x0C,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x05,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x7C,0xE5,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x34,0x30,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x98,0xE5,0xFF,0xFF,0x18,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0xC0,0xE5,0xFF,0xFF,0x18,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x52,0x65,0x66,0x65,0x72,0x72,0x61,0x62,0x6C,0x65,0x54,0x00,
+ 0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0xEC,0xE5,0xFF,0xFF,
+ 0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x2E,0x67,0x65,0x74,0x28,0x29,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x5F,0x67,0x65,0x74,
+ 0x00,0x00,0x00,0x00,0x1C,0xE6,0xFF,0xFF,0x20,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,
+ 0xCC,0xED,0xFF,0xFF,0x00,0x00,0x0E,0x0A,0x1E,0x00,0x00,0x00,0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,
+ 0x66,0x5F,0x63,0x6F,0x5F,0x6F,0x77,0x6E,0x69,0x6E,0x67,0x5F,0x72,0x65,0x66,0x65,0x72,0x65,0x6E,0x63,
+ 0x65,0x73,0x00,0x00,0x32,0xEF,0xFF,0xFF,0x27,0x00,0x52,0x00,0xCC,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xB0,0xE6,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x39,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xCC,0xE6,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0xF4,0xE6,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x52,0x65,0x66,0x65,
+ 0x72,0x72,0x61,0x62,0x6C,0x65,0x54,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x74,0x79,0x70,0x65,
+ 0x00,0x00,0x00,0x00,0x20,0xE7,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+ 0x6E,0x61,0x6B,0x65,0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0xE6,0xE3,0xFF,0xFF,0x00,0x00,0x00,0x0A,0x13,0x00,0x00,0x00,
+ 0x63,0x6F,0x5F,0x6F,0x77,0x6E,0x69,0x6E,0x67,0x5F,0x72,0x65,0x66,0x65,0x72,0x65,0x6E,0x63,0x65,0x00,
+ 0x44,0xEF,0xFF,0xFF,0x00,0x00,0x00,0x01,0x26,0x00,0x50,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x98,0xE7,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x33,0x38,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xB4,0xE7,0xFF,0xFF,0x20,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x5F,0x70,0x74,0x72,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0x1A,0xF1,0xFF,0xFF,0x00,0x00,0x0E,0x0F,0x02,0x00,0x00,0x00,
+ 0x1C,0x00,0x00,0x00,0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x73,0x74,0x72,0x6F,0x6E,0x67,
+ 0x5F,0x72,0x65,0x66,0x65,0x72,0x72,0x61,0x62,0x6C,0x65,0x73,0x00,0x00,0x00,0x00,0xF4,0xEF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x25,0x00,0x4E,0x00,0xCC,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x50,0x00,0x00,0x00,
+ 0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x50,0xE8,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x33,0x37,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x6C,0xE8,0xFF,0xFF,
+ 0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x61,0x5F,0x36,0x34,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x94,0xE8,0xFF,0xFF,
+ 0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x52,0x65,0x66,0x65,0x72,0x72,0x61,0x62,
+ 0x6C,0x65,0x54,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,
+ 0xC0,0xE8,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x6E,0x61,0x6B,0x65,
+ 0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,
+ 0x00,0x00,0x00,0x00,0x64,0xF0,0xFF,0xFF,0x00,0x00,0x0E,0x0A,0x19,0x00,0x00,0x00,0x76,0x65,0x63,0x74,
+ 0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x77,0x65,0x61,0x6B,0x5F,0x72,0x65,0x66,0x65,0x72,0x65,0x6E,0x63,0x65,
+ 0x73,0x00,0x00,0x00,0xC6,0xF1,0xFF,0xFF,0x24,0x00,0x4C,0x00,0xCC,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xE9,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x36,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x60,0xE9,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0x88,0xE9,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x52,0x65,0x66,0x65,
+ 0x72,0x72,0x61,0x62,0x6C,0x65,0x54,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x74,0x79,0x70,0x65,
+ 0x00,0x00,0x00,0x00,0xB4,0xE9,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+ 0x6E,0x61,0x6B,0x65,0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,0x70,0x74,0x72,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0x7A,0xE6,0xFF,0xFF,0x00,0x00,0x00,0x0A,0x15,0x00,0x00,0x00,
+ 0x73,0x69,0x6E,0x67,0x6C,0x65,0x5F,0x77,0x65,0x61,0x6B,0x5F,0x72,0x65,0x66,0x65,0x72,0x65,0x6E,0x63,
+ 0x65,0x00,0x00,0x00,0xDC,0xF1,0xFF,0xFF,0x00,0x00,0x00,0x01,0x23,0x00,0x4A,0x00,0x44,0x00,0x00,0x00,
+ 0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x2C,0xEA,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x33,0x35,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x76,0xF3,0xFF,0xFF,0x00,0x00,0x0E,0x0F,
+ 0x02,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x72,0x65,
+ 0x66,0x65,0x72,0x72,0x61,0x62,0x6C,0x65,0x73,0x00,0x00,0x00,0x48,0xF2,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x22,0x00,0x48,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0xEA,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x34,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xF6,0xE7,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x09,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x70,0x61,0x72,0x65,
+ 0x6E,0x74,0x5F,0x6E,0x61,0x6D,0x65,0x73,0x70,0x61,0x63,0x65,0x5F,0x74,0x65,0x73,0x74,0x00,0x00,0x00,
+ 0xB4,0xF2,0xFF,0xFF,0x00,0x00,0x00,0x01,0x21,0x00,0x46,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x04,0xEB,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x33,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x98,0xF2,0xFF,0xFF,0x00,0x00,0x0E,0x0C,0x11,0x00,0x00,0x00,
+ 0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x64,0x6F,0x75,0x62,0x6C,0x65,0x73,0x00,0x00,0x00,
+ 0x18,0xF3,0xFF,0xFF,0x00,0x00,0x00,0x01,0x20,0x00,0x44,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x68,0xEB,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x32,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xFC,0xF2,0xFF,0xFF,0x00,0x00,0x0E,0x09,0x0F,0x00,0x00,0x00,
+ 0x76,0x65,0x63,0x74,0x6F,0x72,0x5F,0x6F,0x66,0x5F,0x6C,0x6F,0x6E,0x67,0x73,0x00,0x78,0xF3,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x1F,0x00,0x42,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xC8,0xEB,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x31,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0x12,0xF5,0xFF,0xFF,0x00,0x00,0x0E,0x0F,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x35,0x00,0x00,0x00,0xD4,0xF3,0xFF,0xFF,0x00,0x00,0x00,0x01,0x1E,0x00,0x40,0x00,
+ 0x68,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x28,0xEC,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x44,0xEC,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
+ 0x0A,0x00,0x00,0x00,0x66,0x6C,0x65,0x78,0x62,0x75,0x66,0x66,0x65,0x72,0x00,0x00,0xE0,0xF3,0xFF,0xFF,
+ 0x00,0x00,0x0E,0x04,0x04,0x00,0x00,0x00,0x66,0x6C,0x65,0x78,0x00,0x00,0x00,0x00,0x54,0xF4,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x1D,0x00,0x3E,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xA4,0xEC,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x39,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0xEE,0xF5,0xFF,0xFF,0x00,0x00,0x0E,0x0F,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x61,0x72,0x72,0x61,0x79,0x6F,0x66,0x73,0x6F,0x72,0x74,0x65,0x64,0x73,0x74,0x72,
+ 0x75,0x63,0x74,0x00,0xC0,0xF4,0xFF,0xFF,0x00,0x00,0x00,0x01,0x1C,0x00,0x3C,0x00,0x40,0x00,0x00,0x00,
+ 0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x10,0xED,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x32,0x38,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xA4,0xF4,0xFF,0xFF,0x00,0x00,0x0E,0x0D,
+ 0x12,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x61,0x72,0x72,0x61,0x79,0x6F,0x66,0x73,0x74,0x72,0x69,0x6E,
+ 0x67,0x32,0x00,0x00,0xFE,0xF5,0xFF,0xFF,0x1B,0x00,0x3A,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x70,0xED,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x37,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x26,0xEA,0xFF,0xFF,0x00,0x00,0x00,0x0B,0x06,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x66,0x33,0x00,0x00,0x00,0x00,0x1A,0x00,0x20,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,
+ 0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,
+ 0x1A,0x00,0x38,0x00,0x48,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xE8,0xED,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x36,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x9E,0xEA,0xFF,0xFF,0x00,0x00,0x00,0x0B,0x06,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x66,0x32,0x00,0x00,0x00,0x00,0x1A,0x00,0x24,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,
+ 0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,
+ 0x19,0x00,0x36,0x00,0x4C,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x6E,0x86,0x1B,0xF0,0xF9,0x21,0x09,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x64,0xEE,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x32,0x35,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x1A,0xEB,0xFF,0xFF,0x00,0x00,0x00,0x0B,
+ 0x05,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x66,0x00,0x00,0x00,0x6C,0xF6,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x18,0x00,0x34,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xBC,0xEE,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x34,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x50,0xF6,0xFF,0xFF,0x00,0x00,0x0E,0x02,0x10,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x61,0x72,0x72,0x61,
+ 0x79,0x6F,0x66,0x62,0x6F,0x6F,0x6C,0x73,0x00,0x00,0x00,0x00,0xAA,0xF7,0xFF,0xFF,0x17,0x00,0x32,0x00,
+ 0x6C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0xEF,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x33,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x3C,0xEF,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0xFE,0xEB,0xFF,0xFF,0x00,0x00,0x00,0x0A,0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,
+ 0x75,0x36,0x34,0x5F,0x66,0x6E,0x76,0x31,0x61,0x00,0x00,0x00,0x36,0xF8,0xFF,0xFF,0x16,0x00,0x30,0x00,
+ 0x6C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xAC,0xEF,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x32,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xC8,0xEF,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x61,0x5F,0x36,0x34,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0x8A,0xEC,0xFF,0xFF,0x00,0x00,0x00,0x09,0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,
+ 0x73,0x36,0x34,0x5F,0x66,0x6E,0x76,0x31,0x61,0x00,0x00,0x00,0xC2,0xF8,0xFF,0xFF,0x15,0x00,0x2E,0x00,
+ 0xC8,0x00,0x00,0x00,0xBC,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x40,0xF0,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x31,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x5C,0xF0,0xFF,0xFF,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x61,0x5F,0x33,0x32,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x84,0xF0,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x53,0x74,0x61,0x74,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,
+ 0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0xAC,0xF0,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x05,0x00,0x00,0x00,0x6E,0x61,0x6B,0x65,0x64,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x63,0x70,0x70,0x5F,
+ 0x70,0x74,0x72,0x5F,0x74,0x79,0x70,0x65,0x00,0x00,0x00,0x00,0x72,0xED,0xFF,0xFF,0x00,0x00,0x00,0x08,
+ 0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,0x75,0x33,0x32,0x5F,0x66,0x6E,0x76,0x31,
+ 0x61,0x00,0x00,0x00,0xAA,0xF9,0xFF,0xFF,0x14,0x00,0x2C,0x00,0x6C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x20,0xF1,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x32,0x30,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x3C,0xF1,0xFF,0xFF,0x18,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x61,0x5F,0x33,0x32,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0xFE,0xED,0xFF,0xFF,0x00,0x00,0x00,0x07,
+ 0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,0x73,0x33,0x32,0x5F,0x66,0x6E,0x76,0x31,
+ 0x61,0x00,0x00,0x00,0x36,0xFA,0xFF,0xFF,0x13,0x00,0x2A,0x00,0x68,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xAC,0xF1,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x31,0x39,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xC8,0xF1,0xFF,0xFF,0x14,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x5F,0x36,0x34,0x00,0x04,0x00,0x00,0x00,
+ 0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x86,0xEE,0xFF,0xFF,0x00,0x00,0x00,0x0A,0x10,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,0x75,0x36,0x34,0x5F,0x66,0x6E,0x76,0x31,0x00,0x00,0x00,0x00,
+ 0xBE,0xFA,0xFF,0xFF,0x12,0x00,0x28,0x00,0x68,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x34,0xF2,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x31,0x38,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x50,0xF2,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x07,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x5F,0x36,0x34,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,
+ 0x00,0x00,0x00,0x00,0x0E,0xEF,0xFF,0xFF,0x00,0x00,0x00,0x09,0x10,0x00,0x00,0x00,0x74,0x65,0x73,0x74,
+ 0x68,0x61,0x73,0x68,0x73,0x36,0x34,0x5F,0x66,0x6E,0x76,0x31,0x00,0x00,0x00,0x00,0x46,0xFB,0xFF,0xFF,
+ 0x11,0x00,0x26,0x00,0x68,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xBC,0xF2,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x31,0x37,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0xD8,0xF2,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
+ 0x66,0x6E,0x76,0x31,0x5F,0x33,0x32,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,
+ 0x96,0xEF,0xFF,0xFF,0x00,0x00,0x00,0x08,0x10,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,
+ 0x75,0x33,0x32,0x5F,0x66,0x6E,0x76,0x31,0x00,0x00,0x00,0x00,0xCE,0xFB,0xFF,0xFF,0x10,0x00,0x24,0x00,
+ 0x68,0x00,0x00,0x00,0x5C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xF3,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x31,0x36,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x60,0xF3,0xFF,0xFF,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,
+ 0x5F,0x33,0x32,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x1E,0xF0,0xFF,0xFF,
+ 0x00,0x00,0x00,0x07,0x10,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x68,0x61,0x73,0x68,0x73,0x33,0x32,0x5F,
+ 0x66,0x6E,0x76,0x31,0x00,0x00,0x00,0x00,0x56,0xFC,0xFF,0xFF,0x0F,0x00,0x22,0x00,0x40,0x00,0x00,0x00,
+ 0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xC8,0xF3,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x31,0x35,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x7E,0xF0,0xFF,0xFF,0x00,0x00,0x00,0x02,
+ 0x08,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x62,0x6F,0x6F,0x6C,0x00,0x00,0x00,0x00,0xD4,0xFB,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x0E,0x00,0x20,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0xF4,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x31,0x34,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0x82,0xF1,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x65,0x6D,0x70,0x74,0x79,0x00,0x00,0x00,0x34,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x0D,0x00,0x1E,0x00,0x74,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x88,0xF4,0xFF,0xFF,
+ 0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,
+ 0x11,0x00,0x00,0x00,0x6E,0x65,0x73,0x74,0x65,0x64,0x5F,0x66,0x6C,0x61,0x74,0x62,0x75,0x66,0x66,0x65,
+ 0x72,0x00,0x00,0x00,0xB8,0xF4,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x31,0x33,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x4C,0xFC,0xFF,0xFF,0x00,0x00,0x0E,0x04,
+ 0x14,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x6E,0x65,0x73,0x74,0x65,0x64,0x66,0x6C,0x61,0x74,0x62,0x75,
+ 0x66,0x66,0x65,0x72,0x00,0x00,0x00,0x00,0xD0,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x01,0x0C,0x00,0x1C,0x00,
+ 0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0xF5,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x31,0x32,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x7E,0xF2,0xFF,0xFF,
+ 0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x65,0x6E,0x65,0x6D,0x79,0x00,0x00,0x00,
+ 0x2C,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x01,0x0B,0x00,0x1A,0x00,0xB0,0x00,0x00,0x00,0xA0,0x00,0x00,0x00,
+ 0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x0E,0x00,0x00,0x00,0x20,0x6D,0x75,0x6C,0x74,0x69,0x6C,0x69,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x00,0x00,
+ 0x49,0x00,0x00,0x00,0x20,0x61,0x6E,0x20,0x65,0x78,0x61,0x6D,0x70,0x6C,0x65,0x20,0x64,0x6F,0x63,0x75,
+ 0x6D,0x65,0x6E,0x74,0x61,0x74,0x69,0x6F,0x6E,0x20,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x74,0x3A,0x20,0x74,
+ 0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,0x65,0x6E,0x64,0x20,0x75,0x70,0x20,0x69,0x6E,0x20,0x74,
+ 0x68,0x65,0x20,0x67,0x65,0x6E,0x65,0x72,0x61,0x74,0x65,0x64,0x20,0x63,0x6F,0x64,0x65,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xE8,0xF5,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x32,0xFF,0xFF,0xFF,
+ 0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x61,0x72,0x72,0x61,
+ 0x79,0x6F,0x66,0x74,0x61,0x62,0x6C,0x65,0x73,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x0A,0x00,0x18,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x50,0xF6,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x31,0x30,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xE4,0xFD,0xFF,0xFF,0x00,0x00,0x0E,0x0D,0x11,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x61,0x72,0x72,0x61,
+ 0x79,0x6F,0x66,0x73,0x74,0x72,0x69,0x6E,0x67,0x00,0x00,0x00,0x64,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x01,
+ 0x09,0x00,0x16,0x00,0x50,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xB4,0xF6,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x00,0x00,0x0A,0x00,0x0C,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x0E,0x0F,
+ 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x34,0x00,0x00,0x00,0xCC,0xFE,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x08,0x00,0x14,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1C,0xF7,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0x7A,0xF4,0xFF,0xFF,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x00,0x00,0x1A,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,0x07,0x00,0x12,0x00,
+ 0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8C,0xF7,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xEA,0xF4,0xFF,0xFF,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x5F,0x74,0x79,0x70,
+ 0x65,0x00,0x00,0x00,0xA2,0xFD,0xFF,0xFF,0x06,0x00,0x10,0x00,0x50,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF4,0xF7,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x52,0xF5,0xFF,0xFF,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x63,0x6F,0x6C,0x6F,
+ 0x72,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x10,0x00,0x08,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x18,0x00,0x07,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x05,0x00,0x0E,0x00,0x48,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6C,0xF8,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x08,0x00,0x08,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0E,0x04,0x09,0x00,0x00,0x00,
+ 0x69,0x6E,0x76,0x65,0x6E,0x74,0x6F,0x72,0x79,0x00,0x1A,0x00,0x1C,0x00,0x0C,0x00,0x10,0x00,0x08,0x00,
+ 0x0A,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x18,0x00,0x1A,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x04,0x00,0x0C,0x00,0x90,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0xF0,0xF8,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x31,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x70,0x72,0x69,0x6F,0x72,0x69,0x74,0x79,0x00,0x00,0x00,0x00,
+ 0x14,0xF9,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x30,0xF9,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x64,0x65,0x70,0x72,0x65,0x63,0x61,0x74,
+ 0x65,0x64,0x00,0x00,0xEE,0xF5,0xFF,0xFF,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x66,0x72,0x69,0x65,
+ 0x6E,0x64,0x6C,0x79,0x00,0x00,0x1A,0x00,0x1C,0x00,0x0C,0x00,0x10,0x00,0x08,0x00,0x0A,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x00,0x14,0x00,0x18,0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
+ 0x03,0x00,0x0A,0x00,0x88,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xB4,0xF9,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x00,0x00,0x00,0x00,0xD8,0xF9,0xFF,0xFF,
+ 0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x6B,0x65,0x79,0x00,0xF4,0xF9,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x33,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0xAA,0xF6,0xFF,0xFF,0x00,0x00,0x00,0x0D,
+ 0x04,0x00,0x00,0x00,0x6E,0x61,0x6D,0x65,0x00,0x00,0x1A,0x00,0x24,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,
+ 0x06,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,
+ 0x02,0x00,0x08,0x00,0x4C,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x6C,0xFA,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x32,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x22,0xF7,0xFF,0xFF,0x00,0x00,0x00,0x05,
+ 0x02,0x00,0x00,0x00,0x68,0x70,0x00,0x00,0x00,0x00,0x1A,0x00,0x20,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,
+ 0x06,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,
+ 0x01,0x00,0x06,0x00,0x48,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xE0,0xFA,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x96,0xF7,0xFF,0xFF,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00,
+ 0x6D,0x61,0x6E,0x61,0x00,0x00,0x00,0x00,0x1C,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x14,0x00,0x05,0x00,0x1C,0x00,0x00,0x00,
+ 0x00,0x01,0x04,0x00,0x44,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x50,0xFB,0xFF,0xFF,0x10,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0xAE,0xF8,0xFF,0xFF,0x00,0x00,0x00,0x0F,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x70,0x6F,0x73,0x00,
+ 0x4E,0xF9,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x52,0x65,0x66,0x65,0x72,0x72,0x61,0x62,0x6C,
+ 0x65,0x00,0x1A,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x05,0x00,0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x6C,0x00,0x00,0x00,
+ 0x60,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x6B,0x65,0x79,0x00,0x1C,0xFC,0xFF,0xFF,
+ 0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x66,0x6E,0x76,0x31,0x61,0x5F,0x36,0x34,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0xDE,0xF8,0xFF,0xFF,
+ 0x00,0x00,0x00,0x0A,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,0x22,0xFA,0xFF,0xFF,0x24,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+ 0x24,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x53,0x74,0x61,0x74,0x00,0x92,0xFB,0xFF,0xFF,
+ 0x02,0x00,0x08,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x46,0xF9,0xFF,0xFF,0x00,0x00,0x00,0x06,0x05,0x00,0x00,0x00,0x63,0x6F,0x75,0x6E,0x74,0x00,0x00,0x00,
+ 0xBE,0xFB,0xFF,0xFF,0x01,0x00,0x06,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x72,0xF9,0xFF,0xFF,0x00,0x00,0x00,0x09,0x03,0x00,0x00,0x00,0x76,0x61,0x6C,0x00,
+ 0x60,0xFA,0xFF,0xFF,0x00,0x01,0x04,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x9A,0xF9,0xFF,0xFF,0x00,0x00,0x00,0x0D,0x02,0x00,0x00,0x00,0x69,0x64,0x00,0x00,
+ 0x36,0xFA,0xFF,0xFF,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
+ 0x68,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,
+ 0x6C,0x65,0x2E,0x41,0x62,0x69,0x6C,0x69,0x74,0x79,0x00,0x00,0x56,0xFC,0xFF,0xFF,0x01,0x00,0x04,0x00,
+ 0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0xFA,0xFF,0xFF,
+ 0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x64,0x69,0x73,0x74,0x61,0x6E,0x63,0x65,0x00,0x00,0x1A,0x00,
+ 0x18,0x00,0x08,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,
+ 0x10,0x00,0x14,0x00,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xC4,0xFD,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x6B,0x65,0x79,0x00,0x7A,0xFA,0xFF,0xFF,0x00,0x00,0x00,0x08,0x02,0x00,0x00,0x00,
+ 0x69,0x64,0x00,0x00,0x00,0x00,0x12,0x00,0x20,0x00,0x08,0x00,0x0C,0x00,0x07,0x00,0x10,0x00,0x14,0x00,
+ 0x18,0x00,0x1C,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x64,0x00,0x00,0x00,0x44,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x30,0xFE,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x66,0x6F,0x72,0x63,0x65,0x5F,0x61,0x6C,
+ 0x69,0x67,0x6E,0x00,0x06,0x00,0x00,0x00,0xB0,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x44,0x00,0x00,0x00,
+ 0x20,0x01,0x00,0x00,0xF4,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,
+ 0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x56,0x65,0x63,0x33,0x00,0x1C,0x00,0x18,0x00,
+ 0x0C,0x00,0x10,0x00,0x08,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x14,0x00,0x07,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x05,0x00,0x1A,0x00,0x1C,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x0F,
+ 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x33,0x00,0x00,0x00,0xD6,0xFD,0xFF,0xFF,
+ 0x04,0x00,0x18,0x00,0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x32,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x74,0x65,0x73,0x74,
+ 0x32,0x00,0x00,0x00,0x06,0xFE,0xFF,0xFF,0x03,0x00,0x10,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBA,0xFB,0xFF,0xFF,0x00,0x00,0x00,0x0C,0x05,0x00,0x00,0x00,
+ 0x74,0x65,0x73,0x74,0x31,0x00,0x00,0x00,0x32,0xFE,0xFF,0xFF,0x02,0x00,0x08,0x00,0x18,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0xFB,0xFF,0xFF,0x00,0x00,0x00,0x0B,
+ 0x01,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0x5A,0xFE,0xFF,0xFF,0x01,0x00,0x04,0x00,0x18,0x00,0x00,0x00,
+ 0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x0B,
+ 0x01,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x4E,0xFC,0xFF,0xFF,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x0B,0x01,0x00,0x00,0x00,
+ 0x78,0x00,0x12,0x00,0x18,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x14,0x00,
+ 0x12,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0xE0,0xFF,0xFF,0xFF,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
+ 0x07,0x00,0x00,0x00,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x08,0x00,
+ 0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
+ 0x0E,0x00,0x00,0x00,0x63,0x73,0x68,0x61,0x72,0x70,0x5F,0x70,0x61,0x72,0x74,0x69,0x61,0x6C,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x4C,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,
+ 0x78,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x54,0x65,0x73,0x74,0x53,0x69,0x6D,0x70,0x6C,0x65,0x54,0x61,0x62,
+ 0x6C,0x65,0x57,0x69,0x74,0x68,0x45,0x6E,0x75,0x6D,0x00,0x00,0x00,0x00,0x1A,0x00,0x20,0x00,0x08,0x00,
+ 0x0C,0x00,0x00,0x00,0x06,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x1A,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x28,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0xFD,0xFF,0xFF,
+ 0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x63,0x6F,0x6C,0x6F,0x72,0x00,0x00,0x00,
+ 0xE2,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x64,0x00,0x00,0x00,
+ 0x38,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,
+ 0x6C,0x65,0x2E,0x54,0x65,0x73,0x74,0x00,0x00,0x00,0x1A,0x00,0x14,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,
+ 0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x1A,0x00,0x00,0x00,
+ 0x01,0x00,0x02,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xCE,0xFD,0xFF,0xFF,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x0E,0xFE,0xFF,0xFF,
+ 0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF2,0xFD,0xFF,0xFF,
+ 0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x36,0xFF,0xFF,0xFF,0x18,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x17,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x45,0x78,0x61,0x6D,0x70,0x6C,0x65,0x32,0x2E,
+ 0x4D,0x6F,0x6E,0x73,0x74,0x65,0x72,0x00,0x6E,0xFF,0xFF,0xFF,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+ 0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x49,0x6E,0x50,0x61,0x72,0x65,0x6E,0x74,0x4E,0x61,0x6D,0x65,0x73,
+ 0x70,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0xAA,0xFF,0xFF,0xFF,0x1C,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x06,0x00,0x00,0x00,0x54,0x61,0x62,0x6C,0x65,0x41,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x01,0x04,0x00,
+ 0x1C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0xFF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x0F,0x0A,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x12,0x00,0x14,0x00,0x04,0x00,
+ 0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x12,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x44,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x4F,0x74,0x68,0x65,0x72,
+ 0x4E,0x61,0x6D,0x65,0x53,0x70,0x61,0x63,0x65,0x2E,0x54,0x61,0x62,0x6C,0x65,0x42,0x00,0x00,0x00,0x00,
+ 0x1C,0x00,0x14,0x00,0x08,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x05,0x00,0x1C,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x28,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0C,0x00,0x07,0x00,
+ 0x00,0x00,0x08,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x61,0x00,0x12,0x00,0x1C,0x00,0x08,0x00,0x0C,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x00,0x00,0x18,0x00,
+ 0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x1C,0x00,0x00,0x00,0x4D,0x79,0x47,0x61,0x6D,0x65,0x2E,0x4F,0x74,0x68,0x65,0x72,0x4E,0x61,0x6D,0x65,
+ 0x53,0x70,0x61,0x63,0x65,0x2E,0x55,0x6E,0x75,0x73,0x65,0x64,0x00,0x00,0x1A,0x00,0x10,0x00,0x04,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,
+ 0x1A,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x06,0x00,0x08,0x00,0x07,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x00,
+ 0x61,0x00,0x00,0x00
+ };
+ return bfbsData;
+ }
+ static size_t size() {
+ return 12544;
+ }
+ const uint8_t *begin() {
+ return data();
+ }
+ const uint8_t *end() {
+ return data() + size();
+ }
+};
+
+} // namespace Example
+} // namespace MyGame
+
+#endif // FLATBUFFERS_GENERATED_MONSTERTEST_MYGAME_EXAMPLE_BFBS_H_
diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index 4016ce9..8f55b1d 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -10,11 +10,13 @@
namespace MyGame {
struct InParentNamespace;
+struct InParentNamespaceBuilder;
struct InParentNamespaceT;
namespace Example2 {
struct Monster;
+struct MonsterBuilder;
struct MonsterT;
} // namespace Example2
@@ -24,6 +26,7 @@
struct Test;
struct TestSimpleTableWithEnum;
+struct TestSimpleTableWithEnumBuilder;
struct TestSimpleTableWithEnumT;
struct Vec3;
@@ -31,15 +34,19 @@
struct Ability;
struct Stat;
+struct StatBuilder;
struct StatT;
struct Referrable;
+struct ReferrableBuilder;
struct ReferrableT;
struct Monster;
+struct MonsterBuilder;
struct MonsterT;
struct TypeAliases;
+struct TypeAliasesBuilder;
struct TypeAliasesT;
} // namespace Example
@@ -136,11 +143,47 @@
}
inline const char *EnumNameColor(Color e) {
- if (e < Color_Red || e > Color_Blue) return "";
+ if (flatbuffers::IsOutRange(e, Color_Red, Color_Blue)) return "";
const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Color_Red);
return EnumNamesColor()[index];
}
+enum Race {
+ Race_None = -1,
+ Race_Human = 0,
+ Race_Dwarf = 1,
+ Race_Elf = 2,
+ Race_MIN = Race_None,
+ Race_MAX = Race_Elf
+};
+
+inline const Race (&EnumValuesRace())[4] {
+ static const Race values[] = {
+ Race_None,
+ Race_Human,
+ Race_Dwarf,
+ Race_Elf
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesRace() {
+ static const char * const names[5] = {
+ "None",
+ "Human",
+ "Dwarf",
+ "Elf",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameRace(Race e) {
+ if (flatbuffers::IsOutRange(e, Race_None, Race_Elf)) return "";
+ const size_t index = static_cast<size_t>(e) - static_cast<size_t>(Race_None);
+ return EnumNamesRace()[index];
+}
+
enum Any {
Any_NONE = 0,
Any_Monster = 1,
@@ -172,7 +215,7 @@
}
inline const char *EnumNameAny(Any e) {
- if (e < Any_NONE || e > Any_MyGame_Example2_Monster) return "";
+ if (flatbuffers::IsOutRange(e, Any_NONE, Any_MyGame_Example2_Monster)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesAny()[index];
}
@@ -201,8 +244,8 @@
AnyUnion(AnyUnion&& u) FLATBUFFERS_NOEXCEPT :
type(Any_NONE), value(nullptr)
{ std::swap(type, u.type); std::swap(value, u.value); }
- AnyUnion(const AnyUnion &) FLATBUFFERS_NOEXCEPT;
- AnyUnion &operator=(const AnyUnion &u) FLATBUFFERS_NOEXCEPT
+ AnyUnion(const AnyUnion &);
+ AnyUnion &operator=(const AnyUnion &u)
{ AnyUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
AnyUnion &operator=(AnyUnion &&u) FLATBUFFERS_NOEXCEPT
{ std::swap(type, u.type); std::swap(value, u.value); return *this; }
@@ -314,7 +357,7 @@
}
inline const char *EnumNameAnyUniqueAliases(AnyUniqueAliases e) {
- if (e < AnyUniqueAliases_NONE || e > AnyUniqueAliases_M2) return "";
+ if (flatbuffers::IsOutRange(e, AnyUniqueAliases_NONE, AnyUniqueAliases_M2)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesAnyUniqueAliases()[index];
}
@@ -343,8 +386,8 @@
AnyUniqueAliasesUnion(AnyUniqueAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
type(AnyUniqueAliases_NONE), value(nullptr)
{ std::swap(type, u.type); std::swap(value, u.value); }
- AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &) FLATBUFFERS_NOEXCEPT;
- AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u) FLATBUFFERS_NOEXCEPT
+ AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &);
+ AnyUniqueAliasesUnion &operator=(const AnyUniqueAliasesUnion &u)
{ AnyUniqueAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
AnyUniqueAliasesUnion &operator=(AnyUniqueAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
{ std::swap(type, u.type); std::swap(value, u.value); return *this; }
@@ -456,7 +499,7 @@
}
inline const char *EnumNameAnyAmbiguousAliases(AnyAmbiguousAliases e) {
- if (e < AnyAmbiguousAliases_NONE || e > AnyAmbiguousAliases_M3) return "";
+ if (flatbuffers::IsOutRange(e, AnyAmbiguousAliases_NONE, AnyAmbiguousAliases_M3)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesAnyAmbiguousAliases()[index];
}
@@ -469,8 +512,8 @@
AnyAmbiguousAliasesUnion(AnyAmbiguousAliasesUnion&& u) FLATBUFFERS_NOEXCEPT :
type(AnyAmbiguousAliases_NONE), value(nullptr)
{ std::swap(type, u.type); std::swap(value, u.value); }
- AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &) FLATBUFFERS_NOEXCEPT;
- AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u) FLATBUFFERS_NOEXCEPT
+ AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &);
+ AnyAmbiguousAliasesUnion &operator=(const AnyAmbiguousAliasesUnion &u)
{ AnyAmbiguousAliasesUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
AnyAmbiguousAliasesUnion &operator=(AnyAmbiguousAliasesUnion &&u) FLATBUFFERS_NOEXCEPT
{ std::swap(type, u.type); std::swap(value, u.value); return *this; }
@@ -549,8 +592,11 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TestTypeTable();
}
- Test() {
- memset(static_cast<void *>(this), 0, sizeof(Test));
+ Test()
+ : a_(0),
+ b_(0),
+ padding0__(0) {
+ (void)padding0__;
}
Test(int16_t _a, int8_t _b)
: a_(flatbuffers::EndianScalar(_a)),
@@ -600,8 +646,19 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return Vec3TypeTable();
}
- Vec3() {
- memset(static_cast<void *>(this), 0, sizeof(Vec3));
+ Vec3()
+ : x_(0),
+ y_(0),
+ z_(0),
+ padding0__(0),
+ test1_(0),
+ test2_(0),
+ padding1__(0),
+ test3_(),
+ padding2__(0) {
+ (void)padding0__;
+ (void)padding1__;
+ (void)padding2__;
}
Vec3(float _x, float _y, float _z, double _test1, MyGame::Example::Color _test2, const MyGame::Example::Test &_test3)
: x_(flatbuffers::EndianScalar(_x)),
@@ -680,8 +737,9 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return AbilityTypeTable();
}
- Ability() {
- memset(static_cast<void *>(this), 0, sizeof(Ability));
+ Ability()
+ : id_(0),
+ distance_(0) {
}
Ability(uint32_t _id, uint32_t _distance)
: id_(flatbuffers::EndianScalar(_id)),
@@ -738,6 +796,7 @@
struct InParentNamespace FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef InParentNamespaceT NativeTableType;
+ typedef InParentNamespaceBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return InParentNamespaceTypeTable();
}
@@ -751,13 +810,13 @@
};
struct InParentNamespaceBuilder {
+ typedef InParentNamespace Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
explicit InParentNamespaceBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- InParentNamespaceBuilder &operator=(const InParentNamespaceBuilder &);
flatbuffers::Offset<InParentNamespace> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<InParentNamespace>(end);
@@ -792,6 +851,7 @@
struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef MonsterT NativeTableType;
+ typedef MonsterBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return MonsterTypeTable();
}
@@ -805,13 +865,13 @@
};
struct MonsterBuilder {
+ typedef Monster Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- MonsterBuilder &operator=(const MonsterBuilder &);
flatbuffers::Offset<Monster> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<Monster>(end);
@@ -851,6 +911,7 @@
struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef TestSimpleTableWithEnumT NativeTableType;
+ typedef TestSimpleTableWithEnumBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TestSimpleTableWithEnumTypeTable();
}
@@ -874,6 +935,7 @@
};
struct TestSimpleTableWithEnumBuilder {
+ typedef TestSimpleTableWithEnum Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_color(MyGame::Example::Color color) {
@@ -883,7 +945,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- TestSimpleTableWithEnumBuilder &operator=(const TestSimpleTableWithEnumBuilder &);
flatbuffers::Offset<TestSimpleTableWithEnum> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<TestSimpleTableWithEnum>(end);
@@ -926,6 +987,7 @@
struct Stat FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef StatT NativeTableType;
+ typedef StatBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return StatTypeTable();
}
@@ -966,6 +1028,7 @@
};
struct StatBuilder {
+ typedef Stat Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_id(flatbuffers::Offset<flatbuffers::String> id) {
@@ -981,7 +1044,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- StatBuilder &operator=(const StatBuilder &);
flatbuffers::Offset<Stat> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<Stat>(end);
@@ -1036,6 +1098,7 @@
struct Referrable FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef ReferrableT NativeTableType;
+ typedef ReferrableBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return ReferrableTypeTable();
}
@@ -1065,6 +1128,7 @@
};
struct ReferrableBuilder {
+ typedef Referrable Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_id(uint64_t id) {
@@ -1074,7 +1138,6 @@
: 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);
@@ -1100,7 +1163,7 @@
std::string name;
std::vector<uint8_t> inventory;
MyGame::Example::Color color;
- AnyUnion test;
+ MyGame::Example::AnyUnion test;
std::vector<MyGame::Example::Test> test4;
std::vector<std::string> testarrayofstring;
std::vector<flatbuffers::unique_ptr<MyGame::Example::MonsterT>> testarrayoftables;
@@ -1135,9 +1198,11 @@
std::vector<flatbuffers::unique_ptr<ReferrableT>> vector_of_co_owning_references;
ReferrableT *non_owning_reference;
std::vector<ReferrableT *> vector_of_non_owning_references;
- AnyUniqueAliasesUnion any_unique;
- AnyAmbiguousAliasesUnion any_ambiguous;
+ MyGame::Example::AnyUniqueAliasesUnion any_unique;
+ MyGame::Example::AnyAmbiguousAliasesUnion any_ambiguous;
std::vector<MyGame::Example::Color> vector_of_enums;
+ MyGame::Example::Race signed_enum;
+ std::vector<uint8_t> testrequirednestedflatbuffer;
MonsterT()
: mana(150),
hp(100),
@@ -1156,7 +1221,8 @@
testf3(0.0f),
single_weak_reference(nullptr),
co_owning_reference(nullptr),
- non_owning_reference(nullptr) {
+ non_owning_reference(nullptr),
+ signed_enum(MyGame::Example::Race_None) {
}
};
@@ -1205,7 +1271,9 @@
(lhs.vector_of_non_owning_references == rhs.vector_of_non_owning_references) &&
(lhs.any_unique == rhs.any_unique) &&
(lhs.any_ambiguous == rhs.any_ambiguous) &&
- (lhs.vector_of_enums == rhs.vector_of_enums);
+ (lhs.vector_of_enums == rhs.vector_of_enums) &&
+ (lhs.signed_enum == rhs.signed_enum) &&
+ (lhs.testrequirednestedflatbuffer == rhs.testrequirednestedflatbuffer);
}
inline bool operator!=(const MonsterT &lhs, const MonsterT &rhs) {
@@ -1213,9 +1281,10 @@
}
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef MonsterT NativeTableType;
+ typedef MonsterBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return MonsterTypeTable();
}
@@ -1266,7 +1335,9 @@
VT_ANY_UNIQUE = 92,
VT_ANY_AMBIGUOUS_TYPE = 94,
VT_ANY_AMBIGUOUS = 96,
- VT_VECTOR_OF_ENUMS = 98
+ VT_VECTOR_OF_ENUMS = 98,
+ VT_SIGNED_ENUM = 100,
+ VT_TESTREQUIREDNESTEDFLATBUFFER = 102
};
const MyGame::Example::Vec3 *pos() const {
return GetStruct<const MyGame::Example::Vec3 *>(VT_POS);
@@ -1313,9 +1384,6 @@
MyGame::Example::Any test_type() const {
return static_cast<MyGame::Example::Any>(GetField<uint8_t>(VT_TEST_TYPE, 0));
}
- bool mutate_test_type(MyGame::Example::Any _test_type) {
- return SetField<uint8_t>(VT_TEST_TYPE, static_cast<uint8_t>(_test_type), 0);
- }
const void *test() const {
return GetPointer<const void *>(VT_TEST);
}
@@ -1547,9 +1615,6 @@
MyGame::Example::AnyUniqueAliases any_unique_type() const {
return static_cast<MyGame::Example::AnyUniqueAliases>(GetField<uint8_t>(VT_ANY_UNIQUE_TYPE, 0));
}
- bool mutate_any_unique_type(MyGame::Example::AnyUniqueAliases _any_unique_type) {
- return SetField<uint8_t>(VT_ANY_UNIQUE_TYPE, static_cast<uint8_t>(_any_unique_type), 0);
- }
const void *any_unique() const {
return GetPointer<const void *>(VT_ANY_UNIQUE);
}
@@ -1569,9 +1634,6 @@
MyGame::Example::AnyAmbiguousAliases any_ambiguous_type() const {
return static_cast<MyGame::Example::AnyAmbiguousAliases>(GetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, 0));
}
- bool mutate_any_ambiguous_type(MyGame::Example::AnyAmbiguousAliases _any_ambiguous_type) {
- return SetField<uint8_t>(VT_ANY_AMBIGUOUS_TYPE, static_cast<uint8_t>(_any_ambiguous_type), 0);
- }
const void *any_ambiguous() const {
return GetPointer<const void *>(VT_ANY_AMBIGUOUS);
}
@@ -1593,6 +1655,21 @@
flatbuffers::Vector<uint8_t> *mutable_vector_of_enums() {
return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_VECTOR_OF_ENUMS);
}
+ MyGame::Example::Race signed_enum() const {
+ return static_cast<MyGame::Example::Race>(GetField<int8_t>(VT_SIGNED_ENUM, -1));
+ }
+ bool mutate_signed_enum(MyGame::Example::Race _signed_enum) {
+ return SetField<int8_t>(VT_SIGNED_ENUM, static_cast<int8_t>(_signed_enum), -1);
+ }
+ const flatbuffers::Vector<uint8_t> *testrequirednestedflatbuffer() const {
+ return GetPointer<const flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
+ }
+ flatbuffers::Vector<uint8_t> *mutable_testrequirednestedflatbuffer() {
+ return GetPointer<flatbuffers::Vector<uint8_t> *>(VT_TESTREQUIREDNESTEDFLATBUFFER);
+ }
+ const MyGame::Example::Monster *testrequirednestedflatbuffer_nested_root() const {
+ return flatbuffers::GetRoot<MyGame::Example::Monster>(testrequirednestedflatbuffer()->Data());
+ }
bool Verify(flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<MyGame::Example::Vec3>(verifier, VT_POS) &&
@@ -1672,6 +1749,9 @@
VerifyAnyAmbiguousAliases(verifier, any_ambiguous(), any_ambiguous_type()) &&
VerifyOffset(verifier, VT_VECTOR_OF_ENUMS) &&
verifier.VerifyVector(vector_of_enums()) &&
+ VerifyField<int8_t>(verifier, VT_SIGNED_ENUM) &&
+ VerifyOffset(verifier, VT_TESTREQUIREDNESTEDFLATBUFFER) &&
+ verifier.VerifyVector(testrequirednestedflatbuffer()) &&
verifier.EndTable();
}
MonsterT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
@@ -1704,6 +1784,7 @@
}
struct MonsterBuilder {
+ typedef Monster Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_pos(const MyGame::Example::Vec3 *pos) {
@@ -1847,11 +1928,16 @@
void add_vector_of_enums(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> vector_of_enums) {
fbb_.AddOffset(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);
}
+ void add_signed_enum(MyGame::Example::Race signed_enum) {
+ fbb_.AddElement<int8_t>(Monster::VT_SIGNED_ENUM, static_cast<int8_t>(signed_enum), -1);
+ }
+ void add_testrequirednestedflatbuffer(flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer) {
+ fbb_.AddOffset(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);
+ }
explicit MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- MonsterBuilder &operator=(const MonsterBuilder &);
flatbuffers::Offset<Monster> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<Monster>(end);
@@ -1908,7 +1994,9 @@
flatbuffers::Offset<void> any_unique = 0,
MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,
flatbuffers::Offset<void> any_ambiguous = 0,
- flatbuffers::Offset<flatbuffers::Vector<uint8_t>> vector_of_enums = 0) {
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> vector_of_enums = 0,
+ MyGame::Example::Race signed_enum = MyGame::Example::Race_None,
+ flatbuffers::Offset<flatbuffers::Vector<uint8_t>> testrequirednestedflatbuffer = 0) {
MonsterBuilder builder_(_fbb);
builder_.add_non_owning_reference(non_owning_reference);
builder_.add_co_owning_reference(co_owning_reference);
@@ -1917,6 +2005,7 @@
builder_.add_testhashs64_fnv1a(testhashs64_fnv1a);
builder_.add_testhashu64_fnv1(testhashu64_fnv1);
builder_.add_testhashs64_fnv1(testhashs64_fnv1);
+ builder_.add_testrequirednestedflatbuffer(testrequirednestedflatbuffer);
builder_.add_vector_of_enums(vector_of_enums);
builder_.add_any_ambiguous(any_ambiguous);
builder_.add_any_unique(any_unique);
@@ -1952,6 +2041,7 @@
builder_.add_pos(pos);
builder_.add_hp(hp);
builder_.add_mana(mana);
+ builder_.add_signed_enum(signed_enum);
builder_.add_any_ambiguous_type(any_ambiguous_type);
builder_.add_any_unique_type(any_unique_type);
builder_.add_testbool(testbool);
@@ -1972,7 +2062,7 @@
flatbuffers::Offset<void> test = 0,
const std::vector<MyGame::Example::Test> *test4 = nullptr,
const std::vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring = nullptr,
- const std::vector<flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,
+ std::vector<flatbuffers::Offset<MyGame::Example::Monster>> *testarrayoftables = nullptr,
flatbuffers::Offset<MyGame::Example::Monster> enemy = 0,
const std::vector<uint8_t> *testnestedflatbuffer = nullptr,
flatbuffers::Offset<MyGame::Example::Stat> testempty = 0,
@@ -1990,16 +2080,16 @@
float testf2 = 3.0f,
float testf3 = 0.0f,
const std::vector<flatbuffers::Offset<flatbuffers::String>> *testarrayofstring2 = nullptr,
- const std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,
+ std::vector<MyGame::Example::Ability> *testarrayofsortedstruct = nullptr,
const std::vector<uint8_t> *flex = nullptr,
const std::vector<MyGame::Example::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,
- const std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,
+ std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_referrables = nullptr,
uint64_t single_weak_reference = 0,
const std::vector<uint64_t> *vector_of_weak_references = nullptr,
- const std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,
+ std::vector<flatbuffers::Offset<MyGame::Example::Referrable>> *vector_of_strong_referrables = nullptr,
uint64_t co_owning_reference = 0,
const std::vector<uint64_t> *vector_of_co_owning_references = nullptr,
uint64_t non_owning_reference = 0,
@@ -2008,26 +2098,29 @@
flatbuffers::Offset<void> any_unique = 0,
MyGame::Example::AnyAmbiguousAliases any_ambiguous_type = MyGame::Example::AnyAmbiguousAliases_NONE,
flatbuffers::Offset<void> any_ambiguous = 0,
- const std::vector<uint8_t> *vector_of_enums = nullptr) {
+ const std::vector<uint8_t> *vector_of_enums = nullptr,
+ MyGame::Example::Race signed_enum = MyGame::Example::Race_None,
+ const std::vector<uint8_t> *testrequirednestedflatbuffer = nullptr) {
auto name__ = name ? _fbb.CreateString(name) : 0;
auto inventory__ = inventory ? _fbb.CreateVector<uint8_t>(*inventory) : 0;
auto test4__ = test4 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test4) : 0;
auto testarrayofstring__ = testarrayofstring ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*testarrayofstring) : 0;
- auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVector<flatbuffers::Offset<MyGame::Example::Monster>>(*testarrayoftables) : 0;
+ auto testarrayoftables__ = testarrayoftables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Monster>(testarrayoftables) : 0;
auto testnestedflatbuffer__ = testnestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testnestedflatbuffer) : 0;
auto testarrayofbools__ = testarrayofbools ? _fbb.CreateVector<uint8_t>(*testarrayofbools) : 0;
auto testarrayofstring2__ = testarrayofstring2 ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*testarrayofstring2) : 0;
- auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfStructs<MyGame::Example::Ability>(*testarrayofsortedstruct) : 0;
+ auto testarrayofsortedstruct__ = testarrayofsortedstruct ? _fbb.CreateVectorOfSortedStructs<MyGame::Example::Ability>(testarrayofsortedstruct) : 0;
auto flex__ = flex ? _fbb.CreateVector<uint8_t>(*flex) : 0;
auto test5__ = test5 ? _fbb.CreateVectorOfStructs<MyGame::Example::Test>(*test5) : 0;
auto vector_of_longs__ = vector_of_longs ? _fbb.CreateVector<int64_t>(*vector_of_longs) : 0;
auto vector_of_doubles__ = vector_of_doubles ? _fbb.CreateVector<double>(*vector_of_doubles) : 0;
- auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVector<flatbuffers::Offset<MyGame::Example::Referrable>>(*vector_of_referrables) : 0;
+ auto vector_of_referrables__ = vector_of_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_referrables) : 0;
auto vector_of_weak_references__ = vector_of_weak_references ? _fbb.CreateVector<uint64_t>(*vector_of_weak_references) : 0;
- auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVector<flatbuffers::Offset<MyGame::Example::Referrable>>(*vector_of_strong_referrables) : 0;
+ auto vector_of_strong_referrables__ = vector_of_strong_referrables ? _fbb.CreateVectorOfSortedTables<MyGame::Example::Referrable>(vector_of_strong_referrables) : 0;
auto vector_of_co_owning_references__ = vector_of_co_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_co_owning_references) : 0;
auto vector_of_non_owning_references__ = vector_of_non_owning_references ? _fbb.CreateVector<uint64_t>(*vector_of_non_owning_references) : 0;
auto vector_of_enums__ = vector_of_enums ? _fbb.CreateVector<uint8_t>(*vector_of_enums) : 0;
+ auto testrequirednestedflatbuffer__ = testrequirednestedflatbuffer ? _fbb.CreateVector<uint8_t>(*testrequirednestedflatbuffer) : 0;
return MyGame::Example::CreateMonster(
_fbb,
pos,
@@ -2076,7 +2169,9 @@
any_unique,
any_ambiguous_type,
any_ambiguous,
- vector_of_enums__);
+ vector_of_enums__,
+ signed_enum,
+ testrequirednestedflatbuffer__);
}
flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
@@ -2132,6 +2227,7 @@
struct TypeAliases FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef TypeAliasesT NativeTableType;
+ typedef TypeAliasesBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TypeAliasesTypeTable();
}
@@ -2245,6 +2341,7 @@
};
struct TypeAliasesBuilder {
+ typedef TypeAliases Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_i8(int8_t i8) {
@@ -2287,7 +2384,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- TypeAliasesBuilder &operator=(const TypeAliasesBuilder &);
flatbuffers::Offset<TypeAliases> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<TypeAliases>(end);
@@ -2362,9 +2458,9 @@
} // namespace Example
inline InParentNamespaceT *InParentNamespace::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new InParentNamespaceT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::InParentNamespaceT> _o = flatbuffers::unique_ptr<MyGame::InParentNamespaceT>(new InParentNamespaceT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void InParentNamespace::UnPackTo(InParentNamespaceT *_o, const flatbuffers::resolver_function_t *_resolver) const {
@@ -2387,9 +2483,9 @@
namespace Example2 {
inline MonsterT *Monster::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new MonsterT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example2::MonsterT> _o = flatbuffers::unique_ptr<MyGame::Example2::MonsterT>(new MonsterT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver) const {
@@ -2414,15 +2510,15 @@
namespace Example {
inline TestSimpleTableWithEnumT *TestSimpleTableWithEnum::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new TestSimpleTableWithEnumT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::TestSimpleTableWithEnumT> _o = flatbuffers::unique_ptr<MyGame::Example::TestSimpleTableWithEnumT>(new TestSimpleTableWithEnumT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void TestSimpleTableWithEnum::UnPackTo(TestSimpleTableWithEnumT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = color(); _o->color = _e; };
+ { auto _e = color(); _o->color = _e; }
}
inline flatbuffers::Offset<TestSimpleTableWithEnum> TestSimpleTableWithEnum::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TestSimpleTableWithEnumT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -2440,17 +2536,17 @@
}
inline StatT *Stat::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new StatT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::StatT> _o = flatbuffers::unique_ptr<MyGame::Example::StatT>(new StatT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Stat::UnPackTo(StatT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = id(); if (_e) _o->id = _e->str(); };
- { auto _e = val(); _o->val = _e; };
- { auto _e = count(); _o->count = _e; };
+ { auto _e = id(); if (_e) _o->id = _e->str(); }
+ { auto _e = val(); _o->val = _e; }
+ { auto _e = count(); _o->count = _e; }
}
inline flatbuffers::Offset<Stat> Stat::Pack(flatbuffers::FlatBufferBuilder &_fbb, const StatT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -2472,15 +2568,15 @@
}
inline ReferrableT *Referrable::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new ReferrableT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::ReferrableT> _o = flatbuffers::unique_ptr<MyGame::Example::ReferrableT>(new ReferrableT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Referrable::UnPackTo(ReferrableT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = id(); _o->id = _e; };
+ { auto _e = id(); _o->id = _e; }
}
inline flatbuffers::Offset<Referrable> Referrable::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReferrableT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -2498,68 +2594,70 @@
}
inline MonsterT *Monster::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new MonsterT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::MonsterT> _o = flatbuffers::unique_ptr<MyGame::Example::MonsterT>(new MonsterT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Monster::UnPackTo(MonsterT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = pos(); if (_e) _o->pos = flatbuffers::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); };
- { auto _e = mana(); _o->mana = _e; };
- { auto _e = hp(); _o->hp = _e; };
- { auto _e = name(); if (_e) _o->name = _e->str(); };
- { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->inventory[_i] = _e->Get(_i); } } };
- { auto _e = color(); _o->color = _e; };
- { auto _e = test_type(); _o->test.type = _e; };
- { auto _e = test(); if (_e) _o->test.value = AnyUnion::UnPack(_e, test_type(), _resolver); };
- { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } };
- { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } };
- { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayoftables[_i] = flatbuffers::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } };
- { auto _e = enemy(); if (_e) _o->enemy = flatbuffers::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); };
- { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testnestedflatbuffer[_i] = _e->Get(_i); } } };
- { auto _e = testempty(); if (_e) _o->testempty = flatbuffers::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); };
- { auto _e = testbool(); _o->testbool = _e; };
- { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; };
- { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; };
- { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; };
- { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; };
- { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; };
+ { auto _e = pos(); if (_e) _o->pos = flatbuffers::unique_ptr<MyGame::Example::Vec3>(new MyGame::Example::Vec3(*_e)); }
+ { auto _e = mana(); _o->mana = _e; }
+ { auto _e = hp(); _o->hp = _e; }
+ { auto _e = name(); if (_e) _o->name = _e->str(); }
+ { auto _e = inventory(); if (_e) { _o->inventory.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->inventory.begin()); } }
+ { auto _e = color(); _o->color = _e; }
+ { auto _e = test_type(); _o->test.type = _e; }
+ { auto _e = test(); if (_e) _o->test.value = MyGame::Example::AnyUnion::UnPack(_e, test_type(), _resolver); }
+ { auto _e = test4(); if (_e) { _o->test4.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->test4[_i] = *_e->Get(_i); } } }
+ { auto _e = testarrayofstring(); if (_e) { _o->testarrayofstring.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofstring[_i] = _e->Get(_i)->str(); } } }
+ { auto _e = testarrayoftables(); if (_e) { _o->testarrayoftables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayoftables[_i] = flatbuffers::unique_ptr<MyGame::Example::MonsterT>(_e->Get(_i)->UnPack(_resolver)); } } }
+ { auto _e = enemy(); if (_e) _o->enemy = flatbuffers::unique_ptr<MyGame::Example::MonsterT>(_e->UnPack(_resolver)); }
+ { auto _e = testnestedflatbuffer(); if (_e) { _o->testnestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testnestedflatbuffer.begin()); } }
+ { auto _e = testempty(); if (_e) _o->testempty = flatbuffers::unique_ptr<MyGame::Example::StatT>(_e->UnPack(_resolver)); }
+ { auto _e = testbool(); _o->testbool = _e; }
+ { auto _e = testhashs32_fnv1(); _o->testhashs32_fnv1 = _e; }
+ { auto _e = testhashu32_fnv1(); _o->testhashu32_fnv1 = _e; }
+ { auto _e = testhashs64_fnv1(); _o->testhashs64_fnv1 = _e; }
+ { auto _e = testhashu64_fnv1(); _o->testhashu64_fnv1 = _e; }
+ { auto _e = testhashs32_fnv1a(); _o->testhashs32_fnv1a = _e; }
{ auto _e = testhashu32_fnv1a(); //scalar resolver, naked
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; };
- { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; };
- { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; };
- { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } };
- { auto _e = testf(); _o->testf = _e; };
- { auto _e = testf2(); _o->testf2 = _e; };
- { auto _e = testf3(); _o->testf3 = _e; };
- { 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); } } };
- { 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<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } };
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->testhashu32_fnv1a), static_cast<flatbuffers::hash_value_t>(_e)); else _o->testhashu32_fnv1a = nullptr; }
+ { auto _e = testhashs64_fnv1a(); _o->testhashs64_fnv1a = _e; }
+ { auto _e = testhashu64_fnv1a(); _o->testhashu64_fnv1a = _e; }
+ { auto _e = testarrayofbools(); if (_e) { _o->testarrayofbools.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->testarrayofbools[_i] = _e->Get(_i) != 0; } } }
+ { auto _e = testf(); _o->testf = _e; }
+ { auto _e = testf2(); _o->testf2 = _e; }
+ { auto _e = testf3(); _o->testf3 = _e; }
+ { 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()); std::copy(_e->begin(), _e->end(), _o->flex.begin()); } }
+ { 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); } } }
+ { 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<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } }
{ auto _e = single_weak_reference(); //scalar resolver, naked
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->single_weak_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->single_weak_reference = nullptr; };
+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++) { //vector resolver, naked
-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; } } };
- { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_strong_referrables[_i] = flatbuffers::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } };
+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; } } }
+ { auto _e = vector_of_strong_referrables(); if (_e) { _o->vector_of_strong_referrables.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_strong_referrables[_i] = flatbuffers::unique_ptr<MyGame::Example::ReferrableT>(_e->Get(_i)->UnPack(_resolver)); } } }
{ auto _e = co_owning_reference(); //scalar resolver, naked
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; };
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->co_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->co_owning_reference = nullptr; }
{ auto _e = vector_of_co_owning_references(); if (_e) { _o->vector_of_co_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, default_ptr_type
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */; } } };
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_co_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i)));/* else do nothing */; } } }
{ auto _e = non_owning_reference(); //scalar resolver, naked
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; };
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->non_owning_reference), static_cast<flatbuffers::hash_value_t>(_e)); else _o->non_owning_reference = nullptr; }
{ auto _e = vector_of_non_owning_references(); if (_e) { _o->vector_of_non_owning_references.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { //vector resolver, naked
-if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } };
- { auto _e = any_unique_type(); _o->any_unique.type = _e; };
- { auto _e = any_unique(); if (_e) _o->any_unique.value = AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); };
- { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; };
- { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); };
- { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } };
+if (_resolver) (*_resolver)(reinterpret_cast<void **>(&_o->vector_of_non_owning_references[_i]), static_cast<flatbuffers::hash_value_t>(_e->Get(_i))); else _o->vector_of_non_owning_references[_i] = nullptr; } } }
+ { auto _e = any_unique_type(); _o->any_unique.type = _e; }
+ { auto _e = any_unique(); if (_e) _o->any_unique.value = MyGame::Example::AnyUniqueAliasesUnion::UnPack(_e, any_unique_type(), _resolver); }
+ { auto _e = any_ambiguous_type(); _o->any_ambiguous.type = _e; }
+ { auto _e = any_ambiguous(); if (_e) _o->any_ambiguous.value = MyGame::Example::AnyAmbiguousAliasesUnion::UnPack(_e, any_ambiguous_type(), _resolver); }
+ { auto _e = vector_of_enums(); if (_e) { _o->vector_of_enums.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vector_of_enums[_i] = static_cast<MyGame::Example::Color>(_e->Get(_i)); } } }
+ { auto _e = signed_enum(); _o->signed_enum = _e; }
+ { auto _e = testrequirednestedflatbuffer(); if (_e) { _o->testrequirednestedflatbuffer.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->testrequirednestedflatbuffer.begin()); } }
}
inline flatbuffers::Offset<Monster> Monster::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MonsterT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -2617,6 +2715,8 @@
auto _any_ambiguous_type = _o->any_ambiguous.type;
auto _any_ambiguous = _o->any_ambiguous.Pack(_fbb);
auto _vector_of_enums = _o->vector_of_enums.size() ? _fbb.CreateVectorScalarCast<uint8_t>(flatbuffers::data(_o->vector_of_enums), _o->vector_of_enums.size()) : 0;
+ auto _signed_enum = _o->signed_enum;
+ auto _testrequirednestedflatbuffer = _o->testrequirednestedflatbuffer.size() ? _fbb.CreateVector(_o->testrequirednestedflatbuffer) : 0;
return MyGame::Example::CreateMonster(
_fbb,
_pos,
@@ -2665,30 +2765,32 @@
_any_unique,
_any_ambiguous_type,
_any_ambiguous,
- _vector_of_enums);
+ _vector_of_enums,
+ _signed_enum,
+ _testrequirednestedflatbuffer);
}
inline TypeAliasesT *TypeAliases::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new TypeAliasesT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MyGame::Example::TypeAliasesT> _o = flatbuffers::unique_ptr<MyGame::Example::TypeAliasesT>(new TypeAliasesT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void TypeAliases::UnPackTo(TypeAliasesT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = i8(); _o->i8 = _e; };
- { auto _e = u8(); _o->u8 = _e; };
- { auto _e = i16(); _o->i16 = _e; };
- { auto _e = u16(); _o->u16 = _e; };
- { auto _e = i32(); _o->i32 = _e; };
- { auto _e = u32(); _o->u32 = _e; };
- { auto _e = i64(); _o->i64 = _e; };
- { auto _e = u64(); _o->u64 = _e; };
- { auto _e = f32(); _o->f32 = _e; };
- { auto _e = f64(); _o->f64 = _e; };
- { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->v8[_i] = _e->Get(_i); } } };
- { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } };
+ { auto _e = i8(); _o->i8 = _e; }
+ { auto _e = u8(); _o->u8 = _e; }
+ { auto _e = i16(); _o->i16 = _e; }
+ { auto _e = u16(); _o->u16 = _e; }
+ { auto _e = i32(); _o->i32 = _e; }
+ { auto _e = u32(); _o->u32 = _e; }
+ { auto _e = i64(); _o->i64 = _e; }
+ { auto _e = u64(); _o->u64 = _e; }
+ { auto _e = f32(); _o->f32 = _e; }
+ { auto _e = f64(); _o->f64 = _e; }
+ { auto _e = v8(); if (_e) { _o->v8.resize(_e->size()); std::copy(_e->begin(), _e->end(), _o->v8.begin()); } }
+ { auto _e = vf64(); if (_e) { _o->vf64.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vf64[_i] = _e->Get(_i); } } }
}
inline flatbuffers::Offset<TypeAliases> TypeAliases::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TypeAliasesT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -2744,7 +2846,7 @@
auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
return verifier.VerifyTable(ptr);
}
- default: return false;
+ default: return true;
}
}
@@ -2796,7 +2898,7 @@
}
}
-inline AnyUnion::AnyUnion(const AnyUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) {
+inline AnyUnion::AnyUnion(const AnyUnion &u) : type(u.type), value(nullptr) {
switch (type) {
case Any_Monster: {
FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
@@ -2855,7 +2957,7 @@
auto ptr = reinterpret_cast<const MyGame::Example2::Monster *>(obj);
return verifier.VerifyTable(ptr);
}
- default: return false;
+ default: return true;
}
}
@@ -2907,7 +3009,7 @@
}
}
-inline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) {
+inline AnyUniqueAliasesUnion::AnyUniqueAliasesUnion(const AnyUniqueAliasesUnion &u) : type(u.type), value(nullptr) {
switch (type) {
case AnyUniqueAliases_M: {
FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
@@ -2966,7 +3068,7 @@
auto ptr = reinterpret_cast<const MyGame::Example::Monster *>(obj);
return verifier.VerifyTable(ptr);
}
- default: return false;
+ default: return true;
}
}
@@ -3018,7 +3120,7 @@
}
}
-inline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) {
+inline AnyAmbiguousAliasesUnion::AnyAmbiguousAliasesUnion(const AnyAmbiguousAliasesUnion &u) : type(u.type), value(nullptr) {
switch (type) {
case AnyAmbiguousAliases_M1: {
FLATBUFFERS_ASSERT(false); // MyGame::Example::MonsterT not copyable.
@@ -3076,7 +3178,30 @@
"Blue"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_ENUM, 3, type_codes, type_refs, values, names
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, values, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *RaceTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ MyGame::Example::RaceTypeTable
+ };
+ static const int64_t values[] = { -1, 0, 1, 2 };
+ static const char * const names[] = {
+ "None",
+ "Human",
+ "Dwarf",
+ "Elf"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 4, type_codes, type_refs, nullptr, values, names
};
return &tt;
}
@@ -3100,7 +3225,7 @@
"MyGame_Example2_Monster"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -3124,7 +3249,7 @@
"M2"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -3146,7 +3271,7 @@
"M3"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_UNION, 4, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -3155,7 +3280,7 @@
inline const flatbuffers::TypeTable *InParentNamespaceTypeTable() {
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr
+ flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
};
return &tt;
}
@@ -3164,7 +3289,7 @@
inline const flatbuffers::TypeTable *MonsterTypeTable() {
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr
+ flatbuffers::ST_TABLE, 0, nullptr, nullptr, nullptr, nullptr, nullptr
};
return &tt;
}
@@ -3184,7 +3309,7 @@
"b"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
@@ -3200,7 +3325,7 @@
"color"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -3228,7 +3353,7 @@
"test3"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 6, type_codes, type_refs, values, names
+ flatbuffers::ST_STRUCT, 6, type_codes, type_refs, nullptr, values, names
};
return &tt;
}
@@ -3244,7 +3369,7 @@
"distance"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
@@ -3261,7 +3386,7 @@
"count"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 3, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
@@ -3274,7 +3399,7 @@
"id"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
@@ -3328,7 +3453,9 @@
{ flatbuffers::ET_SEQUENCE, 0, 9 },
{ flatbuffers::ET_UTYPE, 0, 10 },
{ flatbuffers::ET_SEQUENCE, 0, 10 },
- { flatbuffers::ET_UCHAR, 1, 1 }
+ { flatbuffers::ET_UCHAR, 1, 1 },
+ { flatbuffers::ET_CHAR, 0, 11 },
+ { flatbuffers::ET_UCHAR, 1, -1 }
};
static const flatbuffers::TypeFunction type_refs[] = {
MyGame::Example::Vec3TypeTable,
@@ -3341,7 +3468,8 @@
MyGame::InParentNamespaceTypeTable,
MyGame::Example::ReferrableTypeTable,
MyGame::Example::AnyUniqueAliasesTypeTable,
- MyGame::Example::AnyAmbiguousAliasesTypeTable
+ MyGame::Example::AnyAmbiguousAliasesTypeTable,
+ MyGame::Example::RaceTypeTable
};
static const char * const names[] = {
"pos",
@@ -3391,10 +3519,12 @@
"any_unique",
"any_ambiguous_type",
"any_ambiguous",
- "vector_of_enums"
+ "vector_of_enums",
+ "signed_enum",
+ "testrequirednestedflatbuffer"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 48, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 50, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -3429,7 +3559,7 @@
"vf64"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 12, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js
index 2a68288..a2abec7 100644
--- a/tests/monster_test_generated.js
+++ b/tests/monster_test_generated.js
@@ -50,18 +50,38 @@
* @enum {string}
*/
MyGame.Example.ColorName = {
- 1: 'Red',
+ '1': 'Red',
/**
* \brief color Green
* Green is bit_flag with value (1u << 1)
*/
- 2: 'Green',
+ '2': 'Green',
/**
* \brief color Blue (1u << 3)
*/
- 8: 'Blue'
+ '8': 'Blue'
+};
+
+/**
+ * @enum {number}
+ */
+MyGame.Example.Race = {
+ None: -1,
+ Human: 0,
+ Dwarf: 1,
+ Elf: 2
+};
+
+/**
+ * @enum {string}
+ */
+MyGame.Example.RaceName = {
+ '-1': 'None',
+ '0': 'Human',
+ '1': 'Dwarf',
+ '2': 'Elf'
};
/**
@@ -78,10 +98,10 @@
* @enum {string}
*/
MyGame.Example.AnyName = {
- 0: 'NONE',
- 1: 'Monster',
- 2: 'TestSimpleTableWithEnum',
- 3: 'MyGame_Example2_Monster'
+ '0': 'NONE',
+ '1': 'Monster',
+ '2': 'TestSimpleTableWithEnum',
+ '3': 'MyGame_Example2_Monster'
};
/**
@@ -98,10 +118,10 @@
* @enum {string}
*/
MyGame.Example.AnyUniqueAliasesName = {
- 0: 'NONE',
- 1: 'M',
- 2: 'TS',
- 3: 'M2'
+ '0': 'NONE',
+ '1': 'M',
+ '2': 'TS',
+ '3': 'M2'
};
/**
@@ -118,10 +138,10 @@
* @enum {string}
*/
MyGame.Example.AnyAmbiguousAliasesName = {
- 0: 'NONE',
- 1: 'M1',
- 2: 'M2',
- 3: 'M3'
+ '0': 'NONE',
+ '1': 'M1',
+ '2': 'M2',
+ '3': 'M3'
};
/**
@@ -165,6 +185,7 @@
* @returns {MyGame.InParentNamespace}
*/
MyGame.InParentNamespace.getSizePrefixedRootAsInParentNamespace = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.InParentNamespace).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -234,6 +255,7 @@
* @returns {MyGame.Example2.Monster}
*/
MyGame.Example2.Monster.getSizePrefixedRootAsMonster = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example2.Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -300,13 +322,7 @@
* @returns {boolean}
*/
MyGame.Example.Test.prototype.mutate_a = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt16(this.bb_pos + offset, value);
+ this.bb.writeInt16(this.bb_pos + 0, value);
return true;
};
@@ -322,17 +338,18 @@
* @returns {boolean}
*/
MyGame.Example.Test.prototype.mutate_b = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 2);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt8(this.bb_pos + offset, value);
+ this.bb.writeInt8(this.bb_pos + 2, value);
return true;
};
/**
+ * @returns {number}
+ */
+MyGame.Example.Test.sizeOf = function() {
+ return 4;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} a
* @param {number} b
@@ -387,6 +404,7 @@
* @returns {MyGame.Example.TestSimpleTableWithEnum}
*/
MyGame.Example.TestSimpleTableWithEnum.getSizePrefixedRootAsTestSimpleTableWithEnum = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example.TestSimpleTableWithEnum).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -486,13 +504,7 @@
* @returns {boolean}
*/
MyGame.Example.Vec3.prototype.mutate_x = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeFloat32(this.bb_pos + offset, value);
+ this.bb.writeFloat32(this.bb_pos + 0, value);
return true;
};
@@ -508,13 +520,7 @@
* @returns {boolean}
*/
MyGame.Example.Vec3.prototype.mutate_y = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeFloat32(this.bb_pos + offset, value);
+ this.bb.writeFloat32(this.bb_pos + 4, value);
return true;
};
@@ -530,13 +536,7 @@
* @returns {boolean}
*/
MyGame.Example.Vec3.prototype.mutate_z = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 8);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeFloat32(this.bb_pos + offset, value);
+ this.bb.writeFloat32(this.bb_pos + 8, value);
return true;
};
@@ -552,13 +552,7 @@
* @returns {boolean}
*/
MyGame.Example.Vec3.prototype.mutate_test1 = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 16);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeFloat64(this.bb_pos + offset, value);
+ this.bb.writeFloat64(this.bb_pos + 16, value);
return true;
};
@@ -574,13 +568,7 @@
* @returns {boolean}
*/
MyGame.Example.Vec3.prototype.mutate_test2 = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 24);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint8(this.bb_pos + offset, value);
+ this.bb.writeUint8(this.bb_pos + 24, value);
return true;
};
@@ -593,6 +581,13 @@
};
/**
+ * @returns {number}
+ */
+MyGame.Example.Vec3.sizeOf = function() {
+ return 32;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} x
* @param {number} y
@@ -658,13 +653,7 @@
* @returns {boolean}
*/
MyGame.Example.Ability.prototype.mutate_id = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint32(this.bb_pos + offset, value);
+ this.bb.writeUint32(this.bb_pos + 0, value);
return true;
};
@@ -680,17 +669,18 @@
* @returns {boolean}
*/
MyGame.Example.Ability.prototype.mutate_distance = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint32(this.bb_pos + offset, value);
+ this.bb.writeUint32(this.bb_pos + 4, value);
return true;
};
/**
+ * @returns {number}
+ */
+MyGame.Example.Ability.sizeOf = function() {
+ return 8;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} id
* @param {number} distance
@@ -744,6 +734,7 @@
* @returns {MyGame.Example.Stat}
*/
MyGame.Example.Stat.getSizePrefixedRootAsStat = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example.Stat).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -898,6 +889,7 @@
* @returns {MyGame.Example.Referrable}
*/
MyGame.Example.Referrable.getSizePrefixedRootAsReferrable = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example.Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -960,7 +952,7 @@
}
/**
- * an example documentation comment: monster object
+ * an example documentation comment: "monster object"
*
* @constructor
*/
@@ -1002,6 +994,7 @@
* @returns {MyGame.Example.Monster}
*/
MyGame.Example.Monster.getSizePrefixedRootAsMonster = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example.Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -1134,21 +1127,6 @@
};
/**
- * @param {MyGame.Example.Any} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_test_type = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 18);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param {flatbuffers.Table} obj
* @returns {?flatbuffers.Table}
*/
@@ -1853,21 +1831,6 @@
};
/**
- * @param {MyGame.Example.AnyUniqueAliases} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_any_unique_type = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 90);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param {flatbuffers.Table} obj
* @returns {?flatbuffers.Table}
*/
@@ -1885,21 +1848,6 @@
};
/**
- * @param {MyGame.Example.AnyAmbiguousAliases} value
- * @returns {boolean}
- */
-MyGame.Example.Monster.prototype.mutate_any_ambiguous_type = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 94);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param {flatbuffers.Table} obj
* @returns {?flatbuffers.Table}
*/
@@ -1934,10 +1882,58 @@
};
/**
+ * @returns {MyGame.Example.Race}
+ */
+MyGame.Example.Monster.prototype.signedEnum = function() {
+ var offset = this.bb.__offset(this.bb_pos, 100);
+ return offset ? /** @type {MyGame.Example.Race} */ (this.bb.readInt8(this.bb_pos + offset)) : MyGame.Example.Race.None;
+};
+
+/**
+ * @param {MyGame.Example.Race} value
+ * @returns {boolean}
+ */
+MyGame.Example.Monster.prototype.mutate_signed_enum = function(value) {
+ var offset = this.bb.__offset(this.bb_pos, 100);
+
+ if (offset === 0) {
+ return false;
+ }
+
+ this.bb.writeInt8(this.bb_pos + offset, value);
+ return true;
+};
+
+/**
+ * @param {number} index
+ * @returns {number}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbuffer = function(index) {
+ var offset = this.bb.__offset(this.bb_pos, 102);
+ return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;
+};
+
+/**
+ * @returns {number}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbufferLength = function() {
+ var offset = this.bb.__offset(this.bb_pos, 102);
+ return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {Uint8Array}
+ */
+MyGame.Example.Monster.prototype.testrequirednestedflatbufferArray = function() {
+ var offset = this.bb.__offset(this.bb_pos, 102);
+ 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 {flatbuffers.Builder} builder
*/
MyGame.Example.Monster.startMonster = function(builder) {
- builder.startObject(48);
+ builder.startObject(50);
};
/**
@@ -2657,6 +2653,43 @@
/**
* @param {flatbuffers.Builder} builder
+ * @param {MyGame.Example.Race} signedEnum
+ */
+MyGame.Example.Monster.addSignedEnum = function(builder, signedEnum) {
+ builder.addFieldInt8(48, signedEnum, MyGame.Example.Race.None);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Offset} testrequirednestedflatbufferOffset
+ */
+MyGame.Example.Monster.addTestrequirednestedflatbuffer = function(builder, testrequirednestedflatbufferOffset) {
+ builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {Array.<number>} data
+ * @returns {flatbuffers.Offset}
+ */
+MyGame.Example.Monster.createTestrequirednestedflatbufferVector = function(builder, data) {
+ builder.startVector(1, data.length, 1);
+ for (var i = data.length - 1; i >= 0; i--) {
+ builder.addInt8(data[i]);
+ }
+ return builder.endVector();
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} numElems
+ */
+MyGame.Example.Monster.startTestrequirednestedflatbufferVector = function(builder, numElems) {
+ builder.startVector(1, numElems, 1);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
* @returns {flatbuffers.Offset}
*/
MyGame.Example.Monster.endMonster = function(builder) {
@@ -2682,109 +2715,6 @@
};
/**
- * @param {flatbuffers.Builder} builder
- * @param {flatbuffers.Offset} posOffset
- * @param {number} mana
- * @param {number} hp
- * @param {flatbuffers.Offset} nameOffset
- * @param {flatbuffers.Offset} inventoryOffset
- * @param {MyGame.Example.Color} color
- * @param {MyGame.Example.Any} testType
- * @param {flatbuffers.Offset} testOffset
- * @param {flatbuffers.Offset} test4Offset
- * @param {flatbuffers.Offset} testarrayofstringOffset
- * @param {flatbuffers.Offset} testarrayoftablesOffset
- * @param {flatbuffers.Offset} enemyOffset
- * @param {flatbuffers.Offset} testnestedflatbufferOffset
- * @param {flatbuffers.Offset} testemptyOffset
- * @param {boolean} testbool
- * @param {number} testhashs32Fnv1
- * @param {number} testhashu32Fnv1
- * @param {flatbuffers.Long} testhashs64Fnv1
- * @param {flatbuffers.Long} testhashu64Fnv1
- * @param {number} testhashs32Fnv1a
- * @param {number} testhashu32Fnv1a
- * @param {flatbuffers.Long} testhashs64Fnv1a
- * @param {flatbuffers.Long} testhashu64Fnv1a
- * @param {flatbuffers.Offset} testarrayofboolsOffset
- * @param {number} testf
- * @param {number} testf2
- * @param {number} testf3
- * @param {flatbuffers.Offset} testarrayofstring2Offset
- * @param {flatbuffers.Offset} testarrayofsortedstructOffset
- * @param {flatbuffers.Offset} flexOffset
- * @param {flatbuffers.Offset} test5Offset
- * @param {flatbuffers.Offset} vectorOfLongsOffset
- * @param {flatbuffers.Offset} vectorOfDoublesOffset
- * @param {flatbuffers.Offset} parentNamespaceTestOffset
- * @param {flatbuffers.Offset} vectorOfReferrablesOffset
- * @param {flatbuffers.Long} singleWeakReference
- * @param {flatbuffers.Offset} vectorOfWeakReferencesOffset
- * @param {flatbuffers.Offset} vectorOfStrongReferrablesOffset
- * @param {flatbuffers.Long} coOwningReference
- * @param {flatbuffers.Offset} vectorOfCoOwningReferencesOffset
- * @param {flatbuffers.Long} nonOwningReference
- * @param {flatbuffers.Offset} vectorOfNonOwningReferencesOffset
- * @param {MyGame.Example.AnyUniqueAliases} anyUniqueType
- * @param {flatbuffers.Offset} anyUniqueOffset
- * @param {MyGame.Example.AnyAmbiguousAliases} anyAmbiguousType
- * @param {flatbuffers.Offset} anyAmbiguousOffset
- * @param {flatbuffers.Offset} vectorOfEnumsOffset
- * @returns {flatbuffers.Offset}
- */
-MyGame.Example.Monster.createMonster = function(builder, posOffset, mana, hp, nameOffset, inventoryOffset, color, testType, testOffset, test4Offset, testarrayofstringOffset, testarrayoftablesOffset, enemyOffset, testnestedflatbufferOffset, testemptyOffset, testbool, testhashs32Fnv1, testhashu32Fnv1, testhashs64Fnv1, testhashu64Fnv1, testhashs32Fnv1a, testhashu32Fnv1a, testhashs64Fnv1a, testhashu64Fnv1a, testarrayofboolsOffset, testf, testf2, testf3, testarrayofstring2Offset, testarrayofsortedstructOffset, flexOffset, test5Offset, vectorOfLongsOffset, vectorOfDoublesOffset, parentNamespaceTestOffset, vectorOfReferrablesOffset, singleWeakReference, vectorOfWeakReferencesOffset, vectorOfStrongReferrablesOffset, coOwningReference, vectorOfCoOwningReferencesOffset, nonOwningReference, vectorOfNonOwningReferencesOffset, anyUniqueType, anyUniqueOffset, anyAmbiguousType, anyAmbiguousOffset, vectorOfEnumsOffset) {
- MyGame.Example.Monster.startMonster(builder);
- MyGame.Example.Monster.addPos(builder, posOffset);
- MyGame.Example.Monster.addMana(builder, mana);
- MyGame.Example.Monster.addHp(builder, hp);
- MyGame.Example.Monster.addName(builder, nameOffset);
- MyGame.Example.Monster.addInventory(builder, inventoryOffset);
- MyGame.Example.Monster.addColor(builder, color);
- MyGame.Example.Monster.addTestType(builder, testType);
- MyGame.Example.Monster.addTest(builder, testOffset);
- MyGame.Example.Monster.addTest4(builder, test4Offset);
- MyGame.Example.Monster.addTestarrayofstring(builder, testarrayofstringOffset);
- MyGame.Example.Monster.addTestarrayoftables(builder, testarrayoftablesOffset);
- MyGame.Example.Monster.addEnemy(builder, enemyOffset);
- MyGame.Example.Monster.addTestnestedflatbuffer(builder, testnestedflatbufferOffset);
- MyGame.Example.Monster.addTestempty(builder, testemptyOffset);
- MyGame.Example.Monster.addTestbool(builder, testbool);
- MyGame.Example.Monster.addTesthashs32Fnv1(builder, testhashs32Fnv1);
- MyGame.Example.Monster.addTesthashu32Fnv1(builder, testhashu32Fnv1);
- MyGame.Example.Monster.addTesthashs64Fnv1(builder, testhashs64Fnv1);
- MyGame.Example.Monster.addTesthashu64Fnv1(builder, testhashu64Fnv1);
- MyGame.Example.Monster.addTesthashs32Fnv1a(builder, testhashs32Fnv1a);
- MyGame.Example.Monster.addTesthashu32Fnv1a(builder, testhashu32Fnv1a);
- MyGame.Example.Monster.addTesthashs64Fnv1a(builder, testhashs64Fnv1a);
- MyGame.Example.Monster.addTesthashu64Fnv1a(builder, testhashu64Fnv1a);
- MyGame.Example.Monster.addTestarrayofbools(builder, testarrayofboolsOffset);
- MyGame.Example.Monster.addTestf(builder, testf);
- MyGame.Example.Monster.addTestf2(builder, testf2);
- MyGame.Example.Monster.addTestf3(builder, testf3);
- MyGame.Example.Monster.addTestarrayofstring2(builder, testarrayofstring2Offset);
- MyGame.Example.Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstructOffset);
- MyGame.Example.Monster.addFlex(builder, flexOffset);
- MyGame.Example.Monster.addTest5(builder, test5Offset);
- MyGame.Example.Monster.addVectorOfLongs(builder, vectorOfLongsOffset);
- MyGame.Example.Monster.addVectorOfDoubles(builder, vectorOfDoublesOffset);
- MyGame.Example.Monster.addParentNamespaceTest(builder, parentNamespaceTestOffset);
- MyGame.Example.Monster.addVectorOfReferrables(builder, vectorOfReferrablesOffset);
- MyGame.Example.Monster.addSingleWeakReference(builder, singleWeakReference);
- MyGame.Example.Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset);
- MyGame.Example.Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset);
- MyGame.Example.Monster.addCoOwningReference(builder, coOwningReference);
- MyGame.Example.Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset);
- MyGame.Example.Monster.addNonOwningReference(builder, nonOwningReference);
- MyGame.Example.Monster.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset);
- MyGame.Example.Monster.addAnyUniqueType(builder, anyUniqueType);
- MyGame.Example.Monster.addAnyUnique(builder, anyUniqueOffset);
- MyGame.Example.Monster.addAnyAmbiguousType(builder, anyAmbiguousType);
- MyGame.Example.Monster.addAnyAmbiguous(builder, anyAmbiguousOffset);
- MyGame.Example.Monster.addVectorOfEnums(builder, vectorOfEnumsOffset);
- return MyGame.Example.Monster.endMonster(builder);
-}
-
-/**
* @constructor
*/
MyGame.Example.TypeAliases = function() {
@@ -2825,6 +2755,7 @@
* @returns {MyGame.Example.TypeAliases}
*/
MyGame.Example.TypeAliases.getSizePrefixedRootAsTypeAliases = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new MyGame.Example.TypeAliases).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
diff --git a/tests/monster_test_generated.lobster b/tests/monster_test_generated.lobster
index 05e9cbe..3a0d371 100644
--- a/tests/monster_test_generated.lobster
+++ b/tests/monster_test_generated.lobster
@@ -12,6 +12,12 @@
/// \brief color Blue (1u << 3)
Color_Blue = 8
+enum Race:
+ Race_None = -1
+ Race_Human = 0
+ Race_Dwarf = 1
+ Race_Elf = 2
+
enum Any:
Any_NONE = 0
Any_Monster = 1
@@ -202,7 +208,7 @@
def end():
return b_.EndObject()
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
class Monster : flatbuffers_handle
def pos():
let o = buf_.flatbuffers_field_struct(pos_, 4)
@@ -352,13 +358,19 @@
return buf_.read_int8_le(buf_.flatbuffers_field_vector(pos_, 98) + i * 1)
def vector_of_enums_length():
return buf_.flatbuffers_field_vector_len(pos_, 98)
+ def signed_enum():
+ return Race(buf_.flatbuffers_field_int8(pos_, 100, -1))
+ def testrequirednestedflatbuffer(i:int):
+ return buf_.read_int8_le(buf_.flatbuffers_field_vector(pos_, 102) + i * 1)
+ def testrequirednestedflatbuffer_length():
+ return buf_.flatbuffers_field_vector_len(pos_, 102)
def GetRootAsMonster(buf:string): return Monster { buf, buf.flatbuffers_indirect(0) }
struct MonsterBuilder:
b_:flatbuffers_builder
def start():
- b_.StartObject(48)
+ b_.StartObject(50)
return this
def add_pos(pos:flatbuffers_offset):
b_.PrependStructSlot(0, pos)
@@ -501,6 +513,12 @@
def add_vector_of_enums(vector_of_enums:flatbuffers_offset):
b_.PrependUOffsetTRelativeSlot(47, vector_of_enums)
return this
+ def add_signed_enum(signed_enum:Race):
+ b_.PrependInt8Slot(48, signed_enum, -1)
+ return this
+ def add_testrequirednestedflatbuffer(testrequirednestedflatbuffer:flatbuffers_offset):
+ b_.PrependUOffsetTRelativeSlot(49, testrequirednestedflatbuffer)
+ return this
def end():
return b_.EndObject()
@@ -618,6 +636,13 @@
reverse(v_) e_: b_.PrependUint8(e_)
return b_.EndVector(v_.length)
+def MonsterStartTestrequirednestedflatbufferVector(b_:flatbuffers_builder, n_:int):
+ b_.StartVector(1, n_, 1)
+def MonsterCreateTestrequirednestedflatbufferVector(b_:flatbuffers_builder, v_:[int]):
+ b_.StartVector(1, v_.length, 1)
+ reverse(v_) e_: b_.PrependUint8(e_)
+ return b_.EndVector(v_.length)
+
class TypeAliases : flatbuffers_handle
def i8():
return buf_.flatbuffers_field_int8(pos_, 4, 0)
diff --git a/tests/monster_test_generated.rs b/tests/monster_test_generated.rs
index 59bbf37..e653933 100644
--- a/tests/monster_test_generated.rs
+++ b/tests/monster_test_generated.rs
@@ -1,7 +1,10 @@
// automatically generated by the FlatBuffers compiler, do not modify
+#![allow(unused_imports, dead_code)]
+use crate::include_test1_generated::*;
+use crate::include_test2_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -11,6 +14,8 @@
#[allow(unused_imports, dead_code)]
pub mod my_game {
+ use crate::include_test1_generated::*;
+ use crate::include_test2_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -18,7 +23,7 @@
use self::flatbuffers::EndianScalar;
pub enum InParentNamespaceOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct InParentNamespace<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -28,13 +33,15 @@
type Inner = InParentNamespace<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> InParentNamespace<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.InParentNamespace"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
InParentNamespace {
@@ -80,9 +87,17 @@
}
}
+impl std::fmt::Debug for InParentNamespace<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("InParentNamespace");
+ ds.finish()
+ }
+}
#[allow(unused_imports, dead_code)]
pub mod example_2 {
+ use crate::include_test1_generated::*;
+ use crate::include_test2_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -90,7 +105,7 @@
use self::flatbuffers::EndianScalar;
pub enum MonsterOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct Monster<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -100,13 +115,15 @@
type Inner = Monster<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> Monster<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example2.Monster"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
Monster {
@@ -152,54 +169,47 @@
}
}
+impl std::fmt::Debug for Monster<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("Monster");
+ ds.finish()
+ }
+}
} // pub mod Example2
#[allow(unused_imports, dead_code)]
pub mod example {
+ use crate::include_test1_generated::*;
+ use crate::include_test2_generated::*;
use std::mem;
use std::cmp::Ordering;
extern crate flatbuffers;
use self::flatbuffers::EndianScalar;
-/// Composite components of Monster color.
-#[allow(non_camel_case_types)]
-#[repr(u8)]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
-pub enum Color {
- Red = 1,
- /// \brief color Green
- /// Green is bit_flag with value (1u << 1)
- Green = 2,
- /// \brief color Blue (1u << 3)
- Blue = 8,
-
+#[allow(non_upper_case_globals)]
+mod bitflags_color {
+ flatbuffers::bitflags::bitflags! {
+ /// Composite components of Monster color.
+ pub struct Color: u8 {
+ const Red = 1;
+ /// \brief color Green
+ /// Green is bit_flag with value (1u << 1)
+ const Green = 2;
+ /// \brief color Blue (1u << 3)
+ const Blue = 8;
+ }
+ }
}
-
-const ENUM_MIN_COLOR: u8 = 1;
-const ENUM_MAX_COLOR: u8 = 8;
+pub use self::bitflags_color::Color;
impl<'a> flatbuffers::Follow<'a> for Color {
type Inner = Self;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- flatbuffers::read_scalar_at::<Self>(buf, loc)
- }
-}
-
-impl flatbuffers::EndianScalar for Color {
- #[inline]
- fn to_little_endian(self) -> Self {
- let n = u8::to_le(self as u8);
- let p = &n as *const u8 as *const Color;
- unsafe { *p }
- }
- #[inline]
- fn from_little_endian(self) -> Self {
- let n = u8::from_le(self as u8);
- let p = &n as *const u8 as *const Color;
- unsafe { *p }
+ let bits = flatbuffers::read_scalar_at::<u8>(buf, loc);
+ unsafe { Self::from_bits_unchecked(bits) }
}
}
@@ -207,68 +217,157 @@
type Output = Color;
#[inline]
fn push(&self, dst: &mut [u8], _rest: &[u8]) {
- flatbuffers::emplace_scalar::<Color>(dst, *self);
+ flatbuffers::emplace_scalar::<u8>(dst, self.bits());
}
}
-#[allow(non_camel_case_types)]
-const ENUM_VALUES_COLOR:[Color; 3] = [
- Color::Red,
- Color::Green,
- Color::Blue
-];
-
-#[allow(non_camel_case_types)]
-const ENUM_NAMES_COLOR:[&'static str; 8] = [
- "Red",
- "Green",
- "",
- "",
- "",
- "",
- "",
- "Blue"
-];
-
-pub fn enum_name_color(e: Color) -> &'static str {
- let index = e as u8 - Color::Red as u8;
- ENUM_NAMES_COLOR[index as usize]
+impl flatbuffers::EndianScalar for Color {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ let bits = u8::to_le(self.bits());
+ unsafe { Self::from_bits_unchecked(bits) }
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ let bits = u8::from_le(self.bits());
+ unsafe { Self::from_bits_unchecked(bits) }
+ }
}
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_RACE: i8 = -1;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_RACE: i8 = 2;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)]
-#[repr(u8)]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
-pub enum Any {
- NONE = 0,
- Monster = 1,
- TestSimpleTableWithEnum = 2,
- MyGame_Example2_Monster = 3,
+pub const ENUM_VALUES_RACE: [Race; 4] = [
+ Race::None,
+ Race::Human,
+ Race::Dwarf,
+ Race::Elf,
+];
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct Race(pub i8);
+#[allow(non_upper_case_globals)]
+impl Race {
+ pub const None: Self = Self(-1);
+ pub const Human: Self = Self(0);
+ pub const Dwarf: Self = Self(1);
+ pub const Elf: Self = Self(2);
+
+ pub const ENUM_MIN: i8 = -1;
+ pub const ENUM_MAX: i8 = 2;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::None,
+ Self::Human,
+ Self::Dwarf,
+ Self::Elf,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::None => Some("None"),
+ Self::Human => Some("Human"),
+ Self::Dwarf => Some("Dwarf"),
+ Self::Elf => Some("Elf"),
+ _ => None,
+ }
+ }
+}
+impl std::fmt::Debug for Race {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
+impl<'a> flatbuffers::Follow<'a> for Race {
+ type Inner = Self;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
+ }
}
-const ENUM_MIN_ANY: u8 = 0;
-const ENUM_MAX_ANY: u8 = 3;
+impl flatbuffers::Push for Race {
+ type Output = Race;
+ #[inline]
+ fn push(&self, dst: &mut [u8], _rest: &[u8]) {
+ flatbuffers::emplace_scalar::<i8>(dst, self.0);
+ }
+}
+impl flatbuffers::EndianScalar for Race {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(i8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(i8::from_le(self.0))
+ }
+}
+
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_ANY: u8 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_ANY: u8 = 3;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+#[allow(non_camel_case_types)]
+pub const ENUM_VALUES_ANY: [Any; 4] = [
+ Any::NONE,
+ Any::Monster,
+ Any::TestSimpleTableWithEnum,
+ Any::MyGame_Example2_Monster,
+];
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct Any(pub u8);
+#[allow(non_upper_case_globals)]
+impl Any {
+ pub const NONE: Self = Self(0);
+ pub const Monster: Self = Self(1);
+ pub const TestSimpleTableWithEnum: Self = Self(2);
+ pub const MyGame_Example2_Monster: Self = Self(3);
+
+ pub const ENUM_MIN: u8 = 0;
+ pub const ENUM_MAX: u8 = 3;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::NONE,
+ Self::Monster,
+ Self::TestSimpleTableWithEnum,
+ Self::MyGame_Example2_Monster,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::NONE => Some("NONE"),
+ Self::Monster => Some("Monster"),
+ Self::TestSimpleTableWithEnum => Some("TestSimpleTableWithEnum"),
+ Self::MyGame_Example2_Monster => Some("MyGame_Example2_Monster"),
+ _ => None,
+ }
+ }
+}
+impl std::fmt::Debug for Any {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
impl<'a> flatbuffers::Follow<'a> for Any {
type Inner = Self;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- flatbuffers::read_scalar_at::<Self>(buf, loc)
- }
-}
-
-impl flatbuffers::EndianScalar for Any {
- #[inline]
- fn to_little_endian(self) -> Self {
- let n = u8::to_le(self as u8);
- let p = &n as *const u8 as *const Any;
- unsafe { *p }
- }
- #[inline]
- fn from_little_endian(self) -> Self {
- let n = u8::from_le(self as u8);
- let p = &n as *const u8 as *const Any;
- unsafe { *p }
+ Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
}
}
@@ -276,66 +375,78 @@
type Output = Any;
#[inline]
fn push(&self, dst: &mut [u8], _rest: &[u8]) {
- flatbuffers::emplace_scalar::<Any>(dst, *self);
+ flatbuffers::emplace_scalar::<u8>(dst, self.0);
}
}
-#[allow(non_camel_case_types)]
-const ENUM_VALUES_ANY:[Any; 4] = [
- Any::NONE,
- Any::Monster,
- Any::TestSimpleTableWithEnum,
- Any::MyGame_Example2_Monster
-];
-
-#[allow(non_camel_case_types)]
-const ENUM_NAMES_ANY:[&'static str; 4] = [
- "NONE",
- "Monster",
- "TestSimpleTableWithEnum",
- "MyGame_Example2_Monster"
-];
-
-pub fn enum_name_any(e: Any) -> &'static str {
- let index = e as u8;
- ENUM_NAMES_ANY[index as usize]
+impl flatbuffers::EndianScalar for Any {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(u8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(u8::from_le(self.0))
+ }
}
pub struct AnyUnionTableOffset {}
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_ANY_UNIQUE_ALIASES: u8 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_ANY_UNIQUE_ALIASES: u8 = 3;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)]
-#[repr(u8)]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
-pub enum AnyUniqueAliases {
- NONE = 0,
- M = 1,
- TS = 2,
- M2 = 3,
+pub const ENUM_VALUES_ANY_UNIQUE_ALIASES: [AnyUniqueAliases; 4] = [
+ AnyUniqueAliases::NONE,
+ AnyUniqueAliases::M,
+ AnyUniqueAliases::TS,
+ AnyUniqueAliases::M2,
+];
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct AnyUniqueAliases(pub u8);
+#[allow(non_upper_case_globals)]
+impl AnyUniqueAliases {
+ pub const NONE: Self = Self(0);
+ pub const M: Self = Self(1);
+ pub const TS: Self = Self(2);
+ pub const M2: Self = Self(3);
+
+ pub const ENUM_MIN: u8 = 0;
+ pub const ENUM_MAX: u8 = 3;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::NONE,
+ Self::M,
+ Self::TS,
+ Self::M2,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::NONE => Some("NONE"),
+ Self::M => Some("M"),
+ Self::TS => Some("TS"),
+ Self::M2 => Some("M2"),
+ _ => None,
+ }
+ }
}
-
-const ENUM_MIN_ANY_UNIQUE_ALIASES: u8 = 0;
-const ENUM_MAX_ANY_UNIQUE_ALIASES: u8 = 3;
-
+impl std::fmt::Debug for AnyUniqueAliases {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
impl<'a> flatbuffers::Follow<'a> for AnyUniqueAliases {
type Inner = Self;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- flatbuffers::read_scalar_at::<Self>(buf, loc)
- }
-}
-
-impl flatbuffers::EndianScalar for AnyUniqueAliases {
- #[inline]
- fn to_little_endian(self) -> Self {
- let n = u8::to_le(self as u8);
- let p = &n as *const u8 as *const AnyUniqueAliases;
- unsafe { *p }
- }
- #[inline]
- fn from_little_endian(self) -> Self {
- let n = u8::from_le(self as u8);
- let p = &n as *const u8 as *const AnyUniqueAliases;
- unsafe { *p }
+ Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
}
}
@@ -343,66 +454,78 @@
type Output = AnyUniqueAliases;
#[inline]
fn push(&self, dst: &mut [u8], _rest: &[u8]) {
- flatbuffers::emplace_scalar::<AnyUniqueAliases>(dst, *self);
+ flatbuffers::emplace_scalar::<u8>(dst, self.0);
}
}
-#[allow(non_camel_case_types)]
-const ENUM_VALUES_ANY_UNIQUE_ALIASES:[AnyUniqueAliases; 4] = [
- AnyUniqueAliases::NONE,
- AnyUniqueAliases::M,
- AnyUniqueAliases::TS,
- AnyUniqueAliases::M2
-];
-
-#[allow(non_camel_case_types)]
-const ENUM_NAMES_ANY_UNIQUE_ALIASES:[&'static str; 4] = [
- "NONE",
- "M",
- "TS",
- "M2"
-];
-
-pub fn enum_name_any_unique_aliases(e: AnyUniqueAliases) -> &'static str {
- let index = e as u8;
- ENUM_NAMES_ANY_UNIQUE_ALIASES[index as usize]
+impl flatbuffers::EndianScalar for AnyUniqueAliases {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(u8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(u8::from_le(self.0))
+ }
}
pub struct AnyUniqueAliasesUnionTableOffset {}
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_ANY_AMBIGUOUS_ALIASES: u8 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_ANY_AMBIGUOUS_ALIASES: u8 = 3;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)]
-#[repr(u8)]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
-pub enum AnyAmbiguousAliases {
- NONE = 0,
- M1 = 1,
- M2 = 2,
- M3 = 3,
+pub const ENUM_VALUES_ANY_AMBIGUOUS_ALIASES: [AnyAmbiguousAliases; 4] = [
+ AnyAmbiguousAliases::NONE,
+ AnyAmbiguousAliases::M1,
+ AnyAmbiguousAliases::M2,
+ AnyAmbiguousAliases::M3,
+];
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct AnyAmbiguousAliases(pub u8);
+#[allow(non_upper_case_globals)]
+impl AnyAmbiguousAliases {
+ pub const NONE: Self = Self(0);
+ pub const M1: Self = Self(1);
+ pub const M2: Self = Self(2);
+ pub const M3: Self = Self(3);
+
+ pub const ENUM_MIN: u8 = 0;
+ pub const ENUM_MAX: u8 = 3;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::NONE,
+ Self::M1,
+ Self::M2,
+ Self::M3,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::NONE => Some("NONE"),
+ Self::M1 => Some("M1"),
+ Self::M2 => Some("M2"),
+ Self::M3 => Some("M3"),
+ _ => None,
+ }
+ }
}
-
-const ENUM_MIN_ANY_AMBIGUOUS_ALIASES: u8 = 0;
-const ENUM_MAX_ANY_AMBIGUOUS_ALIASES: u8 = 3;
-
+impl std::fmt::Debug for AnyAmbiguousAliases {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
impl<'a> flatbuffers::Follow<'a> for AnyAmbiguousAliases {
type Inner = Self;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- flatbuffers::read_scalar_at::<Self>(buf, loc)
- }
-}
-
-impl flatbuffers::EndianScalar for AnyAmbiguousAliases {
- #[inline]
- fn to_little_endian(self) -> Self {
- let n = u8::to_le(self as u8);
- let p = &n as *const u8 as *const AnyAmbiguousAliases;
- unsafe { *p }
- }
- #[inline]
- fn from_little_endian(self) -> Self {
- let n = u8::from_le(self as u8);
- let p = &n as *const u8 as *const AnyAmbiguousAliases;
- unsafe { *p }
+ Self(flatbuffers::read_scalar_at::<u8>(buf, loc))
}
}
@@ -410,40 +533,39 @@
type Output = AnyAmbiguousAliases;
#[inline]
fn push(&self, dst: &mut [u8], _rest: &[u8]) {
- flatbuffers::emplace_scalar::<AnyAmbiguousAliases>(dst, *self);
+ flatbuffers::emplace_scalar::<u8>(dst, self.0);
}
}
-#[allow(non_camel_case_types)]
-const ENUM_VALUES_ANY_AMBIGUOUS_ALIASES:[AnyAmbiguousAliases; 4] = [
- AnyAmbiguousAliases::NONE,
- AnyAmbiguousAliases::M1,
- AnyAmbiguousAliases::M2,
- AnyAmbiguousAliases::M3
-];
-
-#[allow(non_camel_case_types)]
-const ENUM_NAMES_ANY_AMBIGUOUS_ALIASES:[&'static str; 4] = [
- "NONE",
- "M1",
- "M2",
- "M3"
-];
-
-pub fn enum_name_any_ambiguous_aliases(e: AnyAmbiguousAliases) -> &'static str {
- let index = e as u8;
- ENUM_NAMES_ANY_AMBIGUOUS_ALIASES[index as usize]
+impl flatbuffers::EndianScalar for AnyAmbiguousAliases {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(u8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(u8::from_le(self.0))
+ }
}
pub struct AnyAmbiguousAliasesUnionTableOffset {}
// struct Test, aligned to 2
#[repr(C, align(2))]
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, PartialEq)]
pub struct Test {
a_: i16,
b_: i8,
padding0__: u8,
} // pub struct Test
+impl std::fmt::Debug for Test {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_struct("Test")
+ .field("a", &self.a())
+ .field("b", &self.b())
+ .finish()
+ }
+}
+
impl flatbuffers::SafeSliceAccess for Test {}
impl<'a> flatbuffers::Follow<'a> for Test {
type Inner = &'a Test;
@@ -483,7 +605,7 @@
impl Test {
- pub fn new<'a>(_a: i16, _b: i8) -> Self {
+ pub fn new(_a: i16, _b: i8) -> Self {
Test {
a_: _a.to_little_endian(),
b_: _b.to_little_endian(),
@@ -491,17 +613,21 @@
padding0__: 0,
}
}
- pub fn a<'a>(&'a self) -> i16 {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Test"
+ }
+
+ pub fn a(&self) -> i16 {
self.a_.from_little_endian()
}
- pub fn b<'a>(&'a self) -> i8 {
+ pub fn b(&self) -> i8 {
self.b_.from_little_endian()
}
}
// struct Vec3, aligned to 8
#[repr(C, align(8))]
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, PartialEq)]
pub struct Vec3 {
x_: f32,
y_: f32,
@@ -513,6 +639,19 @@
test3_: Test,
padding2__: u16,
} // pub struct Vec3
+impl std::fmt::Debug for Vec3 {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_struct("Vec3")
+ .field("x", &self.x())
+ .field("y", &self.y())
+ .field("z", &self.z())
+ .field("test1", &self.test1())
+ .field("test2", &self.test2())
+ .field("test3", &self.test3())
+ .finish()
+ }
+}
+
impl flatbuffers::SafeSliceAccess for Vec3 {}
impl<'a> flatbuffers::Follow<'a> for Vec3 {
type Inner = &'a Vec3;
@@ -552,7 +691,7 @@
impl Vec3 {
- pub fn new<'a>(_x: f32, _y: f32, _z: f32, _test1: f64, _test2: Color, _test3: &'a Test) -> Self {
+ pub fn new(_x: f32, _y: f32, _z: f32, _test1: f64, _test2: Color, _test3: &Test) -> Self {
Vec3 {
x_: _x.to_little_endian(),
y_: _y.to_little_endian(),
@@ -566,33 +705,46 @@
padding2__: 0,
}
}
- pub fn x<'a>(&'a self) -> f32 {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Vec3"
+ }
+
+ pub fn x(&self) -> f32 {
self.x_.from_little_endian()
}
- pub fn y<'a>(&'a self) -> f32 {
+ pub fn y(&self) -> f32 {
self.y_.from_little_endian()
}
- pub fn z<'a>(&'a self) -> f32 {
+ pub fn z(&self) -> f32 {
self.z_.from_little_endian()
}
- pub fn test1<'a>(&'a self) -> f64 {
+ pub fn test1(&self) -> f64 {
self.test1_.from_little_endian()
}
- pub fn test2<'a>(&'a self) -> Color {
+ pub fn test2(&self) -> Color {
self.test2_.from_little_endian()
}
- pub fn test3<'a>(&'a self) -> &'a Test {
+ pub fn test3(&self) -> &Test {
&self.test3_
}
}
// struct Ability, aligned to 4
#[repr(C, align(4))]
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, PartialEq)]
pub struct Ability {
id_: u32,
distance_: u32,
} // pub struct Ability
+impl std::fmt::Debug for Ability {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_struct("Ability")
+ .field("id", &self.id())
+ .field("distance", &self.distance())
+ .finish()
+ }
+}
+
impl flatbuffers::SafeSliceAccess for Ability {}
impl<'a> flatbuffers::Follow<'a> for Ability {
type Inner = &'a Ability;
@@ -632,14 +784,18 @@
impl Ability {
- pub fn new<'a>(_id: u32, _distance: u32) -> Self {
+ pub fn new(_id: u32, _distance: u32) -> Self {
Ability {
id_: _id.to_little_endian(),
distance_: _distance.to_little_endian(),
}
}
- pub fn id<'a>(&'a self) -> u32 {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Ability"
+ }
+
+ pub fn id(&self) -> u32 {
self.id_.from_little_endian()
}
#[inline]
@@ -652,13 +808,13 @@
let key = self.id();
key.cmp(&val)
}
- pub fn distance<'a>(&'a self) -> u32 {
+ pub fn distance(&self) -> u32 {
self.distance_.from_little_endian()
}
}
pub enum TestSimpleTableWithEnumOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct TestSimpleTableWithEnum<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -668,13 +824,15 @@
type Inner = TestSimpleTableWithEnum<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> TestSimpleTableWithEnum<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.TestSimpleTableWithEnum"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
TestSimpleTableWithEnum {
@@ -733,8 +891,15 @@
}
}
+impl std::fmt::Debug for TestSimpleTableWithEnum<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TestSimpleTableWithEnum");
+ ds.field("color", &self.color());
+ ds.finish()
+ }
+}
pub enum StatOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct Stat<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -744,13 +909,15 @@
type Inner = Stat<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> Stat<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Stat"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
Stat {
@@ -787,7 +954,7 @@
}
pub struct StatArgs<'a> {
- pub id: Option<flatbuffers::WIPOffset<&'a str>>,
+ pub id: Option<flatbuffers::WIPOffset<&'a str>>,
pub val: i64,
pub count: u16,
}
@@ -833,8 +1000,17 @@
}
}
+impl std::fmt::Debug for Stat<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("Stat");
+ ds.field("id", &self.id());
+ ds.field("val", &self.val());
+ ds.field("count", &self.count());
+ ds.finish()
+ }
+}
pub enum ReferrableOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct Referrable<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -844,13 +1020,15 @@
type Inner = Referrable<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> Referrable<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Referrable"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
Referrable {
@@ -919,10 +1097,17 @@
}
}
+impl std::fmt::Debug for Referrable<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("Referrable");
+ ds.field("id", &self.id());
+ ds.finish()
+ }
+}
pub enum MonsterOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
pub struct Monster<'a> {
pub _tab: flatbuffers::Table<'a>,
}
@@ -931,13 +1116,15 @@
type Inner = Monster<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> Monster<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.Monster"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
Monster {
@@ -956,6 +1143,7 @@
builder.add_testhashs64_fnv1a(args.testhashs64_fnv1a);
builder.add_testhashu64_fnv1(args.testhashu64_fnv1);
builder.add_testhashs64_fnv1(args.testhashs64_fnv1);
+ if let Some(x) = args.testrequirednestedflatbuffer { builder.add_testrequirednestedflatbuffer(x); }
if let Some(x) = args.vector_of_enums { builder.add_vector_of_enums(x); }
if let Some(x) = args.any_ambiguous { builder.add_any_ambiguous(x); }
if let Some(x) = args.any_unique { builder.add_any_unique(x); }
@@ -991,6 +1179,7 @@
if let Some(x) = args.pos { builder.add_pos(x); }
builder.add_hp(args.hp);
builder.add_mana(args.mana);
+ builder.add_signed_enum(args.signed_enum);
builder.add_any_ambiguous_type(args.any_ambiguous_type);
builder.add_any_unique_type(args.any_unique_type);
builder.add_testbool(args.testbool);
@@ -1046,6 +1235,8 @@
pub const VT_ANY_AMBIGUOUS_TYPE: flatbuffers::VOffsetT = 94;
pub const VT_ANY_AMBIGUOUS: flatbuffers::VOffsetT = 96;
pub const VT_VECTOR_OF_ENUMS: flatbuffers::VOffsetT = 98;
+ pub const VT_SIGNED_ENUM: flatbuffers::VOffsetT = 100;
+ pub const VT_TESTREQUIREDNESTEDFLATBUFFER: flatbuffers::VOffsetT = 102;
#[inline]
pub fn pos(&self) -> Option<&'a Vec3> {
@@ -1111,14 +1302,11 @@
pub fn testnestedflatbuffer(&self) -> Option<&'a [u8]> {
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTNESTEDFLATBUFFER, None).map(|v| v.safe_slice())
}
- pub fn testnestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {
- match self.testnestedflatbuffer() {
- None => { None }
- Some(data) => {
- use self::flatbuffers::Follow;
- Some(<flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data, 0))
- },
- }
+ pub fn testnestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {
+ self.testnestedflatbuffer().map(|data| {
+ use flatbuffers::Follow;
+ <flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data, 0)
+ })
}
#[inline]
pub fn testempty(&self) -> Option<Stat<'a>> {
@@ -1257,10 +1445,24 @@
self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, Color>>>(Monster::VT_VECTOR_OF_ENUMS, None)
}
#[inline]
+ pub fn signed_enum(&self) -> Race {
+ self._tab.get::<Race>(Monster::VT_SIGNED_ENUM, Some(Race::None)).unwrap()
+ }
+ #[inline]
+ pub fn testrequirednestedflatbuffer(&self) -> Option<&'a [u8]> {
+ self._tab.get::<flatbuffers::ForwardsUOffset<flatbuffers::Vector<'a, u8>>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, None).map(|v| v.safe_slice())
+ }
+ pub fn testrequirednestedflatbuffer_nested_flatbuffer(&'a self) -> Option<Monster<'a>> {
+ self.testrequirednestedflatbuffer().map(|data| {
+ use flatbuffers::Follow;
+ <flatbuffers::ForwardsUOffset<Monster<'a>>>::follow(data, 0)
+ })
+ }
+ #[inline]
#[allow(non_snake_case)]
pub fn test_as_monster(&self) -> Option<Monster<'a>> {
if self.test_type() == Any::Monster {
- self.test().map(|u| Monster::init_from_table(u))
+ self.test().map(Monster::init_from_table)
} else {
None
}
@@ -1270,7 +1472,7 @@
#[allow(non_snake_case)]
pub fn test_as_test_simple_table_with_enum(&self) -> Option<TestSimpleTableWithEnum<'a>> {
if self.test_type() == Any::TestSimpleTableWithEnum {
- self.test().map(|u| TestSimpleTableWithEnum::init_from_table(u))
+ self.test().map(TestSimpleTableWithEnum::init_from_table)
} else {
None
}
@@ -1280,7 +1482,7 @@
#[allow(non_snake_case)]
pub fn test_as_my_game_example_2_monster(&self) -> Option<super::example_2::Monster<'a>> {
if self.test_type() == Any::MyGame_Example2_Monster {
- self.test().map(|u| super::example_2::Monster::init_from_table(u))
+ self.test().map(super::example_2::Monster::init_from_table)
} else {
None
}
@@ -1290,7 +1492,7 @@
#[allow(non_snake_case)]
pub fn any_unique_as_m(&self) -> Option<Monster<'a>> {
if self.any_unique_type() == AnyUniqueAliases::M {
- self.any_unique().map(|u| Monster::init_from_table(u))
+ self.any_unique().map(Monster::init_from_table)
} else {
None
}
@@ -1300,7 +1502,7 @@
#[allow(non_snake_case)]
pub fn any_unique_as_ts(&self) -> Option<TestSimpleTableWithEnum<'a>> {
if self.any_unique_type() == AnyUniqueAliases::TS {
- self.any_unique().map(|u| TestSimpleTableWithEnum::init_from_table(u))
+ self.any_unique().map(TestSimpleTableWithEnum::init_from_table)
} else {
None
}
@@ -1310,7 +1512,7 @@
#[allow(non_snake_case)]
pub fn any_unique_as_m2(&self) -> Option<super::example_2::Monster<'a>> {
if self.any_unique_type() == AnyUniqueAliases::M2 {
- self.any_unique().map(|u| super::example_2::Monster::init_from_table(u))
+ self.any_unique().map(super::example_2::Monster::init_from_table)
} else {
None
}
@@ -1320,7 +1522,7 @@
#[allow(non_snake_case)]
pub fn any_ambiguous_as_m1(&self) -> Option<Monster<'a>> {
if self.any_ambiguous_type() == AnyAmbiguousAliases::M1 {
- self.any_ambiguous().map(|u| Monster::init_from_table(u))
+ self.any_ambiguous().map(Monster::init_from_table)
} else {
None
}
@@ -1330,7 +1532,7 @@
#[allow(non_snake_case)]
pub fn any_ambiguous_as_m2(&self) -> Option<Monster<'a>> {
if self.any_ambiguous_type() == AnyAmbiguousAliases::M2 {
- self.any_ambiguous().map(|u| Monster::init_from_table(u))
+ self.any_ambiguous().map(Monster::init_from_table)
} else {
None
}
@@ -1340,7 +1542,7 @@
#[allow(non_snake_case)]
pub fn any_ambiguous_as_m3(&self) -> Option<Monster<'a>> {
if self.any_ambiguous_type() == AnyAmbiguousAliases::M3 {
- self.any_ambiguous().map(|u| Monster::init_from_table(u))
+ self.any_ambiguous().map(Monster::init_from_table)
} else {
None
}
@@ -1349,20 +1551,20 @@
}
pub struct MonsterArgs<'a> {
- pub pos: Option<&'a Vec3>,
+ pub pos: Option<&'a Vec3>,
pub mana: i16,
pub hp: i16,
- pub name: Option<flatbuffers::WIPOffset<&'a str>>,
- pub inventory: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u8>>>,
+ pub name: Option<flatbuffers::WIPOffset<&'a str>>,
+ pub inventory: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>,
pub color: Color,
pub test_type: Any,
pub test: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>,
- pub test4: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , Test>>>,
- pub testarrayofstring: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , flatbuffers::ForwardsUOffset<&'a str>>>>,
- pub testarrayoftables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , flatbuffers::ForwardsUOffset<Monster<'a >>>>>,
- pub enemy: Option<flatbuffers::WIPOffset<Monster<'a >>>,
- pub testnestedflatbuffer: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u8>>>,
- pub testempty: Option<flatbuffers::WIPOffset<Stat<'a >>>,
+ pub test4: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Test>>>,
+ pub testarrayofstring: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>,
+ pub testarrayoftables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Monster<'a>>>>>,
+ pub enemy: Option<flatbuffers::WIPOffset<Monster<'a>>>,
+ pub testnestedflatbuffer: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>,
+ pub testempty: Option<flatbuffers::WIPOffset<Stat<'a>>>,
pub testbool: bool,
pub testhashs32_fnv1: i32,
pub testhashu32_fnv1: u32,
@@ -1372,30 +1574,32 @@
pub testhashu32_fnv1a: u32,
pub testhashs64_fnv1a: i64,
pub testhashu64_fnv1a: u64,
- pub testarrayofbools: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , bool>>>,
+ pub testarrayofbools: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, bool>>>,
pub testf: f32,
pub testf2: f32,
pub testf3: f32,
- pub testarrayofstring2: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , flatbuffers::ForwardsUOffset<&'a str>>>>,
- pub testarrayofsortedstruct: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , Ability>>>,
- pub flex: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u8>>>,
- pub test5: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , Test>>>,
- pub vector_of_longs: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , i64>>>,
- pub vector_of_doubles: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , f64>>>,
- pub parent_namespace_test: Option<flatbuffers::WIPOffset<super::InParentNamespace<'a >>>,
- pub vector_of_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , flatbuffers::ForwardsUOffset<Referrable<'a >>>>>,
+ pub testarrayofstring2: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>>>,
+ pub testarrayofsortedstruct: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Ability>>>,
+ pub flex: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>,
+ pub test5: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Test>>>,
+ pub vector_of_longs: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, i64>>>,
+ pub vector_of_doubles: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, f64>>>,
+ pub parent_namespace_test: Option<flatbuffers::WIPOffset<super::InParentNamespace<'a>>>,
+ pub vector_of_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,
pub single_weak_reference: u64,
- pub vector_of_weak_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u64>>>,
- pub vector_of_strong_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , flatbuffers::ForwardsUOffset<Referrable<'a >>>>>,
+ pub vector_of_weak_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>,
+ pub vector_of_strong_referrables: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<Referrable<'a>>>>>,
pub co_owning_reference: u64,
- pub vector_of_co_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u64>>>,
+ pub vector_of_co_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>,
pub non_owning_reference: u64,
- pub vector_of_non_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , u64>>>,
+ pub vector_of_non_owning_references: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u64>>>,
pub any_unique_type: AnyUniqueAliases,
pub any_unique: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>,
pub any_ambiguous_type: AnyAmbiguousAliases,
pub any_ambiguous: Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>,
- pub vector_of_enums: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , Color>>>,
+ pub vector_of_enums: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, Color>>>,
+ pub signed_enum: Race,
+ pub testrequirednestedflatbuffer: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, u8>>>,
}
impl<'a> Default for MonsterArgs<'a> {
#[inline]
@@ -1448,6 +1652,8 @@
any_ambiguous_type: AnyAmbiguousAliases::NONE,
any_ambiguous: None,
vector_of_enums: None,
+ signed_enum: Race::None,
+ testrequirednestedflatbuffer: None,
}
}
}
@@ -1457,7 +1663,7 @@
}
impl<'a: 'b, 'b> MonsterBuilder<'a, 'b> {
#[inline]
- pub fn add_pos(&mut self, pos: &'b Vec3) {
+ pub fn add_pos(&mut self, pos: &Vec3) {
self.fbb_.push_slot_always::<&Vec3>(Monster::VT_POS, pos);
}
#[inline]
@@ -1645,6 +1851,14 @@
self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_VECTOR_OF_ENUMS, vector_of_enums);
}
#[inline]
+ pub fn add_signed_enum(&mut self, signed_enum: Race) {
+ self.fbb_.push_slot::<Race>(Monster::VT_SIGNED_ENUM, signed_enum, Race::None);
+ }
+ #[inline]
+ pub fn add_testrequirednestedflatbuffer(&mut self, testrequirednestedflatbuffer: flatbuffers::WIPOffset<flatbuffers::Vector<'b , u8>>) {
+ self.fbb_.push_slot_always::<flatbuffers::WIPOffset<_>>(Monster::VT_TESTREQUIREDNESTEDFLATBUFFER, testrequirednestedflatbuffer);
+ }
+ #[inline]
pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> MonsterBuilder<'a, 'b> {
let start = _fbb.start_table();
MonsterBuilder {
@@ -1660,8 +1874,141 @@
}
}
+impl std::fmt::Debug for Monster<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("Monster");
+ ds.field("pos", &self.pos());
+ ds.field("mana", &self.mana());
+ ds.field("hp", &self.hp());
+ ds.field("name", &self.name());
+ ds.field("inventory", &self.inventory());
+ ds.field("color", &self.color());
+ ds.field("test_type", &self.test_type());
+ match self.test_type() {
+ Any::Monster => {
+ if let Some(x) = self.test_as_monster() {
+ ds.field("test", &x)
+ } else {
+ ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ Any::TestSimpleTableWithEnum => {
+ if let Some(x) = self.test_as_test_simple_table_with_enum() {
+ ds.field("test", &x)
+ } else {
+ ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ Any::MyGame_Example2_Monster => {
+ if let Some(x) = self.test_as_my_game_example_2_monster() {
+ ds.field("test", &x)
+ } else {
+ ds.field("test", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ _ => {
+ let x: Option<()> = None;
+ ds.field("test", &x)
+ },
+ };
+ ds.field("test4", &self.test4());
+ ds.field("testarrayofstring", &self.testarrayofstring());
+ ds.field("testarrayoftables", &self.testarrayoftables());
+ ds.field("enemy", &self.enemy());
+ ds.field("testnestedflatbuffer", &self.testnestedflatbuffer());
+ ds.field("testempty", &self.testempty());
+ ds.field("testbool", &self.testbool());
+ ds.field("testhashs32_fnv1", &self.testhashs32_fnv1());
+ ds.field("testhashu32_fnv1", &self.testhashu32_fnv1());
+ ds.field("testhashs64_fnv1", &self.testhashs64_fnv1());
+ ds.field("testhashu64_fnv1", &self.testhashu64_fnv1());
+ ds.field("testhashs32_fnv1a", &self.testhashs32_fnv1a());
+ ds.field("testhashu32_fnv1a", &self.testhashu32_fnv1a());
+ ds.field("testhashs64_fnv1a", &self.testhashs64_fnv1a());
+ ds.field("testhashu64_fnv1a", &self.testhashu64_fnv1a());
+ ds.field("testarrayofbools", &self.testarrayofbools());
+ ds.field("testf", &self.testf());
+ ds.field("testf2", &self.testf2());
+ ds.field("testf3", &self.testf3());
+ ds.field("testarrayofstring2", &self.testarrayofstring2());
+ ds.field("testarrayofsortedstruct", &self.testarrayofsortedstruct());
+ ds.field("flex", &self.flex());
+ ds.field("test5", &self.test5());
+ ds.field("vector_of_longs", &self.vector_of_longs());
+ ds.field("vector_of_doubles", &self.vector_of_doubles());
+ ds.field("parent_namespace_test", &self.parent_namespace_test());
+ ds.field("vector_of_referrables", &self.vector_of_referrables());
+ ds.field("single_weak_reference", &self.single_weak_reference());
+ ds.field("vector_of_weak_references", &self.vector_of_weak_references());
+ ds.field("vector_of_strong_referrables", &self.vector_of_strong_referrables());
+ ds.field("co_owning_reference", &self.co_owning_reference());
+ ds.field("vector_of_co_owning_references", &self.vector_of_co_owning_references());
+ ds.field("non_owning_reference", &self.non_owning_reference());
+ ds.field("vector_of_non_owning_references", &self.vector_of_non_owning_references());
+ ds.field("any_unique_type", &self.any_unique_type());
+ match self.any_unique_type() {
+ AnyUniqueAliases::M => {
+ if let Some(x) = self.any_unique_as_m() {
+ ds.field("any_unique", &x)
+ } else {
+ ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ AnyUniqueAliases::TS => {
+ if let Some(x) = self.any_unique_as_ts() {
+ ds.field("any_unique", &x)
+ } else {
+ ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ AnyUniqueAliases::M2 => {
+ if let Some(x) = self.any_unique_as_m2() {
+ ds.field("any_unique", &x)
+ } else {
+ ds.field("any_unique", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ _ => {
+ let x: Option<()> = None;
+ ds.field("any_unique", &x)
+ },
+ };
+ ds.field("any_ambiguous_type", &self.any_ambiguous_type());
+ match self.any_ambiguous_type() {
+ AnyAmbiguousAliases::M1 => {
+ if let Some(x) = self.any_ambiguous_as_m1() {
+ ds.field("any_ambiguous", &x)
+ } else {
+ ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ AnyAmbiguousAliases::M2 => {
+ if let Some(x) = self.any_ambiguous_as_m2() {
+ ds.field("any_ambiguous", &x)
+ } else {
+ ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ AnyAmbiguousAliases::M3 => {
+ if let Some(x) = self.any_ambiguous_as_m3() {
+ ds.field("any_ambiguous", &x)
+ } else {
+ ds.field("any_ambiguous", &"InvalidFlatbuffer: Union discriminant does not match value.")
+ }
+ },
+ _ => {
+ let x: Option<()> = None;
+ ds.field("any_ambiguous", &x)
+ },
+ };
+ ds.field("vector_of_enums", &self.vector_of_enums());
+ ds.field("signed_enum", &self.signed_enum());
+ ds.field("testrequirednestedflatbuffer", &self.testrequirednestedflatbuffer());
+ ds.finish()
+ }
+}
pub enum TypeAliasesOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct TypeAliases<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -1671,13 +2018,15 @@
type Inner = TypeAliases<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> TypeAliases<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "MyGame.Example.TypeAliases"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
TypeAliases {
@@ -1778,8 +2127,8 @@
pub u64_: u64,
pub f32_: f32,
pub f64_: f64,
- pub v8: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , i8>>>,
- pub vf64: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a , f64>>>,
+ pub v8: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, i8>>>,
+ pub vf64: Option<flatbuffers::WIPOffset<flatbuffers::Vector<'a, f64>>>,
}
impl<'a> Default for TypeAliasesArgs<'a> {
#[inline]
@@ -1868,6 +2217,24 @@
}
}
+impl std::fmt::Debug for TypeAliases<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TypeAliases");
+ ds.field("i8_", &self.i8_());
+ ds.field("u8_", &self.u8_());
+ ds.field("i16_", &self.i16_());
+ ds.field("u16_", &self.u16_());
+ ds.field("i32_", &self.i32_());
+ ds.field("u32_", &self.u32_());
+ ds.field("i64_", &self.i64_());
+ ds.field("u64_", &self.u64_());
+ ds.field("f32_", &self.f32_());
+ ds.field("f64_", &self.f64_());
+ ds.field("v8", &self.v8());
+ ds.field("vf64", &self.vf64());
+ ds.finish()
+ }
+}
#[inline]
pub fn get_root_as_monster<'a>(buf: &'a [u8]) -> Monster<'a> {
flatbuffers::get_root::<Monster<'a>>(buf)
@@ -1878,19 +2245,19 @@
flatbuffers::get_size_prefixed_root::<Monster<'a>>(buf)
}
-pub const MONSTER_IDENTIFIER: &'static str = "MONS";
+pub const MONSTER_IDENTIFIER: &str = "MONS";
#[inline]
pub fn monster_buffer_has_identifier(buf: &[u8]) -> bool {
- return flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, false);
+ flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, false)
}
#[inline]
pub fn monster_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {
- return flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, true);
+ flatbuffers::buffer_has_identifier(buf, MONSTER_IDENTIFIER, true)
}
-pub const MONSTER_EXTENSION: &'static str = "mon";
+pub const MONSTER_EXTENSION: &str = "mon";
#[inline]
pub fn finish_monster_buffer<'a, 'b>(
diff --git a/tests/monster_test_generated.ts b/tests/monster_test_generated.ts
index 5f51589..d210917 100644
--- a/tests/monster_test_generated.ts
+++ b/tests/monster_test_generated.ts
@@ -19,7 +19,20 @@
* \brief color Blue (1u << 3)
*/
Blue= 8
-}};
+};
+}
+
+/**
+ * @enum {number}
+ */
+export namespace MyGame.Example{
+export enum Race{
+ None= -1,
+ Human= 0,
+ Dwarf= 1,
+ Elf= 2
+};
+}
/**
* @enum {number}
@@ -30,7 +43,35 @@
Monster= 1,
TestSimpleTableWithEnum= 2,
MyGame_Example2_Monster= 3
-}};
+};
+
+export function unionToAny(
+ type: Any,
+ accessor: (obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null
+): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
+ switch(MyGame.Example.Any[type]) {
+ case 'NONE': return null;
+ case 'Monster': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'TestSimpleTableWithEnum': return accessor(new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
+ case 'MyGame_Example2_Monster': return accessor(new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
+ default: return null;
+ }
+}
+
+export function unionListToAny(
+ type: Any,
+ accessor: (index: number, obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null,
+ index: number
+): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
+ switch(MyGame.Example.Any[type]) {
+ case 'NONE': return null;
+ case 'Monster': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'TestSimpleTableWithEnum': return accessor(index, new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
+ case 'MyGame_Example2_Monster': return accessor(index, new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
+ default: return null;
+ }
+}
+}
/**
* @enum {number}
@@ -41,7 +82,35 @@
M= 1,
TS= 2,
M2= 3
-}};
+};
+
+export function unionToAnyUniqueAliases(
+ type: AnyUniqueAliases,
+ accessor: (obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null
+): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
+ switch(MyGame.Example.AnyUniqueAliases[type]) {
+ case 'NONE': return null;
+ case 'M': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'TS': return accessor(new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
+ case 'M2': return accessor(new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
+ default: return null;
+ }
+}
+
+export function unionListToAnyUniqueAliases(
+ type: AnyUniqueAliases,
+ accessor: (index: number, obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null,
+ index: number
+): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
+ switch(MyGame.Example.AnyUniqueAliases[type]) {
+ case 'NONE': return null;
+ case 'M': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'TS': return accessor(index, new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
+ case 'M2': return accessor(index, new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
+ default: return null;
+ }
+}
+}
/**
* @enum {number}
@@ -52,7 +121,35 @@
M1= 1,
M2= 2,
M3= 3
-}};
+};
+
+export function unionToAnyAmbiguousAliases(
+ type: AnyAmbiguousAliases,
+ accessor: (obj:MyGame.Example.Monster) => MyGame.Example.Monster|null
+): MyGame.Example.Monster|null {
+ switch(MyGame.Example.AnyAmbiguousAliases[type]) {
+ case 'NONE': return null;
+ case 'M1': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'M2': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'M3': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ default: return null;
+ }
+}
+
+export function unionListToAnyAmbiguousAliases(
+ type: AnyAmbiguousAliases,
+ accessor: (index: number, obj:MyGame.Example.Monster) => MyGame.Example.Monster|null,
+ index: number
+): MyGame.Example.Monster|null {
+ switch(MyGame.Example.AnyAmbiguousAliases[type]) {
+ case 'NONE': return null;
+ case 'M1': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'M2': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ case 'M3': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
+ default: return null;
+ }
+}
+}
/**
* @constructor
@@ -79,7 +176,7 @@
* @returns InParentNamespace
*/
static getRootAsInParentNamespace(bb:flatbuffers.ByteBuffer, obj?:InParentNamespace):InParentNamespace {
- return (obj || new InParentNamespace).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -88,7 +185,8 @@
* @returns InParentNamespace
*/
static getSizePrefixedRootAsInParentNamespace(bb:flatbuffers.ByteBuffer, obj?:InParentNamespace):InParentNamespace {
- return (obj || new InParentNamespace).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new InParentNamespace()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -111,6 +209,41 @@
InParentNamespace.startInParentNamespace(builder);
return InParentNamespace.endInParentNamespace(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):InParentNamespace {
+ return InParentNamespace.getRootAsInParentNamespace(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns InParentNamespaceT
+ */
+unpack(): InParentNamespaceT {
+ return new InParentNamespaceT();
+};
+
+/**
+ * @param InParentNamespaceT _o
+ */
+unpackTo(_o: InParentNamespaceT): void {};
+}
+
+export class InParentNamespaceT {
+/**
+ * @constructor
+ */
+constructor(){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.InParentNamespace.createInParentNamespace(builder);
+};
}
}
/**
@@ -138,7 +271,7 @@
* @returns Monster
*/
static getRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {
- return (obj || new Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -147,7 +280,8 @@
* @returns Monster
*/
static getSizePrefixedRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {
- return (obj || new Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -170,6 +304,41 @@
Monster.startMonster(builder);
return Monster.endMonster(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):Monster {
+ return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns MonsterT
+ */
+unpack(): MonsterT {
+ return new MonsterT();
+};
+
+/**
+ * @param MonsterT _o
+ */
+unpackTo(_o: MonsterT): void {};
+}
+
+export class MonsterT {
+/**
+ * @constructor
+ */
+constructor(){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example2.Monster.createMonster(builder);
+};
}
}
/**
@@ -203,13 +372,7 @@
* @returns boolean
*/
mutate_a(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt16(this.bb_pos + offset, value);
+ this.bb!.writeInt16(this.bb_pos + 0, value);
return true;
};
@@ -225,17 +388,18 @@
* @returns boolean
*/
mutate_b(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 2);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt8(this.bb_pos + offset, value);
+ this.bb!.writeInt8(this.bb_pos + 2, value);
return true;
};
/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 4;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number a
* @param number b
@@ -249,6 +413,47 @@
return builder.offset();
};
+
+/**
+ * @returns TestT
+ */
+unpack(): TestT {
+ return new TestT(
+ this.a(),
+ this.b()
+ );
+};
+
+/**
+ * @param TestT _o
+ */
+unpackTo(_o: TestT): void {
+ _o.a = this.a();
+ _o.b = this.b();
+};
+}
+
+export class TestT {
+/**
+ * @constructor
+ * @param number a
+ * @param number b
+ */
+constructor(
+ public a: number = 0,
+ public b: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example.Test.createTest(builder,
+ this.a,
+ this.b
+ );
+};
}
}
/**
@@ -276,7 +481,7 @@
* @returns TestSimpleTableWithEnum
*/
static getRootAsTestSimpleTableWithEnum(bb:flatbuffers.ByteBuffer, obj?:TestSimpleTableWithEnum):TestSimpleTableWithEnum {
- return (obj || new TestSimpleTableWithEnum).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -285,7 +490,8 @@
* @returns TestSimpleTableWithEnum
*/
static getSizePrefixedRootAsTestSimpleTableWithEnum(bb:flatbuffers.ByteBuffer, obj?:TestSimpleTableWithEnum):TestSimpleTableWithEnum {
- return (obj || new TestSimpleTableWithEnum).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new TestSimpleTableWithEnum()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -340,6 +546,50 @@
TestSimpleTableWithEnum.addColor(builder, color);
return TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):TestSimpleTableWithEnum {
+ return TestSimpleTableWithEnum.getRootAsTestSimpleTableWithEnum(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns TestSimpleTableWithEnumT
+ */
+unpack(): TestSimpleTableWithEnumT {
+ return new TestSimpleTableWithEnumT(
+ this.color()
+ );
+};
+
+/**
+ * @param TestSimpleTableWithEnumT _o
+ */
+unpackTo(_o: TestSimpleTableWithEnumT): void {
+ _o.color = this.color();
+};
+}
+
+export class TestSimpleTableWithEnumT {
+/**
+ * @constructor
+ * @param MyGame.Example.Color color
+ */
+constructor(
+ public color: MyGame.Example.Color = MyGame.Example.Color.Green
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example.TestSimpleTableWithEnum.createTestSimpleTableWithEnum(builder,
+ this.color
+ );
+};
}
}
/**
@@ -373,13 +623,7 @@
* @returns boolean
*/
mutate_x(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeFloat32(this.bb_pos + offset, value);
+ this.bb!.writeFloat32(this.bb_pos + 0, value);
return true;
};
@@ -395,13 +639,7 @@
* @returns boolean
*/
mutate_y(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeFloat32(this.bb_pos + offset, value);
+ this.bb!.writeFloat32(this.bb_pos + 4, value);
return true;
};
@@ -417,13 +655,7 @@
* @returns boolean
*/
mutate_z(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 8);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeFloat32(this.bb_pos + offset, value);
+ this.bb!.writeFloat32(this.bb_pos + 8, value);
return true;
};
@@ -439,13 +671,7 @@
* @returns boolean
*/
mutate_test1(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 16);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeFloat64(this.bb_pos + offset, value);
+ this.bb!.writeFloat64(this.bb_pos + 16, value);
return true;
};
@@ -461,13 +687,7 @@
* @returns boolean
*/
mutate_test2(value:MyGame.Example.Color):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 24);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint8(this.bb_pos + offset, value);
+ this.bb!.writeUint8(this.bb_pos + 24, value);
return true;
};
@@ -476,10 +696,17 @@
* @returns MyGame.Example.Test|null
*/
test3(obj?:MyGame.Example.Test):MyGame.Example.Test|null {
- return (obj || new MyGame.Example.Test).__init(this.bb_pos + 26, this.bb!);
+ return (obj || new MyGame.Example.Test()).__init(this.bb_pos + 26, this.bb!);
};
/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 32;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number x
* @param number y
@@ -507,6 +734,68 @@
return builder.offset();
};
+
+/**
+ * @returns Vec3T
+ */
+unpack(): Vec3T {
+ return new Vec3T(
+ this.x(),
+ this.y(),
+ this.z(),
+ this.test1(),
+ this.test2(),
+ (this.test3() !== null ? this.test3()!.unpack() : null)
+ );
+};
+
+/**
+ * @param Vec3T _o
+ */
+unpackTo(_o: Vec3T): void {
+ _o.x = this.x();
+ _o.y = this.y();
+ _o.z = this.z();
+ _o.test1 = this.test1();
+ _o.test2 = this.test2();
+ _o.test3 = (this.test3() !== null ? this.test3()!.unpack() : null);
+};
+}
+
+export class Vec3T {
+/**
+ * @constructor
+ * @param number x
+ * @param number y
+ * @param number z
+ * @param number test1
+ * @param MyGame.Example.Color test2
+ * @param MyGame.Example.TestT|null test3
+ */
+constructor(
+ public x: number = 0.0,
+ public y: number = 0.0,
+ public z: number = 0.0,
+ public test1: number = 0.0,
+ public test2: MyGame.Example.Color = /** } */ (0),
+ public test3: MyGame.Example.TestT|null = null
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example.Vec3.createVec3(builder,
+ this.x,
+ this.y,
+ this.z,
+ this.test1,
+ this.test2,
+ (this.test3 === null ? 0 : this.test3.a!),
+ (this.test3 === null ? 0 : this.test3.b!)
+ );
+};
}
}
/**
@@ -540,13 +829,7 @@
* @returns boolean
*/
mutate_id(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint32(this.bb_pos + offset, value);
+ this.bb!.writeUint32(this.bb_pos + 0, value);
return true;
};
@@ -562,17 +845,18 @@
* @returns boolean
*/
mutate_distance(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint32(this.bb_pos + offset, value);
+ this.bb!.writeUint32(this.bb_pos + 4, value);
return true;
};
/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 8;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number id
* @param number distance
@@ -585,6 +869,47 @@
return builder.offset();
};
+
+/**
+ * @returns AbilityT
+ */
+unpack(): AbilityT {
+ return new AbilityT(
+ this.id(),
+ this.distance()
+ );
+};
+
+/**
+ * @param AbilityT _o
+ */
+unpackTo(_o: AbilityT): void {
+ _o.id = this.id();
+ _o.distance = this.distance();
+};
+}
+
+export class AbilityT {
+/**
+ * @constructor
+ * @param number id
+ * @param number distance
+ */
+constructor(
+ public id: number = 0,
+ public distance: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example.Ability.createAbility(builder,
+ this.id,
+ this.distance
+ );
+};
}
}
/**
@@ -612,7 +937,7 @@
* @returns Stat
*/
static getRootAsStat(bb:flatbuffers.ByteBuffer, obj?:Stat):Stat {
- return (obj || new Stat).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -621,7 +946,8 @@
* @returns Stat
*/
static getSizePrefixedRootAsStat(bb:flatbuffers.ByteBuffer, obj?:Stat):Stat {
- return (obj || new Stat).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Stat()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -728,6 +1054,62 @@
Stat.addCount(builder, count);
return Stat.endStat(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):Stat {
+ return Stat.getRootAsStat(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns StatT
+ */
+unpack(): StatT {
+ return new StatT(
+ this.id(),
+ this.val(),
+ this.count()
+ );
+};
+
+/**
+ * @param StatT _o
+ */
+unpackTo(_o: StatT): void {
+ _o.id = this.id();
+ _o.val = this.val();
+ _o.count = this.count();
+};
+}
+
+export class StatT {
+/**
+ * @constructor
+ * @param string|Uint8Array|null id
+ * @param flatbuffers.Long val
+ * @param number count
+ */
+constructor(
+ public id: string|Uint8Array|null = null,
+ public val: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public count: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ const id = (this.id !== null ? builder.createString(this.id!) : 0);
+
+ return MyGame.Example.Stat.createStat(builder,
+ id,
+ this.val,
+ this.count
+ );
+};
}
}
/**
@@ -755,7 +1137,7 @@
* @returns Referrable
*/
static getRootAsReferrable(bb:flatbuffers.ByteBuffer, obj?:Referrable):Referrable {
- return (obj || new Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -764,7 +1146,8 @@
* @returns Referrable
*/
static getSizePrefixedRootAsReferrable(bb:flatbuffers.ByteBuffer, obj?:Referrable):Referrable {
- return (obj || new Referrable).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Referrable()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -819,10 +1202,54 @@
Referrable.addId(builder, id);
return Referrable.endReferrable(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):Referrable {
+ return Referrable.getRootAsReferrable(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns ReferrableT
+ */
+unpack(): ReferrableT {
+ return new ReferrableT(
+ this.id()
+ );
+};
+
+/**
+ * @param ReferrableT _o
+ */
+unpackTo(_o: ReferrableT): void {
+ _o.id = this.id();
+};
+}
+
+export class ReferrableT {
+/**
+ * @constructor
+ * @param flatbuffers.Long id
+ */
+constructor(
+ public id: flatbuffers.Long = flatbuffers.createLong(0, 0)
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return MyGame.Example.Referrable.createReferrable(builder,
+ this.id
+ );
+};
}
}
/**
- * an example documentation comment: monster object
+ * an example documentation comment: "monster object"
*
* @constructor
*/
@@ -848,7 +1275,7 @@
* @returns Monster
*/
static getRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {
- return (obj || new Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -857,7 +1284,8 @@
* @returns Monster
*/
static getSizePrefixedRootAsMonster(bb:flatbuffers.ByteBuffer, obj?:Monster):Monster {
- return (obj || new Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Monster()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -874,7 +1302,7 @@
*/
pos(obj?:MyGame.Example.Vec3):MyGame.Example.Vec3|null {
var offset = this.bb!.__offset(this.bb_pos, 4);
- return offset ? (obj || new MyGame.Example.Vec3).__init(this.bb_pos + offset, this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Vec3()).__init(this.bb_pos + offset, this.bb!) : null;
};
/**
@@ -991,21 +1419,6 @@
};
/**
- * @param MyGame.Example.Any value
- * @returns boolean
- */
-mutate_test_type(value:MyGame.Example.Any):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 18);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param flatbuffers.Table obj
* @returns ?flatbuffers.Table
*/
@@ -1021,7 +1434,7 @@
*/
test4(index: number, obj?:MyGame.Example.Test):MyGame.Example.Test|null {
var offset = this.bb!.__offset(this.bb_pos, 22);
- return offset ? (obj || new MyGame.Example.Test).__init(this.bb!.__vector(this.bb_pos + offset) + index * 4, this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Test()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 4, this.bb!) : null;
};
/**
@@ -1062,7 +1475,7 @@
*/
testarrayoftables(index: number, obj?:MyGame.Example.Monster):MyGame.Example.Monster|null {
var offset = this.bb!.__offset(this.bb_pos, 26);
- return offset ? (obj || new MyGame.Example.Monster).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Monster()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
};
/**
@@ -1079,7 +1492,7 @@
*/
enemy(obj?:MyGame.Example.Monster):MyGame.Example.Monster|null {
var offset = this.bb!.__offset(this.bb_pos, 28);
- return offset ? (obj || new MyGame.Example.Monster).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Monster()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
@@ -1113,7 +1526,7 @@
*/
testempty(obj?:MyGame.Example.Stat):MyGame.Example.Stat|null {
var offset = this.bb!.__offset(this.bb_pos, 32);
- return offset ? (obj || new MyGame.Example.Stat).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Stat()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
@@ -1444,7 +1857,7 @@
*/
testarrayofsortedstruct(index: number, obj?:MyGame.Example.Ability):MyGame.Example.Ability|null {
var offset = this.bb!.__offset(this.bb_pos, 62);
- return offset ? (obj || new MyGame.Example.Ability).__init(this.bb!.__vector(this.bb_pos + offset) + index * 8, this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Ability()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 8, this.bb!) : null;
};
/**
@@ -1487,7 +1900,7 @@
*/
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;
+ return offset ? (obj || new MyGame.Example.Test()).__init(this.bb!.__vector(this.bb_pos + offset) + index * 4, this.bb!) : null;
};
/**
@@ -1546,7 +1959,7 @@
*/
parentNamespaceTest(obj?:MyGame.InParentNamespace):MyGame.InParentNamespace|null {
var offset = this.bb!.__offset(this.bb_pos, 72);
- return offset ? (obj || new MyGame.InParentNamespace).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new MyGame.InParentNamespace()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
@@ -1556,7 +1969,7 @@
*/
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;
+ return offset ? (obj || new MyGame.Example.Referrable()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
};
/**
@@ -1614,7 +2027,7 @@
*/
vectorOfStrongReferrables(index: number, obj?:MyGame.Example.Referrable):MyGame.Example.Referrable|null {
var offset = this.bb!.__offset(this.bb_pos, 80);
- return offset ? (obj || new MyGame.Example.Referrable).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+ return offset ? (obj || new MyGame.Example.Referrable()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
};
/**
@@ -1714,21 +2127,6 @@
};
/**
- * @param MyGame.Example.AnyUniqueAliases value
- * @returns boolean
- */
-mutate_any_unique_type(value:MyGame.Example.AnyUniqueAliases):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 90);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param flatbuffers.Table obj
* @returns ?flatbuffers.Table
*/
@@ -1746,21 +2144,6 @@
};
/**
- * @param MyGame.Example.AnyAmbiguousAliases value
- * @returns boolean
- */
-mutate_any_ambiguous_type(value:MyGame.Example.AnyAmbiguousAliases):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 94);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param flatbuffers.Table obj
* @returns ?flatbuffers.Table
*/
@@ -1795,10 +2178,58 @@
};
/**
+ * @returns MyGame.Example.Race
+ */
+signedEnum():MyGame.Example.Race {
+ var offset = this.bb!.__offset(this.bb_pos, 100);
+ return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) : MyGame.Example.Race.None;
+};
+
+/**
+ * @param MyGame.Example.Race value
+ * @returns boolean
+ */
+mutate_signed_enum(value:MyGame.Example.Race):boolean {
+ var offset = this.bb!.__offset(this.bb_pos, 100);
+
+ if (offset === 0) {
+ return false;
+ }
+
+ this.bb!.writeInt8(this.bb_pos + offset, value);
+ return true;
+};
+
+/**
+ * @param number index
+ * @returns number
+ */
+testrequirednestedflatbuffer(index: number):number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 102);
+ return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;
+};
+
+/**
+ * @returns number
+ */
+testrequirednestedflatbufferLength():number {
+ var offset = this.bb!.__offset(this.bb_pos, 102);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns Uint8Array
+ */
+testrequirednestedflatbufferArray():Uint8Array|null {
+ var offset = this.bb!.__offset(this.bb_pos, 102);
+ 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 flatbuffers.Builder builder
*/
static startMonster(builder:flatbuffers.Builder) {
- builder.startObject(48);
+ builder.startObject(50);
};
/**
@@ -1846,7 +2277,7 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createInventoryVector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createInventoryVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
builder.startVector(1, data.length, 1);
for (var i = data.length - 1; i >= 0; i--) {
builder.addInt8(data[i]);
@@ -1981,7 +2412,7 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createTestnestedflatbufferVector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createTestnestedflatbufferVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
builder.startVector(1, data.length, 1);
for (var i = data.length - 1; i >= 0; i--) {
builder.addInt8(data[i]);
@@ -2188,7 +2619,7 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createFlexVector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createFlexVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
builder.startVector(1, data.length, 1);
for (var i = data.length - 1; i >= 0; i--) {
builder.addInt8(data[i]);
@@ -2262,7 +2693,12 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Float64Array):flatbuffers.Offset;
+/**
+ * @deprecated This Uint8Array overload will be removed in the future.
+ */
+static createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;
+static createVectorOfDoublesVector(builder:flatbuffers.Builder, data:number[]|Float64Array|Uint8Array):flatbuffers.Offset {
builder.startVector(8, data.length, 8);
for (var i = data.length - 1; i >= 0; i--) {
builder.addFloat64(data[i]);
@@ -2518,6 +2954,43 @@
/**
* @param flatbuffers.Builder builder
+ * @param MyGame.Example.Race signedEnum
+ */
+static addSignedEnum(builder:flatbuffers.Builder, signedEnum:MyGame.Example.Race) {
+ builder.addFieldInt8(48, signedEnum, MyGame.Example.Race.None);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Offset testrequirednestedflatbufferOffset
+ */
+static addTestrequirednestedflatbuffer(builder:flatbuffers.Builder, testrequirednestedflatbufferOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(49, testrequirednestedflatbufferOffset, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param Array.<number> data
+ * @returns flatbuffers.Offset
+ */
+static createTestrequirednestedflatbufferVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
+ builder.startVector(1, data.length, 1);
+ for (var i = data.length - 1; i >= 0; i--) {
+ builder.addInt8(data[i]);
+ }
+ return builder.endVector();
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number numElems
+ */
+static startTestrequirednestedflatbufferVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(1, numElems, 1);
+};
+
+/**
+ * @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
static endMonster(builder:flatbuffers.Builder):flatbuffers.Offset {
@@ -2542,57 +3015,339 @@
builder.finish(offset, 'MONS', true);
};
-static createMonster(builder:flatbuffers.Builder, posOffset:flatbuffers.Offset, mana:number, hp:number, nameOffset:flatbuffers.Offset, inventoryOffset:flatbuffers.Offset, color:MyGame.Example.Color, testType:MyGame.Example.Any, testOffset:flatbuffers.Offset, test4Offset:flatbuffers.Offset, testarrayofstringOffset:flatbuffers.Offset, testarrayoftablesOffset:flatbuffers.Offset, enemyOffset:flatbuffers.Offset, testnestedflatbufferOffset:flatbuffers.Offset, testemptyOffset:flatbuffers.Offset, testbool:boolean, testhashs32Fnv1:number, testhashu32Fnv1:number, testhashs64Fnv1:flatbuffers.Long, testhashu64Fnv1:flatbuffers.Long, testhashs32Fnv1a:number, testhashu32Fnv1a:number, testhashs64Fnv1a:flatbuffers.Long, testhashu64Fnv1a:flatbuffers.Long, testarrayofboolsOffset:flatbuffers.Offset, testf:number, testf2:number, testf3:number, testarrayofstring2Offset:flatbuffers.Offset, testarrayofsortedstructOffset:flatbuffers.Offset, flexOffset:flatbuffers.Offset, test5Offset:flatbuffers.Offset, vectorOfLongsOffset:flatbuffers.Offset, vectorOfDoublesOffset:flatbuffers.Offset, parentNamespaceTestOffset:flatbuffers.Offset, vectorOfReferrablesOffset:flatbuffers.Offset, singleWeakReference:flatbuffers.Long, vectorOfWeakReferencesOffset:flatbuffers.Offset, vectorOfStrongReferrablesOffset:flatbuffers.Offset, coOwningReference:flatbuffers.Long, vectorOfCoOwningReferencesOffset:flatbuffers.Offset, nonOwningReference:flatbuffers.Long, vectorOfNonOwningReferencesOffset:flatbuffers.Offset, anyUniqueType:MyGame.Example.AnyUniqueAliases, anyUniqueOffset:flatbuffers.Offset, anyAmbiguousType:MyGame.Example.AnyAmbiguousAliases, anyAmbiguousOffset:flatbuffers.Offset, vectorOfEnumsOffset:flatbuffers.Offset):flatbuffers.Offset {
- Monster.startMonster(builder);
- Monster.addPos(builder, posOffset);
- Monster.addMana(builder, mana);
- Monster.addHp(builder, hp);
- Monster.addName(builder, nameOffset);
- Monster.addInventory(builder, inventoryOffset);
- Monster.addColor(builder, color);
- Monster.addTestType(builder, testType);
- Monster.addTest(builder, testOffset);
- Monster.addTest4(builder, test4Offset);
- Monster.addTestarrayofstring(builder, testarrayofstringOffset);
- Monster.addTestarrayoftables(builder, testarrayoftablesOffset);
- Monster.addEnemy(builder, enemyOffset);
- Monster.addTestnestedflatbuffer(builder, testnestedflatbufferOffset);
- Monster.addTestempty(builder, testemptyOffset);
- Monster.addTestbool(builder, testbool);
- Monster.addTesthashs32Fnv1(builder, testhashs32Fnv1);
- Monster.addTesthashu32Fnv1(builder, testhashu32Fnv1);
- Monster.addTesthashs64Fnv1(builder, testhashs64Fnv1);
- Monster.addTesthashu64Fnv1(builder, testhashu64Fnv1);
- Monster.addTesthashs32Fnv1a(builder, testhashs32Fnv1a);
- Monster.addTesthashu32Fnv1a(builder, testhashu32Fnv1a);
- Monster.addTesthashs64Fnv1a(builder, testhashs64Fnv1a);
- Monster.addTesthashu64Fnv1a(builder, testhashu64Fnv1a);
- Monster.addTestarrayofbools(builder, testarrayofboolsOffset);
- Monster.addTestf(builder, testf);
- Monster.addTestf2(builder, testf2);
- Monster.addTestf3(builder, testf3);
- Monster.addTestarrayofstring2(builder, testarrayofstring2Offset);
- Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstructOffset);
- Monster.addFlex(builder, flexOffset);
- Monster.addTest5(builder, test5Offset);
- Monster.addVectorOfLongs(builder, vectorOfLongsOffset);
- Monster.addVectorOfDoubles(builder, vectorOfDoublesOffset);
- Monster.addParentNamespaceTest(builder, parentNamespaceTestOffset);
- Monster.addVectorOfReferrables(builder, vectorOfReferrablesOffset);
- Monster.addSingleWeakReference(builder, singleWeakReference);
- Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferencesOffset);
- Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrablesOffset);
- Monster.addCoOwningReference(builder, coOwningReference);
- Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferencesOffset);
- Monster.addNonOwningReference(builder, nonOwningReference);
- Monster.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferencesOffset);
- Monster.addAnyUniqueType(builder, anyUniqueType);
- Monster.addAnyUnique(builder, anyUniqueOffset);
- Monster.addAnyAmbiguousType(builder, anyAmbiguousType);
- Monster.addAnyAmbiguous(builder, anyAmbiguousOffset);
- Monster.addVectorOfEnums(builder, vectorOfEnumsOffset);
- return Monster.endMonster(builder);
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
}
+
+static deserialize(buffer: Uint8Array):Monster {
+ return Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns MonsterT
+ */
+unpack(): MonsterT {
+ return new MonsterT(
+ (this.pos() !== null ? this.pos()!.unpack() : null),
+ this.mana(),
+ this.hp(),
+ this.name(),
+ this.bb!.createScalarList(this.inventory.bind(this), this.inventoryLength()),
+ this.color(),
+ this.testType(),
+ (() => {
+ let temp = MyGame.Example.unionToAny(this.testType(), this.test.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })(),
+ this.bb!.createObjList(this.test4.bind(this), this.test4Length()),
+ this.bb!.createStringList(this.testarrayofstring.bind(this), this.testarrayofstringLength()),
+ this.bb!.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength()),
+ (this.enemy() !== null ? this.enemy()!.unpack() : null),
+ this.bb!.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength()),
+ (this.testempty() !== null ? this.testempty()!.unpack() : null),
+ this.testbool(),
+ this.testhashs32Fnv1(),
+ this.testhashu32Fnv1(),
+ this.testhashs64Fnv1(),
+ this.testhashu64Fnv1(),
+ this.testhashs32Fnv1a(),
+ this.testhashu32Fnv1a(),
+ this.testhashs64Fnv1a(),
+ this.testhashu64Fnv1a(),
+ this.bb!.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength()),
+ this.testf(),
+ this.testf2(),
+ this.testf3(),
+ this.bb!.createStringList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length()),
+ this.bb!.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength()),
+ this.bb!.createScalarList(this.flex.bind(this), this.flexLength()),
+ this.bb!.createObjList(this.test5.bind(this), this.test5Length()),
+ this.bb!.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength()),
+ this.bb!.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength()),
+ (this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null),
+ this.bb!.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength()),
+ this.singleWeakReference(),
+ this.bb!.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength()),
+ this.bb!.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength()),
+ this.coOwningReference(),
+ this.bb!.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength()),
+ this.nonOwningReference(),
+ this.bb!.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength()),
+ this.anyUniqueType(),
+ (() => {
+ let temp = MyGame.Example.unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })(),
+ this.anyAmbiguousType(),
+ (() => {
+ let temp = MyGame.Example.unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })(),
+ this.bb!.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength()),
+ this.signedEnum(),
+ this.bb!.createScalarList(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength())
+ );
+};
+
+/**
+ * @param MonsterT _o
+ */
+unpackTo(_o: MonsterT): void {
+ _o.pos = (this.pos() !== null ? this.pos()!.unpack() : null);
+ _o.mana = this.mana();
+ _o.hp = this.hp();
+ _o.name = this.name();
+ _o.inventory = this.bb!.createScalarList(this.inventory.bind(this), this.inventoryLength());
+ _o.color = this.color();
+ _o.testType = this.testType();
+ _o.test = (() => {
+ let temp = MyGame.Example.unionToAny(this.testType(), this.test.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })();
+ _o.test4 = this.bb!.createObjList(this.test4.bind(this), this.test4Length());
+ _o.testarrayofstring = this.bb!.createStringList(this.testarrayofstring.bind(this), this.testarrayofstringLength());
+ _o.testarrayoftables = this.bb!.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength());
+ _o.enemy = (this.enemy() !== null ? this.enemy()!.unpack() : null);
+ _o.testnestedflatbuffer = this.bb!.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength());
+ _o.testempty = (this.testempty() !== null ? this.testempty()!.unpack() : null);
+ _o.testbool = this.testbool();
+ _o.testhashs32Fnv1 = this.testhashs32Fnv1();
+ _o.testhashu32Fnv1 = this.testhashu32Fnv1();
+ _o.testhashs64Fnv1 = this.testhashs64Fnv1();
+ _o.testhashu64Fnv1 = this.testhashu64Fnv1();
+ _o.testhashs32Fnv1a = this.testhashs32Fnv1a();
+ _o.testhashu32Fnv1a = this.testhashu32Fnv1a();
+ _o.testhashs64Fnv1a = this.testhashs64Fnv1a();
+ _o.testhashu64Fnv1a = this.testhashu64Fnv1a();
+ _o.testarrayofbools = this.bb!.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength());
+ _o.testf = this.testf();
+ _o.testf2 = this.testf2();
+ _o.testf3 = this.testf3();
+ _o.testarrayofstring2 = this.bb!.createStringList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length());
+ _o.testarrayofsortedstruct = this.bb!.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength());
+ _o.flex = this.bb!.createScalarList(this.flex.bind(this), this.flexLength());
+ _o.test5 = this.bb!.createObjList(this.test5.bind(this), this.test5Length());
+ _o.vectorOfLongs = this.bb!.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength());
+ _o.vectorOfDoubles = this.bb!.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength());
+ _o.parentNamespaceTest = (this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null);
+ _o.vectorOfReferrables = this.bb!.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength());
+ _o.singleWeakReference = this.singleWeakReference();
+ _o.vectorOfWeakReferences = this.bb!.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength());
+ _o.vectorOfStrongReferrables = this.bb!.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength());
+ _o.coOwningReference = this.coOwningReference();
+ _o.vectorOfCoOwningReferences = this.bb!.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength());
+ _o.nonOwningReference = this.nonOwningReference();
+ _o.vectorOfNonOwningReferences = this.bb!.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength());
+ _o.anyUniqueType = this.anyUniqueType();
+ _o.anyUnique = (() => {
+ let temp = MyGame.Example.unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })();
+ _o.anyAmbiguousType = this.anyAmbiguousType();
+ _o.anyAmbiguous = (() => {
+ let temp = MyGame.Example.unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));
+ if(temp === null) { return null; }
+ return temp.unpack()
+ })();
+ _o.vectorOfEnums = this.bb!.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength());
+ _o.signedEnum = this.signedEnum();
+ _o.testrequirednestedflatbuffer = this.bb!.createScalarList(this.testrequirednestedflatbuffer.bind(this), this.testrequirednestedflatbufferLength());
+};
+}
+
+export class MonsterT {
+/**
+ * @constructor
+ * @param MyGame.Example.Vec3T|null pos
+ * @param number mana
+ * @param number hp
+ * @param string|Uint8Array|null name
+ * @param (number)[] inventory
+ * @param MyGame.Example.Color color
+ * @param MyGame.Example.Any testType
+ * @param MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null test
+ * @param (MyGame.Example.TestT)[] test4
+ * @param (string)[] testarrayofstring
+ * @param (MyGame.Example.MonsterT)[] testarrayoftables
+ * @param MyGame.Example.MonsterT|null enemy
+ * @param (number)[] testnestedflatbuffer
+ * @param MyGame.Example.StatT|null testempty
+ * @param boolean testbool
+ * @param number testhashs32Fnv1
+ * @param number testhashu32Fnv1
+ * @param flatbuffers.Long testhashs64Fnv1
+ * @param flatbuffers.Long testhashu64Fnv1
+ * @param number testhashs32Fnv1a
+ * @param number testhashu32Fnv1a
+ * @param flatbuffers.Long testhashs64Fnv1a
+ * @param flatbuffers.Long testhashu64Fnv1a
+ * @param (boolean)[] testarrayofbools
+ * @param number testf
+ * @param number testf2
+ * @param number testf3
+ * @param (string)[] testarrayofstring2
+ * @param (MyGame.Example.AbilityT)[] testarrayofsortedstruct
+ * @param (number)[] flex
+ * @param (MyGame.Example.TestT)[] test5
+ * @param (flatbuffers.Long)[] vectorOfLongs
+ * @param (number)[] vectorOfDoubles
+ * @param MyGame.InParentNamespaceT|null parentNamespaceTest
+ * @param (MyGame.Example.ReferrableT)[] vectorOfReferrables
+ * @param flatbuffers.Long singleWeakReference
+ * @param (flatbuffers.Long)[] vectorOfWeakReferences
+ * @param (MyGame.Example.ReferrableT)[] vectorOfStrongReferrables
+ * @param flatbuffers.Long coOwningReference
+ * @param (flatbuffers.Long)[] vectorOfCoOwningReferences
+ * @param flatbuffers.Long nonOwningReference
+ * @param (flatbuffers.Long)[] vectorOfNonOwningReferences
+ * @param MyGame.Example.AnyUniqueAliases anyUniqueType
+ * @param MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null anyUnique
+ * @param MyGame.Example.AnyAmbiguousAliases anyAmbiguousType
+ * @param MyGame.Example.MonsterT|null anyAmbiguous
+ * @param (MyGame.Example.Color)[] vectorOfEnums
+ * @param MyGame.Example.Race signedEnum
+ * @param (number)[] testrequirednestedflatbuffer
+ */
+constructor(
+ public pos: MyGame.Example.Vec3T|null = null,
+ public mana: number = 150,
+ public hp: number = 100,
+ public name: string|Uint8Array|null = null,
+ public inventory: (number)[] = [],
+ public color: MyGame.Example.Color = MyGame.Example.Color.Blue,
+ public testType: MyGame.Example.Any = MyGame.Example.Any.NONE,
+ public test: MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null = null,
+ public test4: (MyGame.Example.TestT)[] = [],
+ public testarrayofstring: (string)[] = [],
+ public testarrayoftables: (MyGame.Example.MonsterT)[] = [],
+ public enemy: MyGame.Example.MonsterT|null = null,
+ public testnestedflatbuffer: (number)[] = [],
+ public testempty: MyGame.Example.StatT|null = null,
+ public testbool: boolean = false,
+ public testhashs32Fnv1: number = 0,
+ public testhashu32Fnv1: number = 0,
+ public testhashs64Fnv1: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public testhashu64Fnv1: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public testhashs32Fnv1a: number = 0,
+ public testhashu32Fnv1a: number = 0,
+ public testhashs64Fnv1a: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public testhashu64Fnv1a: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public testarrayofbools: (boolean)[] = [],
+ public testf: number = 3.14159,
+ public testf2: number = 3.0,
+ public testf3: number = 0.0,
+ public testarrayofstring2: (string)[] = [],
+ public testarrayofsortedstruct: (MyGame.Example.AbilityT)[] = [],
+ public flex: (number)[] = [],
+ public test5: (MyGame.Example.TestT)[] = [],
+ public vectorOfLongs: (flatbuffers.Long)[] = [],
+ public vectorOfDoubles: (number)[] = [],
+ public parentNamespaceTest: MyGame.InParentNamespaceT|null = null,
+ public vectorOfReferrables: (MyGame.Example.ReferrableT)[] = [],
+ public singleWeakReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public vectorOfWeakReferences: (flatbuffers.Long)[] = [],
+ public vectorOfStrongReferrables: (MyGame.Example.ReferrableT)[] = [],
+ public coOwningReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public vectorOfCoOwningReferences: (flatbuffers.Long)[] = [],
+ public nonOwningReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public vectorOfNonOwningReferences: (flatbuffers.Long)[] = [],
+ public anyUniqueType: MyGame.Example.AnyUniqueAliases = MyGame.Example.AnyUniqueAliases.NONE,
+ public anyUnique: MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null = null,
+ public anyAmbiguousType: MyGame.Example.AnyAmbiguousAliases = MyGame.Example.AnyAmbiguousAliases.NONE,
+ public anyAmbiguous: MyGame.Example.MonsterT|null = null,
+ public vectorOfEnums: (MyGame.Example.Color)[] = [],
+ public signedEnum: MyGame.Example.Race = MyGame.Example.Race.None,
+ public testrequirednestedflatbuffer: (number)[] = []
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ const name = (this.name !== null ? builder.createString(this.name!) : 0);
+ const inventory = MyGame.Example.Monster.createInventoryVector(builder, this.inventory);
+ const test = builder.createObjectOffset(this.test);
+ const test4 = builder.createStructOffsetList(this.test4, MyGame.Example.Monster.startTest4Vector);
+ const testarrayofstring = MyGame.Example.Monster.createTestarrayofstringVector(builder, builder.createObjectOffsetList(this.testarrayofstring));
+ const testarrayoftables = MyGame.Example.Monster.createTestarrayoftablesVector(builder, builder.createObjectOffsetList(this.testarrayoftables));
+ const testnestedflatbuffer = MyGame.Example.Monster.createTestnestedflatbufferVector(builder, this.testnestedflatbuffer);
+ const testarrayofbools = MyGame.Example.Monster.createTestarrayofboolsVector(builder, this.testarrayofbools);
+ const testarrayofstring2 = MyGame.Example.Monster.createTestarrayofstring2Vector(builder, builder.createObjectOffsetList(this.testarrayofstring2));
+ const testarrayofsortedstruct = builder.createStructOffsetList(this.testarrayofsortedstruct, MyGame.Example.Monster.startTestarrayofsortedstructVector);
+ const flex = MyGame.Example.Monster.createFlexVector(builder, this.flex);
+ const test5 = builder.createStructOffsetList(this.test5, MyGame.Example.Monster.startTest5Vector);
+ const vectorOfLongs = MyGame.Example.Monster.createVectorOfLongsVector(builder, this.vectorOfLongs);
+ const vectorOfDoubles = MyGame.Example.Monster.createVectorOfDoublesVector(builder, this.vectorOfDoubles);
+ const vectorOfReferrables = MyGame.Example.Monster.createVectorOfReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfReferrables));
+ const vectorOfWeakReferences = MyGame.Example.Monster.createVectorOfWeakReferencesVector(builder, this.vectorOfWeakReferences);
+ const vectorOfStrongReferrables = MyGame.Example.Monster.createVectorOfStrongReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfStrongReferrables));
+ const vectorOfCoOwningReferences = MyGame.Example.Monster.createVectorOfCoOwningReferencesVector(builder, this.vectorOfCoOwningReferences);
+ const vectorOfNonOwningReferences = MyGame.Example.Monster.createVectorOfNonOwningReferencesVector(builder, this.vectorOfNonOwningReferences);
+ const anyUnique = builder.createObjectOffset(this.anyUnique);
+ const anyAmbiguous = builder.createObjectOffset(this.anyAmbiguous);
+ const vectorOfEnums = MyGame.Example.Monster.createVectorOfEnumsVector(builder, this.vectorOfEnums);
+ const testrequirednestedflatbuffer = MyGame.Example.Monster.createTestrequirednestedflatbufferVector(builder, this.testrequirednestedflatbuffer);
+
+ MyGame.Example.Monster.start(builder);
+ MyGame.Example.Monster.addPos(builder, (this.pos !== null ? this.pos!.pack(builder) : 0));
+ MyGame.Example.Monster.addMana(builder, this.mana);
+ MyGame.Example.Monster.addHp(builder, this.hp);
+ MyGame.Example.Monster.addName(builder, name);
+ MyGame.Example.Monster.addInventory(builder, inventory);
+ MyGame.Example.Monster.addColor(builder, this.color);
+ MyGame.Example.Monster.addTestType(builder, this.testType);
+ MyGame.Example.Monster.addTest(builder, test);
+ MyGame.Example.Monster.addTest4(builder, test4);
+ MyGame.Example.Monster.addTestarrayofstring(builder, testarrayofstring);
+ MyGame.Example.Monster.addTestarrayoftables(builder, testarrayoftables);
+ MyGame.Example.Monster.addEnemy(builder, (this.enemy !== null ? this.enemy!.pack(builder) : 0));
+ MyGame.Example.Monster.addTestnestedflatbuffer(builder, testnestedflatbuffer);
+ MyGame.Example.Monster.addTestempty(builder, (this.testempty !== null ? this.testempty!.pack(builder) : 0));
+ MyGame.Example.Monster.addTestbool(builder, this.testbool);
+ MyGame.Example.Monster.addTesthashs32Fnv1(builder, this.testhashs32Fnv1);
+ MyGame.Example.Monster.addTesthashu32Fnv1(builder, this.testhashu32Fnv1);
+ MyGame.Example.Monster.addTesthashs64Fnv1(builder, this.testhashs64Fnv1);
+ MyGame.Example.Monster.addTesthashu64Fnv1(builder, this.testhashu64Fnv1);
+ MyGame.Example.Monster.addTesthashs32Fnv1a(builder, this.testhashs32Fnv1a);
+ MyGame.Example.Monster.addTesthashu32Fnv1a(builder, this.testhashu32Fnv1a);
+ MyGame.Example.Monster.addTesthashs64Fnv1a(builder, this.testhashs64Fnv1a);
+ MyGame.Example.Monster.addTesthashu64Fnv1a(builder, this.testhashu64Fnv1a);
+ MyGame.Example.Monster.addTestarrayofbools(builder, testarrayofbools);
+ MyGame.Example.Monster.addTestf(builder, this.testf);
+ MyGame.Example.Monster.addTestf2(builder, this.testf2);
+ MyGame.Example.Monster.addTestf3(builder, this.testf3);
+ MyGame.Example.Monster.addTestarrayofstring2(builder, testarrayofstring2);
+ MyGame.Example.Monster.addTestarrayofsortedstruct(builder, testarrayofsortedstruct);
+ MyGame.Example.Monster.addFlex(builder, flex);
+ MyGame.Example.Monster.addTest5(builder, test5);
+ MyGame.Example.Monster.addVectorOfLongs(builder, vectorOfLongs);
+ MyGame.Example.Monster.addVectorOfDoubles(builder, vectorOfDoubles);
+ MyGame.Example.Monster.addParentNamespaceTest(builder, (this.parentNamespaceTest !== null ? this.parentNamespaceTest!.pack(builder) : 0));
+ MyGame.Example.Monster.addVectorOfReferrables(builder, vectorOfReferrables);
+ MyGame.Example.Monster.addSingleWeakReference(builder, this.singleWeakReference);
+ MyGame.Example.Monster.addVectorOfWeakReferences(builder, vectorOfWeakReferences);
+ MyGame.Example.Monster.addVectorOfStrongReferrables(builder, vectorOfStrongReferrables);
+ MyGame.Example.Monster.addCoOwningReference(builder, this.coOwningReference);
+ MyGame.Example.Monster.addVectorOfCoOwningReferences(builder, vectorOfCoOwningReferences);
+ MyGame.Example.Monster.addNonOwningReference(builder, this.nonOwningReference);
+ MyGame.Example.Monster.addVectorOfNonOwningReferences(builder, vectorOfNonOwningReferences);
+ MyGame.Example.Monster.addAnyUniqueType(builder, this.anyUniqueType);
+ MyGame.Example.Monster.addAnyUnique(builder, anyUnique);
+ MyGame.Example.Monster.addAnyAmbiguousType(builder, this.anyAmbiguousType);
+ MyGame.Example.Monster.addAnyAmbiguous(builder, anyAmbiguous);
+ MyGame.Example.Monster.addVectorOfEnums(builder, vectorOfEnums);
+ MyGame.Example.Monster.addSignedEnum(builder, this.signedEnum);
+ MyGame.Example.Monster.addTestrequirednestedflatbuffer(builder, testrequirednestedflatbuffer);
+
+ return MyGame.Example.Monster.end(builder);
+};
}
}
/**
@@ -2620,7 +3375,7 @@
* @returns TypeAliases
*/
static getRootAsTypeAliases(bb:flatbuffers.ByteBuffer, obj?:TypeAliases):TypeAliases {
- return (obj || new TypeAliases).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -2629,7 +3384,8 @@
* @returns TypeAliases
*/
static getSizePrefixedRootAsTypeAliases(bb:flatbuffers.ByteBuffer, obj?:TypeAliases):TypeAliases {
- return (obj || new TypeAliases).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new TypeAliases()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -3012,7 +3768,12 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createV8Vector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createV8Vector(builder:flatbuffers.Builder, data:number[]|Int8Array):flatbuffers.Offset;
+/**
+ * @deprecated This Uint8Array overload will be removed in the future.
+ */
+static createV8Vector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;
+static createV8Vector(builder:flatbuffers.Builder, data:number[]|Int8Array|Uint8Array):flatbuffers.Offset {
builder.startVector(1, data.length, 1);
for (var i = data.length - 1; i >= 0; i--) {
builder.addInt8(data[i]);
@@ -3041,7 +3802,12 @@
* @param Array.<number> data
* @returns flatbuffers.Offset
*/
-static createVf64Vector(builder:flatbuffers.Builder, data:number[] | Uint8Array):flatbuffers.Offset {
+static createVf64Vector(builder:flatbuffers.Builder, data:number[]|Float64Array):flatbuffers.Offset;
+/**
+ * @deprecated This Uint8Array overload will be removed in the future.
+ */
+static createVf64Vector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;
+static createVf64Vector(builder:flatbuffers.Builder, data:number[]|Float64Array|Uint8Array):flatbuffers.Offset {
builder.startVector(8, data.length, 8);
for (var i = data.length - 1; i >= 0; i--) {
builder.addFloat64(data[i]);
@@ -3082,5 +3848,107 @@
TypeAliases.addVf64(builder, vf64Offset);
return TypeAliases.endTypeAliases(builder);
}
+
+serialize():Uint8Array {
+ return this.bb!.bytes();
+}
+
+static deserialize(buffer: Uint8Array):TypeAliases {
+ return TypeAliases.getRootAsTypeAliases(new flatbuffers.ByteBuffer(buffer))
+}
+
+/**
+ * @returns TypeAliasesT
+ */
+unpack(): TypeAliasesT {
+ return new TypeAliasesT(
+ this.i8(),
+ this.u8(),
+ this.i16(),
+ this.u16(),
+ this.i32(),
+ this.u32(),
+ this.i64(),
+ this.u64(),
+ this.f32(),
+ this.f64(),
+ this.bb!.createScalarList(this.v8.bind(this), this.v8Length()),
+ this.bb!.createScalarList(this.vf64.bind(this), this.vf64Length())
+ );
+};
+
+/**
+ * @param TypeAliasesT _o
+ */
+unpackTo(_o: TypeAliasesT): void {
+ _o.i8 = this.i8();
+ _o.u8 = this.u8();
+ _o.i16 = this.i16();
+ _o.u16 = this.u16();
+ _o.i32 = this.i32();
+ _o.u32 = this.u32();
+ _o.i64 = this.i64();
+ _o.u64 = this.u64();
+ _o.f32 = this.f32();
+ _o.f64 = this.f64();
+ _o.v8 = this.bb!.createScalarList(this.v8.bind(this), this.v8Length());
+ _o.vf64 = this.bb!.createScalarList(this.vf64.bind(this), this.vf64Length());
+};
+}
+
+export class TypeAliasesT {
+/**
+ * @constructor
+ * @param number i8
+ * @param number u8
+ * @param number i16
+ * @param number u16
+ * @param number i32
+ * @param number u32
+ * @param flatbuffers.Long i64
+ * @param flatbuffers.Long u64
+ * @param number f32
+ * @param number f64
+ * @param (number)[] v8
+ * @param (number)[] vf64
+ */
+constructor(
+ public i8: number = 0,
+ public u8: number = 0,
+ public i16: number = 0,
+ public u16: number = 0,
+ public i32: number = 0,
+ public u32: number = 0,
+ public i64: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public u64: flatbuffers.Long = flatbuffers.createLong(0, 0),
+ public f32: number = 0.0,
+ public f64: number = 0.0,
+ public v8: (number)[] = [],
+ public vf64: (number)[] = []
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ const v8 = MyGame.Example.TypeAliases.createV8Vector(builder, this.v8);
+ const vf64 = MyGame.Example.TypeAliases.createVf64Vector(builder, this.vf64);
+
+ return MyGame.Example.TypeAliases.createTypeAliases(builder,
+ this.i8,
+ this.u8,
+ this.i16,
+ this.u16,
+ this.i32,
+ this.u32,
+ this.i64,
+ this.u64,
+ this.f32,
+ this.f64,
+ v8,
+ vf64
+ );
+};
}
}
diff --git a/tests/monster_test_grpc.d.ts b/tests/monster_test_grpc.d.ts
new file mode 100644
index 0000000..128c602
--- /dev/null
+++ b/tests/monster_test_grpc.d.ts
@@ -0,0 +1,92 @@
+// Generated GRPC code for FlatBuffers TS *** DO NOT EDIT ***
+import { flatbuffers } from 'flatbuffers';
+import * as MonsterStorage_fbs from './monster_test_generated';
+
+import * as grpc from 'grpc';
+
+interface IMonsterStorageService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {
+ Store: IMonsterStorageService_IStore;
+ Retrieve: IMonsterStorageService_IRetrieve;
+ GetMaxHitPoint: IMonsterStorageService_IGetMaxHitPoint;
+ GetMinMaxHitPoints: IMonsterStorageService_IGetMinMaxHitPoints;
+}
+interface IMonsterStorageService_IStore extends grpc.MethodDefinition<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat> {
+ path: string; // /MyGame.Example.MonsterStorage/Store
+ requestStream: boolean; // false
+ responseStream: boolean; // false
+ requestSerialize: grpc.serialize<MonsterStorage_fbs.Monster>;
+ requestDeserialize: grpc.deserialize<MonsterStorage_fbs.Monster>;
+ responseSerialize: grpc.serialize<MonsterStorage_fbs.Stat>;
+ responseDeserialize: grpc.deserialize<MonsterStorage_fbs.Stat>;
+}
+
+interface IMonsterStorageService_IRetrieve extends grpc.MethodDefinition<MonsterStorage_fbs.Stat, MonsterStorage_fbs.Monster> {
+ path: string; // /MyGame.Example.MonsterStorage/Retrieve
+ requestStream: boolean; // false
+ responseStream: boolean; // true
+ requestSerialize: grpc.serialize<MonsterStorage_fbs.Stat>;
+ requestDeserialize: grpc.deserialize<MonsterStorage_fbs.Stat>;
+ responseSerialize: grpc.serialize<MonsterStorage_fbs.Monster>;
+ responseDeserialize: grpc.deserialize<MonsterStorage_fbs.Monster>;
+}
+
+interface IMonsterStorageService_IGetMaxHitPoint extends grpc.MethodDefinition<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat> {
+ path: string; // /MyGame.Example.MonsterStorage/GetMaxHitPoint
+ requestStream: boolean; // true
+ responseStream: boolean; // false
+ requestSerialize: grpc.serialize<MonsterStorage_fbs.Monster>;
+ requestDeserialize: grpc.deserialize<MonsterStorage_fbs.Monster>;
+ responseSerialize: grpc.serialize<MonsterStorage_fbs.Stat>;
+ responseDeserialize: grpc.deserialize<MonsterStorage_fbs.Stat>;
+}
+
+interface IMonsterStorageService_IGetMinMaxHitPoints extends grpc.MethodDefinition<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat> {
+ path: string; // /MyGame.Example.MonsterStorage/GetMinMaxHitPoints
+ requestStream: boolean; // true
+ responseStream: boolean; // true
+ requestSerialize: grpc.serialize<MonsterStorage_fbs.Monster>;
+ requestDeserialize: grpc.deserialize<MonsterStorage_fbs.Monster>;
+ responseSerialize: grpc.serialize<MonsterStorage_fbs.Stat>;
+ responseDeserialize: grpc.deserialize<MonsterStorage_fbs.Stat>;
+}
+
+
+export const MonsterStorageService: IMonsterStorageService;
+
+export interface IMonsterStorageServer {
+ Store: grpc.handleUnaryCall<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ Retrieve: grpc.handleServerStreamingCall<MonsterStorage_fbs.Stat, MonsterStorage_fbs.Monster>;
+ GetMaxHitPoint: grpc.handleClientStreamingCall<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ GetMinMaxHitPoints: grpc.handleBidiStreamingCall<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+}
+
+export interface IMonsterStorageClient {
+ Store(request: MonsterStorage_fbs.Monster, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ Store(request: MonsterStorage_fbs.Monster, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ Store(request: MonsterStorage_fbs.Monster, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ Retrieve(request: MonsterStorage_fbs.Stat, metadata: grpc.Metadata): grpc.ClientReadableStream<MonsterStorage_fbs.Monster>;
+ Retrieve(request: MonsterStorage_fbs.Stat, options: Partial<grpc.CallOptions>): grpc.ClientReadableStream<MonsterStorage_fbs.Monster>;
+ GetMaxHitPoint(callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ GetMaxHitPoint(metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ GetMaxHitPoint(options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ GetMaxHitPoint(metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ GetMinMaxHitPoints(): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ GetMinMaxHitPoints(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ GetMinMaxHitPoints(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+}
+
+export class MonsterStorageClient extends grpc.Client implements IMonsterStorageClient {
+ constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); public Store(request: MonsterStorage_fbs.Monster, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ public Store(request: MonsterStorage_fbs.Monster, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ public Store(request: MonsterStorage_fbs.Monster, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Stat) => void): grpc.ClientUnaryCall;
+ public Retrieve(request: MonsterStorage_fbs.Stat, metadata: grpc.Metadata): grpc.ClientReadableStream<MonsterStorage_fbs.Monster>;
+ public Retrieve(request: MonsterStorage_fbs.Stat, options: Partial<grpc.CallOptions>): grpc.ClientReadableStream<MonsterStorage_fbs.Monster>;
+ public GetMaxHitPoint(callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ public GetMaxHitPoint(metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ public GetMaxHitPoint(options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ public GetMaxHitPoint(metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: MonsterStorage_fbs.Monster) => void): grpc.ClientWritableStream<MonsterStorage_fbs.Stat>;
+ public GetMinMaxHitPoints(): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ public GetMinMaxHitPoints(options: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+ public GetMinMaxHitPoints(metadata: grpc.Metadata, options?: Partial<grpc.CallOptions>): grpc.ClientDuplexStream<MonsterStorage_fbs.Monster, MonsterStorage_fbs.Stat>;
+}
+
diff --git a/tests/monster_test_grpc.js b/tests/monster_test_grpc.js
new file mode 100644
index 0000000..c12d789
--- /dev/null
+++ b/tests/monster_test_grpc.js
@@ -0,0 +1,79 @@
+// Generated GRPC code for FlatBuffers TS *** DO NOT EDIT ***
+import { flatbuffers } from 'flatbuffers';
+import * as MonsterStorage_fbs from './monster_test_generated';
+
+var grpc = require('grpc');
+
+function serialize_Stat(buffer_args) {
+ if (!(buffer_args instanceof MonsterStorage_fbs.Stat)) {
+ throw new Error('Expected argument of type MonsterStorage_fbs.Stat');
+ }
+ return buffer_args.serialize();
+}
+
+function deserialize_Stat(buffer) {
+ return MonsterStorage_fbs.Stat.getRootAsStat(new flatbuffers.ByteBuffer(buffer))
+}
+
+
+function serialize_Monster(buffer_args) {
+ if (!(buffer_args instanceof MonsterStorage_fbs.Monster)) {
+ throw new Error('Expected argument of type MonsterStorage_fbs.Monster');
+ }
+ return buffer_args.serialize();
+}
+
+function deserialize_Monster(buffer) {
+ return MonsterStorage_fbs.Monster.getRootAsMonster(new flatbuffers.ByteBuffer(buffer))
+}
+
+
+
+
+var MonsterStorageService = exports.MonsterStorageService = {
+ Store: {
+ path: '/MyGame.Example.MonsterStorage/Store',
+ requestStream: false,
+ responseStream: false,
+ requestType: flatbuffers.ByteBuffer,
+ responseType: MonsterStorage_fbs.Stat,
+ requestSerialize: serialize_Monster,
+ requestDeserialize: deserialize_Monster,
+ responseSerialize: serialize_Stat,
+ responseDeserialize: deserialize_Stat,
+ },
+ Retrieve: {
+ path: '/MyGame.Example.MonsterStorage/Retrieve',
+ requestStream: false,
+ responseStream: true,
+ requestType: flatbuffers.ByteBuffer,
+ responseType: MonsterStorage_fbs.Monster,
+ requestSerialize: serialize_Stat,
+ requestDeserialize: deserialize_Stat,
+ responseSerialize: serialize_Monster,
+ responseDeserialize: deserialize_Monster,
+ },
+ GetMaxHitPoint: {
+ path: '/MyGame.Example.MonsterStorage/GetMaxHitPoint',
+ requestStream: true,
+ responseStream: false,
+ requestType: flatbuffers.ByteBuffer,
+ responseType: MonsterStorage_fbs.Stat,
+ requestSerialize: serialize_Monster,
+ requestDeserialize: deserialize_Monster,
+ responseSerialize: serialize_Stat,
+ responseDeserialize: deserialize_Stat,
+ },
+ GetMinMaxHitPoints: {
+ path: '/MyGame.Example.MonsterStorage/GetMinMaxHitPoints',
+ requestStream: true,
+ responseStream: true,
+ requestType: flatbuffers.ByteBuffer,
+ responseType: MonsterStorage_fbs.Stat,
+ requestSerialize: serialize_Monster,
+ requestDeserialize: deserialize_Monster,
+ responseSerialize: serialize_Stat,
+ responseDeserialize: deserialize_Stat,
+ },
+};
+exports.MonsterStorageClient = grpc.makeGenericClientConstructor(MonsterStorageService);
diff --git a/tests/monster_test_my_game.example_generated.dart b/tests/monster_test_my_game.example_generated.dart
index 13b7f4a..fa8f1ca 100644
--- a/tests/monster_test_my_game.example_generated.dart
+++ b/tests/monster_test_my_game.example_generated.dart
@@ -32,7 +32,7 @@
/// \brief color Blue (1u << 3)
static const Color Blue = const Color._(8);
- static get values => {1: Red,2: Green,8: Blue,};
+ static const values = {1: Red,2: Green,8: Blue,};
static const fb.Reader<Color> reader = const _ColorReader();
@@ -53,6 +53,47 @@
new Color.fromValue(const fb.Uint8Reader().read(bc, offset));
}
+class Race {
+ final int value;
+ const Race._(this.value);
+
+ factory Race.fromValue(int value) {
+ if (value == null) value = 0;
+ if (!values.containsKey(value)) {
+ throw new StateError('Invalid value $value for bit flag enum Race');
+ }
+ return values[value];
+ }
+
+ static const int minValue = -1;
+ static const int maxValue = 2;
+ static bool containsValue(int value) => values.containsKey(value);
+
+ static const Race None = const Race._(-1);
+ static const Race Human = const Race._(0);
+ static const Race Dwarf = const Race._(1);
+ static const Race Elf = const Race._(2);
+ static const values = {-1: None,0: Human,1: Dwarf,2: Elf,};
+
+ static const fb.Reader<Race> reader = const _RaceReader();
+
+ @override
+ String toString() {
+ return 'Race{value: $value}';
+ }
+}
+
+class _RaceReader extends fb.Reader<Race> {
+ const _RaceReader();
+
+ @override
+ int get size => 1;
+
+ @override
+ Race read(fb.BufferContext bc, int offset) =>
+ new Race.fromValue(const fb.Int8Reader().read(bc, offset));
+}
+
class AnyTypeId {
final int value;
const AnyTypeId._(this.value);
@@ -73,7 +114,7 @@
static const AnyTypeId Monster = const AnyTypeId._(1);
static const AnyTypeId TestSimpleTableWithEnum = const AnyTypeId._(2);
static const AnyTypeId MyGame_Example2_Monster = const AnyTypeId._(3);
- static get values => {0: NONE,1: Monster,2: TestSimpleTableWithEnum,3: MyGame_Example2_Monster,};
+ static const values = {0: NONE,1: Monster,2: TestSimpleTableWithEnum,3: MyGame_Example2_Monster,};
static const fb.Reader<AnyTypeId> reader = const _AnyTypeIdReader();
@@ -114,7 +155,7 @@
static const AnyUniqueAliasesTypeId M = const AnyUniqueAliasesTypeId._(1);
static const AnyUniqueAliasesTypeId TS = const AnyUniqueAliasesTypeId._(2);
static const AnyUniqueAliasesTypeId M2 = const AnyUniqueAliasesTypeId._(3);
- static get values => {0: NONE,1: M,2: TS,3: M2,};
+ static const values = {0: NONE,1: M,2: TS,3: M2,};
static const fb.Reader<AnyUniqueAliasesTypeId> reader = const _AnyUniqueAliasesTypeIdReader();
@@ -155,7 +196,7 @@
static const AnyAmbiguousAliasesTypeId M1 = const AnyAmbiguousAliasesTypeId._(1);
static const AnyAmbiguousAliasesTypeId M2 = const AnyAmbiguousAliasesTypeId._(2);
static const AnyAmbiguousAliasesTypeId M3 = const AnyAmbiguousAliasesTypeId._(3);
- static get values => {0: NONE,1: M1,2: M2,3: M3,};
+ static const values = {0: NONE,1: M1,2: M2,3: M3,};
static const fb.Reader<AnyAmbiguousAliasesTypeId> reader = const _AnyAmbiguousAliasesTypeIdReader();
@@ -676,7 +717,7 @@
return fbBuilder.finish(offset, fileIdentifier);
}
}
-/// an example documentation comment: monster object
+/// an example documentation comment: "monster object"
class Monster {
Monster._(this._bc, this._bcOffset);
factory Monster(List<int> bytes) {
@@ -743,26 +784,28 @@
AnyUniqueAliasesTypeId get anyUniqueType => new AnyUniqueAliasesTypeId.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 90, 0));
dynamic get anyUnique {
switch (anyUniqueType?.value) {
- case 1: return M.reader.vTableGet(_bc, _bcOffset, 92, null);
- case 2: return TS.reader.vTableGet(_bc, _bcOffset, 92, null);
- case 3: return M2.reader.vTableGet(_bc, _bcOffset, 92, null);
+ case 1: return Monster.reader.vTableGet(_bc, _bcOffset, 92, null);
+ case 2: return TestSimpleTableWithEnum.reader.vTableGet(_bc, _bcOffset, 92, null);
+ case 3: return my_game_example2.Monster.reader.vTableGet(_bc, _bcOffset, 92, null);
default: return null;
}
}
AnyAmbiguousAliasesTypeId get anyAmbiguousType => new AnyAmbiguousAliasesTypeId.fromValue(const fb.Uint8Reader().vTableGet(_bc, _bcOffset, 94, 0));
dynamic get anyAmbiguous {
switch (anyAmbiguousType?.value) {
- case 1: return M1.reader.vTableGet(_bc, _bcOffset, 96, null);
- case 2: return M2.reader.vTableGet(_bc, _bcOffset, 96, null);
- case 3: return M3.reader.vTableGet(_bc, _bcOffset, 96, null);
+ case 1: return Monster.reader.vTableGet(_bc, _bcOffset, 96, null);
+ case 2: return Monster.reader.vTableGet(_bc, _bcOffset, 96, null);
+ case 3: return Monster.reader.vTableGet(_bc, _bcOffset, 96, null);
default: return null;
}
}
List<Color> get vectorOfEnums => const fb.ListReader<Color>(Color.reader).vTableGet(_bc, _bcOffset, 98, null);
+ Race get signedEnum => new Race.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 100, -1));
+ List<int> get testrequirednestedflatbuffer => const fb.ListReader<int>(const fb.Uint8Reader()).vTableGet(_bc, _bcOffset, 102, null);
@override
String toString() {
- return 'Monster{pos: $pos, mana: $mana, hp: $hp, name: $name, inventory: $inventory, color: $color, testType: $testType, test: $test, test4: $test4, testarrayofstring: $testarrayofstring, testarrayoftables: $testarrayoftables, enemy: $enemy, testnestedflatbuffer: $testnestedflatbuffer, testempty: $testempty, testbool: $testbool, testhashs32Fnv1: $testhashs32Fnv1, testhashu32Fnv1: $testhashu32Fnv1, testhashs64Fnv1: $testhashs64Fnv1, testhashu64Fnv1: $testhashu64Fnv1, testhashs32Fnv1a: $testhashs32Fnv1a, testhashu32Fnv1a: $testhashu32Fnv1a, testhashs64Fnv1a: $testhashs64Fnv1a, testhashu64Fnv1a: $testhashu64Fnv1a, testarrayofbools: $testarrayofbools, testf: $testf, testf2: $testf2, testf3: $testf3, testarrayofstring2: $testarrayofstring2, testarrayofsortedstruct: $testarrayofsortedstruct, flex: $flex, test5: $test5, vectorOfLongs: $vectorOfLongs, vectorOfDoubles: $vectorOfDoubles, parentNamespaceTest: $parentNamespaceTest, vectorOfReferrables: $vectorOfReferrables, singleWeakReference: $singleWeakReference, vectorOfWeakReferences: $vectorOfWeakReferences, vectorOfStrongReferrables: $vectorOfStrongReferrables, coOwningReference: $coOwningReference, vectorOfCoOwningReferences: $vectorOfCoOwningReferences, nonOwningReference: $nonOwningReference, vectorOfNonOwningReferences: $vectorOfNonOwningReferences, anyUniqueType: $anyUniqueType, anyUnique: $anyUnique, anyAmbiguousType: $anyAmbiguousType, anyAmbiguous: $anyAmbiguous, vectorOfEnums: $vectorOfEnums}';
+ return 'Monster{pos: $pos, mana: $mana, hp: $hp, name: $name, inventory: $inventory, color: $color, testType: $testType, test: $test, test4: $test4, testarrayofstring: $testarrayofstring, testarrayoftables: $testarrayoftables, enemy: $enemy, testnestedflatbuffer: $testnestedflatbuffer, testempty: $testempty, testbool: $testbool, testhashs32Fnv1: $testhashs32Fnv1, testhashu32Fnv1: $testhashu32Fnv1, testhashs64Fnv1: $testhashs64Fnv1, testhashu64Fnv1: $testhashu64Fnv1, testhashs32Fnv1a: $testhashs32Fnv1a, testhashu32Fnv1a: $testhashu32Fnv1a, testhashs64Fnv1a: $testhashs64Fnv1a, testhashu64Fnv1a: $testhashu64Fnv1a, testarrayofbools: $testarrayofbools, testf: $testf, testf2: $testf2, testf3: $testf3, testarrayofstring2: $testarrayofstring2, testarrayofsortedstruct: $testarrayofsortedstruct, flex: $flex, test5: $test5, vectorOfLongs: $vectorOfLongs, vectorOfDoubles: $vectorOfDoubles, parentNamespaceTest: $parentNamespaceTest, vectorOfReferrables: $vectorOfReferrables, singleWeakReference: $singleWeakReference, vectorOfWeakReferences: $vectorOfWeakReferences, vectorOfStrongReferrables: $vectorOfStrongReferrables, coOwningReference: $coOwningReference, vectorOfCoOwningReferences: $vectorOfCoOwningReferences, nonOwningReference: $nonOwningReference, vectorOfNonOwningReferences: $vectorOfNonOwningReferences, anyUniqueType: $anyUniqueType, anyUnique: $anyUnique, anyAmbiguousType: $anyAmbiguousType, anyAmbiguous: $anyAmbiguous, vectorOfEnums: $vectorOfEnums, signedEnum: $signedEnum, testrequirednestedflatbuffer: $testrequirednestedflatbuffer}';
}
}
@@ -973,6 +1016,14 @@
fbBuilder.addOffset(47, offset);
return fbBuilder.offset;
}
+ int addSignedEnum(Race signedEnum) {
+ fbBuilder.addInt8(48, signedEnum?.value);
+ return fbBuilder.offset;
+ }
+ int addTestrequirednestedflatbufferOffset(int offset) {
+ fbBuilder.addOffset(49, offset);
+ return fbBuilder.offset;
+ }
int finish() {
return fbBuilder.endTable();
@@ -1027,6 +1078,8 @@
final AnyAmbiguousAliasesTypeId _anyAmbiguousType;
final dynamic _anyAmbiguous;
final List<Color> _vectorOfEnums;
+ final Race _signedEnum;
+ final List<int> _testrequirednestedflatbuffer;
MonsterObjectBuilder({
Vec3ObjectBuilder pos,
@@ -1076,6 +1129,8 @@
AnyAmbiguousAliasesTypeId anyAmbiguousType,
dynamic anyAmbiguous,
List<Color> vectorOfEnums,
+ Race signedEnum,
+ List<int> testrequirednestedflatbuffer,
})
: _pos = pos,
_mana = mana,
@@ -1123,7 +1178,9 @@
_anyUnique = anyUnique,
_anyAmbiguousType = anyAmbiguousType,
_anyAmbiguous = anyAmbiguous,
- _vectorOfEnums = vectorOfEnums;
+ _vectorOfEnums = vectorOfEnums,
+ _signedEnum = signedEnum,
+ _testrequirednestedflatbuffer = testrequirednestedflatbuffer;
/// Finish building, and store into the [fbBuilder].
@override
@@ -1191,6 +1248,9 @@
final int vectorOfEnumsOffset = _vectorOfEnums?.isNotEmpty == true
? fbBuilder.writeListUint8(_vectorOfEnums.map((f) => f.value))
: null;
+ final int testrequirednestedflatbufferOffset = _testrequirednestedflatbuffer?.isNotEmpty == true
+ ? fbBuilder.writeListUint8(_testrequirednestedflatbuffer)
+ : null;
fbBuilder.startTable();
if (_pos != null) {
@@ -1292,6 +1352,10 @@
if (vectorOfEnumsOffset != null) {
fbBuilder.addOffset(47, vectorOfEnumsOffset);
}
+ fbBuilder.addInt8(48, _signedEnum?.value);
+ if (testrequirednestedflatbufferOffset != null) {
+ fbBuilder.addOffset(49, testrequirednestedflatbufferOffset);
+ }
return fbBuilder.endTable();
}
diff --git a/tests/monsterdata_test.json b/tests/monsterdata_test.json
index d3028b5..eb40080 100644
--- a/tests/monsterdata_test.json
+++ b/tests/monsterdata_test.json
@@ -4,7 +4,7 @@
y: "2",
z: 3,
test1: 3,
- test2: Green,
+ test2: "Green",
test3: {
a: 5,
b: 6
@@ -31,7 +31,7 @@
0,
1.7976931348623157e+308
],
- test_type: Monster,
+ test_type: "Monster",
test: {
name: "Fred",
pos: null
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.cs
index ff44023..bb17d7b 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/EnumInNestedNS.cs
@@ -5,6 +5,7 @@
namespace NamespaceA.NamespaceB
{
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum EnumInNestedNS : sbyte
{
A = 0,
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
index 9aba8db..6fa9dd3 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.cs
@@ -6,6 +6,7 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct StructInNestedNS : IFlatbufferObject
@@ -26,7 +27,36 @@
builder.PutInt(A);
return new Offset<NamespaceA.NamespaceB.StructInNestedNS>(builder.Offset);
}
+ public StructInNestedNST UnPack() {
+ var _o = new StructInNestedNST();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(StructInNestedNST _o) {
+ _o.A = this.A;
+ _o.B = this.B;
+ }
+ public static Offset<NamespaceA.NamespaceB.StructInNestedNS> Pack(FlatBufferBuilder builder, StructInNestedNST _o) {
+ if (_o == null) return default(Offset<NamespaceA.NamespaceB.StructInNestedNS>);
+ return CreateStructInNestedNS(
+ builder,
+ _o.A,
+ _o.B);
+ }
};
+public class StructInNestedNST
+{
+ [Newtonsoft.Json.JsonProperty("a")]
+ public int A { get; set; }
+ [Newtonsoft.Json.JsonProperty("b")]
+ public int B { get; set; }
+
+ public StructInNestedNST() {
+ this.A = 0;
+ this.B = 0;
+ }
+}
+
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.go b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.go
index e985fbf..854403f 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.go
+++ b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.go
@@ -6,6 +6,27 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type StructInNestedNST struct {
+ A int32
+ B int32
+}
+
+func (t *StructInNestedNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ return CreateStructInNestedNS(builder, t.A, t.B)
+}
+func (rcv *StructInNestedNS) UnPackTo(t *StructInNestedNST) {
+ t.A = rcv.A()
+ t.B = rcv.B()
+}
+
+func (rcv *StructInNestedNS) UnPack() *StructInNestedNST {
+ if rcv == nil { return nil }
+ t := &StructInNestedNST{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type StructInNestedNS struct {
_tab flatbuffers.Struct
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.java b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.java
index 284f89a..6505561 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.java
+++ b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.java
@@ -23,5 +23,12 @@
builder.putInt(a);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public StructInNestedNS get(int j) { return get(new StructInNestedNS(), j); }
+ public StructInNestedNS get(StructInNestedNS obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.py b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.py
index 59cceaa..f49495b 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.py
+++ b/tests/namespace_test/NamespaceA/NamespaceB/StructInNestedNS.py
@@ -3,10 +3,16 @@
# namespace: NamespaceB
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class StructInNestedNS(object):
__slots__ = ['_tab']
+ @classmethod
+ def SizeOf(cls):
+ return 8
+
# StructInNestedNS
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
@@ -21,3 +27,34 @@
builder.PrependInt32(b)
builder.PrependInt32(a)
return builder.Offset()
+
+
+class StructInNestedNST(object):
+
+ # StructInNestedNST
+ def __init__(self):
+ self.a = 0 # type: int
+ self.b = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ structInNestedNS = StructInNestedNS()
+ structInNestedNS.Init(buf, pos)
+ return cls.InitFromObj(structInNestedNS)
+
+ @classmethod
+ def InitFromObj(cls, structInNestedNS):
+ x = StructInNestedNST()
+ x._UnPack(structInNestedNS)
+ return x
+
+ # StructInNestedNST
+ def _UnPack(self, structInNestedNS):
+ if structInNestedNS is None:
+ return
+ self.a = structInNestedNS.A()
+ self.b = structInNestedNS.B()
+
+ # StructInNestedNST
+ def Pack(self, builder):
+ return CreateStructInNestedNS(builder, self.a, self.b)
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
index f8ea32b..cdbf6f8 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct TableInNestedNS : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb) { return GetRootAsTableInNestedNS(_bb, new TableInNestedNS()); }
public static TableInNestedNS GetRootAsTableInNestedNS(ByteBuffer _bb, TableInNestedNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -34,7 +35,31 @@
int o = builder.EndTable();
return new Offset<NamespaceA.NamespaceB.TableInNestedNS>(o);
}
+ public TableInNestedNST UnPack() {
+ var _o = new TableInNestedNST();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TableInNestedNST _o) {
+ _o.Foo = this.Foo;
+ }
+ public static Offset<NamespaceA.NamespaceB.TableInNestedNS> Pack(FlatBufferBuilder builder, TableInNestedNST _o) {
+ if (_o == null) return default(Offset<NamespaceA.NamespaceB.TableInNestedNS>);
+ return CreateTableInNestedNS(
+ builder,
+ _o.Foo);
+ }
};
+public class TableInNestedNST
+{
+ [Newtonsoft.Json.JsonProperty("foo")]
+ public int Foo { get; set; }
+
+ public TableInNestedNST() {
+ this.Foo = 0;
+ }
+}
+
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.go b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.go
index 75f7a55..3782645 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.go
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.go
@@ -6,6 +6,28 @@
flatbuffers "github.com/google/flatbuffers/go"
)
+type TableInNestedNST struct {
+ Foo int32
+}
+
+func (t *TableInNestedNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ TableInNestedNSStart(builder)
+ TableInNestedNSAddFoo(builder, t.Foo)
+ return TableInNestedNSEnd(builder)
+}
+
+func (rcv *TableInNestedNS) UnPackTo(t *TableInNestedNST) {
+ t.Foo = rcv.Foo()
+}
+
+func (rcv *TableInNestedNS) UnPack() *TableInNestedNST {
+ if rcv == nil { return nil }
+ t := &TableInNestedNST{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type TableInNestedNS struct {
_tab flatbuffers.Table
}
@@ -17,6 +39,13 @@
return x
}
+func GetSizePrefixedRootAsTableInNestedNS(buf []byte, offset flatbuffers.UOffsetT) *TableInNestedNS {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &TableInNestedNS{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *TableInNestedNS) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.java b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.java
index af1449b..b0931b1 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.java
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class TableInNestedNS extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static TableInNestedNS getRootAsTableInNestedNS(ByteBuffer _bb) { return getRootAsTableInNestedNS(_bb, new TableInNestedNS()); }
public static TableInNestedNS getRootAsTableInNestedNS(ByteBuffer _bb, TableInNestedNS obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -31,5 +31,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public TableInNestedNS get(int j) { return get(new TableInNestedNS(), j); }
+ public TableInNestedNS get(TableInNestedNS obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.kt b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.kt
index 59ebdc9..0fb2e3c 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.kt
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.kt
@@ -32,7 +32,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsTableInNestedNS(_bb: ByteBuffer): TableInNestedNS = getRootAsTableInNestedNS(_bb, TableInNestedNS())
fun getRootAsTableInNestedNS(_bb: ByteBuffer, obj: TableInNestedNS): TableInNestedNS {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.py b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.py
index d6d1674..e86ba63 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.py
+++ b/tests/namespace_test/NamespaceA/NamespaceB/TableInNestedNS.py
@@ -3,6 +3,8 @@
# namespace: NamespaceB
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class TableInNestedNS(object):
__slots__ = ['_tab']
@@ -28,3 +30,35 @@
def TableInNestedNSStart(builder): builder.StartObject(1)
def TableInNestedNSAddFoo(builder, foo): builder.PrependInt32Slot(0, foo, 0)
def TableInNestedNSEnd(builder): return builder.EndObject()
+
+
+class TableInNestedNST(object):
+
+ # TableInNestedNST
+ def __init__(self):
+ self.foo = 0 # type: int
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ tableInNestedNS = TableInNestedNS()
+ tableInNestedNS.Init(buf, pos)
+ return cls.InitFromObj(tableInNestedNS)
+
+ @classmethod
+ def InitFromObj(cls, tableInNestedNS):
+ x = TableInNestedNST()
+ x._UnPack(tableInNestedNS)
+ return x
+
+ # TableInNestedNST
+ def _UnPack(self, tableInNestedNS):
+ if tableInNestedNS is None:
+ return
+ self.foo = tableInNestedNS.Foo()
+
+ # TableInNestedNST
+ def Pack(self, builder):
+ TableInNestedNSStart(builder)
+ TableInNestedNSAddFoo(builder, self.foo)
+ tableInNestedNS = TableInNestedNSEnd(builder)
+ return tableInNestedNS
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.cs b/tests/namespace_test/NamespaceA/SecondTableInA.cs
index 7e08de8..a949c61 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.cs
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct SecondTableInA : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb) { return GetRootAsSecondTableInA(_bb, new SecondTableInA()); }
public static SecondTableInA GetRootAsSecondTableInA(ByteBuffer _bb, SecondTableInA obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -33,7 +34,32 @@
int o = builder.EndTable();
return new Offset<NamespaceA.SecondTableInA>(o);
}
+ public SecondTableInAT UnPack() {
+ var _o = new SecondTableInAT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(SecondTableInAT _o) {
+ _o.ReferToC = this.ReferToC.HasValue ? this.ReferToC.Value.UnPack() : null;
+ }
+ public static Offset<NamespaceA.SecondTableInA> Pack(FlatBufferBuilder builder, SecondTableInAT _o) {
+ if (_o == null) return default(Offset<NamespaceA.SecondTableInA>);
+ var _refer_to_c = _o.ReferToC == null ? default(Offset<NamespaceC.TableInC>) : NamespaceC.TableInC.Pack(builder, _o.ReferToC);
+ return CreateSecondTableInA(
+ builder,
+ _refer_to_c);
+ }
};
+public class SecondTableInAT
+{
+ [Newtonsoft.Json.JsonProperty("refer_to_c")]
+ public NamespaceC.TableInCT ReferToC { get; set; }
+
+ public SecondTableInAT() {
+ this.ReferToC = null;
+ }
+}
+
}
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.go b/tests/namespace_test/NamespaceA/SecondTableInA.go
index 6dd1eef..f88a682 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.go
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.go
@@ -8,6 +8,29 @@
NamespaceC "NamespaceC"
)
+type SecondTableInAT struct {
+ ReferToC *NamespaceC.TableInCT
+}
+
+func (t *SecondTableInAT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ referToCOffset := t.ReferToC.Pack(builder)
+ SecondTableInAStart(builder)
+ SecondTableInAAddReferToC(builder, referToCOffset)
+ return SecondTableInAEnd(builder)
+}
+
+func (rcv *SecondTableInA) UnPackTo(t *SecondTableInAT) {
+ t.ReferToC = rcv.ReferToC(nil).UnPack()
+}
+
+func (rcv *SecondTableInA) UnPack() *SecondTableInAT {
+ if rcv == nil { return nil }
+ t := &SecondTableInAT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type SecondTableInA struct {
_tab flatbuffers.Table
}
@@ -19,6 +42,13 @@
return x
}
+func GetSizePrefixedRootAsSecondTableInA(buf []byte, offset flatbuffers.UOffsetT) *SecondTableInA {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &SecondTableInA{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *SecondTableInA) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.java b/tests/namespace_test/NamespaceA/SecondTableInA.java
index a655199..ec6e561 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.java
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class SecondTableInA extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static SecondTableInA getRootAsSecondTableInA(ByteBuffer _bb) { return getRootAsSecondTableInA(_bb, new SecondTableInA()); }
public static SecondTableInA getRootAsSecondTableInA(ByteBuffer _bb, SecondTableInA obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -31,5 +31,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public SecondTableInA get(int j) { return get(new SecondTableInA(), j); }
+ public SecondTableInA get(SecondTableInA obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.kt b/tests/namespace_test/NamespaceA/SecondTableInA.kt
index 8261443..5b41f73 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.kt
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.kt
@@ -27,7 +27,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsSecondTableInA(_bb: ByteBuffer): SecondTableInA = getRootAsSecondTableInA(_bb, SecondTableInA())
fun getRootAsSecondTableInA(_bb: ByteBuffer, obj: SecondTableInA): SecondTableInA {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/namespace_test/NamespaceA/SecondTableInA.py b/tests/namespace_test/NamespaceA/SecondTableInA.py
index 20dac3e..5aaa8ed 100644
--- a/tests/namespace_test/NamespaceA/SecondTableInA.py
+++ b/tests/namespace_test/NamespaceA/SecondTableInA.py
@@ -3,6 +3,8 @@
# namespace: NamespaceA
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class SecondTableInA(object):
__slots__ = ['_tab']
@@ -23,7 +25,6 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .TableInC import TableInC
obj = TableInC()
obj.Init(self._tab.Bytes, x)
return obj
@@ -32,3 +33,43 @@
def SecondTableInAStart(builder): builder.StartObject(1)
def SecondTableInAAddReferToC(builder, referToC): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(referToC), 0)
def SecondTableInAEnd(builder): return builder.EndObject()
+
+try:
+ from typing import Optional
+except:
+ pass
+
+class SecondTableInAT(object):
+
+ # SecondTableInAT
+ def __init__(self):
+ self.referToC = None # type: Optional[TableInCT]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ secondTableInA = SecondTableInA()
+ secondTableInA.Init(buf, pos)
+ return cls.InitFromObj(secondTableInA)
+
+ @classmethod
+ def InitFromObj(cls, secondTableInA):
+ x = SecondTableInAT()
+ x._UnPack(secondTableInA)
+ return x
+
+ # SecondTableInAT
+ def _UnPack(self, secondTableInA):
+ if secondTableInA is None:
+ return
+ if secondTableInA.ReferToC() is not None:
+ self.referToC = TableInCT.InitFromObj(secondTableInA.ReferToC())
+
+ # SecondTableInAT
+ def Pack(self, builder):
+ if self.referToC is not None:
+ referToC = self.referToC.Pack(builder)
+ SecondTableInAStart(builder)
+ if self.referToC is not None:
+ SecondTableInAAddReferToC(builder, referToC)
+ secondTableInA = SecondTableInAEnd(builder)
+ return secondTableInA
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.cs b/tests/namespace_test/NamespaceA/TableInFirstNS.cs
index d0d8ed0..3d597d7 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.cs
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct TableInFirstNS : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb) { return GetRootAsTableInFirstNS(_bb, new TableInFirstNS()); }
public static TableInFirstNS GetRootAsTableInFirstNS(ByteBuffer _bb, TableInFirstNS obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -23,6 +24,17 @@
public bool MutateFooEnum(NamespaceA.NamespaceB.EnumInNestedNS foo_enum) { int o = __p.__offset(6); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)foo_enum); return true; } else { return false; } }
public NamespaceA.NamespaceB.StructInNestedNS? FooStruct { get { int o = __p.__offset(8); return o != 0 ? (NamespaceA.NamespaceB.StructInNestedNS?)(new NamespaceA.NamespaceB.StructInNestedNS()).__assign(o + __p.bb_pos, __p.bb) : null; } }
+ public static Offset<NamespaceA.TableInFirstNS> CreateTableInFirstNS(FlatBufferBuilder builder,
+ Offset<NamespaceA.NamespaceB.TableInNestedNS> foo_tableOffset = default(Offset<NamespaceA.NamespaceB.TableInNestedNS>),
+ NamespaceA.NamespaceB.EnumInNestedNS foo_enum = NamespaceA.NamespaceB.EnumInNestedNS.A,
+ NamespaceA.NamespaceB.StructInNestedNST foo_struct = null) {
+ builder.StartTable(3);
+ TableInFirstNS.AddFooStruct(builder, NamespaceA.NamespaceB.StructInNestedNS.Pack(builder, foo_struct));
+ TableInFirstNS.AddFooTable(builder, foo_tableOffset);
+ TableInFirstNS.AddFooEnum(builder, foo_enum);
+ return TableInFirstNS.EndTableInFirstNS(builder);
+ }
+
public static void StartTableInFirstNS(FlatBufferBuilder builder) { builder.StartTable(3); }
public static void AddFooTable(FlatBufferBuilder builder, Offset<NamespaceA.NamespaceB.TableInNestedNS> fooTableOffset) { builder.AddOffset(0, fooTableOffset.Value, 0); }
public static void AddFooEnum(FlatBufferBuilder builder, NamespaceA.NamespaceB.EnumInNestedNS fooEnum) { builder.AddSbyte(1, (sbyte)fooEnum, 0); }
@@ -31,7 +43,42 @@
int o = builder.EndTable();
return new Offset<NamespaceA.TableInFirstNS>(o);
}
+ public TableInFirstNST UnPack() {
+ var _o = new TableInFirstNST();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TableInFirstNST _o) {
+ _o.FooTable = this.FooTable.HasValue ? this.FooTable.Value.UnPack() : null;
+ _o.FooEnum = this.FooEnum;
+ _o.FooStruct = this.FooStruct.HasValue ? this.FooStruct.Value.UnPack() : null;
+ }
+ public static Offset<NamespaceA.TableInFirstNS> Pack(FlatBufferBuilder builder, TableInFirstNST _o) {
+ if (_o == null) return default(Offset<NamespaceA.TableInFirstNS>);
+ var _foo_table = _o.FooTable == null ? default(Offset<NamespaceA.NamespaceB.TableInNestedNS>) : NamespaceA.NamespaceB.TableInNestedNS.Pack(builder, _o.FooTable);
+ return CreateTableInFirstNS(
+ builder,
+ _foo_table,
+ _o.FooEnum,
+ _o.FooStruct);
+ }
};
+public class TableInFirstNST
+{
+ [Newtonsoft.Json.JsonProperty("foo_table")]
+ public NamespaceA.NamespaceB.TableInNestedNST FooTable { get; set; }
+ [Newtonsoft.Json.JsonProperty("foo_enum")]
+ public NamespaceA.NamespaceB.EnumInNestedNS FooEnum { get; set; }
+ [Newtonsoft.Json.JsonProperty("foo_struct")]
+ public NamespaceA.NamespaceB.StructInNestedNST FooStruct { get; set; }
+
+ public TableInFirstNST() {
+ this.FooTable = null;
+ this.FooEnum = NamespaceA.NamespaceB.EnumInNestedNS.A;
+ this.FooStruct = new NamespaceA.NamespaceB.StructInNestedNST();
+ }
+}
+
}
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.go b/tests/namespace_test/NamespaceA/TableInFirstNS.go
index bbcbdc6..7f419b8 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.go
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.go
@@ -8,6 +8,36 @@
NamespaceA__NamespaceB "NamespaceA/NamespaceB"
)
+type TableInFirstNST struct {
+ FooTable *NamespaceA__NamespaceB.TableInNestedNST
+ FooEnum NamespaceA__NamespaceB.EnumInNestedNS
+ FooStruct *NamespaceA__NamespaceB.StructInNestedNST
+}
+
+func (t *TableInFirstNST) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ fooTableOffset := t.FooTable.Pack(builder)
+ TableInFirstNSStart(builder)
+ TableInFirstNSAddFooTable(builder, fooTableOffset)
+ TableInFirstNSAddFooEnum(builder, t.FooEnum)
+ fooStructOffset := t.FooStruct.Pack(builder)
+ TableInFirstNSAddFooStruct(builder, fooStructOffset)
+ return TableInFirstNSEnd(builder)
+}
+
+func (rcv *TableInFirstNS) UnPackTo(t *TableInFirstNST) {
+ t.FooTable = rcv.FooTable(nil).UnPack()
+ t.FooEnum = rcv.FooEnum()
+ t.FooStruct = rcv.FooStruct(nil).UnPack()
+}
+
+func (rcv *TableInFirstNS) UnPack() *TableInFirstNST {
+ if rcv == nil { return nil }
+ t := &TableInFirstNST{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type TableInFirstNS struct {
_tab flatbuffers.Table
}
@@ -19,6 +49,13 @@
return x
}
+func GetSizePrefixedRootAsTableInFirstNS(buf []byte, offset flatbuffers.UOffsetT) *TableInFirstNS {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &TableInFirstNS{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *TableInFirstNS) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.java b/tests/namespace_test/NamespaceA/TableInFirstNS.java
index e097381..f04d9e9 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.java
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class TableInFirstNS extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static TableInFirstNS getRootAsTableInFirstNS(ByteBuffer _bb) { return getRootAsTableInFirstNS(_bb, new TableInFirstNS()); }
public static TableInFirstNS getRootAsTableInFirstNS(ByteBuffer _bb, TableInFirstNS obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -30,5 +30,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public TableInFirstNS get(int j) { return get(new TableInFirstNS(), j); }
+ public TableInFirstNS get(TableInFirstNS obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.kt b/tests/namespace_test/NamespaceA/TableInFirstNS.kt
index 1ba0afc..febe050 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.kt
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.kt
@@ -50,7 +50,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsTableInFirstNS(_bb: ByteBuffer): TableInFirstNS = getRootAsTableInFirstNS(_bb, TableInFirstNS())
fun getRootAsTableInFirstNS(_bb: ByteBuffer, obj: TableInFirstNS): TableInFirstNS {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.py b/tests/namespace_test/NamespaceA/TableInFirstNS.py
index 40cbeba..39598f5 100644
--- a/tests/namespace_test/NamespaceA/TableInFirstNS.py
+++ b/tests/namespace_test/NamespaceA/TableInFirstNS.py
@@ -3,6 +3,8 @@
# namespace: NamespaceA
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class TableInFirstNS(object):
__slots__ = ['_tab']
@@ -23,7 +25,6 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .TableInNestedNS import TableInNestedNS
obj = TableInNestedNS()
obj.Init(self._tab.Bytes, x)
return obj
@@ -41,7 +42,6 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
if o != 0:
x = o + self._tab.Pos
- from .StructInNestedNS import StructInNestedNS
obj = StructInNestedNS()
obj.Init(self._tab.Bytes, x)
return obj
@@ -52,3 +52,52 @@
def TableInFirstNSAddFooEnum(builder, fooEnum): builder.PrependInt8Slot(1, fooEnum, 0)
def TableInFirstNSAddFooStruct(builder, fooStruct): builder.PrependStructSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(fooStruct), 0)
def TableInFirstNSEnd(builder): return builder.EndObject()
+
+try:
+ from typing import Optional
+except:
+ pass
+
+class TableInFirstNST(object):
+
+ # TableInFirstNST
+ def __init__(self):
+ self.fooTable = None # type: Optional[TableInNestedNST]
+ self.fooEnum = 0 # type: int
+ self.fooStruct = None # type: Optional[StructInNestedNST]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ tableInFirstNS = TableInFirstNS()
+ tableInFirstNS.Init(buf, pos)
+ return cls.InitFromObj(tableInFirstNS)
+
+ @classmethod
+ def InitFromObj(cls, tableInFirstNS):
+ x = TableInFirstNST()
+ x._UnPack(tableInFirstNS)
+ return x
+
+ # TableInFirstNST
+ def _UnPack(self, tableInFirstNS):
+ if tableInFirstNS is None:
+ return
+ if tableInFirstNS.FooTable() is not None:
+ self.fooTable = TableInNestedNST.InitFromObj(tableInFirstNS.FooTable())
+ self.fooEnum = tableInFirstNS.FooEnum()
+ if tableInFirstNS.FooStruct() is not None:
+ self.fooStruct = StructInNestedNST.InitFromObj(tableInFirstNS.FooStruct())
+
+ # TableInFirstNST
+ def Pack(self, builder):
+ if self.fooTable is not None:
+ fooTable = self.fooTable.Pack(builder)
+ TableInFirstNSStart(builder)
+ if self.fooTable is not None:
+ TableInFirstNSAddFooTable(builder, fooTable)
+ TableInFirstNSAddFooEnum(builder, self.fooEnum)
+ if self.fooStruct is not None:
+ fooStruct = self.fooStruct.Pack(builder)
+ TableInFirstNSAddFooStruct(builder, fooStruct)
+ tableInFirstNS = TableInFirstNSEnd(builder)
+ return tableInFirstNS
diff --git a/tests/namespace_test/NamespaceC/TableInC.cs b/tests/namespace_test/NamespaceC/TableInC.cs
index 74b85a4..bfb9b76 100644
--- a/tests/namespace_test/NamespaceC/TableInC.cs
+++ b/tests/namespace_test/NamespaceC/TableInC.cs
@@ -6,13 +6,14 @@
{
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct TableInC : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static TableInC GetRootAsTableInC(ByteBuffer _bb) { return GetRootAsTableInC(_bb, new TableInC()); }
public static TableInC GetRootAsTableInC(ByteBuffer _bb, TableInC obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -37,7 +38,38 @@
int o = builder.EndTable();
return new Offset<NamespaceC.TableInC>(o);
}
+ public TableInCT UnPack() {
+ var _o = new TableInCT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(TableInCT _o) {
+ _o.ReferToA1 = this.ReferToA1.HasValue ? this.ReferToA1.Value.UnPack() : null;
+ _o.ReferToA2 = this.ReferToA2.HasValue ? this.ReferToA2.Value.UnPack() : null;
+ }
+ public static Offset<NamespaceC.TableInC> Pack(FlatBufferBuilder builder, TableInCT _o) {
+ if (_o == null) return default(Offset<NamespaceC.TableInC>);
+ var _refer_to_a1 = _o.ReferToA1 == null ? default(Offset<NamespaceA.TableInFirstNS>) : NamespaceA.TableInFirstNS.Pack(builder, _o.ReferToA1);
+ var _refer_to_a2 = _o.ReferToA2 == null ? default(Offset<NamespaceA.SecondTableInA>) : NamespaceA.SecondTableInA.Pack(builder, _o.ReferToA2);
+ return CreateTableInC(
+ builder,
+ _refer_to_a1,
+ _refer_to_a2);
+ }
};
+public class TableInCT
+{
+ [Newtonsoft.Json.JsonProperty("refer_to_a1")]
+ public NamespaceA.TableInFirstNST ReferToA1 { get; set; }
+ [Newtonsoft.Json.JsonProperty("refer_to_a2")]
+ public NamespaceA.SecondTableInAT ReferToA2 { get; set; }
+
+ public TableInCT() {
+ this.ReferToA1 = null;
+ this.ReferToA2 = null;
+ }
+}
+
}
diff --git a/tests/namespace_test/NamespaceC/TableInC.go b/tests/namespace_test/NamespaceC/TableInC.go
index 59b3e48..f171634 100644
--- a/tests/namespace_test/NamespaceC/TableInC.go
+++ b/tests/namespace_test/NamespaceC/TableInC.go
@@ -8,6 +8,33 @@
NamespaceA "NamespaceA"
)
+type TableInCT struct {
+ ReferToA1 *NamespaceA.TableInFirstNST
+ ReferToA2 *NamespaceA.SecondTableInAT
+}
+
+func (t *TableInCT) Pack(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+ if t == nil { return 0 }
+ referToA1Offset := t.ReferToA1.Pack(builder)
+ referToA2Offset := t.ReferToA2.Pack(builder)
+ TableInCStart(builder)
+ TableInCAddReferToA1(builder, referToA1Offset)
+ TableInCAddReferToA2(builder, referToA2Offset)
+ return TableInCEnd(builder)
+}
+
+func (rcv *TableInC) UnPackTo(t *TableInCT) {
+ t.ReferToA1 = rcv.ReferToA1(nil).UnPack()
+ t.ReferToA2 = rcv.ReferToA2(nil).UnPack()
+}
+
+func (rcv *TableInC) UnPack() *TableInCT {
+ if rcv == nil { return nil }
+ t := &TableInCT{}
+ rcv.UnPackTo(t)
+ return t
+}
+
type TableInC struct {
_tab flatbuffers.Table
}
@@ -19,6 +46,13 @@
return x
}
+func GetSizePrefixedRootAsTableInC(buf []byte, offset flatbuffers.UOffsetT) *TableInC {
+ n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
+ x := &TableInC{}
+ x.Init(buf, n+offset+flatbuffers.SizeUint32)
+ return x
+}
+
func (rcv *TableInC) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
diff --git a/tests/namespace_test/NamespaceC/TableInC.java b/tests/namespace_test/NamespaceC/TableInC.java
index 2d9e4bf..503f237 100644
--- a/tests/namespace_test/NamespaceC/TableInC.java
+++ b/tests/namespace_test/NamespaceC/TableInC.java
@@ -9,7 +9,7 @@
@SuppressWarnings("unused")
public final class TableInC extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static TableInC getRootAsTableInC(ByteBuffer _bb) { return getRootAsTableInC(_bb, new TableInC()); }
public static TableInC getRootAsTableInC(ByteBuffer _bb, TableInC obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -36,5 +36,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public TableInC get(int j) { return get(new TableInC(), j); }
+ public TableInC get(TableInC obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/namespace_test/NamespaceC/TableInC.kt b/tests/namespace_test/NamespaceC/TableInC.kt
index e468642..a5222f1 100644
--- a/tests/namespace_test/NamespaceC/TableInC.kt
+++ b/tests/namespace_test/NamespaceC/TableInC.kt
@@ -36,7 +36,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsTableInC(_bb: ByteBuffer): TableInC = getRootAsTableInC(_bb, TableInC())
fun getRootAsTableInC(_bb: ByteBuffer, obj: TableInC): TableInC {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/namespace_test/NamespaceC/TableInC.py b/tests/namespace_test/NamespaceC/TableInC.py
index 90b8736..8f04b52 100644
--- a/tests/namespace_test/NamespaceC/TableInC.py
+++ b/tests/namespace_test/NamespaceC/TableInC.py
@@ -3,6 +3,8 @@
# namespace: NamespaceC
import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
class TableInC(object):
__slots__ = ['_tab']
@@ -23,7 +25,6 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .TableInFirstNS import TableInFirstNS
obj = TableInFirstNS()
obj.Init(self._tab.Bytes, x)
return obj
@@ -34,7 +35,6 @@
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
if o != 0:
x = self._tab.Indirect(o + self._tab.Pos)
- from .SecondTableInA import SecondTableInA
obj = SecondTableInA()
obj.Init(self._tab.Bytes, x)
return obj
@@ -44,3 +44,50 @@
def TableInCAddReferToA1(builder, referToA1): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(referToA1), 0)
def TableInCAddReferToA2(builder, referToA2): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(referToA2), 0)
def TableInCEnd(builder): return builder.EndObject()
+
+try:
+ from typing import Optional
+except:
+ pass
+
+class TableInCT(object):
+
+ # TableInCT
+ def __init__(self):
+ self.referToA1 = None # type: Optional[TableInFirstNST]
+ self.referToA2 = None # type: Optional[SecondTableInAT]
+
+ @classmethod
+ def InitFromBuf(cls, buf, pos):
+ tableInC = TableInC()
+ tableInC.Init(buf, pos)
+ return cls.InitFromObj(tableInC)
+
+ @classmethod
+ def InitFromObj(cls, tableInC):
+ x = TableInCT()
+ x._UnPack(tableInC)
+ return x
+
+ # TableInCT
+ def _UnPack(self, tableInC):
+ if tableInC is None:
+ return
+ if tableInC.ReferToA1() is not None:
+ self.referToA1 = TableInFirstNST.InitFromObj(tableInC.ReferToA1())
+ if tableInC.ReferToA2() is not None:
+ self.referToA2 = SecondTableInAT.InitFromObj(tableInC.ReferToA2())
+
+ # TableInCT
+ def Pack(self, builder):
+ if self.referToA1 is not None:
+ referToA1 = self.referToA1.Pack(builder)
+ if self.referToA2 is not None:
+ referToA2 = self.referToA2.Pack(builder)
+ TableInCStart(builder)
+ if self.referToA1 is not None:
+ TableInCAddReferToA1(builder, referToA1)
+ if self.referToA2 is not None:
+ TableInCAddReferToA2(builder, referToA2)
+ tableInC = TableInCEnd(builder)
+ return tableInC
diff --git a/tests/namespace_test/namespace_test1_generated.h b/tests/namespace_test/namespace_test1_generated.h
index daaf7ae..5ec21f8 100644
--- a/tests/namespace_test/namespace_test1_generated.h
+++ b/tests/namespace_test/namespace_test1_generated.h
@@ -10,9 +10,16 @@
namespace NamespaceB {
struct TableInNestedNS;
+struct TableInNestedNSBuilder;
+struct TableInNestedNST;
struct StructInNestedNS;
+bool operator==(const TableInNestedNST &lhs, const TableInNestedNST &rhs);
+bool operator!=(const TableInNestedNST &lhs, const TableInNestedNST &rhs);
+bool operator==(const StructInNestedNS &lhs, const StructInNestedNS &rhs);
+bool operator!=(const StructInNestedNS &lhs, const StructInNestedNS &rhs);
+
inline const flatbuffers::TypeTable *TableInNestedNSTypeTable();
inline const flatbuffers::TypeTable *StructInNestedNSTypeTable();
@@ -45,7 +52,7 @@
}
inline const char *EnumNameEnumInNestedNS(EnumInNestedNS e) {
- if (e < EnumInNestedNS_A || e > EnumInNestedNS_C) return "";
+ if (flatbuffers::IsOutRange(e, EnumInNestedNS_A, EnumInNestedNS_C)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesEnumInNestedNS()[index];
}
@@ -59,8 +66,12 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return StructInNestedNSTypeTable();
}
- StructInNestedNS() {
- memset(static_cast<void *>(this), 0, sizeof(StructInNestedNS));
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.NamespaceB.StructInNestedNS";
+ }
+ StructInNestedNS()
+ : a_(0),
+ b_(0) {
}
StructInNestedNS(int32_t _a, int32_t _b)
: a_(flatbuffers::EndianScalar(_a)),
@@ -81,10 +92,47 @@
};
FLATBUFFERS_STRUCT_END(StructInNestedNS, 8);
+inline bool operator==(const StructInNestedNS &lhs, const StructInNestedNS &rhs) {
+ return
+ (lhs.a() == rhs.a()) &&
+ (lhs.b() == rhs.b());
+}
+
+inline bool operator!=(const StructInNestedNS &lhs, const StructInNestedNS &rhs) {
+ return !(lhs == rhs);
+}
+
+
+struct TableInNestedNST : public flatbuffers::NativeTable {
+ typedef TableInNestedNS TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.NamespaceB.TableInNestedNST";
+ }
+ int32_t foo;
+ TableInNestedNST()
+ : foo(0) {
+ }
+};
+
+inline bool operator==(const TableInNestedNST &lhs, const TableInNestedNST &rhs) {
+ return
+ (lhs.foo == rhs.foo);
+}
+
+inline bool operator!=(const TableInNestedNST &lhs, const TableInNestedNST &rhs) {
+ return !(lhs == rhs);
+}
+
+
struct TableInNestedNS FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableInNestedNST NativeTableType;
+ typedef TableInNestedNSBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TableInNestedNSTypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.NamespaceB.TableInNestedNS";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_FOO = 4
};
@@ -99,9 +147,13 @@
VerifyField<int32_t>(verifier, VT_FOO) &&
verifier.EndTable();
}
+ TableInNestedNST *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(TableInNestedNST *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<TableInNestedNS> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInNestedNST* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct TableInNestedNSBuilder {
+ typedef TableInNestedNS Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_foo(int32_t foo) {
@@ -111,7 +163,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- TableInNestedNSBuilder &operator=(const TableInNestedNSBuilder &);
flatbuffers::Offset<TableInNestedNS> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<TableInNestedNS>(end);
@@ -127,6 +178,34 @@
return builder_.Finish();
}
+flatbuffers::Offset<TableInNestedNS> CreateTableInNestedNS(flatbuffers::FlatBufferBuilder &_fbb, const TableInNestedNST *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+inline TableInNestedNST *TableInNestedNS::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ flatbuffers::unique_ptr<NamespaceA::NamespaceB::TableInNestedNST> _o = flatbuffers::unique_ptr<NamespaceA::NamespaceB::TableInNestedNST>(new TableInNestedNST());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void TableInNestedNS::UnPackTo(TableInNestedNST *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = foo(); _o->foo = _e; }
+}
+
+inline flatbuffers::Offset<TableInNestedNS> TableInNestedNS::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInNestedNST* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateTableInNestedNS(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<TableInNestedNS> CreateTableInNestedNS(flatbuffers::FlatBufferBuilder &_fbb, const TableInNestedNST *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TableInNestedNST* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _foo = _o->foo;
+ return NamespaceA::NamespaceB::CreateTableInNestedNS(
+ _fbb,
+ _foo);
+}
+
inline const flatbuffers::TypeTable *EnumInNestedNSTypeTable() {
static const flatbuffers::TypeCode type_codes[] = {
{ flatbuffers::ET_CHAR, 0, 0 },
@@ -142,7 +221,7 @@
"C"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -155,7 +234,7 @@
"foo"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
@@ -171,7 +250,7 @@
"b"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 2, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 2, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
diff --git a/tests/namespace_test/namespace_test1_generated.js b/tests/namespace_test/namespace_test1_generated.js
index bd018d6..7331f64 100644
--- a/tests/namespace_test/namespace_test1_generated.js
+++ b/tests/namespace_test/namespace_test1_generated.js
@@ -25,9 +25,9 @@
* @enum {string}
*/
NamespaceA.NamespaceB.EnumInNestedNSName = {
- 0: 'A',
- 1: 'B',
- 2: 'C'
+ '0': 'A',
+ '1': 'B',
+ '2': 'C'
};
/**
@@ -71,6 +71,7 @@
* @returns {NamespaceA.NamespaceB.TableInNestedNS}
*/
NamespaceA.NamespaceB.TableInNestedNS.getSizePrefixedRootAsTableInNestedNS = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new NamespaceA.NamespaceB.TableInNestedNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -98,6 +99,13 @@
};
/**
+ * @returns {string}
+ */
+NamespaceA.NamespaceB.TableInNestedNS.getFullyQualifiedName = function() {
+ return 'NamespaceA.NamespaceB.TableInNestedNS';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
NamespaceA.NamespaceB.TableInNestedNS.startTableInNestedNS = function(builder) {
@@ -170,13 +178,7 @@
* @returns {boolean}
*/
NamespaceA.NamespaceB.StructInNestedNS.prototype.mutate_a = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt32(this.bb_pos + offset, value);
+ this.bb.writeInt32(this.bb_pos + 0, value);
return true;
};
@@ -192,17 +194,25 @@
* @returns {boolean}
*/
NamespaceA.NamespaceB.StructInNestedNS.prototype.mutate_b = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt32(this.bb_pos + offset, value);
+ this.bb.writeInt32(this.bb_pos + 4, value);
return true;
};
/**
+ * @returns {string}
+ */
+NamespaceA.NamespaceB.StructInNestedNS.getFullyQualifiedName = function() {
+ return 'NamespaceA.NamespaceB.StructInNestedNS';
+}
+
+/**
+ * @returns {number}
+ */
+NamespaceA.NamespaceB.StructInNestedNS.sizeOf = function() {
+ return 8;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} a
* @param {number} b
diff --git a/tests/namespace_test/namespace_test1_generated.rs b/tests/namespace_test/namespace_test1_generated.rs
index ab30299..dd735a6 100644
--- a/tests/namespace_test/namespace_test1_generated.rs
+++ b/tests/namespace_test/namespace_test1_generated.rs
@@ -1,6 +1,7 @@
// automatically generated by the FlatBuffers compiler, do not modify
+#![allow(unused_imports, dead_code)]
use std::mem;
use std::cmp::Ordering;
@@ -25,39 +26,58 @@
extern crate flatbuffers;
use self::flatbuffers::EndianScalar;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_ENUM_IN_NESTED_NS: i8 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_ENUM_IN_NESTED_NS: i8 = 2;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
#[allow(non_camel_case_types)]
-#[repr(i8)]
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
-pub enum EnumInNestedNS {
- A = 0,
- B = 1,
- C = 2,
+pub const ENUM_VALUES_ENUM_IN_NESTED_NS: [EnumInNestedNS; 3] = [
+ EnumInNestedNS::A,
+ EnumInNestedNS::B,
+ EnumInNestedNS::C,
+];
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct EnumInNestedNS(pub i8);
+#[allow(non_upper_case_globals)]
+impl EnumInNestedNS {
+ pub const A: Self = Self(0);
+ pub const B: Self = Self(1);
+ pub const C: Self = Self(2);
+
+ pub const ENUM_MIN: i8 = 0;
+ pub const ENUM_MAX: i8 = 2;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::A,
+ Self::B,
+ Self::C,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::A => Some("A"),
+ Self::B => Some("B"),
+ Self::C => Some("C"),
+ _ => None,
+ }
+ }
}
-
-const ENUM_MIN_ENUM_IN_NESTED_NS: i8 = 0;
-const ENUM_MAX_ENUM_IN_NESTED_NS: i8 = 2;
-
+impl std::fmt::Debug for EnumInNestedNS {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
impl<'a> flatbuffers::Follow<'a> for EnumInNestedNS {
type Inner = Self;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- flatbuffers::read_scalar_at::<Self>(buf, loc)
- }
-}
-
-impl flatbuffers::EndianScalar for EnumInNestedNS {
- #[inline]
- fn to_little_endian(self) -> Self {
- let n = i8::to_le(self as i8);
- let p = &n as *const i8 as *const EnumInNestedNS;
- unsafe { *p }
- }
- #[inline]
- fn from_little_endian(self) -> Self {
- let n = i8::from_le(self as i8);
- let p = &n as *const i8 as *const EnumInNestedNS;
- unsafe { *p }
+ Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
}
}
@@ -65,36 +85,37 @@
type Output = EnumInNestedNS;
#[inline]
fn push(&self, dst: &mut [u8], _rest: &[u8]) {
- flatbuffers::emplace_scalar::<EnumInNestedNS>(dst, *self);
+ flatbuffers::emplace_scalar::<i8>(dst, self.0);
}
}
-#[allow(non_camel_case_types)]
-const ENUM_VALUES_ENUM_IN_NESTED_NS:[EnumInNestedNS; 3] = [
- EnumInNestedNS::A,
- EnumInNestedNS::B,
- EnumInNestedNS::C
-];
-
-#[allow(non_camel_case_types)]
-const ENUM_NAMES_ENUM_IN_NESTED_NS:[&'static str; 3] = [
- "A",
- "B",
- "C"
-];
-
-pub fn enum_name_enum_in_nested_ns(e: EnumInNestedNS) -> &'static str {
- let index = e as i8;
- ENUM_NAMES_ENUM_IN_NESTED_NS[index as usize]
+impl flatbuffers::EndianScalar for EnumInNestedNS {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(i8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(i8::from_le(self.0))
+ }
}
// struct StructInNestedNS, aligned to 4
#[repr(C, align(4))]
-#[derive(Clone, Copy, Debug, PartialEq)]
+#[derive(Clone, Copy, PartialEq)]
pub struct StructInNestedNS {
a_: i32,
b_: i32,
} // pub struct StructInNestedNS
+impl std::fmt::Debug for StructInNestedNS {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ f.debug_struct("StructInNestedNS")
+ .field("a", &self.a())
+ .field("b", &self.b())
+ .finish()
+ }
+}
+
impl flatbuffers::SafeSliceAccess for StructInNestedNS {}
impl<'a> flatbuffers::Follow<'a> for StructInNestedNS {
type Inner = &'a StructInNestedNS;
@@ -134,23 +155,27 @@
impl StructInNestedNS {
- pub fn new<'a>(_a: i32, _b: i32) -> Self {
+ pub fn new(_a: i32, _b: i32) -> Self {
StructInNestedNS {
a_: _a.to_little_endian(),
b_: _b.to_little_endian(),
}
}
- pub fn a<'a>(&'a self) -> i32 {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "NamespaceA.NamespaceB.StructInNestedNS"
+ }
+
+ pub fn a(&self) -> i32 {
self.a_.from_little_endian()
}
- pub fn b<'a>(&'a self) -> i32 {
+ pub fn b(&self) -> i32 {
self.b_.from_little_endian()
}
}
pub enum TableInNestedNSOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct TableInNestedNS<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -160,13 +185,15 @@
type Inner = TableInNestedNS<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> TableInNestedNS<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "NamespaceA.NamespaceB.TableInNestedNS"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
TableInNestedNS {
@@ -225,6 +252,13 @@
}
}
+impl std::fmt::Debug for TableInNestedNS<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TableInNestedNS");
+ ds.field("foo", &self.foo());
+ ds.finish()
+ }
+}
} // pub mod NamespaceB
} // pub mod NamespaceA
diff --git a/tests/namespace_test/namespace_test1_generated.ts b/tests/namespace_test/namespace_test1_generated.ts
index 615c7ce..933a43d 100644
--- a/tests/namespace_test/namespace_test1_generated.ts
+++ b/tests/namespace_test/namespace_test1_generated.ts
@@ -8,7 +8,8 @@
A= 0,
B= 1,
C= 2
-}};
+};
+}
/**
* @constructor
@@ -35,7 +36,7 @@
* @returns TableInNestedNS
*/
static getRootAsTableInNestedNS(bb:flatbuffers.ByteBuffer, obj?:TableInNestedNS):TableInNestedNS {
- return (obj || new TableInNestedNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new TableInNestedNS()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -44,7 +45,8 @@
* @returns TableInNestedNS
*/
static getSizePrefixedRootAsTableInNestedNS(bb:flatbuffers.ByteBuffer, obj?:TableInNestedNS):TableInNestedNS {
- return (obj || new TableInNestedNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new TableInNestedNS()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -71,6 +73,13 @@
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'NamespaceA.NamespaceB.TableInNestedNS';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startTableInNestedNS(builder:flatbuffers.Builder) {
@@ -99,6 +108,42 @@
TableInNestedNS.addFoo(builder, foo);
return TableInNestedNS.endTableInNestedNS(builder);
}
+
+/**
+ * @returns TableInNestedNST
+ */
+unpack(): TableInNestedNST {
+ return new TableInNestedNST(
+ this.foo()
+ );
+};
+
+/**
+ * @param TableInNestedNST _o
+ */
+unpackTo(_o: TableInNestedNST): void {
+ _o.foo = this.foo();
+};
+}
+
+export class TableInNestedNST {
+/**
+ * @constructor
+ * @param number foo
+ */
+constructor(
+ public foo: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return NamespaceA.NamespaceB.TableInNestedNS.createTableInNestedNS(builder,
+ this.foo
+ );
+};
}
}
/**
@@ -132,13 +177,7 @@
* @returns boolean
*/
mutate_a(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt32(this.bb_pos + offset, value);
+ this.bb!.writeInt32(this.bb_pos + 0, value);
return true;
};
@@ -154,17 +193,25 @@
* @returns boolean
*/
mutate_b(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt32(this.bb_pos + offset, value);
+ this.bb!.writeInt32(this.bb_pos + 4, value);
return true;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'NamespaceA.NamespaceB.StructInNestedNS';
+}
+
+/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 8;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number a
* @param number b
@@ -177,5 +224,46 @@
return builder.offset();
};
+
+/**
+ * @returns StructInNestedNST
+ */
+unpack(): StructInNestedNST {
+ return new StructInNestedNST(
+ this.a(),
+ this.b()
+ );
+};
+
+/**
+ * @param StructInNestedNST _o
+ */
+unpackTo(_o: StructInNestedNST): void {
+ _o.a = this.a();
+ _o.b = this.b();
+};
+}
+
+export class StructInNestedNST {
+/**
+ * @constructor
+ * @param number a
+ * @param number b
+ */
+constructor(
+ public a: number = 0,
+ public b: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return NamespaceA.NamespaceB.StructInNestedNS.createStructInNestedNS(builder,
+ this.a,
+ this.b
+ );
+};
}
}
diff --git a/tests/namespace_test/namespace_test1_namespace_a.namespace_b_generated.dart b/tests/namespace_test/namespace_test1_namespace_a.namespace_b_generated.dart
index f999e44..cc936c3 100644
--- a/tests/namespace_test/namespace_test1_namespace_a.namespace_b_generated.dart
+++ b/tests/namespace_test/namespace_test1_namespace_a.namespace_b_generated.dart
@@ -26,7 +26,7 @@
static const EnumInNestedNS A = const EnumInNestedNS._(0);
static const EnumInNestedNS B = const EnumInNestedNS._(1);
static const EnumInNestedNS C = const EnumInNestedNS._(2);
- static get values => {0: A,1: B,2: C,};
+ static const values = {0: A,1: B,2: C,};
static const fb.Reader<EnumInNestedNS> reader = const _EnumInNestedNSReader();
diff --git a/tests/namespace_test/namespace_test2_generated.h b/tests/namespace_test/namespace_test2_generated.h
index 135100a..9c0a1b6 100644
--- a/tests/namespace_test/namespace_test2_generated.h
+++ b/tests/namespace_test/namespace_test2_generated.h
@@ -6,23 +6,42 @@
#include "flatbuffers/flatbuffers.h"
-#include "namespace_test1_generated.h"
-
namespace NamespaceA {
struct TableInFirstNS;
+struct TableInFirstNSBuilder;
+struct TableInFirstNST;
} // namespace NamespaceA
namespace NamespaceC {
struct TableInC;
+struct TableInCBuilder;
+struct TableInCT;
} // namespace NamespaceC
namespace NamespaceA {
struct SecondTableInA;
+struct SecondTableInABuilder;
+struct SecondTableInAT;
+
+bool operator==(const TableInFirstNST &lhs, const TableInFirstNST &rhs);
+bool operator!=(const TableInFirstNST &lhs, const TableInFirstNST &rhs);
+} // namespace NamespaceA
+
+namespace NamespaceC {
+
+bool operator==(const TableInCT &lhs, const TableInCT &rhs);
+bool operator!=(const TableInCT &lhs, const TableInCT &rhs);
+} // namespace NamespaceC
+
+namespace NamespaceA {
+
+bool operator==(const SecondTableInAT &lhs, const SecondTableInAT &rhs);
+bool operator!=(const SecondTableInAT &lhs, const SecondTableInAT &rhs);
inline const flatbuffers::TypeTable *TableInFirstNSTypeTable();
@@ -38,10 +57,40 @@
inline const flatbuffers::TypeTable *SecondTableInATypeTable();
+struct TableInFirstNST : public flatbuffers::NativeTable {
+ typedef TableInFirstNS TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.TableInFirstNST";
+ }
+ flatbuffers::unique_ptr<NamespaceA::NamespaceB::TableInNestedNST> foo_table;
+ NamespaceA::NamespaceB::EnumInNestedNS foo_enum;
+ flatbuffers::unique_ptr<NamespaceA::NamespaceB::StructInNestedNS> foo_struct;
+ TableInFirstNST()
+ : foo_enum(NamespaceA::NamespaceB::EnumInNestedNS_A) {
+ }
+};
+
+inline bool operator==(const TableInFirstNST &lhs, const TableInFirstNST &rhs) {
+ return
+ (lhs.foo_table == rhs.foo_table) &&
+ (lhs.foo_enum == rhs.foo_enum) &&
+ (lhs.foo_struct == rhs.foo_struct);
+}
+
+inline bool operator!=(const TableInFirstNST &lhs, const TableInFirstNST &rhs) {
+ return !(lhs == rhs);
+}
+
+
struct TableInFirstNS FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableInFirstNST NativeTableType;
+ typedef TableInFirstNSBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TableInFirstNSTypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.TableInFirstNS";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_FOO_TABLE = 4,
VT_FOO_ENUM = 6,
@@ -73,9 +122,13 @@
VerifyField<NamespaceA::NamespaceB::StructInNestedNS>(verifier, VT_FOO_STRUCT) &&
verifier.EndTable();
}
+ TableInFirstNST *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(TableInFirstNST *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<TableInFirstNS> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInFirstNST* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct TableInFirstNSBuilder {
+ typedef TableInFirstNS Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_foo_table(flatbuffers::Offset<NamespaceA::NamespaceB::TableInNestedNS> foo_table) {
@@ -91,7 +144,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- TableInFirstNSBuilder &operator=(const TableInFirstNSBuilder &);
flatbuffers::Offset<TableInFirstNS> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<TableInFirstNS>(end);
@@ -111,14 +163,43 @@
return builder_.Finish();
}
+flatbuffers::Offset<TableInFirstNS> CreateTableInFirstNS(flatbuffers::FlatBufferBuilder &_fbb, const TableInFirstNST *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
} // namespace NamespaceA
namespace NamespaceC {
+struct TableInCT : public flatbuffers::NativeTable {
+ typedef TableInC TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceC.TableInCT";
+ }
+ flatbuffers::unique_ptr<NamespaceA::TableInFirstNST> refer_to_a1;
+ flatbuffers::unique_ptr<NamespaceA::SecondTableInAT> refer_to_a2;
+ TableInCT() {
+ }
+};
+
+inline bool operator==(const TableInCT &lhs, const TableInCT &rhs) {
+ return
+ (lhs.refer_to_a1 == rhs.refer_to_a1) &&
+ (lhs.refer_to_a2 == rhs.refer_to_a2);
+}
+
+inline bool operator!=(const TableInCT &lhs, const TableInCT &rhs) {
+ return !(lhs == rhs);
+}
+
+
struct TableInC FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef TableInCT NativeTableType;
+ typedef TableInCBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return TableInCTypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceC.TableInC";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_REFER_TO_A1 = 4,
VT_REFER_TO_A2 = 6
@@ -143,9 +224,13 @@
verifier.VerifyTable(refer_to_a2()) &&
verifier.EndTable();
}
+ TableInCT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(TableInCT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<TableInC> Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInCT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct TableInCBuilder {
+ typedef TableInC Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_refer_to_a1(flatbuffers::Offset<NamespaceA::TableInFirstNS> refer_to_a1) {
@@ -158,7 +243,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- TableInCBuilder &operator=(const TableInCBuilder &);
flatbuffers::Offset<TableInC> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<TableInC>(end);
@@ -176,14 +260,41 @@
return builder_.Finish();
}
+flatbuffers::Offset<TableInC> CreateTableInC(flatbuffers::FlatBufferBuilder &_fbb, const TableInCT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
} // namespace NamespaceC
namespace NamespaceA {
+struct SecondTableInAT : public flatbuffers::NativeTable {
+ typedef SecondTableInA TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.SecondTableInAT";
+ }
+ flatbuffers::unique_ptr<NamespaceC::TableInCT> refer_to_c;
+ SecondTableInAT() {
+ }
+};
+
+inline bool operator==(const SecondTableInAT &lhs, const SecondTableInAT &rhs) {
+ return
+ (lhs.refer_to_c == rhs.refer_to_c);
+}
+
+inline bool operator!=(const SecondTableInAT &lhs, const SecondTableInAT &rhs) {
+ return !(lhs == rhs);
+}
+
+
struct SecondTableInA FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef SecondTableInAT NativeTableType;
+ typedef SecondTableInABuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return SecondTableInATypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "NamespaceA.SecondTableInA";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_REFER_TO_C = 4
};
@@ -199,9 +310,13 @@
verifier.VerifyTable(refer_to_c()) &&
verifier.EndTable();
}
+ SecondTableInAT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(SecondTableInAT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<SecondTableInA> Pack(flatbuffers::FlatBufferBuilder &_fbb, const SecondTableInAT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
};
struct SecondTableInABuilder {
+ typedef SecondTableInA Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_refer_to_c(flatbuffers::Offset<NamespaceC::TableInC> refer_to_c) {
@@ -211,7 +326,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- SecondTableInABuilder &operator=(const SecondTableInABuilder &);
flatbuffers::Offset<SecondTableInA> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<SecondTableInA>(end);
@@ -227,14 +341,103 @@
return builder_.Finish();
}
+flatbuffers::Offset<SecondTableInA> CreateSecondTableInA(flatbuffers::FlatBufferBuilder &_fbb, const SecondTableInAT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+inline TableInFirstNST *TableInFirstNS::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ flatbuffers::unique_ptr<NamespaceA::TableInFirstNST> _o = flatbuffers::unique_ptr<NamespaceA::TableInFirstNST>(new TableInFirstNST());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void TableInFirstNS::UnPackTo(TableInFirstNST *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = foo_table(); if (_e) _o->foo_table = flatbuffers::unique_ptr<NamespaceA::NamespaceB::TableInNestedNST>(_e->UnPack(_resolver)); }
+ { auto _e = foo_enum(); _o->foo_enum = _e; }
+ { auto _e = foo_struct(); if (_e) _o->foo_struct = flatbuffers::unique_ptr<NamespaceA::NamespaceB::StructInNestedNS>(new NamespaceA::NamespaceB::StructInNestedNS(*_e)); }
+}
+
+inline flatbuffers::Offset<TableInFirstNS> TableInFirstNS::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInFirstNST* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateTableInFirstNS(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<TableInFirstNS> CreateTableInFirstNS(flatbuffers::FlatBufferBuilder &_fbb, const TableInFirstNST *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TableInFirstNST* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _foo_table = _o->foo_table ? CreateTableInNestedNS(_fbb, _o->foo_table.get(), _rehasher) : 0;
+ auto _foo_enum = _o->foo_enum;
+ auto _foo_struct = _o->foo_struct ? _o->foo_struct.get() : 0;
+ return NamespaceA::CreateTableInFirstNS(
+ _fbb,
+ _foo_table,
+ _foo_enum,
+ _foo_struct);
+}
+
} // namespace NamespaceA
namespace NamespaceC {
+inline TableInCT *TableInC::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ flatbuffers::unique_ptr<NamespaceC::TableInCT> _o = flatbuffers::unique_ptr<NamespaceC::TableInCT>(new TableInCT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void TableInC::UnPackTo(TableInCT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = refer_to_a1(); if (_e) _o->refer_to_a1 = flatbuffers::unique_ptr<NamespaceA::TableInFirstNST>(_e->UnPack(_resolver)); }
+ { auto _e = refer_to_a2(); if (_e) _o->refer_to_a2 = flatbuffers::unique_ptr<NamespaceA::SecondTableInAT>(_e->UnPack(_resolver)); }
+}
+
+inline flatbuffers::Offset<TableInC> TableInC::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TableInCT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateTableInC(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<TableInC> CreateTableInC(flatbuffers::FlatBufferBuilder &_fbb, const TableInCT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TableInCT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _refer_to_a1 = _o->refer_to_a1 ? CreateTableInFirstNS(_fbb, _o->refer_to_a1.get(), _rehasher) : 0;
+ auto _refer_to_a2 = _o->refer_to_a2 ? CreateSecondTableInA(_fbb, _o->refer_to_a2.get(), _rehasher) : 0;
+ return NamespaceC::CreateTableInC(
+ _fbb,
+ _refer_to_a1,
+ _refer_to_a2);
+}
+
} // namespace NamespaceC
namespace NamespaceA {
+inline SecondTableInAT *SecondTableInA::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ flatbuffers::unique_ptr<NamespaceA::SecondTableInAT> _o = flatbuffers::unique_ptr<NamespaceA::SecondTableInAT>(new SecondTableInAT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void SecondTableInA::UnPackTo(SecondTableInAT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = refer_to_c(); if (_e) _o->refer_to_c = flatbuffers::unique_ptr<NamespaceC::TableInCT>(_e->UnPack(_resolver)); }
+}
+
+inline flatbuffers::Offset<SecondTableInA> SecondTableInA::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SecondTableInAT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateSecondTableInA(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<SecondTableInA> CreateSecondTableInA(flatbuffers::FlatBufferBuilder &_fbb, const SecondTableInAT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SecondTableInAT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _refer_to_c = _o->refer_to_c ? CreateTableInC(_fbb, _o->refer_to_c.get(), _rehasher) : 0;
+ return NamespaceA::CreateSecondTableInA(
+ _fbb,
+ _refer_to_c);
+}
+
inline const flatbuffers::TypeTable *TableInFirstNSTypeTable() {
static const flatbuffers::TypeCode type_codes[] = {
{ flatbuffers::ET_SEQUENCE, 0, 0 },
@@ -252,7 +455,7 @@
"foo_struct"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 3, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 3, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -275,7 +478,7 @@
"refer_to_a2"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 2, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 2, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -295,7 +498,7 @@
"refer_to_c"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
diff --git a/tests/namespace_test/namespace_test2_generated.js b/tests/namespace_test/namespace_test2_generated.js
index f54cda7..9b2668c 100644
--- a/tests/namespace_test/namespace_test2_generated.js
+++ b/tests/namespace_test/namespace_test2_generated.js
@@ -59,6 +59,7 @@
* @returns {NamespaceA.TableInFirstNS}
*/
NamespaceA.TableInFirstNS.getSizePrefixedRootAsTableInFirstNS = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new NamespaceA.TableInFirstNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -104,6 +105,13 @@
};
/**
+ * @returns {string}
+ */
+NamespaceA.TableInFirstNS.getFullyQualifiedName = function() {
+ return 'NamespaceA.TableInFirstNS';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
NamespaceA.TableInFirstNS.startTableInFirstNS = function(builder) {
@@ -144,21 +152,6 @@
};
/**
- * @param {flatbuffers.Builder} builder
- * @param {flatbuffers.Offset} fooTableOffset
- * @param {NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS} fooEnum
- * @param {flatbuffers.Offset} fooStructOffset
- * @returns {flatbuffers.Offset}
- */
-NamespaceA.TableInFirstNS.createTableInFirstNS = function(builder, fooTableOffset, fooEnum, fooStructOffset) {
- NamespaceA.TableInFirstNS.startTableInFirstNS(builder);
- NamespaceA.TableInFirstNS.addFooTable(builder, fooTableOffset);
- NamespaceA.TableInFirstNS.addFooEnum(builder, fooEnum);
- NamespaceA.TableInFirstNS.addFooStruct(builder, fooStructOffset);
- return NamespaceA.TableInFirstNS.endTableInFirstNS(builder);
-}
-
-/**
* @constructor
*/
NamespaceC.TableInC = function() {
@@ -199,6 +192,7 @@
* @returns {NamespaceC.TableInC}
*/
NamespaceC.TableInC.getSizePrefixedRootAsTableInC = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new NamespaceC.TableInC).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -221,6 +215,13 @@
};
/**
+ * @returns {string}
+ */
+NamespaceC.TableInC.getFullyQualifiedName = function() {
+ return 'NamespaceC.TableInC';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
NamespaceC.TableInC.startTableInC = function(builder) {
@@ -253,19 +254,6 @@
};
/**
- * @param {flatbuffers.Builder} builder
- * @param {flatbuffers.Offset} referToA1Offset
- * @param {flatbuffers.Offset} referToA2Offset
- * @returns {flatbuffers.Offset}
- */
-NamespaceC.TableInC.createTableInC = function(builder, referToA1Offset, referToA2Offset) {
- NamespaceC.TableInC.startTableInC(builder);
- NamespaceC.TableInC.addReferToA1(builder, referToA1Offset);
- NamespaceC.TableInC.addReferToA2(builder, referToA2Offset);
- return NamespaceC.TableInC.endTableInC(builder);
-}
-
-/**
* @constructor
*/
NamespaceA.SecondTableInA = function() {
@@ -306,6 +294,7 @@
* @returns {NamespaceA.SecondTableInA}
*/
NamespaceA.SecondTableInA.getSizePrefixedRootAsSecondTableInA = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new NamespaceA.SecondTableInA).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -319,6 +308,13 @@
};
/**
+ * @returns {string}
+ */
+NamespaceA.SecondTableInA.getFullyQualifiedName = function() {
+ return 'NamespaceA.SecondTableInA';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
NamespaceA.SecondTableInA.startSecondTableInA = function(builder) {
diff --git a/tests/namespace_test/namespace_test2_generated.rs b/tests/namespace_test/namespace_test2_generated.rs
index 3c04c0f..b1d84cf 100644
--- a/tests/namespace_test/namespace_test2_generated.rs
+++ b/tests/namespace_test/namespace_test2_generated.rs
@@ -1,7 +1,9 @@
// automatically generated by the FlatBuffers compiler, do not modify
+#![allow(unused_imports, dead_code)]
+use crate::namespace_test1_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -11,6 +13,7 @@
#[allow(unused_imports, dead_code)]
pub mod namespace_a {
+ use crate::namespace_test1_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -18,7 +21,7 @@
use self::flatbuffers::EndianScalar;
pub enum TableInFirstNSOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct TableInFirstNS<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -28,13 +31,15 @@
type Inner = TableInFirstNS<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> TableInFirstNS<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "NamespaceA.TableInFirstNS"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
TableInFirstNS {
@@ -71,9 +76,9 @@
}
pub struct TableInFirstNSArgs<'a> {
- pub foo_table: Option<flatbuffers::WIPOffset<namespace_b::TableInNestedNS<'a >>>,
+ pub foo_table: Option<flatbuffers::WIPOffset<namespace_b::TableInNestedNS<'a>>>,
pub foo_enum: namespace_b::EnumInNestedNS,
- pub foo_struct: Option<&'a namespace_b::StructInNestedNS>,
+ pub foo_struct: Option<&'a namespace_b::StructInNestedNS>,
}
impl<'a> Default for TableInFirstNSArgs<'a> {
#[inline]
@@ -99,7 +104,7 @@
self.fbb_.push_slot::<namespace_b::EnumInNestedNS>(TableInFirstNS::VT_FOO_ENUM, foo_enum, namespace_b::EnumInNestedNS::A);
}
#[inline]
- pub fn add_foo_struct(&mut self, foo_struct: &'b namespace_b::StructInNestedNS) {
+ pub fn add_foo_struct(&mut self, foo_struct: &namespace_b::StructInNestedNS) {
self.fbb_.push_slot_always::<&namespace_b::StructInNestedNS>(TableInFirstNS::VT_FOO_STRUCT, foo_struct);
}
#[inline]
@@ -117,8 +122,17 @@
}
}
+impl std::fmt::Debug for TableInFirstNS<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TableInFirstNS");
+ ds.field("foo_table", &self.foo_table());
+ ds.field("foo_enum", &self.foo_enum());
+ ds.field("foo_struct", &self.foo_struct());
+ ds.finish()
+ }
+}
pub enum SecondTableInAOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct SecondTableInA<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -128,13 +142,15 @@
type Inner = SecondTableInA<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> SecondTableInA<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "NamespaceA.SecondTableInA"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
SecondTableInA {
@@ -159,7 +175,7 @@
}
pub struct SecondTableInAArgs<'a> {
- pub refer_to_c: Option<flatbuffers::WIPOffset<super::namespace_c::TableInC<'a >>>,
+ pub refer_to_c: Option<flatbuffers::WIPOffset<super::namespace_c::TableInC<'a>>>,
}
impl<'a> Default for SecondTableInAArgs<'a> {
#[inline]
@@ -193,11 +209,19 @@
}
}
+impl std::fmt::Debug for SecondTableInA<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("SecondTableInA");
+ ds.field("refer_to_c", &self.refer_to_c());
+ ds.finish()
+ }
+}
} // pub mod NamespaceA
#[allow(unused_imports, dead_code)]
pub mod namespace_c {
+ use crate::namespace_test1_generated::*;
use std::mem;
use std::cmp::Ordering;
@@ -205,7 +229,7 @@
use self::flatbuffers::EndianScalar;
pub enum TableInCOffset {}
-#[derive(Copy, Clone, Debug, PartialEq)]
+#[derive(Copy, Clone, PartialEq)]
pub struct TableInC<'a> {
pub _tab: flatbuffers::Table<'a>,
@@ -215,13 +239,15 @@
type Inner = TableInC<'a>;
#[inline]
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
- Self {
- _tab: flatbuffers::Table { buf: buf, loc: loc },
- }
+ Self { _tab: flatbuffers::Table { buf, loc } }
}
}
impl<'a> TableInC<'a> {
+ pub const fn get_fully_qualified_name() -> &'static str {
+ "NamespaceC.TableInC"
+ }
+
#[inline]
pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
TableInC {
@@ -252,8 +278,8 @@
}
pub struct TableInCArgs<'a> {
- pub refer_to_a1: Option<flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS<'a >>>,
- pub refer_to_a2: Option<flatbuffers::WIPOffset<super::namespace_a::SecondTableInA<'a >>>,
+ pub refer_to_a1: Option<flatbuffers::WIPOffset<super::namespace_a::TableInFirstNS<'a>>>,
+ pub refer_to_a2: Option<flatbuffers::WIPOffset<super::namespace_a::SecondTableInA<'a>>>,
}
impl<'a> Default for TableInCArgs<'a> {
#[inline]
@@ -292,5 +318,13 @@
}
}
+impl std::fmt::Debug for TableInC<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("TableInC");
+ ds.field("refer_to_a1", &self.refer_to_a1());
+ ds.field("refer_to_a2", &self.refer_to_a2());
+ ds.finish()
+ }
+}
} // pub mod NamespaceC
diff --git a/tests/namespace_test/namespace_test2_generated.ts b/tests/namespace_test/namespace_test2_generated.ts
index 7bd0543..bd3c903 100644
--- a/tests/namespace_test/namespace_test2_generated.ts
+++ b/tests/namespace_test/namespace_test2_generated.ts
@@ -26,7 +26,7 @@
* @returns TableInFirstNS
*/
static getRootAsTableInFirstNS(bb:flatbuffers.ByteBuffer, obj?:TableInFirstNS):TableInFirstNS {
- return (obj || new TableInFirstNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new TableInFirstNS()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -35,7 +35,8 @@
* @returns TableInFirstNS
*/
static getSizePrefixedRootAsTableInFirstNS(bb:flatbuffers.ByteBuffer, obj?:TableInFirstNS):TableInFirstNS {
- return (obj || new TableInFirstNS).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new TableInFirstNS()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -44,7 +45,7 @@
*/
fooTable(obj?:NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNS):NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNS|null {
var offset = this.bb!.__offset(this.bb_pos, 4);
- return offset ? (obj || new NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNS()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
@@ -76,10 +77,17 @@
*/
fooStruct(obj?:NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNS):NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNS|null {
var offset = this.bb!.__offset(this.bb_pos, 8);
- return offset ? (obj || new NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb!) : null;
+ return offset ? (obj || new NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNS()).__init(this.bb_pos + offset, this.bb!) : null;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'NamespaceA.TableInFirstNS';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startTableInFirstNS(builder:flatbuffers.Builder) {
@@ -119,13 +127,53 @@
return offset;
};
-static createTableInFirstNS(builder:flatbuffers.Builder, fooTableOffset:flatbuffers.Offset, fooEnum:NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS, fooStructOffset:flatbuffers.Offset):flatbuffers.Offset {
- TableInFirstNS.startTableInFirstNS(builder);
- TableInFirstNS.addFooTable(builder, fooTableOffset);
- TableInFirstNS.addFooEnum(builder, fooEnum);
- TableInFirstNS.addFooStruct(builder, fooStructOffset);
- return TableInFirstNS.endTableInFirstNS(builder);
+
+/**
+ * @returns TableInFirstNST
+ */
+unpack(): TableInFirstNST {
+ return new TableInFirstNST(
+ (this.fooTable() !== null ? this.fooTable()!.unpack() : null),
+ this.fooEnum(),
+ (this.fooStruct() !== null ? this.fooStruct()!.unpack() : null)
+ );
+};
+
+/**
+ * @param TableInFirstNST _o
+ */
+unpackTo(_o: TableInFirstNST): void {
+ _o.fooTable = (this.fooTable() !== null ? this.fooTable()!.unpack() : null);
+ _o.fooEnum = this.fooEnum();
+ _o.fooStruct = (this.fooStruct() !== null ? this.fooStruct()!.unpack() : null);
+};
}
+
+export class TableInFirstNST {
+/**
+ * @constructor
+ * @param NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNST|null fooTable
+ * @param NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS fooEnum
+ * @param NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNST|null fooStruct
+ */
+constructor(
+ public fooTable: NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNST|null = null,
+ public fooEnum: NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS = NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS.A,
+ public fooStruct: NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNST|null = null
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ NamespaceA.TableInFirstNS.start(builder);
+ NamespaceA.TableInFirstNS.addFooTable(builder, (this.fooTable !== null ? this.fooTable!.pack(builder) : 0));
+ NamespaceA.TableInFirstNS.addFooEnum(builder, this.fooEnum);
+ NamespaceA.TableInFirstNS.addFooStruct(builder, (this.fooStruct !== null ? this.fooStruct!.pack(builder) : 0));
+
+ return NamespaceA.TableInFirstNS.end(builder);
+};
}
}
/**
@@ -153,7 +201,7 @@
* @returns TableInC
*/
static getRootAsTableInC(bb:flatbuffers.ByteBuffer, obj?:TableInC):TableInC {
- return (obj || new TableInC).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new TableInC()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -162,7 +210,8 @@
* @returns TableInC
*/
static getSizePrefixedRootAsTableInC(bb:flatbuffers.ByteBuffer, obj?:TableInC):TableInC {
- return (obj || new TableInC).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new TableInC()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -171,7 +220,7 @@
*/
referToA1(obj?:NamespaceA.TableInFirstNS):NamespaceA.TableInFirstNS|null {
var offset = this.bb!.__offset(this.bb_pos, 4);
- return offset ? (obj || new NamespaceA.TableInFirstNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new NamespaceA.TableInFirstNS()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
@@ -180,10 +229,17 @@
*/
referToA2(obj?:NamespaceA.SecondTableInA):NamespaceA.SecondTableInA|null {
var offset = this.bb!.__offset(this.bb_pos, 6);
- return offset ? (obj || new NamespaceA.SecondTableInA).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new NamespaceA.SecondTableInA()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'NamespaceC.TableInC';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startTableInC(builder:flatbuffers.Builder) {
@@ -215,12 +271,48 @@
return offset;
};
-static createTableInC(builder:flatbuffers.Builder, referToA1Offset:flatbuffers.Offset, referToA2Offset:flatbuffers.Offset):flatbuffers.Offset {
- TableInC.startTableInC(builder);
- TableInC.addReferToA1(builder, referToA1Offset);
- TableInC.addReferToA2(builder, referToA2Offset);
- return TableInC.endTableInC(builder);
+
+/**
+ * @returns TableInCT
+ */
+unpack(): TableInCT {
+ return new TableInCT(
+ (this.referToA1() !== null ? this.referToA1()!.unpack() : null),
+ (this.referToA2() !== null ? this.referToA2()!.unpack() : null)
+ );
+};
+
+/**
+ * @param TableInCT _o
+ */
+unpackTo(_o: TableInCT): void {
+ _o.referToA1 = (this.referToA1() !== null ? this.referToA1()!.unpack() : null);
+ _o.referToA2 = (this.referToA2() !== null ? this.referToA2()!.unpack() : null);
+};
}
+
+export class TableInCT {
+/**
+ * @constructor
+ * @param NamespaceA.TableInFirstNST|null referToA1
+ * @param NamespaceA.SecondTableInAT|null referToA2
+ */
+constructor(
+ public referToA1: NamespaceA.TableInFirstNST|null = null,
+ public referToA2: NamespaceA.SecondTableInAT|null = null
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ NamespaceC.TableInC.start(builder);
+ NamespaceC.TableInC.addReferToA1(builder, (this.referToA1 !== null ? this.referToA1!.pack(builder) : 0));
+ NamespaceC.TableInC.addReferToA2(builder, (this.referToA2 !== null ? this.referToA2!.pack(builder) : 0));
+
+ return NamespaceC.TableInC.end(builder);
+};
}
}
/**
@@ -248,7 +340,7 @@
* @returns SecondTableInA
*/
static getRootAsSecondTableInA(bb:flatbuffers.ByteBuffer, obj?:SecondTableInA):SecondTableInA {
- return (obj || new SecondTableInA).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new SecondTableInA()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -257,7 +349,8 @@
* @returns SecondTableInA
*/
static getSizePrefixedRootAsSecondTableInA(bb:flatbuffers.ByteBuffer, obj?:SecondTableInA):SecondTableInA {
- return (obj || new SecondTableInA).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new SecondTableInA()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -266,10 +359,17 @@
*/
referToC(obj?:NamespaceC.TableInC):NamespaceC.TableInC|null {
var offset = this.bb!.__offset(this.bb_pos, 4);
- return offset ? (obj || new NamespaceC.TableInC).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+ return offset ? (obj || new NamespaceC.TableInC()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'NamespaceA.SecondTableInA';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startSecondTableInA(builder:flatbuffers.Builder) {
@@ -298,5 +398,41 @@
SecondTableInA.addReferToC(builder, referToCOffset);
return SecondTableInA.endSecondTableInA(builder);
}
+
+/**
+ * @returns SecondTableInAT
+ */
+unpack(): SecondTableInAT {
+ return new SecondTableInAT(
+ (this.referToC() !== null ? this.referToC()!.unpack() : null)
+ );
+};
+
+/**
+ * @param SecondTableInAT _o
+ */
+unpackTo(_o: SecondTableInAT): void {
+ _o.referToC = (this.referToC() !== null ? this.referToC()!.unpack() : null);
+};
+}
+
+export class SecondTableInAT {
+/**
+ * @constructor
+ * @param NamespaceC.TableInCT|null referToC
+ */
+constructor(
+ public referToC: NamespaceC.TableInCT|null = null
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return NamespaceA.SecondTableInA.createSecondTableInA(builder,
+ (this.referToC !== null ? this.referToC!.pack(builder) : 0)
+ );
+};
}
}
diff --git a/tests/namespace_test/namespace_test2_namespace_a_generated.dart b/tests/namespace_test/namespace_test2_namespace_a_generated.dart
index d5108eb..e10ad4b 100644
--- a/tests/namespace_test/namespace_test2_namespace_a_generated.dart
+++ b/tests/namespace_test/namespace_test2_namespace_a_generated.dart
@@ -6,7 +6,6 @@
import 'dart:typed_data' show Uint8List;
import 'package:flat_buffers/flat_buffers.dart' as fb;
-import 'namespace_test1_namespace_a_generated.dart';
import './namespace_test2_namespace_c_generated.dart' as namespace_c;
class TableInFirstNS {
diff --git a/tests/namespace_test/namespace_test2_namespace_c_generated.dart b/tests/namespace_test/namespace_test2_namespace_c_generated.dart
index 7214feb..edb6ffc 100644
--- a/tests/namespace_test/namespace_test2_namespace_c_generated.dart
+++ b/tests/namespace_test/namespace_test2_namespace_c_generated.dart
@@ -6,7 +6,6 @@
import 'dart:typed_data' show Uint8List;
import 'package:flat_buffers/flat_buffers.dart' as fb;
-import 'namespace_test1_namespace_c_generated.dart';
import './namespace_test2_namespace_a_generated.dart' as namespace_a;
class TableInC {
diff --git a/tests/native_type_test_generated.h b/tests/native_type_test_generated.h
index 9ba7c61..e504c92 100644
--- a/tests/native_type_test_generated.h
+++ b/tests/native_type_test_generated.h
@@ -13,6 +13,7 @@
struct Vector3D;
struct ApplicationData;
+struct ApplicationDataBuilder;
struct ApplicationDataT;
inline const flatbuffers::TypeTable *Vector3DTypeTable();
@@ -29,8 +30,10 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return Vector3DTypeTable();
}
- Vector3D() {
- memset(static_cast<void *>(this), 0, sizeof(Vector3D));
+ Vector3D()
+ : x_(0),
+ y_(0),
+ z_(0) {
}
Vector3D(float _x, float _y, float _z)
: x_(flatbuffers::EndianScalar(_x)),
@@ -67,6 +70,7 @@
struct ApplicationData FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef ApplicationDataT NativeTableType;
+ typedef ApplicationDataBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return ApplicationDataTypeTable();
}
@@ -91,6 +95,7 @@
};
struct ApplicationDataBuilder {
+ typedef ApplicationData Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_vectors(flatbuffers::Offset<flatbuffers::Vector<const Geometry::Vector3D *>> vectors) {
@@ -100,7 +105,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- ApplicationDataBuilder &operator=(const ApplicationDataBuilder &);
flatbuffers::Offset<ApplicationData> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<ApplicationData>(end);
@@ -128,15 +132,15 @@
flatbuffers::Offset<ApplicationData> CreateApplicationData(flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline ApplicationDataT *ApplicationData::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new ApplicationDataT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<Geometry::ApplicationDataT> _o = flatbuffers::unique_ptr<Geometry::ApplicationDataT>(new ApplicationDataT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void ApplicationData::UnPackTo(ApplicationDataT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = vectors(); if (_e) { _o->vectors.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vectors[_i] = flatbuffers::UnPack(*_e->Get(_i)); } } };
+ { auto _e = vectors(); if (_e) { _o->vectors.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->vectors[_i] = flatbuffers::UnPack(*_e->Get(_i)); } } }
}
inline flatbuffers::Offset<ApplicationData> ApplicationData::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ApplicationDataT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -166,7 +170,7 @@
"z"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 3, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 3, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
@@ -182,7 +186,7 @@
"vectors"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
diff --git a/tests/native_type_test_impl.cpp b/tests/native_type_test_impl.cpp
index 04ddb96..edf23eb 100644
--- a/tests/native_type_test_impl.cpp
+++ b/tests/native_type_test_impl.cpp
@@ -1,13 +1,13 @@
#include "native_type_test_impl.h"
+
#include "native_type_test_generated.h"
namespace flatbuffers {
- Geometry::Vector3D Pack(const Native::Vector3D &obj) {
- return Geometry::Vector3D(obj.x, obj.y, obj.z);
- }
-
- const Native::Vector3D UnPack(const Geometry::Vector3D &obj) {
- return Native::Vector3D(obj.x(), obj.y(), obj.z());
- }
+Geometry::Vector3D Pack(const Native::Vector3D &obj) {
+ return Geometry::Vector3D(obj.x, obj.y, obj.z);
}
+const Native::Vector3D UnPack(const Geometry::Vector3D &obj) {
+ return Native::Vector3D(obj.x(), obj.y(), obj.z());
+}
+} // namespace flatbuffers
diff --git a/tests/native_type_test_impl.h b/tests/native_type_test_impl.h
index 2473ad3..fb35e0f 100644
--- a/tests/native_type_test_impl.h
+++ b/tests/native_type_test_impl.h
@@ -2,23 +2,31 @@
#define NATIVE_TYPE_TEST_IMPL_H
namespace Native {
- struct Vector3D {
- float x;
- float y;
- float z;
+struct Vector3D {
+ float x;
+ float y;
+ float z;
- Vector3D() { x = 0; y = 0; z = 0; };
- Vector3D(float _x, float _y, float _z) { this->x = _x; this->y = _y; this->z = _z; }
+ Vector3D() {
+ x = 0;
+ y = 0;
+ z = 0;
};
-}
+ Vector3D(float _x, float _y, float _z) {
+ this->x = _x;
+ this->y = _y;
+ this->z = _z;
+ }
+};
+} // namespace Native
-namespace Geometry {
- struct Vector3D;
+namespace Geometry {
+struct Vector3D;
}
namespace flatbuffers {
- Geometry::Vector3D Pack(const Native::Vector3D &obj);
- const Native::Vector3D UnPack(const Geometry::Vector3D &obj);
-}
+Geometry::Vector3D Pack(const Native::Vector3D &obj);
+const Native::Vector3D UnPack(const Geometry::Vector3D &obj);
+} // namespace flatbuffers
-#endif // VECTOR3D_PACK_H
+#endif // VECTOR3D_PACK_H
diff --git a/tests/optional_scalars.fbs b/tests/optional_scalars.fbs
new file mode 100644
index 0000000..260d443
--- /dev/null
+++ b/tests/optional_scalars.fbs
@@ -0,0 +1,59 @@
+namespace optional_scalars;
+
+enum OptionalByte: byte {
+ None = 0,
+ One = 1,
+ Two = 2,
+}
+
+// This table tests optional scalars in tables. It should be integrated with
+// the main monster test once most languages support optional scalars.
+table ScalarStuff {
+ just_i8: int8;
+ maybe_i8: int8 = null;
+ default_i8: int8 = 42;
+ just_u8: uint8;
+ maybe_u8: uint8 = null;
+ default_u8: uint8 = 42;
+
+ just_i16: int16;
+ maybe_i16: int16 = null;
+ default_i16: int16 = 42;
+ just_u16: uint16;
+ maybe_u16: uint16 = null;
+ default_u16: uint16 = 42;
+
+ just_i32: int32;
+ maybe_i32: int32 = null;
+ default_i32: int32 = 42;
+ just_u32: uint32;
+ maybe_u32: uint32 = null;
+ default_u32: uint32 = 42;
+
+ just_i64: int64;
+ maybe_i64: int64 = null;
+ default_i64: int64 = 42;
+ just_u64: uint64;
+ maybe_u64: uint64 = null;
+ default_u64: uint64 = 42;
+
+ just_f32: float32;
+ maybe_f32: float32 = null;
+ default_f32: float32 = 42;
+ just_f64: float64;
+ maybe_f64: float64 = null;
+ default_f64: float64 = 42;
+
+ just_bool: bool;
+ maybe_bool: bool = null;
+ default_bool: bool = true;
+
+ just_enum: OptionalByte;
+ maybe_enum: OptionalByte = null;
+ default_enum: OptionalByte = One;
+}
+
+root_type ScalarStuff;
+
+file_identifier "NULL";
+file_extension "mon";
diff --git a/tests/optional_scalars/OptionalByte.cs b/tests/optional_scalars/OptionalByte.cs
new file mode 100644
index 0000000..79a2004
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.cs
@@ -0,0 +1,16 @@
+// <auto-generated>
+// automatically generated by the FlatBuffers compiler, do not modify
+// </auto-generated>
+
+namespace optional_scalars
+{
+
+public enum OptionalByte : sbyte
+{
+ None = 0,
+ One = 1,
+ Two = 2,
+};
+
+
+}
diff --git a/tests/optional_scalars/OptionalByte.java b/tests/optional_scalars/OptionalByte.java
new file mode 100644
index 0000000..2ca8475
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.java
@@ -0,0 +1,15 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars;
+
+public final class OptionalByte {
+ private OptionalByte() { }
+ public static final byte None = 0;
+ public static final byte One = 1;
+ public static final byte Two = 2;
+
+ public static final String[] names = { "None", "One", "Two", };
+
+ public static String name(int e) { return names[e]; }
+}
+
diff --git a/tests/optional_scalars/OptionalByte.kt b/tests/optional_scalars/OptionalByte.kt
new file mode 100644
index 0000000..41fe6cd
--- /dev/null
+++ b/tests/optional_scalars/OptionalByte.kt
@@ -0,0 +1,15 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class OptionalByte private constructor() {
+ companion object {
+ const val None: Byte = 0
+ const val One: Byte = 1
+ const val Two: Byte = 2
+ val names : Array<String> = arrayOf("None", "One", "Two")
+ fun name(e: Int) : String = names[e]
+ }
+}
diff --git a/tests/optional_scalars/ScalarStuff.cs b/tests/optional_scalars/ScalarStuff.cs
new file mode 100644
index 0000000..a5c9ffb
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.cs
@@ -0,0 +1,183 @@
+// <auto-generated>
+// automatically generated by the FlatBuffers compiler, do not modify
+// </auto-generated>
+
+namespace optional_scalars
+{
+
+using global::System;
+using global::System.Collections.Generic;
+using global::FlatBuffers;
+
+public struct ScalarStuff : IFlatbufferObject
+{
+ private Table __p;
+ public ByteBuffer ByteBuffer { get { return __p.bb; } }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
+ public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb) { return GetRootAsScalarStuff(_bb, new ScalarStuff()); }
+ public static ScalarStuff GetRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
+ public static bool ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "NULL"); }
+ public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
+ public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public sbyte JustI8 { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)0; } }
+ public sbyte? MaybeI8 { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte?)null; } }
+ public sbyte DefaultI8 { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetSbyte(o + __p.bb_pos) : (sbyte)42; } }
+ public byte JustU8 { get { int o = __p.__offset(10); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)0; } }
+ public byte? MaybeU8 { get { int o = __p.__offset(12); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte?)null; } }
+ public byte DefaultU8 { get { int o = __p.__offset(14); return o != 0 ? __p.bb.Get(o + __p.bb_pos) : (byte)42; } }
+ public short JustI16 { get { int o = __p.__offset(16); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)0; } }
+ public short? MaybeI16 { get { int o = __p.__offset(18); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short?)null; } }
+ public short DefaultI16 { get { int o = __p.__offset(20); return o != 0 ? __p.bb.GetShort(o + __p.bb_pos) : (short)42; } }
+ public ushort JustU16 { get { int o = __p.__offset(22); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)0; } }
+ public ushort? MaybeU16 { get { int o = __p.__offset(24); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort?)null; } }
+ public ushort DefaultU16 { get { int o = __p.__offset(26); return o != 0 ? __p.bb.GetUshort(o + __p.bb_pos) : (ushort)42; } }
+ public int JustI32 { get { int o = __p.__offset(28); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } }
+ public int? MaybeI32 { get { int o = __p.__offset(30); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int?)null; } }
+ public int DefaultI32 { get { int o = __p.__offset(32); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)42; } }
+ public uint JustU32 { get { int o = __p.__offset(34); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)0; } }
+ public uint? MaybeU32 { get { int o = __p.__offset(36); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint?)null; } }
+ public uint DefaultU32 { get { int o = __p.__offset(38); return o != 0 ? __p.bb.GetUint(o + __p.bb_pos) : (uint)42; } }
+ public long JustI64 { get { int o = __p.__offset(40); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)0; } }
+ public long? MaybeI64 { get { int o = __p.__offset(42); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long?)null; } }
+ public long DefaultI64 { get { int o = __p.__offset(44); return o != 0 ? __p.bb.GetLong(o + __p.bb_pos) : (long)42; } }
+ public ulong JustU64 { get { int o = __p.__offset(46); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)0; } }
+ public ulong? MaybeU64 { get { int o = __p.__offset(48); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong?)null; } }
+ public ulong DefaultU64 { get { int o = __p.__offset(50); return o != 0 ? __p.bb.GetUlong(o + __p.bb_pos) : (ulong)42; } }
+ public float JustF32 { get { int o = __p.__offset(52); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } }
+ public float? MaybeF32 { get { int o = __p.__offset(54); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float?)null; } }
+ public float DefaultF32 { get { int o = __p.__offset(56); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)42.0f; } }
+ public double JustF64 { get { int o = __p.__offset(58); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)0.0; } }
+ public double? MaybeF64 { get { int o = __p.__offset(60); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double?)null; } }
+ public double DefaultF64 { get { int o = __p.__offset(62); return o != 0 ? __p.bb.GetDouble(o + __p.bb_pos) : (double)42.0; } }
+ public bool JustBool { get { int o = __p.__offset(64); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)false; } }
+ public bool? MaybeBool { get { int o = __p.__offset(66); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool?)null; } }
+ public bool DefaultBool { get { int o = __p.__offset(68); return o != 0 ? 0!=__p.bb.Get(o + __p.bb_pos) : (bool)true; } }
+ public optional_scalars.OptionalByte JustEnum { get { int o = __p.__offset(70); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.None; } }
+ public optional_scalars.OptionalByte? MaybeEnum { get { int o = __p.__offset(72); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : (optional_scalars.OptionalByte?)null; } }
+ public optional_scalars.OptionalByte DefaultEnum { get { int o = __p.__offset(74); return o != 0 ? (optional_scalars.OptionalByte)__p.bb.GetSbyte(o + __p.bb_pos) : optional_scalars.OptionalByte.One; } }
+
+ public static Offset<optional_scalars.ScalarStuff> CreateScalarStuff(FlatBufferBuilder builder,
+ sbyte just_i8 = 0,
+ sbyte? maybe_i8 = null,
+ sbyte default_i8 = 42,
+ byte just_u8 = 0,
+ byte? maybe_u8 = null,
+ byte default_u8 = 42,
+ short just_i16 = 0,
+ short? maybe_i16 = null,
+ short default_i16 = 42,
+ ushort just_u16 = 0,
+ ushort? maybe_u16 = null,
+ ushort default_u16 = 42,
+ int just_i32 = 0,
+ int? maybe_i32 = null,
+ int default_i32 = 42,
+ uint just_u32 = 0,
+ uint? maybe_u32 = null,
+ uint default_u32 = 42,
+ long just_i64 = 0,
+ long? maybe_i64 = null,
+ long default_i64 = 42,
+ ulong just_u64 = 0,
+ ulong? maybe_u64 = null,
+ ulong default_u64 = 42,
+ float just_f32 = 0.0f,
+ float? maybe_f32 = null,
+ float default_f32 = 42.0f,
+ double just_f64 = 0.0,
+ double? maybe_f64 = null,
+ double default_f64 = 42.0,
+ bool just_bool = false,
+ bool? maybe_bool = null,
+ bool default_bool = true,
+ optional_scalars.OptionalByte just_enum = optional_scalars.OptionalByte.None,
+ optional_scalars.OptionalByte? maybe_enum = null,
+ optional_scalars.OptionalByte default_enum = optional_scalars.OptionalByte.One) {
+ builder.StartTable(36);
+ ScalarStuff.AddDefaultF64(builder, default_f64);
+ ScalarStuff.AddMaybeF64(builder, maybe_f64);
+ ScalarStuff.AddJustF64(builder, just_f64);
+ ScalarStuff.AddDefaultU64(builder, default_u64);
+ ScalarStuff.AddMaybeU64(builder, maybe_u64);
+ ScalarStuff.AddJustU64(builder, just_u64);
+ ScalarStuff.AddDefaultI64(builder, default_i64);
+ ScalarStuff.AddMaybeI64(builder, maybe_i64);
+ ScalarStuff.AddJustI64(builder, just_i64);
+ ScalarStuff.AddDefaultF32(builder, default_f32);
+ ScalarStuff.AddMaybeF32(builder, maybe_f32);
+ ScalarStuff.AddJustF32(builder, just_f32);
+ ScalarStuff.AddDefaultU32(builder, default_u32);
+ ScalarStuff.AddMaybeU32(builder, maybe_u32);
+ ScalarStuff.AddJustU32(builder, just_u32);
+ ScalarStuff.AddDefaultI32(builder, default_i32);
+ ScalarStuff.AddMaybeI32(builder, maybe_i32);
+ ScalarStuff.AddJustI32(builder, just_i32);
+ ScalarStuff.AddDefaultU16(builder, default_u16);
+ ScalarStuff.AddMaybeU16(builder, maybe_u16);
+ ScalarStuff.AddJustU16(builder, just_u16);
+ ScalarStuff.AddDefaultI16(builder, default_i16);
+ ScalarStuff.AddMaybeI16(builder, maybe_i16);
+ ScalarStuff.AddJustI16(builder, just_i16);
+ ScalarStuff.AddDefaultEnum(builder, default_enum);
+ ScalarStuff.AddMaybeEnum(builder, maybe_enum);
+ ScalarStuff.AddJustEnum(builder, just_enum);
+ ScalarStuff.AddDefaultBool(builder, default_bool);
+ ScalarStuff.AddMaybeBool(builder, maybe_bool);
+ ScalarStuff.AddJustBool(builder, just_bool);
+ ScalarStuff.AddDefaultU8(builder, default_u8);
+ ScalarStuff.AddMaybeU8(builder, maybe_u8);
+ ScalarStuff.AddJustU8(builder, just_u8);
+ ScalarStuff.AddDefaultI8(builder, default_i8);
+ ScalarStuff.AddMaybeI8(builder, maybe_i8);
+ ScalarStuff.AddJustI8(builder, just_i8);
+ return ScalarStuff.EndScalarStuff(builder);
+ }
+
+ public static void StartScalarStuff(FlatBufferBuilder builder) { builder.StartTable(36); }
+ public static void AddJustI8(FlatBufferBuilder builder, sbyte justI8) { builder.AddSbyte(0, justI8, 0); }
+ public static void AddMaybeI8(FlatBufferBuilder builder, sbyte? maybeI8) { builder.AddSbyte(1, maybeI8); }
+ public static void AddDefaultI8(FlatBufferBuilder builder, sbyte defaultI8) { builder.AddSbyte(2, defaultI8, 42); }
+ public static void AddJustU8(FlatBufferBuilder builder, byte justU8) { builder.AddByte(3, justU8, 0); }
+ public static void AddMaybeU8(FlatBufferBuilder builder, byte? maybeU8) { builder.AddByte(4, maybeU8); }
+ public static void AddDefaultU8(FlatBufferBuilder builder, byte defaultU8) { builder.AddByte(5, defaultU8, 42); }
+ public static void AddJustI16(FlatBufferBuilder builder, short justI16) { builder.AddShort(6, justI16, 0); }
+ public static void AddMaybeI16(FlatBufferBuilder builder, short? maybeI16) { builder.AddShort(7, maybeI16); }
+ public static void AddDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.AddShort(8, defaultI16, 42); }
+ public static void AddJustU16(FlatBufferBuilder builder, ushort justU16) { builder.AddUshort(9, justU16, 0); }
+ public static void AddMaybeU16(FlatBufferBuilder builder, ushort? maybeU16) { builder.AddUshort(10, maybeU16); }
+ public static void AddDefaultU16(FlatBufferBuilder builder, ushort defaultU16) { builder.AddUshort(11, defaultU16, 42); }
+ public static void AddJustI32(FlatBufferBuilder builder, int justI32) { builder.AddInt(12, justI32, 0); }
+ public static void AddMaybeI32(FlatBufferBuilder builder, int? maybeI32) { builder.AddInt(13, maybeI32); }
+ public static void AddDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.AddInt(14, defaultI32, 42); }
+ public static void AddJustU32(FlatBufferBuilder builder, uint justU32) { builder.AddUint(15, justU32, 0); }
+ public static void AddMaybeU32(FlatBufferBuilder builder, uint? maybeU32) { builder.AddUint(16, maybeU32); }
+ public static void AddDefaultU32(FlatBufferBuilder builder, uint defaultU32) { builder.AddUint(17, defaultU32, 42); }
+ public static void AddJustI64(FlatBufferBuilder builder, long justI64) { builder.AddLong(18, justI64, 0); }
+ public static void AddMaybeI64(FlatBufferBuilder builder, long? maybeI64) { builder.AddLong(19, maybeI64); }
+ public static void AddDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.AddLong(20, defaultI64, 42); }
+ public static void AddJustU64(FlatBufferBuilder builder, ulong justU64) { builder.AddUlong(21, justU64, 0); }
+ public static void AddMaybeU64(FlatBufferBuilder builder, ulong? maybeU64) { builder.AddUlong(22, maybeU64); }
+ public static void AddDefaultU64(FlatBufferBuilder builder, ulong defaultU64) { builder.AddUlong(23, defaultU64, 42); }
+ public static void AddJustF32(FlatBufferBuilder builder, float justF32) { builder.AddFloat(24, justF32, 0.0f); }
+ public static void AddMaybeF32(FlatBufferBuilder builder, float? maybeF32) { builder.AddFloat(25, maybeF32); }
+ public static void AddDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.AddFloat(26, defaultF32, 42.0f); }
+ public static void AddJustF64(FlatBufferBuilder builder, double justF64) { builder.AddDouble(27, justF64, 0.0); }
+ public static void AddMaybeF64(FlatBufferBuilder builder, double? maybeF64) { builder.AddDouble(28, maybeF64); }
+ public static void AddDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.AddDouble(29, defaultF64, 42.0); }
+ public static void AddJustBool(FlatBufferBuilder builder, bool justBool) { builder.AddBool(30, justBool, false); }
+ public static void AddMaybeBool(FlatBufferBuilder builder, bool? maybeBool) { builder.AddBool(31, maybeBool); }
+ public static void AddDefaultBool(FlatBufferBuilder builder, bool defaultBool) { builder.AddBool(32, defaultBool, true); }
+ public static void AddJustEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte justEnum) { builder.AddSbyte(33, (sbyte)justEnum, 0); }
+ public static void AddMaybeEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte? maybeEnum) { builder.AddSbyte(34, (sbyte)maybeEnum); }
+ public static void AddDefaultEnum(FlatBufferBuilder builder, optional_scalars.OptionalByte defaultEnum) { builder.AddSbyte(35, (sbyte)defaultEnum, 1); }
+ public static Offset<optional_scalars.ScalarStuff> EndScalarStuff(FlatBufferBuilder builder) {
+ int o = builder.EndTable();
+ return new Offset<optional_scalars.ScalarStuff>(o);
+ }
+ public static void FinishScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.Finish(offset.Value, "NULL"); }
+ public static void FinishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, Offset<optional_scalars.ScalarStuff> offset) { builder.FinishSizePrefixed(offset.Value, "NULL"); }
+};
+
+
+}
diff --git a/tests/optional_scalars/ScalarStuff.java b/tests/optional_scalars/ScalarStuff.java
new file mode 100644
index 0000000..3689292
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.java
@@ -0,0 +1,196 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class ScalarStuff extends Table {
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
+ public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb) { return getRootAsScalarStuff(_bb, new ScalarStuff()); }
+ public static ScalarStuff getRootAsScalarStuff(ByteBuffer _bb, ScalarStuff obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public static boolean ScalarStuffBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "NULL"); }
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public ScalarStuff __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public byte justI8() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }
+ public boolean hasMaybeI8() { return 0 != __offset(6); }
+ public byte maybeI8() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) : 0; }
+ public byte defaultI8() { int o = __offset(8); return o != 0 ? bb.get(o + bb_pos) : 42; }
+ public int justU8() { int o = __offset(10); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
+ public boolean hasMaybeU8() { return 0 != __offset(12); }
+ public int maybeU8() { int o = __offset(12); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
+ public int defaultU8() { int o = __offset(14); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 42; }
+ public short justI16() { int o = __offset(16); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public boolean hasMaybeI16() { return 0 != __offset(18); }
+ public short maybeI16() { int o = __offset(18); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public short defaultI16() { int o = __offset(20); return o != 0 ? bb.getShort(o + bb_pos) : 42; }
+ public int justU16() { int o = __offset(22); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }
+ public boolean hasMaybeU16() { return 0 != __offset(24); }
+ public int maybeU16() { int o = __offset(24); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 0; }
+ public int defaultU16() { int o = __offset(26); return o != 0 ? bb.getShort(o + bb_pos) & 0xFFFF : 42; }
+ public int justI32() { int o = __offset(28); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+ public boolean hasMaybeI32() { return 0 != __offset(30); }
+ public int maybeI32() { int o = __offset(30); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+ public int defaultI32() { int o = __offset(32); return o != 0 ? bb.getInt(o + bb_pos) : 42; }
+ public long justU32() { int o = __offset(34); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }
+ public boolean hasMaybeU32() { return 0 != __offset(36); }
+ public long maybeU32() { int o = __offset(36); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 0L; }
+ public long defaultU32() { int o = __offset(38); return o != 0 ? (long)bb.getInt(o + bb_pos) & 0xFFFFFFFFL : 42L; }
+ public long justI64() { int o = __offset(40); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+ public boolean hasMaybeI64() { return 0 != __offset(42); }
+ public long maybeI64() { int o = __offset(42); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+ public long defaultI64() { int o = __offset(44); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }
+ public long justU64() { int o = __offset(46); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+ public boolean hasMaybeU64() { return 0 != __offset(48); }
+ public long maybeU64() { int o = __offset(48); return o != 0 ? bb.getLong(o + bb_pos) : 0L; }
+ public long defaultU64() { int o = __offset(50); return o != 0 ? bb.getLong(o + bb_pos) : 42L; }
+ public float justF32() { int o = __offset(52); return o != 0 ? bb.getFloat(o + bb_pos) : 0.0f; }
+ public boolean hasMaybeF32() { return 0 != __offset(54); }
+ public float maybeF32() { int o = __offset(54); return o != 0 ? bb.getFloat(o + bb_pos) : 0f; }
+ public float defaultF32() { int o = __offset(56); return o != 0 ? bb.getFloat(o + bb_pos) : 42.0f; }
+ public double justF64() { int o = __offset(58); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }
+ public boolean hasMaybeF64() { return 0 != __offset(60); }
+ public double maybeF64() { int o = __offset(60); return o != 0 ? bb.getDouble(o + bb_pos) : 0.0; }
+ public double defaultF64() { int o = __offset(62); return o != 0 ? bb.getDouble(o + bb_pos) : 42.0; }
+ public boolean justBool() { int o = __offset(64); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
+ public boolean hasMaybeBool() { return 0 != __offset(66); }
+ public boolean maybeBool() { int o = __offset(66); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
+ public boolean defaultBool() { int o = __offset(68); return o != 0 ? 0!=bb.get(o + bb_pos) : true; }
+ public byte justEnum() { int o = __offset(70); return o != 0 ? bb.get(o + bb_pos) : 0; }
+ public boolean hasMaybeEnum() { return 0 != __offset(72); }
+ public byte maybeEnum() { int o = __offset(72); return o != 0 ? bb.get(o + bb_pos) : 0; }
+ public byte defaultEnum() { int o = __offset(74); return o != 0 ? bb.get(o + bb_pos) : 1; }
+
+ public static int createScalarStuff(FlatBufferBuilder builder,
+ byte just_i8,
+ byte maybe_i8,
+ byte default_i8,
+ int just_u8,
+ int maybe_u8,
+ int default_u8,
+ short just_i16,
+ short maybe_i16,
+ short default_i16,
+ int just_u16,
+ int maybe_u16,
+ int default_u16,
+ int just_i32,
+ int maybe_i32,
+ int default_i32,
+ long just_u32,
+ long maybe_u32,
+ long default_u32,
+ long just_i64,
+ long maybe_i64,
+ long default_i64,
+ long just_u64,
+ long maybe_u64,
+ long default_u64,
+ float just_f32,
+ float maybe_f32,
+ float default_f32,
+ double just_f64,
+ double maybe_f64,
+ double default_f64,
+ boolean just_bool,
+ boolean maybe_bool,
+ boolean default_bool,
+ byte just_enum,
+ byte maybe_enum,
+ byte default_enum) {
+ builder.startTable(36);
+ ScalarStuff.addDefaultF64(builder, default_f64);
+ ScalarStuff.addMaybeF64(builder, maybe_f64);
+ ScalarStuff.addJustF64(builder, just_f64);
+ ScalarStuff.addDefaultU64(builder, default_u64);
+ ScalarStuff.addMaybeU64(builder, maybe_u64);
+ ScalarStuff.addJustU64(builder, just_u64);
+ ScalarStuff.addDefaultI64(builder, default_i64);
+ ScalarStuff.addMaybeI64(builder, maybe_i64);
+ ScalarStuff.addJustI64(builder, just_i64);
+ ScalarStuff.addDefaultF32(builder, default_f32);
+ ScalarStuff.addMaybeF32(builder, maybe_f32);
+ ScalarStuff.addJustF32(builder, just_f32);
+ ScalarStuff.addDefaultU32(builder, default_u32);
+ ScalarStuff.addMaybeU32(builder, maybe_u32);
+ ScalarStuff.addJustU32(builder, just_u32);
+ ScalarStuff.addDefaultI32(builder, default_i32);
+ ScalarStuff.addMaybeI32(builder, maybe_i32);
+ ScalarStuff.addJustI32(builder, just_i32);
+ ScalarStuff.addDefaultU16(builder, default_u16);
+ ScalarStuff.addMaybeU16(builder, maybe_u16);
+ ScalarStuff.addJustU16(builder, just_u16);
+ ScalarStuff.addDefaultI16(builder, default_i16);
+ ScalarStuff.addMaybeI16(builder, maybe_i16);
+ ScalarStuff.addJustI16(builder, just_i16);
+ ScalarStuff.addDefaultEnum(builder, default_enum);
+ ScalarStuff.addMaybeEnum(builder, maybe_enum);
+ ScalarStuff.addJustEnum(builder, just_enum);
+ ScalarStuff.addDefaultBool(builder, default_bool);
+ ScalarStuff.addMaybeBool(builder, maybe_bool);
+ ScalarStuff.addJustBool(builder, just_bool);
+ ScalarStuff.addDefaultU8(builder, default_u8);
+ ScalarStuff.addMaybeU8(builder, maybe_u8);
+ ScalarStuff.addJustU8(builder, just_u8);
+ ScalarStuff.addDefaultI8(builder, default_i8);
+ ScalarStuff.addMaybeI8(builder, maybe_i8);
+ ScalarStuff.addJustI8(builder, just_i8);
+ return ScalarStuff.endScalarStuff(builder);
+ }
+
+ public static void startScalarStuff(FlatBufferBuilder builder) { builder.startTable(36); }
+ public static void addJustI8(FlatBufferBuilder builder, byte justI8) { builder.addByte(0, justI8, 0); }
+ public static void addMaybeI8(FlatBufferBuilder builder, byte maybeI8) { builder.addByte(1, maybeI8, 0); }
+ public static void addDefaultI8(FlatBufferBuilder builder, byte defaultI8) { builder.addByte(2, defaultI8, 42); }
+ public static void addJustU8(FlatBufferBuilder builder, int justU8) { builder.addByte(3, (byte)justU8, (byte)0); }
+ public static void addMaybeU8(FlatBufferBuilder builder, int maybeU8) { builder.addByte(4, (byte)maybeU8, (byte)0); }
+ public static void addDefaultU8(FlatBufferBuilder builder, int defaultU8) { builder.addByte(5, (byte)defaultU8, (byte)42); }
+ public static void addJustI16(FlatBufferBuilder builder, short justI16) { builder.addShort(6, justI16, 0); }
+ public static void addMaybeI16(FlatBufferBuilder builder, short maybeI16) { builder.addShort(7, maybeI16, 0); }
+ public static void addDefaultI16(FlatBufferBuilder builder, short defaultI16) { builder.addShort(8, defaultI16, 42); }
+ public static void addJustU16(FlatBufferBuilder builder, int justU16) { builder.addShort(9, (short)justU16, (short)0); }
+ public static void addMaybeU16(FlatBufferBuilder builder, int maybeU16) { builder.addShort(10, (short)maybeU16, (short)0); }
+ public static void addDefaultU16(FlatBufferBuilder builder, int defaultU16) { builder.addShort(11, (short)defaultU16, (short)42); }
+ public static void addJustI32(FlatBufferBuilder builder, int justI32) { builder.addInt(12, justI32, 0); }
+ public static void addMaybeI32(FlatBufferBuilder builder, int maybeI32) { builder.addInt(13, maybeI32, 0); }
+ public static void addDefaultI32(FlatBufferBuilder builder, int defaultI32) { builder.addInt(14, defaultI32, 42); }
+ public static void addJustU32(FlatBufferBuilder builder, long justU32) { builder.addInt(15, (int)justU32, (int)0L); }
+ public static void addMaybeU32(FlatBufferBuilder builder, long maybeU32) { builder.addInt(16, (int)maybeU32, (int)0L); }
+ public static void addDefaultU32(FlatBufferBuilder builder, long defaultU32) { builder.addInt(17, (int)defaultU32, (int)42L); }
+ public static void addJustI64(FlatBufferBuilder builder, long justI64) { builder.addLong(18, justI64, 0L); }
+ public static void addMaybeI64(FlatBufferBuilder builder, long maybeI64) { builder.addLong(19, maybeI64, 0L); }
+ public static void addDefaultI64(FlatBufferBuilder builder, long defaultI64) { builder.addLong(20, defaultI64, 42L); }
+ public static void addJustU64(FlatBufferBuilder builder, long justU64) { builder.addLong(21, justU64, 0L); }
+ public static void addMaybeU64(FlatBufferBuilder builder, long maybeU64) { builder.addLong(22, maybeU64, 0L); }
+ public static void addDefaultU64(FlatBufferBuilder builder, long defaultU64) { builder.addLong(23, defaultU64, 42L); }
+ public static void addJustF32(FlatBufferBuilder builder, float justF32) { builder.addFloat(24, justF32, 0.0f); }
+ public static void addMaybeF32(FlatBufferBuilder builder, float maybeF32) { builder.addFloat(25, maybeF32, 0f); }
+ public static void addDefaultF32(FlatBufferBuilder builder, float defaultF32) { builder.addFloat(26, defaultF32, 42.0f); }
+ public static void addJustF64(FlatBufferBuilder builder, double justF64) { builder.addDouble(27, justF64, 0.0); }
+ public static void addMaybeF64(FlatBufferBuilder builder, double maybeF64) { builder.addDouble(28, maybeF64, 0.0); }
+ public static void addDefaultF64(FlatBufferBuilder builder, double defaultF64) { builder.addDouble(29, defaultF64, 42.0); }
+ public static void addJustBool(FlatBufferBuilder builder, boolean justBool) { builder.addBoolean(30, justBool, false); }
+ public static void addMaybeBool(FlatBufferBuilder builder, boolean maybeBool) { builder.addBoolean(31, maybeBool, false); }
+ public static void addDefaultBool(FlatBufferBuilder builder, boolean defaultBool) { builder.addBoolean(32, defaultBool, true); }
+ public static void addJustEnum(FlatBufferBuilder builder, byte justEnum) { builder.addByte(33, justEnum, 0); }
+ public static void addMaybeEnum(FlatBufferBuilder builder, byte maybeEnum) { builder.addByte(34, maybeEnum, 0); }
+ public static void addDefaultEnum(FlatBufferBuilder builder, byte defaultEnum) { builder.addByte(35, defaultEnum, 1); }
+ public static int endScalarStuff(FlatBufferBuilder builder) {
+ int o = builder.endTable();
+ return o;
+ }
+ public static void finishScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, "NULL"); }
+ public static void finishSizePrefixedScalarStuffBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, "NULL"); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public ScalarStuff get(int j) { return get(new ScalarStuff(), j); }
+ public ScalarStuff get(ScalarStuff obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
+}
+
diff --git a/tests/optional_scalars/ScalarStuff.kt b/tests/optional_scalars/ScalarStuff.kt
new file mode 100644
index 0000000..5728384
--- /dev/null
+++ b/tests/optional_scalars/ScalarStuff.kt
@@ -0,0 +1,292 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package optional_scalars
+
+import java.nio.*
+import kotlin.math.sign
+import com.google.flatbuffers.*
+
+@Suppress("unused")
+@ExperimentalUnsignedTypes
+class ScalarStuff : Table() {
+
+ fun __init(_i: Int, _bb: ByteBuffer) {
+ __reset(_i, _bb)
+ }
+ fun __assign(_i: Int, _bb: ByteBuffer) : ScalarStuff {
+ __init(_i, _bb)
+ return this
+ }
+ val justI8 : Byte
+ get() {
+ val o = __offset(4)
+ return if(o != 0) bb.get(o + bb_pos) else 0
+ }
+ val maybeI8 : Byte?
+ get() {
+ val o = __offset(6)
+ return if(o != 0) bb.get(o + bb_pos) else null
+ }
+ val defaultI8 : Byte
+ get() {
+ val o = __offset(8)
+ return if(o != 0) bb.get(o + bb_pos) else 42
+ }
+ val justU8 : UByte
+ get() {
+ val o = __offset(10)
+ return if(o != 0) bb.get(o + bb_pos).toUByte() else 0u
+ }
+ val maybeU8 : UByte?
+ get() {
+ val o = __offset(12)
+ return if(o != 0) bb.get(o + bb_pos).toUByte() else null
+ }
+ val defaultU8 : UByte
+ get() {
+ val o = __offset(14)
+ return if(o != 0) bb.get(o + bb_pos).toUByte() else 42u
+ }
+ val justI16 : Short
+ get() {
+ val o = __offset(16)
+ return if(o != 0) bb.getShort(o + bb_pos) else 0
+ }
+ val maybeI16 : Short?
+ get() {
+ val o = __offset(18)
+ return if(o != 0) bb.getShort(o + bb_pos) else null
+ }
+ val defaultI16 : Short
+ get() {
+ val o = __offset(20)
+ return if(o != 0) bb.getShort(o + bb_pos) else 42
+ }
+ val justU16 : UShort
+ get() {
+ val o = __offset(22)
+ return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 0u
+ }
+ val maybeU16 : UShort?
+ get() {
+ val o = __offset(24)
+ return if(o != 0) bb.getShort(o + bb_pos).toUShort() else null
+ }
+ val defaultU16 : UShort
+ get() {
+ val o = __offset(26)
+ return if(o != 0) bb.getShort(o + bb_pos).toUShort() else 42u
+ }
+ val justI32 : Int
+ get() {
+ val o = __offset(28)
+ return if(o != 0) bb.getInt(o + bb_pos) else 0
+ }
+ val maybeI32 : Int?
+ get() {
+ val o = __offset(30)
+ return if(o != 0) bb.getInt(o + bb_pos) else null
+ }
+ val defaultI32 : Int
+ get() {
+ val o = __offset(32)
+ return if(o != 0) bb.getInt(o + bb_pos) else 42
+ }
+ val justU32 : UInt
+ get() {
+ val o = __offset(34)
+ return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 0u
+ }
+ val maybeU32 : UInt?
+ get() {
+ val o = __offset(36)
+ return if(o != 0) bb.getInt(o + bb_pos).toUInt() else null
+ }
+ val defaultU32 : UInt
+ get() {
+ val o = __offset(38)
+ return if(o != 0) bb.getInt(o + bb_pos).toUInt() else 42u
+ }
+ val justI64 : Long
+ get() {
+ val o = __offset(40)
+ return if(o != 0) bb.getLong(o + bb_pos) else 0L
+ }
+ val maybeI64 : Long?
+ get() {
+ val o = __offset(42)
+ return if(o != 0) bb.getLong(o + bb_pos) else null
+ }
+ val defaultI64 : Long
+ get() {
+ val o = __offset(44)
+ return if(o != 0) bb.getLong(o + bb_pos) else 42L
+ }
+ val justU64 : ULong
+ get() {
+ val o = __offset(46)
+ return if(o != 0) bb.getLong(o + bb_pos).toULong() else 0UL
+ }
+ val maybeU64 : ULong?
+ get() {
+ val o = __offset(48)
+ return if(o != 0) bb.getLong(o + bb_pos).toULong() else null
+ }
+ val defaultU64 : ULong
+ get() {
+ val o = __offset(50)
+ return if(o != 0) bb.getLong(o + bb_pos).toULong() else 42UL
+ }
+ val justF32 : Float
+ get() {
+ val o = __offset(52)
+ return if(o != 0) bb.getFloat(o + bb_pos) else 0.0f
+ }
+ val maybeF32 : Float?
+ get() {
+ val o = __offset(54)
+ return if(o != 0) bb.getFloat(o + bb_pos) else null
+ }
+ val defaultF32 : Float
+ get() {
+ val o = __offset(56)
+ return if(o != 0) bb.getFloat(o + bb_pos) else 42.0f
+ }
+ val justF64 : Double
+ get() {
+ val o = __offset(58)
+ return if(o != 0) bb.getDouble(o + bb_pos) else 0.0
+ }
+ val maybeF64 : Double?
+ get() {
+ val o = __offset(60)
+ return if(o != 0) bb.getDouble(o + bb_pos) else null
+ }
+ val defaultF64 : Double
+ get() {
+ val o = __offset(62)
+ return if(o != 0) bb.getDouble(o + bb_pos) else 42.0
+ }
+ val justBool : Boolean
+ get() {
+ val o = __offset(64)
+ return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else false
+ }
+ val maybeBool : Boolean?
+ get() {
+ val o = __offset(66)
+ return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else null
+ }
+ val defaultBool : Boolean
+ get() {
+ val o = __offset(68)
+ return if(o != 0) 0.toByte() != bb.get(o + bb_pos) else true
+ }
+ val justEnum : Byte
+ get() {
+ val o = __offset(70)
+ return if(o != 0) bb.get(o + bb_pos) else 0
+ }
+ val maybeEnum : Byte?
+ get() {
+ val o = __offset(72)
+ return if(o != 0) bb.get(o + bb_pos) else null
+ }
+ val defaultEnum : Byte
+ get() {
+ val o = __offset(74)
+ return if(o != 0) bb.get(o + bb_pos) else 1
+ }
+ companion object {
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
+ fun getRootAsScalarStuff(_bb: ByteBuffer): ScalarStuff = getRootAsScalarStuff(_bb, ScalarStuff())
+ fun getRootAsScalarStuff(_bb: ByteBuffer, obj: ScalarStuff): ScalarStuff {
+ _bb.order(ByteOrder.LITTLE_ENDIAN)
+ return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb))
+ }
+ fun ScalarStuffBufferHasIdentifier(_bb: ByteBuffer) : Boolean = __has_identifier(_bb, "NULL")
+ fun createScalarStuff(builder: FlatBufferBuilder, justI8: Byte, maybeI8: Byte?, defaultI8: Byte, justU8: UByte, maybeU8: UByte?, defaultU8: UByte, justI16: Short, maybeI16: Short?, defaultI16: Short, justU16: UShort, maybeU16: UShort?, defaultU16: UShort, justI32: Int, maybeI32: Int?, defaultI32: Int, justU32: UInt, maybeU32: UInt?, defaultU32: UInt, justI64: Long, maybeI64: Long?, defaultI64: Long, justU64: ULong, maybeU64: ULong?, defaultU64: ULong, justF32: Float, maybeF32: Float?, defaultF32: Float, justF64: Double, maybeF64: Double?, defaultF64: Double, justBool: Boolean, maybeBool: Boolean?, defaultBool: Boolean, justEnum: Byte, maybeEnum: Byte?, defaultEnum: Byte) : Int {
+ builder.startTable(36)
+ addDefaultF64(builder, defaultF64)
+ maybeF64?.run { addMaybeF64(builder, maybeF64) }
+ addJustF64(builder, justF64)
+ addDefaultU64(builder, defaultU64)
+ maybeU64?.run { addMaybeU64(builder, maybeU64) }
+ addJustU64(builder, justU64)
+ addDefaultI64(builder, defaultI64)
+ maybeI64?.run { addMaybeI64(builder, maybeI64) }
+ addJustI64(builder, justI64)
+ addDefaultF32(builder, defaultF32)
+ maybeF32?.run { addMaybeF32(builder, maybeF32) }
+ addJustF32(builder, justF32)
+ addDefaultU32(builder, defaultU32)
+ maybeU32?.run { addMaybeU32(builder, maybeU32) }
+ addJustU32(builder, justU32)
+ addDefaultI32(builder, defaultI32)
+ maybeI32?.run { addMaybeI32(builder, maybeI32) }
+ addJustI32(builder, justI32)
+ addDefaultU16(builder, defaultU16)
+ maybeU16?.run { addMaybeU16(builder, maybeU16) }
+ addJustU16(builder, justU16)
+ addDefaultI16(builder, defaultI16)
+ maybeI16?.run { addMaybeI16(builder, maybeI16) }
+ addJustI16(builder, justI16)
+ addDefaultEnum(builder, defaultEnum)
+ maybeEnum?.run { addMaybeEnum(builder, maybeEnum) }
+ addJustEnum(builder, justEnum)
+ addDefaultBool(builder, defaultBool)
+ maybeBool?.run { addMaybeBool(builder, maybeBool) }
+ addJustBool(builder, justBool)
+ addDefaultU8(builder, defaultU8)
+ maybeU8?.run { addMaybeU8(builder, maybeU8) }
+ addJustU8(builder, justU8)
+ addDefaultI8(builder, defaultI8)
+ maybeI8?.run { addMaybeI8(builder, maybeI8) }
+ addJustI8(builder, justI8)
+ return endScalarStuff(builder)
+ }
+ fun startScalarStuff(builder: FlatBufferBuilder) = builder.startTable(36)
+ fun addJustI8(builder: FlatBufferBuilder, justI8: Byte) = builder.addByte(0, justI8, 0)
+ fun addMaybeI8(builder: FlatBufferBuilder, maybeI8: Byte) = builder.addByte(1, maybeI8, 0)
+ fun addDefaultI8(builder: FlatBufferBuilder, defaultI8: Byte) = builder.addByte(2, defaultI8, 42)
+ fun addJustU8(builder: FlatBufferBuilder, justU8: UByte) = builder.addByte(3, justU8.toByte(), 0)
+ fun addMaybeU8(builder: FlatBufferBuilder, maybeU8: UByte) = builder.addByte(4, maybeU8.toByte(), 0)
+ fun addDefaultU8(builder: FlatBufferBuilder, defaultU8: UByte) = builder.addByte(5, defaultU8.toByte(), 42)
+ fun addJustI16(builder: FlatBufferBuilder, justI16: Short) = builder.addShort(6, justI16, 0)
+ fun addMaybeI16(builder: FlatBufferBuilder, maybeI16: Short) = builder.addShort(7, maybeI16, 0)
+ fun addDefaultI16(builder: FlatBufferBuilder, defaultI16: Short) = builder.addShort(8, defaultI16, 42)
+ fun addJustU16(builder: FlatBufferBuilder, justU16: UShort) = builder.addShort(9, justU16.toShort(), 0)
+ fun addMaybeU16(builder: FlatBufferBuilder, maybeU16: UShort) = builder.addShort(10, maybeU16.toShort(), 0)
+ fun addDefaultU16(builder: FlatBufferBuilder, defaultU16: UShort) = builder.addShort(11, defaultU16.toShort(), 42)
+ fun addJustI32(builder: FlatBufferBuilder, justI32: Int) = builder.addInt(12, justI32, 0)
+ fun addMaybeI32(builder: FlatBufferBuilder, maybeI32: Int) = builder.addInt(13, maybeI32, 0)
+ fun addDefaultI32(builder: FlatBufferBuilder, defaultI32: Int) = builder.addInt(14, defaultI32, 42)
+ fun addJustU32(builder: FlatBufferBuilder, justU32: UInt) = builder.addInt(15, justU32.toInt(), 0)
+ fun addMaybeU32(builder: FlatBufferBuilder, maybeU32: UInt) = builder.addInt(16, maybeU32.toInt(), 0)
+ fun addDefaultU32(builder: FlatBufferBuilder, defaultU32: UInt) = builder.addInt(17, defaultU32.toInt(), 42)
+ fun addJustI64(builder: FlatBufferBuilder, justI64: Long) = builder.addLong(18, justI64, 0L)
+ fun addMaybeI64(builder: FlatBufferBuilder, maybeI64: Long) = builder.addLong(19, maybeI64, 0)
+ fun addDefaultI64(builder: FlatBufferBuilder, defaultI64: Long) = builder.addLong(20, defaultI64, 42L)
+ fun addJustU64(builder: FlatBufferBuilder, justU64: ULong) = builder.addLong(21, justU64.toLong(), 0)
+ fun addMaybeU64(builder: FlatBufferBuilder, maybeU64: ULong) = builder.addLong(22, maybeU64.toLong(), 0)
+ fun addDefaultU64(builder: FlatBufferBuilder, defaultU64: ULong) = builder.addLong(23, defaultU64.toLong(), 42)
+ fun addJustF32(builder: FlatBufferBuilder, justF32: Float) = builder.addFloat(24, justF32, 0.0)
+ fun addMaybeF32(builder: FlatBufferBuilder, maybeF32: Float) = builder.addFloat(25, maybeF32, 0.0)
+ fun addDefaultF32(builder: FlatBufferBuilder, defaultF32: Float) = builder.addFloat(26, defaultF32, 42.0)
+ fun addJustF64(builder: FlatBufferBuilder, justF64: Double) = builder.addDouble(27, justF64, 0.0)
+ fun addMaybeF64(builder: FlatBufferBuilder, maybeF64: Double) = builder.addDouble(28, maybeF64, 0.0)
+ fun addDefaultF64(builder: FlatBufferBuilder, defaultF64: Double) = builder.addDouble(29, defaultF64, 42.0)
+ fun addJustBool(builder: FlatBufferBuilder, justBool: Boolean) = builder.addBoolean(30, justBool, false)
+ fun addMaybeBool(builder: FlatBufferBuilder, maybeBool: Boolean) = builder.addBoolean(31, maybeBool, false)
+ fun addDefaultBool(builder: FlatBufferBuilder, defaultBool: Boolean) = builder.addBoolean(32, defaultBool, true)
+ fun addJustEnum(builder: FlatBufferBuilder, justEnum: Byte) = builder.addByte(33, justEnum, 0)
+ fun addMaybeEnum(builder: FlatBufferBuilder, maybeEnum: Byte) = builder.addByte(34, maybeEnum, 0)
+ fun addDefaultEnum(builder: FlatBufferBuilder, defaultEnum: Byte) = builder.addByte(35, defaultEnum, 1)
+ fun endScalarStuff(builder: FlatBufferBuilder) : Int {
+ val o = builder.endTable()
+ return o
+ }
+ fun finishScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finish(offset, "NULL")
+ fun finishSizePrefixedScalarStuffBuffer(builder: FlatBufferBuilder, offset: Int) = builder.finishSizePrefixed(offset, "NULL")
+ }
+}
diff --git a/tests/optional_scalars_generated.h b/tests/optional_scalars_generated.h
new file mode 100644
index 0000000..e7c7fc1
--- /dev/null
+++ b/tests/optional_scalars_generated.h
@@ -0,0 +1,982 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#ifndef FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
+#define FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace optional_scalars {
+
+struct ScalarStuff;
+struct ScalarStuffBuilder;
+struct ScalarStuffT;
+
+bool operator==(const ScalarStuffT &lhs, const ScalarStuffT &rhs);
+bool operator!=(const ScalarStuffT &lhs, const ScalarStuffT &rhs);
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable();
+
+enum OptionalByte {
+ OptionalByte_None = 0,
+ OptionalByte_One = 1,
+ OptionalByte_Two = 2,
+ OptionalByte_MIN = OptionalByte_None,
+ OptionalByte_MAX = OptionalByte_Two
+};
+
+inline const OptionalByte (&EnumValuesOptionalByte())[3] {
+ static const OptionalByte values[] = {
+ OptionalByte_None,
+ OptionalByte_One,
+ OptionalByte_Two
+ };
+ return values;
+}
+
+inline const char * const *EnumNamesOptionalByte() {
+ static const char * const names[4] = {
+ "None",
+ "One",
+ "Two",
+ nullptr
+ };
+ return names;
+}
+
+inline const char *EnumNameOptionalByte(OptionalByte e) {
+ if (flatbuffers::IsOutRange(e, OptionalByte_None, OptionalByte_Two)) return "";
+ const size_t index = static_cast<size_t>(e);
+ return EnumNamesOptionalByte()[index];
+}
+
+struct ScalarStuffT : public flatbuffers::NativeTable {
+ typedef ScalarStuff TableType;
+ int8_t just_i8;
+ flatbuffers::Optional<int8_t> maybe_i8;
+ int8_t default_i8;
+ uint8_t just_u8;
+ flatbuffers::Optional<uint8_t> maybe_u8;
+ uint8_t default_u8;
+ int16_t just_i16;
+ flatbuffers::Optional<int16_t> maybe_i16;
+ int16_t default_i16;
+ uint16_t just_u16;
+ flatbuffers::Optional<uint16_t> maybe_u16;
+ uint16_t default_u16;
+ int32_t just_i32;
+ flatbuffers::Optional<int32_t> maybe_i32;
+ int32_t default_i32;
+ uint32_t just_u32;
+ flatbuffers::Optional<uint32_t> maybe_u32;
+ uint32_t default_u32;
+ int64_t just_i64;
+ flatbuffers::Optional<int64_t> maybe_i64;
+ int64_t default_i64;
+ uint64_t just_u64;
+ flatbuffers::Optional<uint64_t> maybe_u64;
+ uint64_t default_u64;
+ float just_f32;
+ flatbuffers::Optional<float> maybe_f32;
+ float default_f32;
+ double just_f64;
+ flatbuffers::Optional<double> maybe_f64;
+ double default_f64;
+ bool just_bool;
+ flatbuffers::Optional<bool> maybe_bool;
+ bool default_bool;
+ optional_scalars::OptionalByte just_enum;
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum;
+ optional_scalars::OptionalByte default_enum;
+ ScalarStuffT()
+ : just_i8(0),
+ maybe_i8(flatbuffers::nullopt),
+ default_i8(42),
+ just_u8(0),
+ maybe_u8(flatbuffers::nullopt),
+ default_u8(42),
+ just_i16(0),
+ maybe_i16(flatbuffers::nullopt),
+ default_i16(42),
+ just_u16(0),
+ maybe_u16(flatbuffers::nullopt),
+ default_u16(42),
+ just_i32(0),
+ maybe_i32(flatbuffers::nullopt),
+ default_i32(42),
+ just_u32(0),
+ maybe_u32(flatbuffers::nullopt),
+ default_u32(42),
+ just_i64(0),
+ maybe_i64(flatbuffers::nullopt),
+ default_i64(42LL),
+ just_u64(0),
+ maybe_u64(flatbuffers::nullopt),
+ default_u64(42ULL),
+ just_f32(0.0f),
+ maybe_f32(flatbuffers::nullopt),
+ default_f32(42.0f),
+ just_f64(0.0),
+ maybe_f64(flatbuffers::nullopt),
+ default_f64(42.0),
+ just_bool(false),
+ maybe_bool(flatbuffers::nullopt),
+ default_bool(true),
+ just_enum(optional_scalars::OptionalByte_None),
+ maybe_enum(flatbuffers::nullopt),
+ default_enum(optional_scalars::OptionalByte_One) {
+ }
+};
+
+inline bool operator==(const ScalarStuffT &lhs, const ScalarStuffT &rhs) {
+ return
+ (lhs.just_i8 == rhs.just_i8) &&
+ (lhs.maybe_i8 == rhs.maybe_i8) &&
+ (lhs.default_i8 == rhs.default_i8) &&
+ (lhs.just_u8 == rhs.just_u8) &&
+ (lhs.maybe_u8 == rhs.maybe_u8) &&
+ (lhs.default_u8 == rhs.default_u8) &&
+ (lhs.just_i16 == rhs.just_i16) &&
+ (lhs.maybe_i16 == rhs.maybe_i16) &&
+ (lhs.default_i16 == rhs.default_i16) &&
+ (lhs.just_u16 == rhs.just_u16) &&
+ (lhs.maybe_u16 == rhs.maybe_u16) &&
+ (lhs.default_u16 == rhs.default_u16) &&
+ (lhs.just_i32 == rhs.just_i32) &&
+ (lhs.maybe_i32 == rhs.maybe_i32) &&
+ (lhs.default_i32 == rhs.default_i32) &&
+ (lhs.just_u32 == rhs.just_u32) &&
+ (lhs.maybe_u32 == rhs.maybe_u32) &&
+ (lhs.default_u32 == rhs.default_u32) &&
+ (lhs.just_i64 == rhs.just_i64) &&
+ (lhs.maybe_i64 == rhs.maybe_i64) &&
+ (lhs.default_i64 == rhs.default_i64) &&
+ (lhs.just_u64 == rhs.just_u64) &&
+ (lhs.maybe_u64 == rhs.maybe_u64) &&
+ (lhs.default_u64 == rhs.default_u64) &&
+ (lhs.just_f32 == rhs.just_f32) &&
+ (lhs.maybe_f32 == rhs.maybe_f32) &&
+ (lhs.default_f32 == rhs.default_f32) &&
+ (lhs.just_f64 == rhs.just_f64) &&
+ (lhs.maybe_f64 == rhs.maybe_f64) &&
+ (lhs.default_f64 == rhs.default_f64) &&
+ (lhs.just_bool == rhs.just_bool) &&
+ (lhs.maybe_bool == rhs.maybe_bool) &&
+ (lhs.default_bool == rhs.default_bool) &&
+ (lhs.just_enum == rhs.just_enum) &&
+ (lhs.maybe_enum == rhs.maybe_enum) &&
+ (lhs.default_enum == rhs.default_enum);
+}
+
+inline bool operator!=(const ScalarStuffT &lhs, const ScalarStuffT &rhs) {
+ return !(lhs == rhs);
+}
+
+
+struct ScalarStuff FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ typedef ScalarStuffT NativeTableType;
+ typedef ScalarStuffBuilder Builder;
+ static const flatbuffers::TypeTable *MiniReflectTypeTable() {
+ return ScalarStuffTypeTable();
+ }
+ enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+ VT_JUST_I8 = 4,
+ VT_MAYBE_I8 = 6,
+ VT_DEFAULT_I8 = 8,
+ VT_JUST_U8 = 10,
+ VT_MAYBE_U8 = 12,
+ VT_DEFAULT_U8 = 14,
+ VT_JUST_I16 = 16,
+ VT_MAYBE_I16 = 18,
+ VT_DEFAULT_I16 = 20,
+ VT_JUST_U16 = 22,
+ VT_MAYBE_U16 = 24,
+ VT_DEFAULT_U16 = 26,
+ VT_JUST_I32 = 28,
+ VT_MAYBE_I32 = 30,
+ VT_DEFAULT_I32 = 32,
+ VT_JUST_U32 = 34,
+ VT_MAYBE_U32 = 36,
+ VT_DEFAULT_U32 = 38,
+ VT_JUST_I64 = 40,
+ VT_MAYBE_I64 = 42,
+ VT_DEFAULT_I64 = 44,
+ VT_JUST_U64 = 46,
+ VT_MAYBE_U64 = 48,
+ VT_DEFAULT_U64 = 50,
+ VT_JUST_F32 = 52,
+ VT_MAYBE_F32 = 54,
+ VT_DEFAULT_F32 = 56,
+ VT_JUST_F64 = 58,
+ VT_MAYBE_F64 = 60,
+ VT_DEFAULT_F64 = 62,
+ VT_JUST_BOOL = 64,
+ VT_MAYBE_BOOL = 66,
+ VT_DEFAULT_BOOL = 68,
+ VT_JUST_ENUM = 70,
+ VT_MAYBE_ENUM = 72,
+ VT_DEFAULT_ENUM = 74
+ };
+ int8_t just_i8() const {
+ return GetField<int8_t>(VT_JUST_I8, 0);
+ }
+ bool mutate_just_i8(int8_t _just_i8) {
+ return SetField<int8_t>(VT_JUST_I8, _just_i8, 0);
+ }
+ flatbuffers::Optional<int8_t> maybe_i8() const {
+ return GetOptional<int8_t, int8_t>(VT_MAYBE_I8);
+ }
+ bool mutate_maybe_i8(int8_t _maybe_i8) {
+ return SetField<int8_t>(VT_MAYBE_I8, _maybe_i8);
+ }
+ int8_t default_i8() const {
+ return GetField<int8_t>(VT_DEFAULT_I8, 42);
+ }
+ bool mutate_default_i8(int8_t _default_i8) {
+ return SetField<int8_t>(VT_DEFAULT_I8, _default_i8, 42);
+ }
+ uint8_t just_u8() const {
+ return GetField<uint8_t>(VT_JUST_U8, 0);
+ }
+ bool mutate_just_u8(uint8_t _just_u8) {
+ return SetField<uint8_t>(VT_JUST_U8, _just_u8, 0);
+ }
+ flatbuffers::Optional<uint8_t> maybe_u8() const {
+ return GetOptional<uint8_t, uint8_t>(VT_MAYBE_U8);
+ }
+ bool mutate_maybe_u8(uint8_t _maybe_u8) {
+ return SetField<uint8_t>(VT_MAYBE_U8, _maybe_u8);
+ }
+ uint8_t default_u8() const {
+ return GetField<uint8_t>(VT_DEFAULT_U8, 42);
+ }
+ bool mutate_default_u8(uint8_t _default_u8) {
+ return SetField<uint8_t>(VT_DEFAULT_U8, _default_u8, 42);
+ }
+ int16_t just_i16() const {
+ return GetField<int16_t>(VT_JUST_I16, 0);
+ }
+ bool mutate_just_i16(int16_t _just_i16) {
+ return SetField<int16_t>(VT_JUST_I16, _just_i16, 0);
+ }
+ flatbuffers::Optional<int16_t> maybe_i16() const {
+ return GetOptional<int16_t, int16_t>(VT_MAYBE_I16);
+ }
+ bool mutate_maybe_i16(int16_t _maybe_i16) {
+ return SetField<int16_t>(VT_MAYBE_I16, _maybe_i16);
+ }
+ int16_t default_i16() const {
+ return GetField<int16_t>(VT_DEFAULT_I16, 42);
+ }
+ bool mutate_default_i16(int16_t _default_i16) {
+ return SetField<int16_t>(VT_DEFAULT_I16, _default_i16, 42);
+ }
+ uint16_t just_u16() const {
+ return GetField<uint16_t>(VT_JUST_U16, 0);
+ }
+ bool mutate_just_u16(uint16_t _just_u16) {
+ return SetField<uint16_t>(VT_JUST_U16, _just_u16, 0);
+ }
+ flatbuffers::Optional<uint16_t> maybe_u16() const {
+ return GetOptional<uint16_t, uint16_t>(VT_MAYBE_U16);
+ }
+ bool mutate_maybe_u16(uint16_t _maybe_u16) {
+ return SetField<uint16_t>(VT_MAYBE_U16, _maybe_u16);
+ }
+ uint16_t default_u16() const {
+ return GetField<uint16_t>(VT_DEFAULT_U16, 42);
+ }
+ bool mutate_default_u16(uint16_t _default_u16) {
+ return SetField<uint16_t>(VT_DEFAULT_U16, _default_u16, 42);
+ }
+ int32_t just_i32() const {
+ return GetField<int32_t>(VT_JUST_I32, 0);
+ }
+ bool mutate_just_i32(int32_t _just_i32) {
+ return SetField<int32_t>(VT_JUST_I32, _just_i32, 0);
+ }
+ flatbuffers::Optional<int32_t> maybe_i32() const {
+ return GetOptional<int32_t, int32_t>(VT_MAYBE_I32);
+ }
+ bool mutate_maybe_i32(int32_t _maybe_i32) {
+ return SetField<int32_t>(VT_MAYBE_I32, _maybe_i32);
+ }
+ int32_t default_i32() const {
+ return GetField<int32_t>(VT_DEFAULT_I32, 42);
+ }
+ bool mutate_default_i32(int32_t _default_i32) {
+ return SetField<int32_t>(VT_DEFAULT_I32, _default_i32, 42);
+ }
+ uint32_t just_u32() const {
+ return GetField<uint32_t>(VT_JUST_U32, 0);
+ }
+ bool mutate_just_u32(uint32_t _just_u32) {
+ return SetField<uint32_t>(VT_JUST_U32, _just_u32, 0);
+ }
+ flatbuffers::Optional<uint32_t> maybe_u32() const {
+ return GetOptional<uint32_t, uint32_t>(VT_MAYBE_U32);
+ }
+ bool mutate_maybe_u32(uint32_t _maybe_u32) {
+ return SetField<uint32_t>(VT_MAYBE_U32, _maybe_u32);
+ }
+ uint32_t default_u32() const {
+ return GetField<uint32_t>(VT_DEFAULT_U32, 42);
+ }
+ bool mutate_default_u32(uint32_t _default_u32) {
+ return SetField<uint32_t>(VT_DEFAULT_U32, _default_u32, 42);
+ }
+ int64_t just_i64() const {
+ return GetField<int64_t>(VT_JUST_I64, 0);
+ }
+ bool mutate_just_i64(int64_t _just_i64) {
+ return SetField<int64_t>(VT_JUST_I64, _just_i64, 0);
+ }
+ flatbuffers::Optional<int64_t> maybe_i64() const {
+ return GetOptional<int64_t, int64_t>(VT_MAYBE_I64);
+ }
+ bool mutate_maybe_i64(int64_t _maybe_i64) {
+ return SetField<int64_t>(VT_MAYBE_I64, _maybe_i64);
+ }
+ int64_t default_i64() const {
+ return GetField<int64_t>(VT_DEFAULT_I64, 42LL);
+ }
+ bool mutate_default_i64(int64_t _default_i64) {
+ return SetField<int64_t>(VT_DEFAULT_I64, _default_i64, 42LL);
+ }
+ uint64_t just_u64() const {
+ return GetField<uint64_t>(VT_JUST_U64, 0);
+ }
+ bool mutate_just_u64(uint64_t _just_u64) {
+ return SetField<uint64_t>(VT_JUST_U64, _just_u64, 0);
+ }
+ flatbuffers::Optional<uint64_t> maybe_u64() const {
+ return GetOptional<uint64_t, uint64_t>(VT_MAYBE_U64);
+ }
+ bool mutate_maybe_u64(uint64_t _maybe_u64) {
+ return SetField<uint64_t>(VT_MAYBE_U64, _maybe_u64);
+ }
+ uint64_t default_u64() const {
+ return GetField<uint64_t>(VT_DEFAULT_U64, 42ULL);
+ }
+ bool mutate_default_u64(uint64_t _default_u64) {
+ return SetField<uint64_t>(VT_DEFAULT_U64, _default_u64, 42ULL);
+ }
+ float just_f32() const {
+ return GetField<float>(VT_JUST_F32, 0.0f);
+ }
+ bool mutate_just_f32(float _just_f32) {
+ return SetField<float>(VT_JUST_F32, _just_f32, 0.0f);
+ }
+ flatbuffers::Optional<float> maybe_f32() const {
+ return GetOptional<float, float>(VT_MAYBE_F32);
+ }
+ bool mutate_maybe_f32(float _maybe_f32) {
+ return SetField<float>(VT_MAYBE_F32, _maybe_f32);
+ }
+ float default_f32() const {
+ return GetField<float>(VT_DEFAULT_F32, 42.0f);
+ }
+ bool mutate_default_f32(float _default_f32) {
+ return SetField<float>(VT_DEFAULT_F32, _default_f32, 42.0f);
+ }
+ double just_f64() const {
+ return GetField<double>(VT_JUST_F64, 0.0);
+ }
+ bool mutate_just_f64(double _just_f64) {
+ return SetField<double>(VT_JUST_F64, _just_f64, 0.0);
+ }
+ flatbuffers::Optional<double> maybe_f64() const {
+ return GetOptional<double, double>(VT_MAYBE_F64);
+ }
+ bool mutate_maybe_f64(double _maybe_f64) {
+ return SetField<double>(VT_MAYBE_F64, _maybe_f64);
+ }
+ double default_f64() const {
+ return GetField<double>(VT_DEFAULT_F64, 42.0);
+ }
+ bool mutate_default_f64(double _default_f64) {
+ return SetField<double>(VT_DEFAULT_F64, _default_f64, 42.0);
+ }
+ bool just_bool() const {
+ return GetField<uint8_t>(VT_JUST_BOOL, 0) != 0;
+ }
+ bool mutate_just_bool(bool _just_bool) {
+ return SetField<uint8_t>(VT_JUST_BOOL, static_cast<uint8_t>(_just_bool), 0);
+ }
+ flatbuffers::Optional<bool> maybe_bool() const {
+ return GetOptional<uint8_t, bool>(VT_MAYBE_BOOL);
+ }
+ bool mutate_maybe_bool(bool _maybe_bool) {
+ return SetField<uint8_t>(VT_MAYBE_BOOL, static_cast<uint8_t>(_maybe_bool));
+ }
+ bool default_bool() const {
+ return GetField<uint8_t>(VT_DEFAULT_BOOL, 1) != 0;
+ }
+ bool mutate_default_bool(bool _default_bool) {
+ return SetField<uint8_t>(VT_DEFAULT_BOOL, static_cast<uint8_t>(_default_bool), 1);
+ }
+ optional_scalars::OptionalByte just_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_JUST_ENUM, 0));
+ }
+ bool mutate_just_enum(optional_scalars::OptionalByte _just_enum) {
+ return SetField<int8_t>(VT_JUST_ENUM, static_cast<int8_t>(_just_enum), 0);
+ }
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum() const {
+ return GetOptional<int8_t, optional_scalars::OptionalByte>(VT_MAYBE_ENUM);
+ }
+ bool mutate_maybe_enum(optional_scalars::OptionalByte _maybe_enum) {
+ return SetField<int8_t>(VT_MAYBE_ENUM, static_cast<int8_t>(_maybe_enum));
+ }
+ optional_scalars::OptionalByte default_enum() const {
+ return static_cast<optional_scalars::OptionalByte>(GetField<int8_t>(VT_DEFAULT_ENUM, 1));
+ }
+ bool mutate_default_enum(optional_scalars::OptionalByte _default_enum) {
+ return SetField<int8_t>(VT_DEFAULT_ENUM, static_cast<int8_t>(_default_enum), 1);
+ }
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ VerifyField<int8_t>(verifier, VT_JUST_I8) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_I8) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_I8) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_U8) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_U8) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_U8) &&
+ VerifyField<int16_t>(verifier, VT_JUST_I16) &&
+ VerifyField<int16_t>(verifier, VT_MAYBE_I16) &&
+ VerifyField<int16_t>(verifier, VT_DEFAULT_I16) &&
+ VerifyField<uint16_t>(verifier, VT_JUST_U16) &&
+ VerifyField<uint16_t>(verifier, VT_MAYBE_U16) &&
+ VerifyField<uint16_t>(verifier, VT_DEFAULT_U16) &&
+ VerifyField<int32_t>(verifier, VT_JUST_I32) &&
+ VerifyField<int32_t>(verifier, VT_MAYBE_I32) &&
+ VerifyField<int32_t>(verifier, VT_DEFAULT_I32) &&
+ VerifyField<uint32_t>(verifier, VT_JUST_U32) &&
+ VerifyField<uint32_t>(verifier, VT_MAYBE_U32) &&
+ VerifyField<uint32_t>(verifier, VT_DEFAULT_U32) &&
+ VerifyField<int64_t>(verifier, VT_JUST_I64) &&
+ VerifyField<int64_t>(verifier, VT_MAYBE_I64) &&
+ VerifyField<int64_t>(verifier, VT_DEFAULT_I64) &&
+ VerifyField<uint64_t>(verifier, VT_JUST_U64) &&
+ VerifyField<uint64_t>(verifier, VT_MAYBE_U64) &&
+ VerifyField<uint64_t>(verifier, VT_DEFAULT_U64) &&
+ VerifyField<float>(verifier, VT_JUST_F32) &&
+ VerifyField<float>(verifier, VT_MAYBE_F32) &&
+ VerifyField<float>(verifier, VT_DEFAULT_F32) &&
+ VerifyField<double>(verifier, VT_JUST_F64) &&
+ VerifyField<double>(verifier, VT_MAYBE_F64) &&
+ VerifyField<double>(verifier, VT_DEFAULT_F64) &&
+ VerifyField<uint8_t>(verifier, VT_JUST_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_MAYBE_BOOL) &&
+ VerifyField<uint8_t>(verifier, VT_DEFAULT_BOOL) &&
+ VerifyField<int8_t>(verifier, VT_JUST_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_MAYBE_ENUM) &&
+ VerifyField<int8_t>(verifier, VT_DEFAULT_ENUM) &&
+ verifier.EndTable();
+ }
+ ScalarStuffT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ void UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const;
+ static flatbuffers::Offset<ScalarStuff> Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+};
+
+struct ScalarStuffBuilder {
+ typedef ScalarStuff Table;
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ void add_just_i8(int8_t just_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_I8, just_i8, 0);
+ }
+ void add_maybe_i8(int8_t maybe_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_I8, maybe_i8);
+ }
+ void add_default_i8(int8_t default_i8) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_I8, default_i8, 42);
+ }
+ void add_just_u8(uint8_t just_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_U8, just_u8, 0);
+ }
+ void add_maybe_u8(uint8_t maybe_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_U8, maybe_u8);
+ }
+ void add_default_u8(uint8_t default_u8) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_U8, default_u8, 42);
+ }
+ void add_just_i16(int16_t just_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_JUST_I16, just_i16, 0);
+ }
+ void add_maybe_i16(int16_t maybe_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_MAYBE_I16, maybe_i16);
+ }
+ void add_default_i16(int16_t default_i16) {
+ fbb_.AddElement<int16_t>(ScalarStuff::VT_DEFAULT_I16, default_i16, 42);
+ }
+ void add_just_u16(uint16_t just_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_JUST_U16, just_u16, 0);
+ }
+ void add_maybe_u16(uint16_t maybe_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_MAYBE_U16, maybe_u16);
+ }
+ void add_default_u16(uint16_t default_u16) {
+ fbb_.AddElement<uint16_t>(ScalarStuff::VT_DEFAULT_U16, default_u16, 42);
+ }
+ void add_just_i32(int32_t just_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_JUST_I32, just_i32, 0);
+ }
+ void add_maybe_i32(int32_t maybe_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_MAYBE_I32, maybe_i32);
+ }
+ void add_default_i32(int32_t default_i32) {
+ fbb_.AddElement<int32_t>(ScalarStuff::VT_DEFAULT_I32, default_i32, 42);
+ }
+ void add_just_u32(uint32_t just_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_JUST_U32, just_u32, 0);
+ }
+ void add_maybe_u32(uint32_t maybe_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_MAYBE_U32, maybe_u32);
+ }
+ void add_default_u32(uint32_t default_u32) {
+ fbb_.AddElement<uint32_t>(ScalarStuff::VT_DEFAULT_U32, default_u32, 42);
+ }
+ void add_just_i64(int64_t just_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_JUST_I64, just_i64, 0);
+ }
+ void add_maybe_i64(int64_t maybe_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_MAYBE_I64, maybe_i64);
+ }
+ void add_default_i64(int64_t default_i64) {
+ fbb_.AddElement<int64_t>(ScalarStuff::VT_DEFAULT_I64, default_i64, 42LL);
+ }
+ void add_just_u64(uint64_t just_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_JUST_U64, just_u64, 0);
+ }
+ void add_maybe_u64(uint64_t maybe_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_MAYBE_U64, maybe_u64);
+ }
+ void add_default_u64(uint64_t default_u64) {
+ fbb_.AddElement<uint64_t>(ScalarStuff::VT_DEFAULT_U64, default_u64, 42ULL);
+ }
+ void add_just_f32(float just_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_JUST_F32, just_f32, 0.0f);
+ }
+ void add_maybe_f32(float maybe_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_MAYBE_F32, maybe_f32);
+ }
+ void add_default_f32(float default_f32) {
+ fbb_.AddElement<float>(ScalarStuff::VT_DEFAULT_F32, default_f32, 42.0f);
+ }
+ void add_just_f64(double just_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_JUST_F64, just_f64, 0.0);
+ }
+ void add_maybe_f64(double maybe_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_MAYBE_F64, maybe_f64);
+ }
+ void add_default_f64(double default_f64) {
+ fbb_.AddElement<double>(ScalarStuff::VT_DEFAULT_F64, default_f64, 42.0);
+ }
+ void add_just_bool(bool just_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_JUST_BOOL, static_cast<uint8_t>(just_bool), 0);
+ }
+ void add_maybe_bool(bool maybe_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_MAYBE_BOOL, static_cast<uint8_t>(maybe_bool));
+ }
+ void add_default_bool(bool default_bool) {
+ fbb_.AddElement<uint8_t>(ScalarStuff::VT_DEFAULT_BOOL, static_cast<uint8_t>(default_bool), 1);
+ }
+ void add_just_enum(optional_scalars::OptionalByte just_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_JUST_ENUM, static_cast<int8_t>(just_enum), 0);
+ }
+ void add_maybe_enum(optional_scalars::OptionalByte maybe_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_MAYBE_ENUM, static_cast<int8_t>(maybe_enum));
+ }
+ void add_default_enum(optional_scalars::OptionalByte default_enum) {
+ fbb_.AddElement<int8_t>(ScalarStuff::VT_DEFAULT_ENUM, static_cast<int8_t>(default_enum), 1);
+ }
+ explicit ScalarStuffBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+ : fbb_(_fbb) {
+ start_ = fbb_.StartTable();
+ }
+ flatbuffers::Offset<ScalarStuff> Finish() {
+ const auto end = fbb_.EndTable(start_);
+ auto o = flatbuffers::Offset<ScalarStuff>(end);
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(
+ flatbuffers::FlatBufferBuilder &_fbb,
+ int8_t just_i8 = 0,
+ flatbuffers::Optional<int8_t> maybe_i8 = flatbuffers::nullopt,
+ int8_t default_i8 = 42,
+ uint8_t just_u8 = 0,
+ flatbuffers::Optional<uint8_t> maybe_u8 = flatbuffers::nullopt,
+ uint8_t default_u8 = 42,
+ int16_t just_i16 = 0,
+ flatbuffers::Optional<int16_t> maybe_i16 = flatbuffers::nullopt,
+ int16_t default_i16 = 42,
+ uint16_t just_u16 = 0,
+ flatbuffers::Optional<uint16_t> maybe_u16 = flatbuffers::nullopt,
+ uint16_t default_u16 = 42,
+ int32_t just_i32 = 0,
+ flatbuffers::Optional<int32_t> maybe_i32 = flatbuffers::nullopt,
+ int32_t default_i32 = 42,
+ uint32_t just_u32 = 0,
+ flatbuffers::Optional<uint32_t> maybe_u32 = flatbuffers::nullopt,
+ uint32_t default_u32 = 42,
+ int64_t just_i64 = 0,
+ flatbuffers::Optional<int64_t> maybe_i64 = flatbuffers::nullopt,
+ int64_t default_i64 = 42LL,
+ uint64_t just_u64 = 0,
+ flatbuffers::Optional<uint64_t> maybe_u64 = flatbuffers::nullopt,
+ uint64_t default_u64 = 42ULL,
+ float just_f32 = 0.0f,
+ flatbuffers::Optional<float> maybe_f32 = flatbuffers::nullopt,
+ float default_f32 = 42.0f,
+ double just_f64 = 0.0,
+ flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt,
+ double default_f64 = 42.0,
+ bool just_bool = false,
+ flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt,
+ bool default_bool = true,
+ optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte_None,
+ flatbuffers::Optional<optional_scalars::OptionalByte> maybe_enum = flatbuffers::nullopt,
+ optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte_One) {
+ ScalarStuffBuilder builder_(_fbb);
+ builder_.add_default_f64(default_f64);
+ if(maybe_f64) { builder_.add_maybe_f64(*maybe_f64); }
+ builder_.add_just_f64(just_f64);
+ builder_.add_default_u64(default_u64);
+ if(maybe_u64) { builder_.add_maybe_u64(*maybe_u64); }
+ builder_.add_just_u64(just_u64);
+ builder_.add_default_i64(default_i64);
+ if(maybe_i64) { builder_.add_maybe_i64(*maybe_i64); }
+ builder_.add_just_i64(just_i64);
+ builder_.add_default_f32(default_f32);
+ if(maybe_f32) { builder_.add_maybe_f32(*maybe_f32); }
+ builder_.add_just_f32(just_f32);
+ builder_.add_default_u32(default_u32);
+ if(maybe_u32) { builder_.add_maybe_u32(*maybe_u32); }
+ builder_.add_just_u32(just_u32);
+ builder_.add_default_i32(default_i32);
+ if(maybe_i32) { builder_.add_maybe_i32(*maybe_i32); }
+ builder_.add_just_i32(just_i32);
+ builder_.add_default_u16(default_u16);
+ if(maybe_u16) { builder_.add_maybe_u16(*maybe_u16); }
+ builder_.add_just_u16(just_u16);
+ builder_.add_default_i16(default_i16);
+ if(maybe_i16) { builder_.add_maybe_i16(*maybe_i16); }
+ builder_.add_just_i16(just_i16);
+ builder_.add_default_enum(default_enum);
+ if(maybe_enum) { builder_.add_maybe_enum(*maybe_enum); }
+ builder_.add_just_enum(just_enum);
+ builder_.add_default_bool(default_bool);
+ if(maybe_bool) { builder_.add_maybe_bool(*maybe_bool); }
+ builder_.add_just_bool(just_bool);
+ builder_.add_default_u8(default_u8);
+ if(maybe_u8) { builder_.add_maybe_u8(*maybe_u8); }
+ builder_.add_just_u8(just_u8);
+ builder_.add_default_i8(default_i8);
+ if(maybe_i8) { builder_.add_maybe_i8(*maybe_i8); }
+ builder_.add_just_i8(just_i8);
+ return builder_.Finish();
+}
+
+flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
+
+inline ScalarStuffT *ScalarStuff::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
+ flatbuffers::unique_ptr<optional_scalars::ScalarStuffT> _o = flatbuffers::unique_ptr<optional_scalars::ScalarStuffT>(new ScalarStuffT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
+}
+
+inline void ScalarStuff::UnPackTo(ScalarStuffT *_o, const flatbuffers::resolver_function_t *_resolver) const {
+ (void)_o;
+ (void)_resolver;
+ { auto _e = just_i8(); _o->just_i8 = _e; }
+ { auto _e = maybe_i8(); _o->maybe_i8 = _e; }
+ { auto _e = default_i8(); _o->default_i8 = _e; }
+ { auto _e = just_u8(); _o->just_u8 = _e; }
+ { auto _e = maybe_u8(); _o->maybe_u8 = _e; }
+ { auto _e = default_u8(); _o->default_u8 = _e; }
+ { auto _e = just_i16(); _o->just_i16 = _e; }
+ { auto _e = maybe_i16(); _o->maybe_i16 = _e; }
+ { auto _e = default_i16(); _o->default_i16 = _e; }
+ { auto _e = just_u16(); _o->just_u16 = _e; }
+ { auto _e = maybe_u16(); _o->maybe_u16 = _e; }
+ { auto _e = default_u16(); _o->default_u16 = _e; }
+ { auto _e = just_i32(); _o->just_i32 = _e; }
+ { auto _e = maybe_i32(); _o->maybe_i32 = _e; }
+ { auto _e = default_i32(); _o->default_i32 = _e; }
+ { auto _e = just_u32(); _o->just_u32 = _e; }
+ { auto _e = maybe_u32(); _o->maybe_u32 = _e; }
+ { auto _e = default_u32(); _o->default_u32 = _e; }
+ { auto _e = just_i64(); _o->just_i64 = _e; }
+ { auto _e = maybe_i64(); _o->maybe_i64 = _e; }
+ { auto _e = default_i64(); _o->default_i64 = _e; }
+ { auto _e = just_u64(); _o->just_u64 = _e; }
+ { auto _e = maybe_u64(); _o->maybe_u64 = _e; }
+ { auto _e = default_u64(); _o->default_u64 = _e; }
+ { auto _e = just_f32(); _o->just_f32 = _e; }
+ { auto _e = maybe_f32(); _o->maybe_f32 = _e; }
+ { auto _e = default_f32(); _o->default_f32 = _e; }
+ { auto _e = just_f64(); _o->just_f64 = _e; }
+ { auto _e = maybe_f64(); _o->maybe_f64 = _e; }
+ { auto _e = default_f64(); _o->default_f64 = _e; }
+ { auto _e = just_bool(); _o->just_bool = _e; }
+ { auto _e = maybe_bool(); _o->maybe_bool = _e; }
+ { auto _e = default_bool(); _o->default_bool = _e; }
+ { auto _e = just_enum(); _o->just_enum = _e; }
+ { auto _e = maybe_enum(); _o->maybe_enum = _e; }
+ { auto _e = default_enum(); _o->default_enum = _e; }
+}
+
+inline flatbuffers::Offset<ScalarStuff> ScalarStuff::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
+ return CreateScalarStuff(_fbb, _o, _rehasher);
+}
+
+inline flatbuffers::Offset<ScalarStuff> CreateScalarStuff(flatbuffers::FlatBufferBuilder &_fbb, const ScalarStuffT *_o, const flatbuffers::rehasher_function_t *_rehasher) {
+ (void)_rehasher;
+ (void)_o;
+ struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ScalarStuffT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va;
+ auto _just_i8 = _o->just_i8;
+ auto _maybe_i8 = _o->maybe_i8;
+ auto _default_i8 = _o->default_i8;
+ auto _just_u8 = _o->just_u8;
+ auto _maybe_u8 = _o->maybe_u8;
+ auto _default_u8 = _o->default_u8;
+ auto _just_i16 = _o->just_i16;
+ auto _maybe_i16 = _o->maybe_i16;
+ auto _default_i16 = _o->default_i16;
+ auto _just_u16 = _o->just_u16;
+ auto _maybe_u16 = _o->maybe_u16;
+ auto _default_u16 = _o->default_u16;
+ auto _just_i32 = _o->just_i32;
+ auto _maybe_i32 = _o->maybe_i32;
+ auto _default_i32 = _o->default_i32;
+ auto _just_u32 = _o->just_u32;
+ auto _maybe_u32 = _o->maybe_u32;
+ auto _default_u32 = _o->default_u32;
+ auto _just_i64 = _o->just_i64;
+ auto _maybe_i64 = _o->maybe_i64;
+ auto _default_i64 = _o->default_i64;
+ auto _just_u64 = _o->just_u64;
+ auto _maybe_u64 = _o->maybe_u64;
+ auto _default_u64 = _o->default_u64;
+ auto _just_f32 = _o->just_f32;
+ auto _maybe_f32 = _o->maybe_f32;
+ auto _default_f32 = _o->default_f32;
+ auto _just_f64 = _o->just_f64;
+ auto _maybe_f64 = _o->maybe_f64;
+ auto _default_f64 = _o->default_f64;
+ auto _just_bool = _o->just_bool;
+ auto _maybe_bool = _o->maybe_bool;
+ auto _default_bool = _o->default_bool;
+ auto _just_enum = _o->just_enum;
+ auto _maybe_enum = _o->maybe_enum;
+ auto _default_enum = _o->default_enum;
+ return optional_scalars::CreateScalarStuff(
+ _fbb,
+ _just_i8,
+ _maybe_i8,
+ _default_i8,
+ _just_u8,
+ _maybe_u8,
+ _default_u8,
+ _just_i16,
+ _maybe_i16,
+ _default_i16,
+ _just_u16,
+ _maybe_u16,
+ _default_u16,
+ _just_i32,
+ _maybe_i32,
+ _default_i32,
+ _just_u32,
+ _maybe_u32,
+ _default_u32,
+ _just_i64,
+ _maybe_i64,
+ _default_i64,
+ _just_u64,
+ _maybe_u64,
+ _default_u64,
+ _just_f32,
+ _maybe_f32,
+ _default_f32,
+ _just_f64,
+ _maybe_f64,
+ _default_f64,
+ _just_bool,
+ _maybe_bool,
+ _default_bool,
+ _just_enum,
+ _maybe_enum,
+ _default_enum);
+}
+
+inline const flatbuffers::TypeTable *OptionalByteTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "None",
+ "One",
+ "Two"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_ENUM, 3, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const flatbuffers::TypeTable *ScalarStuffTypeTable() {
+ static const flatbuffers::TypeCode type_codes[] = {
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_UCHAR, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_SHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_USHORT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_INT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_UINT, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_LONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_ULONG, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_FLOAT, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_DOUBLE, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_BOOL, 0, -1 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 },
+ { flatbuffers::ET_CHAR, 0, 0 }
+ };
+ static const flatbuffers::TypeFunction type_refs[] = {
+ optional_scalars::OptionalByteTypeTable
+ };
+ static const char * const names[] = {
+ "just_i8",
+ "maybe_i8",
+ "default_i8",
+ "just_u8",
+ "maybe_u8",
+ "default_u8",
+ "just_i16",
+ "maybe_i16",
+ "default_i16",
+ "just_u16",
+ "maybe_u16",
+ "default_u16",
+ "just_i32",
+ "maybe_i32",
+ "default_i32",
+ "just_u32",
+ "maybe_u32",
+ "default_u32",
+ "just_i64",
+ "maybe_i64",
+ "default_i64",
+ "just_u64",
+ "maybe_u64",
+ "default_u64",
+ "just_f32",
+ "maybe_f32",
+ "default_f32",
+ "just_f64",
+ "maybe_f64",
+ "default_f64",
+ "just_bool",
+ "maybe_bool",
+ "default_bool",
+ "just_enum",
+ "maybe_enum",
+ "default_enum"
+ };
+ static const flatbuffers::TypeTable tt = {
+ flatbuffers::ST_TABLE, 36, type_codes, type_refs, nullptr, nullptr, names
+ };
+ return &tt;
+}
+
+inline const optional_scalars::ScalarStuff *GetScalarStuff(const void *buf) {
+ return flatbuffers::GetRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline const optional_scalars::ScalarStuff *GetSizePrefixedScalarStuff(const void *buf) {
+ return flatbuffers::GetSizePrefixedRoot<optional_scalars::ScalarStuff>(buf);
+}
+
+inline ScalarStuff *GetMutableScalarStuff(void *buf) {
+ return flatbuffers::GetMutableRoot<ScalarStuff>(buf);
+}
+
+inline const char *ScalarStuffIdentifier() {
+ return "NULL";
+}
+
+inline bool ScalarStuffBufferHasIdentifier(const void *buf) {
+ return flatbuffers::BufferHasIdentifier(
+ buf, ScalarStuffIdentifier());
+}
+
+inline bool VerifyScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifyBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline bool VerifySizePrefixedScalarStuffBuffer(
+ flatbuffers::Verifier &verifier) {
+ return verifier.VerifySizePrefixedBuffer<optional_scalars::ScalarStuff>(ScalarStuffIdentifier());
+}
+
+inline const char *ScalarStuffExtension() {
+ return "mon";
+}
+
+inline void FinishScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.Finish(root, ScalarStuffIdentifier());
+}
+
+inline void FinishSizePrefixedScalarStuffBuffer(
+ flatbuffers::FlatBufferBuilder &fbb,
+ flatbuffers::Offset<optional_scalars::ScalarStuff> root) {
+ fbb.FinishSizePrefixed(root, ScalarStuffIdentifier());
+}
+
+inline flatbuffers::unique_ptr<optional_scalars::ScalarStuffT> UnPackScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return flatbuffers::unique_ptr<optional_scalars::ScalarStuffT>(GetScalarStuff(buf)->UnPack(res));
+}
+
+inline flatbuffers::unique_ptr<optional_scalars::ScalarStuffT> UnPackSizePrefixedScalarStuff(
+ const void *buf,
+ const flatbuffers::resolver_function_t *res = nullptr) {
+ return flatbuffers::unique_ptr<optional_scalars::ScalarStuffT>(GetSizePrefixedScalarStuff(buf)->UnPack(res));
+}
+
+} // namespace optional_scalars
+
+#endif // FLATBUFFERS_GENERATED_OPTIONALSCALARS_OPTIONAL_SCALARS_H_
diff --git a/tests/optional_scalars_generated.js b/tests/optional_scalars_generated.js
new file mode 100644
index 0000000..60a25a0
--- /dev/null
+++ b/tests/optional_scalars_generated.js
@@ -0,0 +1,782 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+/**
+ * @const
+ * @namespace
+ */
+var optional_scalars = optional_scalars || {};
+
+/**
+ * @enum {number}
+ */
+optional_scalars.OptionalByte = {
+ None: 0,
+ One: 1,
+ Two: 2
+};
+
+/**
+ * @enum {string}
+ */
+optional_scalars.OptionalByteName = {
+ '0': 'None',
+ '1': 'One',
+ '2': 'Two'
+};
+
+/**
+ * @constructor
+ */
+optional_scalars.ScalarStuff = function() {
+ /**
+ * @type {flatbuffers.ByteBuffer}
+ */
+ this.bb = null;
+
+ /**
+ * @type {number}
+ */
+ this.bb_pos = 0;
+};
+
+/**
+ * @param {number} i
+ * @param {flatbuffers.ByteBuffer} bb
+ * @returns {optional_scalars.ScalarStuff}
+ */
+optional_scalars.ScalarStuff.prototype.__init = function(i, bb) {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+};
+
+/**
+ * @param {flatbuffers.ByteBuffer} bb
+ * @param {optional_scalars.ScalarStuff=} obj
+ * @returns {optional_scalars.ScalarStuff}
+ */
+optional_scalars.ScalarStuff.getRootAsScalarStuff = function(bb, obj) {
+ return (obj || new optional_scalars.ScalarStuff).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+};
+
+/**
+ * @param {flatbuffers.ByteBuffer} bb
+ * @param {optional_scalars.ScalarStuff=} obj
+ * @returns {optional_scalars.ScalarStuff}
+ */
+optional_scalars.ScalarStuff.getSizePrefixedRootAsScalarStuff = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new optional_scalars.ScalarStuff).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+};
+
+/**
+ * @param {flatbuffers.ByteBuffer} bb
+ * @returns {boolean}
+ */
+optional_scalars.ScalarStuff.bufferHasIdentifier = function(bb) {
+ return bb.__has_identifier('NULL');
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justI8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 4);
+ return offset ? this.bb.readInt8(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeI8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 6);
+ return offset ? this.bb.readInt8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultI8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 8);
+ return offset ? this.bb.readInt8(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justU8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 10);
+ return offset ? this.bb.readUint8(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeU8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 12);
+ return offset ? this.bb.readUint8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultU8 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 14);
+ return offset ? this.bb.readUint8(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justI16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 16);
+ return offset ? this.bb.readInt16(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeI16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 18);
+ return offset ? this.bb.readInt16(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultI16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 20);
+ return offset ? this.bb.readInt16(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justU16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 22);
+ return offset ? this.bb.readUint16(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeU16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 24);
+ return offset ? this.bb.readUint16(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultU16 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 26);
+ return offset ? this.bb.readUint16(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justI32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 28);
+ return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeI32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 30);
+ return offset ? this.bb.readInt32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultI32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 32);
+ return offset ? this.bb.readInt32(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justU32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 34);
+ return offset ? this.bb.readUint32(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeU32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 36);
+ return offset ? this.bb.readUint32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultU32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 38);
+ return offset ? this.bb.readUint32(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns {flatbuffers.Long}
+ */
+optional_scalars.ScalarStuff.prototype.justI64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 40);
+ return offset ? this.bb.readInt64(this.bb_pos + offset) : this.bb.createLong(0, 0);
+};
+
+/**
+ * @returns {flatbuffers.Long|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeI64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 42);
+ return offset ? this.bb.readInt64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {flatbuffers.Long}
+ */
+optional_scalars.ScalarStuff.prototype.defaultI64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 44);
+ return offset ? this.bb.readInt64(this.bb_pos + offset) : this.bb.createLong(42, 0);
+};
+
+/**
+ * @returns {flatbuffers.Long}
+ */
+optional_scalars.ScalarStuff.prototype.justU64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 46);
+ return offset ? this.bb.readUint64(this.bb_pos + offset) : this.bb.createLong(0, 0);
+};
+
+/**
+ * @returns {flatbuffers.Long|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeU64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 48);
+ return offset ? this.bb.readUint64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {flatbuffers.Long}
+ */
+optional_scalars.ScalarStuff.prototype.defaultU64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 50);
+ return offset ? this.bb.readUint64(this.bb_pos + offset) : this.bb.createLong(42, 0);
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justF32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 52);
+ return offset ? this.bb.readFloat32(this.bb_pos + offset) : 0.0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeF32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 54);
+ return offset ? this.bb.readFloat32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultF32 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 56);
+ return offset ? this.bb.readFloat32(this.bb_pos + offset) : 42.0;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.justF64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 58);
+ return offset ? this.bb.readFloat64(this.bb_pos + offset) : 0.0;
+};
+
+/**
+ * @returns {number|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeF64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 60);
+ return offset ? this.bb.readFloat64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {number}
+ */
+optional_scalars.ScalarStuff.prototype.defaultF64 = function() {
+ var offset = this.bb.__offset(this.bb_pos, 62);
+ return offset ? this.bb.readFloat64(this.bb_pos + offset) : 42.0;
+};
+
+/**
+ * @returns {boolean}
+ */
+optional_scalars.ScalarStuff.prototype.justBool = function() {
+ var offset = this.bb.__offset(this.bb_pos, 64);
+ return offset ? !!this.bb.readInt8(this.bb_pos + offset) : false;
+};
+
+/**
+ * @returns {boolean|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeBool = function() {
+ var offset = this.bb.__offset(this.bb_pos, 66);
+ return offset ? !!this.bb.readInt8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns {boolean}
+ */
+optional_scalars.ScalarStuff.prototype.defaultBool = function() {
+ var offset = this.bb.__offset(this.bb_pos, 68);
+ return offset ? !!this.bb.readInt8(this.bb_pos + offset) : true;
+};
+
+/**
+ * @returns {optional_scalars.OptionalByte}
+ */
+optional_scalars.ScalarStuff.prototype.justEnum = function() {
+ var offset = this.bb.__offset(this.bb_pos, 70);
+ return offset ? /** @type {optional_scalars.OptionalByte} */ (this.bb.readInt8(this.bb_pos + offset)) : optional_scalars.OptionalByte.None;
+};
+
+/**
+ * @returns {optional_scalars.OptionalByte|null}
+ */
+optional_scalars.ScalarStuff.prototype.maybeEnum = function() {
+ var offset = this.bb.__offset(this.bb_pos, 72);
+ return offset ? /** @type {optional_scalars.OptionalByte} */ (this.bb.readInt8(this.bb_pos + offset)) : null;
+};
+
+/**
+ * @returns {optional_scalars.OptionalByte}
+ */
+optional_scalars.ScalarStuff.prototype.defaultEnum = function() {
+ var offset = this.bb.__offset(this.bb_pos, 74);
+ return offset ? /** @type {optional_scalars.OptionalByte} */ (this.bb.readInt8(this.bb_pos + offset)) : optional_scalars.OptionalByte.One;
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ */
+optional_scalars.ScalarStuff.startScalarStuff = function(builder) {
+ builder.startObject(36);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justI8
+ */
+optional_scalars.ScalarStuff.addJustI8 = function(builder, justI8) {
+ builder.addFieldInt8(0, justI8, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeI8
+ */
+optional_scalars.ScalarStuff.addMaybeI8 = function(builder, maybeI8) {
+ builder.addFieldInt8(1, maybeI8, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultI8
+ */
+optional_scalars.ScalarStuff.addDefaultI8 = function(builder, defaultI8) {
+ builder.addFieldInt8(2, defaultI8, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justU8
+ */
+optional_scalars.ScalarStuff.addJustU8 = function(builder, justU8) {
+ builder.addFieldInt8(3, justU8, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeU8
+ */
+optional_scalars.ScalarStuff.addMaybeU8 = function(builder, maybeU8) {
+ builder.addFieldInt8(4, maybeU8, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultU8
+ */
+optional_scalars.ScalarStuff.addDefaultU8 = function(builder, defaultU8) {
+ builder.addFieldInt8(5, defaultU8, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justI16
+ */
+optional_scalars.ScalarStuff.addJustI16 = function(builder, justI16) {
+ builder.addFieldInt16(6, justI16, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeI16
+ */
+optional_scalars.ScalarStuff.addMaybeI16 = function(builder, maybeI16) {
+ builder.addFieldInt16(7, maybeI16, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultI16
+ */
+optional_scalars.ScalarStuff.addDefaultI16 = function(builder, defaultI16) {
+ builder.addFieldInt16(8, defaultI16, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justU16
+ */
+optional_scalars.ScalarStuff.addJustU16 = function(builder, justU16) {
+ builder.addFieldInt16(9, justU16, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeU16
+ */
+optional_scalars.ScalarStuff.addMaybeU16 = function(builder, maybeU16) {
+ builder.addFieldInt16(10, maybeU16, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultU16
+ */
+optional_scalars.ScalarStuff.addDefaultU16 = function(builder, defaultU16) {
+ builder.addFieldInt16(11, defaultU16, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justI32
+ */
+optional_scalars.ScalarStuff.addJustI32 = function(builder, justI32) {
+ builder.addFieldInt32(12, justI32, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeI32
+ */
+optional_scalars.ScalarStuff.addMaybeI32 = function(builder, maybeI32) {
+ builder.addFieldInt32(13, maybeI32, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultI32
+ */
+optional_scalars.ScalarStuff.addDefaultI32 = function(builder, defaultI32) {
+ builder.addFieldInt32(14, defaultI32, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justU32
+ */
+optional_scalars.ScalarStuff.addJustU32 = function(builder, justU32) {
+ builder.addFieldInt32(15, justU32, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeU32
+ */
+optional_scalars.ScalarStuff.addMaybeU32 = function(builder, maybeU32) {
+ builder.addFieldInt32(16, maybeU32, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultU32
+ */
+optional_scalars.ScalarStuff.addDefaultU32 = function(builder, defaultU32) {
+ builder.addFieldInt32(17, defaultU32, 42);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} justI64
+ */
+optional_scalars.ScalarStuff.addJustI64 = function(builder, justI64) {
+ builder.addFieldInt64(18, justI64, builder.createLong(0, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} maybeI64
+ */
+optional_scalars.ScalarStuff.addMaybeI64 = function(builder, maybeI64) {
+ builder.addFieldInt64(19, maybeI64, builder.createLong(0, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} defaultI64
+ */
+optional_scalars.ScalarStuff.addDefaultI64 = function(builder, defaultI64) {
+ builder.addFieldInt64(20, defaultI64, builder.createLong(42, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} justU64
+ */
+optional_scalars.ScalarStuff.addJustU64 = function(builder, justU64) {
+ builder.addFieldInt64(21, justU64, builder.createLong(0, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} maybeU64
+ */
+optional_scalars.ScalarStuff.addMaybeU64 = function(builder, maybeU64) {
+ builder.addFieldInt64(22, maybeU64, builder.createLong(0, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Long} defaultU64
+ */
+optional_scalars.ScalarStuff.addDefaultU64 = function(builder, defaultU64) {
+ builder.addFieldInt64(23, defaultU64, builder.createLong(42, 0));
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justF32
+ */
+optional_scalars.ScalarStuff.addJustF32 = function(builder, justF32) {
+ builder.addFieldFloat32(24, justF32, 0.0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeF32
+ */
+optional_scalars.ScalarStuff.addMaybeF32 = function(builder, maybeF32) {
+ builder.addFieldFloat32(25, maybeF32, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultF32
+ */
+optional_scalars.ScalarStuff.addDefaultF32 = function(builder, defaultF32) {
+ builder.addFieldFloat32(26, defaultF32, 42.0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justF64
+ */
+optional_scalars.ScalarStuff.addJustF64 = function(builder, justF64) {
+ builder.addFieldFloat64(27, justF64, 0.0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} maybeF64
+ */
+optional_scalars.ScalarStuff.addMaybeF64 = function(builder, maybeF64) {
+ builder.addFieldFloat64(28, maybeF64, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} defaultF64
+ */
+optional_scalars.ScalarStuff.addDefaultF64 = function(builder, defaultF64) {
+ builder.addFieldFloat64(29, defaultF64, 42.0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {boolean} justBool
+ */
+optional_scalars.ScalarStuff.addJustBool = function(builder, justBool) {
+ builder.addFieldInt8(30, +justBool, +false);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {boolean} maybeBool
+ */
+optional_scalars.ScalarStuff.addMaybeBool = function(builder, maybeBool) {
+ builder.addFieldInt8(31, +maybeBool, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {boolean} defaultBool
+ */
+optional_scalars.ScalarStuff.addDefaultBool = function(builder, defaultBool) {
+ builder.addFieldInt8(32, +defaultBool, +true);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {optional_scalars.OptionalByte} justEnum
+ */
+optional_scalars.ScalarStuff.addJustEnum = function(builder, justEnum) {
+ builder.addFieldInt8(33, justEnum, optional_scalars.OptionalByte.None);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {optional_scalars.OptionalByte} maybeEnum
+ */
+optional_scalars.ScalarStuff.addMaybeEnum = function(builder, maybeEnum) {
+ builder.addFieldInt8(34, maybeEnum, 0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {optional_scalars.OptionalByte} defaultEnum
+ */
+optional_scalars.ScalarStuff.addDefaultEnum = function(builder, defaultEnum) {
+ builder.addFieldInt8(35, defaultEnum, optional_scalars.OptionalByte.One);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @returns {flatbuffers.Offset}
+ */
+optional_scalars.ScalarStuff.endScalarStuff = function(builder) {
+ var offset = builder.endObject();
+ return offset;
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Offset} offset
+ */
+optional_scalars.ScalarStuff.finishScalarStuffBuffer = function(builder, offset) {
+ builder.finish(offset, 'NULL');
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {flatbuffers.Offset} offset
+ */
+optional_scalars.ScalarStuff.finishSizePrefixedScalarStuffBuffer = function(builder, offset) {
+ builder.finish(offset, 'NULL', true);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @param {number} justI8
+ * @param {number|null} maybeI8
+ * @param {number} defaultI8
+ * @param {number} justU8
+ * @param {number|null} maybeU8
+ * @param {number} defaultU8
+ * @param {number} justI16
+ * @param {number|null} maybeI16
+ * @param {number} defaultI16
+ * @param {number} justU16
+ * @param {number|null} maybeU16
+ * @param {number} defaultU16
+ * @param {number} justI32
+ * @param {number|null} maybeI32
+ * @param {number} defaultI32
+ * @param {number} justU32
+ * @param {number|null} maybeU32
+ * @param {number} defaultU32
+ * @param {flatbuffers.Long} justI64
+ * @param {flatbuffers.Long|null} maybeI64
+ * @param {flatbuffers.Long} defaultI64
+ * @param {flatbuffers.Long} justU64
+ * @param {flatbuffers.Long|null} maybeU64
+ * @param {flatbuffers.Long} defaultU64
+ * @param {number} justF32
+ * @param {number|null} maybeF32
+ * @param {number} defaultF32
+ * @param {number} justF64
+ * @param {number|null} maybeF64
+ * @param {number} defaultF64
+ * @param {boolean} justBool
+ * @param {boolean|null} maybeBool
+ * @param {boolean} defaultBool
+ * @param {optional_scalars.OptionalByte} justEnum
+ * @param {optional_scalars.OptionalByte|null} maybeEnum
+ * @param {optional_scalars.OptionalByte} defaultEnum
+ * @returns {flatbuffers.Offset}
+ */
+optional_scalars.ScalarStuff.createScalarStuff = function(builder, justI8, maybeI8, defaultI8, justU8, maybeU8, defaultU8, justI16, maybeI16, defaultI16, justU16, maybeU16, defaultU16, justI32, maybeI32, defaultI32, justU32, maybeU32, defaultU32, justI64, maybeI64, defaultI64, justU64, maybeU64, defaultU64, justF32, maybeF32, defaultF32, justF64, maybeF64, defaultF64, justBool, maybeBool, defaultBool, justEnum, maybeEnum, defaultEnum) {
+ optional_scalars.ScalarStuff.startScalarStuff(builder);
+ optional_scalars.ScalarStuff.addJustI8(builder, justI8);
+ if (maybeI8 !== null)
+ optional_scalars.ScalarStuff.addMaybeI8(builder, maybeI8);
+ optional_scalars.ScalarStuff.addDefaultI8(builder, defaultI8);
+ optional_scalars.ScalarStuff.addJustU8(builder, justU8);
+ if (maybeU8 !== null)
+ optional_scalars.ScalarStuff.addMaybeU8(builder, maybeU8);
+ optional_scalars.ScalarStuff.addDefaultU8(builder, defaultU8);
+ optional_scalars.ScalarStuff.addJustI16(builder, justI16);
+ if (maybeI16 !== null)
+ optional_scalars.ScalarStuff.addMaybeI16(builder, maybeI16);
+ optional_scalars.ScalarStuff.addDefaultI16(builder, defaultI16);
+ optional_scalars.ScalarStuff.addJustU16(builder, justU16);
+ if (maybeU16 !== null)
+ optional_scalars.ScalarStuff.addMaybeU16(builder, maybeU16);
+ optional_scalars.ScalarStuff.addDefaultU16(builder, defaultU16);
+ optional_scalars.ScalarStuff.addJustI32(builder, justI32);
+ if (maybeI32 !== null)
+ optional_scalars.ScalarStuff.addMaybeI32(builder, maybeI32);
+ optional_scalars.ScalarStuff.addDefaultI32(builder, defaultI32);
+ optional_scalars.ScalarStuff.addJustU32(builder, justU32);
+ if (maybeU32 !== null)
+ optional_scalars.ScalarStuff.addMaybeU32(builder, maybeU32);
+ optional_scalars.ScalarStuff.addDefaultU32(builder, defaultU32);
+ optional_scalars.ScalarStuff.addJustI64(builder, justI64);
+ if (maybeI64 !== null)
+ optional_scalars.ScalarStuff.addMaybeI64(builder, maybeI64);
+ optional_scalars.ScalarStuff.addDefaultI64(builder, defaultI64);
+ optional_scalars.ScalarStuff.addJustU64(builder, justU64);
+ if (maybeU64 !== null)
+ optional_scalars.ScalarStuff.addMaybeU64(builder, maybeU64);
+ optional_scalars.ScalarStuff.addDefaultU64(builder, defaultU64);
+ optional_scalars.ScalarStuff.addJustF32(builder, justF32);
+ if (maybeF32 !== null)
+ optional_scalars.ScalarStuff.addMaybeF32(builder, maybeF32);
+ optional_scalars.ScalarStuff.addDefaultF32(builder, defaultF32);
+ optional_scalars.ScalarStuff.addJustF64(builder, justF64);
+ if (maybeF64 !== null)
+ optional_scalars.ScalarStuff.addMaybeF64(builder, maybeF64);
+ optional_scalars.ScalarStuff.addDefaultF64(builder, defaultF64);
+ optional_scalars.ScalarStuff.addJustBool(builder, justBool);
+ if (maybeBool !== null)
+ optional_scalars.ScalarStuff.addMaybeBool(builder, maybeBool);
+ optional_scalars.ScalarStuff.addDefaultBool(builder, defaultBool);
+ optional_scalars.ScalarStuff.addJustEnum(builder, justEnum);
+ if (maybeEnum !== null)
+ optional_scalars.ScalarStuff.addMaybeEnum(builder, maybeEnum);
+ optional_scalars.ScalarStuff.addDefaultEnum(builder, defaultEnum);
+ return optional_scalars.ScalarStuff.endScalarStuff(builder);
+}
+
+// Exports for Node.js and RequireJS
+this.optional_scalars = optional_scalars;
diff --git a/tests/optional_scalars_generated.lobster b/tests/optional_scalars_generated.lobster
new file mode 100644
index 0000000..d0f7aef
--- /dev/null
+++ b/tests/optional_scalars_generated.lobster
@@ -0,0 +1,204 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+import flatbuffers
+
+namespace optional_scalars
+
+enum OptionalByte:
+ OptionalByte_None = 0
+ OptionalByte_One = 1
+ OptionalByte_Two = 2
+
+class ScalarStuff
+
+class ScalarStuff : flatbuffers_handle
+ def just_i8():
+ return buf_.flatbuffers_field_int8(pos_, 4, 0)
+ def maybe_i8():
+ return buf_.flatbuffers_field_int8(pos_, 6, 0), buf_.flatbuffers_field_present(pos_, 6)
+ def default_i8():
+ return buf_.flatbuffers_field_int8(pos_, 8, 42)
+ def just_u8():
+ return buf_.flatbuffers_field_int8(pos_, 10, 0)
+ def maybe_u8():
+ return buf_.flatbuffers_field_int8(pos_, 12, 0), buf_.flatbuffers_field_present(pos_, 12)
+ def default_u8():
+ return buf_.flatbuffers_field_int8(pos_, 14, 42)
+ def just_i16():
+ return buf_.flatbuffers_field_int16(pos_, 16, 0)
+ def maybe_i16():
+ return buf_.flatbuffers_field_int16(pos_, 18, 0), buf_.flatbuffers_field_present(pos_, 18)
+ def default_i16():
+ return buf_.flatbuffers_field_int16(pos_, 20, 42)
+ def just_u16():
+ return buf_.flatbuffers_field_int16(pos_, 22, 0)
+ def maybe_u16():
+ return buf_.flatbuffers_field_int16(pos_, 24, 0), buf_.flatbuffers_field_present(pos_, 24)
+ def default_u16():
+ return buf_.flatbuffers_field_int16(pos_, 26, 42)
+ def just_i32():
+ return buf_.flatbuffers_field_int32(pos_, 28, 0)
+ def maybe_i32():
+ return buf_.flatbuffers_field_int32(pos_, 30, 0), buf_.flatbuffers_field_present(pos_, 30)
+ def default_i32():
+ return buf_.flatbuffers_field_int32(pos_, 32, 42)
+ def just_u32():
+ return buf_.flatbuffers_field_int32(pos_, 34, 0)
+ def maybe_u32():
+ return buf_.flatbuffers_field_int32(pos_, 36, 0), buf_.flatbuffers_field_present(pos_, 36)
+ def default_u32():
+ return buf_.flatbuffers_field_int32(pos_, 38, 42)
+ def just_i64():
+ return buf_.flatbuffers_field_int64(pos_, 40, 0)
+ def maybe_i64():
+ return buf_.flatbuffers_field_int64(pos_, 42, 0), buf_.flatbuffers_field_present(pos_, 42)
+ def default_i64():
+ return buf_.flatbuffers_field_int64(pos_, 44, 42)
+ def just_u64():
+ return buf_.flatbuffers_field_int64(pos_, 46, 0)
+ def maybe_u64():
+ return buf_.flatbuffers_field_int64(pos_, 48, 0), buf_.flatbuffers_field_present(pos_, 48)
+ def default_u64():
+ return buf_.flatbuffers_field_int64(pos_, 50, 42)
+ def just_f32():
+ return buf_.flatbuffers_field_float32(pos_, 52, 0.0)
+ def maybe_f32():
+ return buf_.flatbuffers_field_float32(pos_, 54, 0), buf_.flatbuffers_field_present(pos_, 54)
+ def default_f32():
+ return buf_.flatbuffers_field_float32(pos_, 56, 42.0)
+ def just_f64():
+ return buf_.flatbuffers_field_float64(pos_, 58, 0.0)
+ def maybe_f64():
+ return buf_.flatbuffers_field_float64(pos_, 60, 0), buf_.flatbuffers_field_present(pos_, 60)
+ def default_f64():
+ return buf_.flatbuffers_field_float64(pos_, 62, 42.0)
+ def just_bool():
+ return buf_.flatbuffers_field_int8(pos_, 64, 0)
+ def maybe_bool():
+ return buf_.flatbuffers_field_int8(pos_, 66, 0), buf_.flatbuffers_field_present(pos_, 66)
+ def default_bool():
+ return buf_.flatbuffers_field_int8(pos_, 68, 1)
+ def just_enum():
+ return OptionalByte(buf_.flatbuffers_field_int8(pos_, 70, 0))
+ def maybe_enum():
+ return OptionalByte(buf_.flatbuffers_field_int8(pos_, 72, 0)), buf_.flatbuffers_field_present(pos_, 72)
+ def default_enum():
+ return OptionalByte(buf_.flatbuffers_field_int8(pos_, 74, 1))
+
+def GetRootAsScalarStuff(buf:string): return ScalarStuff { buf, buf.flatbuffers_indirect(0) }
+
+struct ScalarStuffBuilder:
+ b_:flatbuffers_builder
+ def start():
+ b_.StartObject(36)
+ return this
+ def add_just_i8(just_i8:int):
+ b_.PrependInt8Slot(0, just_i8, 0)
+ return this
+ def add_maybe_i8(maybe_i8:int):
+ b_.PrependInt8Slot(1, maybe_i8)
+ return this
+ def add_default_i8(default_i8:int):
+ b_.PrependInt8Slot(2, default_i8, 42)
+ return this
+ def add_just_u8(just_u8:int):
+ b_.PrependUint8Slot(3, just_u8, 0)
+ return this
+ def add_maybe_u8(maybe_u8:int):
+ b_.PrependUint8Slot(4, maybe_u8)
+ return this
+ def add_default_u8(default_u8:int):
+ b_.PrependUint8Slot(5, default_u8, 42)
+ return this
+ def add_just_i16(just_i16:int):
+ b_.PrependInt16Slot(6, just_i16, 0)
+ return this
+ def add_maybe_i16(maybe_i16:int):
+ b_.PrependInt16Slot(7, maybe_i16)
+ return this
+ def add_default_i16(default_i16:int):
+ b_.PrependInt16Slot(8, default_i16, 42)
+ return this
+ def add_just_u16(just_u16:int):
+ b_.PrependUint16Slot(9, just_u16, 0)
+ return this
+ def add_maybe_u16(maybe_u16:int):
+ b_.PrependUint16Slot(10, maybe_u16)
+ return this
+ def add_default_u16(default_u16:int):
+ b_.PrependUint16Slot(11, default_u16, 42)
+ return this
+ def add_just_i32(just_i32:int):
+ b_.PrependInt32Slot(12, just_i32, 0)
+ return this
+ def add_maybe_i32(maybe_i32:int):
+ b_.PrependInt32Slot(13, maybe_i32)
+ return this
+ def add_default_i32(default_i32:int):
+ b_.PrependInt32Slot(14, default_i32, 42)
+ return this
+ def add_just_u32(just_u32:int):
+ b_.PrependUint32Slot(15, just_u32, 0)
+ return this
+ def add_maybe_u32(maybe_u32:int):
+ b_.PrependUint32Slot(16, maybe_u32)
+ return this
+ def add_default_u32(default_u32:int):
+ b_.PrependUint32Slot(17, default_u32, 42)
+ return this
+ def add_just_i64(just_i64:int):
+ b_.PrependInt64Slot(18, just_i64, 0)
+ return this
+ def add_maybe_i64(maybe_i64:int):
+ b_.PrependInt64Slot(19, maybe_i64)
+ return this
+ def add_default_i64(default_i64:int):
+ b_.PrependInt64Slot(20, default_i64, 42)
+ return this
+ def add_just_u64(just_u64:int):
+ b_.PrependUint64Slot(21, just_u64, 0)
+ return this
+ def add_maybe_u64(maybe_u64:int):
+ b_.PrependUint64Slot(22, maybe_u64)
+ return this
+ def add_default_u64(default_u64:int):
+ b_.PrependUint64Slot(23, default_u64, 42)
+ return this
+ def add_just_f32(just_f32:float):
+ b_.PrependFloat32Slot(24, just_f32, 0.0)
+ return this
+ def add_maybe_f32(maybe_f32:float):
+ b_.PrependFloat32Slot(25, maybe_f32)
+ return this
+ def add_default_f32(default_f32:float):
+ b_.PrependFloat32Slot(26, default_f32, 42.0)
+ return this
+ def add_just_f64(just_f64:float):
+ b_.PrependFloat64Slot(27, just_f64, 0.0)
+ return this
+ def add_maybe_f64(maybe_f64:float):
+ b_.PrependFloat64Slot(28, maybe_f64)
+ return this
+ def add_default_f64(default_f64:float):
+ b_.PrependFloat64Slot(29, default_f64, 42.0)
+ return this
+ def add_just_bool(just_bool:int):
+ b_.PrependBoolSlot(30, just_bool, 0)
+ return this
+ def add_maybe_bool(maybe_bool:int):
+ b_.PrependBoolSlot(31, maybe_bool)
+ return this
+ def add_default_bool(default_bool:int):
+ b_.PrependBoolSlot(32, default_bool, 1)
+ return this
+ def add_just_enum(just_enum:OptionalByte):
+ b_.PrependInt8Slot(33, just_enum, 0)
+ return this
+ def add_maybe_enum(maybe_enum:OptionalByte):
+ b_.PrependInt8Slot(34, maybe_enum)
+ return this
+ def add_default_enum(default_enum:OptionalByte):
+ b_.PrependInt8Slot(35, default_enum, 1)
+ return this
+ def end():
+ return b_.EndObject()
+
diff --git a/tests/optional_scalars_generated.rs b/tests/optional_scalars_generated.rs
new file mode 100644
index 0000000..793a8ac
--- /dev/null
+++ b/tests/optional_scalars_generated.rs
@@ -0,0 +1,667 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+
+#![allow(unused_imports, dead_code)]
+
+use std::mem;
+use std::cmp::Ordering;
+
+extern crate flatbuffers;
+use self::flatbuffers::EndianScalar;
+
+#[allow(unused_imports, dead_code)]
+pub mod optional_scalars {
+
+ use std::mem;
+ use std::cmp::Ordering;
+
+ extern crate flatbuffers;
+ use self::flatbuffers::EndianScalar;
+
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MIN_OPTIONAL_BYTE: i8 = 0;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+pub const ENUM_MAX_OPTIONAL_BYTE: i8 = 2;
+#[deprecated(since = "1.13", note = "Use associated constants instead. This will no longer be generated in 2021.")]
+#[allow(non_camel_case_types)]
+pub const ENUM_VALUES_OPTIONAL_BYTE: [OptionalByte; 3] = [
+ OptionalByte::None,
+ OptionalByte::One,
+ OptionalByte::Two,
+];
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct OptionalByte(pub i8);
+#[allow(non_upper_case_globals)]
+impl OptionalByte {
+ pub const None: Self = Self(0);
+ pub const One: Self = Self(1);
+ pub const Two: Self = Self(2);
+
+ pub const ENUM_MIN: i8 = 0;
+ pub const ENUM_MAX: i8 = 2;
+ pub const ENUM_VALUES: &'static [Self] = &[
+ Self::None,
+ Self::One,
+ Self::Two,
+ ];
+ /// Returns the variant's name or "" if unknown.
+ pub fn variant_name(self) -> Option<&'static str> {
+ match self {
+ Self::None => Some("None"),
+ Self::One => Some("One"),
+ Self::Two => Some("Two"),
+ _ => None,
+ }
+ }
+}
+impl std::fmt::Debug for OptionalByte {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ if let Some(name) = self.variant_name() {
+ f.write_str(name)
+ } else {
+ f.write_fmt(format_args!("<UNKNOWN {:?}>", self.0))
+ }
+ }
+}
+impl<'a> flatbuffers::Follow<'a> for OptionalByte {
+ type Inner = Self;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self(flatbuffers::read_scalar_at::<i8>(buf, loc))
+ }
+}
+
+impl flatbuffers::Push for OptionalByte {
+ type Output = OptionalByte;
+ #[inline]
+ fn push(&self, dst: &mut [u8], _rest: &[u8]) {
+ flatbuffers::emplace_scalar::<i8>(dst, self.0);
+ }
+}
+
+impl flatbuffers::EndianScalar for OptionalByte {
+ #[inline]
+ fn to_little_endian(self) -> Self {
+ Self(i8::to_le(self.0))
+ }
+ #[inline]
+ fn from_little_endian(self) -> Self {
+ Self(i8::from_le(self.0))
+ }
+}
+
+pub enum ScalarStuffOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct ScalarStuff<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for ScalarStuff<'a> {
+ type Inner = ScalarStuff<'a>;
+ #[inline]
+ fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table { buf, loc } }
+ }
+}
+
+impl<'a> ScalarStuff<'a> {
+ #[inline]
+ pub fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ ScalarStuff {
+ _tab: table,
+ }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,
+ args: &'args ScalarStuffArgs) -> flatbuffers::WIPOffset<ScalarStuff<'bldr>> {
+ let mut builder = ScalarStuffBuilder::new(_fbb);
+ builder.add_default_f64(args.default_f64);
+ if let Some(x) = args.maybe_f64 { builder.add_maybe_f64(x); }
+ builder.add_just_f64(args.just_f64);
+ builder.add_default_u64(args.default_u64);
+ if let Some(x) = args.maybe_u64 { builder.add_maybe_u64(x); }
+ builder.add_just_u64(args.just_u64);
+ builder.add_default_i64(args.default_i64);
+ if let Some(x) = args.maybe_i64 { builder.add_maybe_i64(x); }
+ builder.add_just_i64(args.just_i64);
+ builder.add_default_f32(args.default_f32);
+ if let Some(x) = args.maybe_f32 { builder.add_maybe_f32(x); }
+ builder.add_just_f32(args.just_f32);
+ builder.add_default_u32(args.default_u32);
+ if let Some(x) = args.maybe_u32 { builder.add_maybe_u32(x); }
+ builder.add_just_u32(args.just_u32);
+ builder.add_default_i32(args.default_i32);
+ if let Some(x) = args.maybe_i32 { builder.add_maybe_i32(x); }
+ builder.add_just_i32(args.just_i32);
+ builder.add_default_u16(args.default_u16);
+ if let Some(x) = args.maybe_u16 { builder.add_maybe_u16(x); }
+ builder.add_just_u16(args.just_u16);
+ builder.add_default_i16(args.default_i16);
+ if let Some(x) = args.maybe_i16 { builder.add_maybe_i16(x); }
+ builder.add_just_i16(args.just_i16);
+ builder.add_default_enum(args.default_enum);
+ if let Some(x) = args.maybe_enum { builder.add_maybe_enum(x); }
+ builder.add_just_enum(args.just_enum);
+ builder.add_default_bool(args.default_bool);
+ if let Some(x) = args.maybe_bool { builder.add_maybe_bool(x); }
+ builder.add_just_bool(args.just_bool);
+ builder.add_default_u8(args.default_u8);
+ if let Some(x) = args.maybe_u8 { builder.add_maybe_u8(x); }
+ builder.add_just_u8(args.just_u8);
+ builder.add_default_i8(args.default_i8);
+ if let Some(x) = args.maybe_i8 { builder.add_maybe_i8(x); }
+ builder.add_just_i8(args.just_i8);
+ builder.finish()
+ }
+
+ pub const VT_JUST_I8: flatbuffers::VOffsetT = 4;
+ pub const VT_MAYBE_I8: flatbuffers::VOffsetT = 6;
+ pub const VT_DEFAULT_I8: flatbuffers::VOffsetT = 8;
+ pub const VT_JUST_U8: flatbuffers::VOffsetT = 10;
+ pub const VT_MAYBE_U8: flatbuffers::VOffsetT = 12;
+ pub const VT_DEFAULT_U8: flatbuffers::VOffsetT = 14;
+ pub const VT_JUST_I16: flatbuffers::VOffsetT = 16;
+ pub const VT_MAYBE_I16: flatbuffers::VOffsetT = 18;
+ pub const VT_DEFAULT_I16: flatbuffers::VOffsetT = 20;
+ pub const VT_JUST_U16: flatbuffers::VOffsetT = 22;
+ pub const VT_MAYBE_U16: flatbuffers::VOffsetT = 24;
+ pub const VT_DEFAULT_U16: flatbuffers::VOffsetT = 26;
+ pub const VT_JUST_I32: flatbuffers::VOffsetT = 28;
+ pub const VT_MAYBE_I32: flatbuffers::VOffsetT = 30;
+ pub const VT_DEFAULT_I32: flatbuffers::VOffsetT = 32;
+ pub const VT_JUST_U32: flatbuffers::VOffsetT = 34;
+ pub const VT_MAYBE_U32: flatbuffers::VOffsetT = 36;
+ pub const VT_DEFAULT_U32: flatbuffers::VOffsetT = 38;
+ pub const VT_JUST_I64: flatbuffers::VOffsetT = 40;
+ pub const VT_MAYBE_I64: flatbuffers::VOffsetT = 42;
+ pub const VT_DEFAULT_I64: flatbuffers::VOffsetT = 44;
+ pub const VT_JUST_U64: flatbuffers::VOffsetT = 46;
+ pub const VT_MAYBE_U64: flatbuffers::VOffsetT = 48;
+ pub const VT_DEFAULT_U64: flatbuffers::VOffsetT = 50;
+ pub const VT_JUST_F32: flatbuffers::VOffsetT = 52;
+ pub const VT_MAYBE_F32: flatbuffers::VOffsetT = 54;
+ pub const VT_DEFAULT_F32: flatbuffers::VOffsetT = 56;
+ pub const VT_JUST_F64: flatbuffers::VOffsetT = 58;
+ pub const VT_MAYBE_F64: flatbuffers::VOffsetT = 60;
+ pub const VT_DEFAULT_F64: flatbuffers::VOffsetT = 62;
+ pub const VT_JUST_BOOL: flatbuffers::VOffsetT = 64;
+ pub const VT_MAYBE_BOOL: flatbuffers::VOffsetT = 66;
+ pub const VT_DEFAULT_BOOL: flatbuffers::VOffsetT = 68;
+ pub const VT_JUST_ENUM: flatbuffers::VOffsetT = 70;
+ pub const VT_MAYBE_ENUM: flatbuffers::VOffsetT = 72;
+ pub const VT_DEFAULT_ENUM: flatbuffers::VOffsetT = 74;
+
+ #[inline]
+ pub fn just_i8(&self) -> i8 {
+ self._tab.get::<i8>(ScalarStuff::VT_JUST_I8, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_i8(&self) -> Option<i8> {
+ self._tab.get::<i8>(ScalarStuff::VT_MAYBE_I8, None)
+ }
+ #[inline]
+ pub fn default_i8(&self) -> i8 {
+ self._tab.get::<i8>(ScalarStuff::VT_DEFAULT_I8, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_u8(&self) -> u8 {
+ self._tab.get::<u8>(ScalarStuff::VT_JUST_U8, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_u8(&self) -> Option<u8> {
+ self._tab.get::<u8>(ScalarStuff::VT_MAYBE_U8, None)
+ }
+ #[inline]
+ pub fn default_u8(&self) -> u8 {
+ self._tab.get::<u8>(ScalarStuff::VT_DEFAULT_U8, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_i16(&self) -> i16 {
+ self._tab.get::<i16>(ScalarStuff::VT_JUST_I16, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_i16(&self) -> Option<i16> {
+ self._tab.get::<i16>(ScalarStuff::VT_MAYBE_I16, None)
+ }
+ #[inline]
+ pub fn default_i16(&self) -> i16 {
+ self._tab.get::<i16>(ScalarStuff::VT_DEFAULT_I16, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_u16(&self) -> u16 {
+ self._tab.get::<u16>(ScalarStuff::VT_JUST_U16, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_u16(&self) -> Option<u16> {
+ self._tab.get::<u16>(ScalarStuff::VT_MAYBE_U16, None)
+ }
+ #[inline]
+ pub fn default_u16(&self) -> u16 {
+ self._tab.get::<u16>(ScalarStuff::VT_DEFAULT_U16, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_i32(&self) -> i32 {
+ self._tab.get::<i32>(ScalarStuff::VT_JUST_I32, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_i32(&self) -> Option<i32> {
+ self._tab.get::<i32>(ScalarStuff::VT_MAYBE_I32, None)
+ }
+ #[inline]
+ pub fn default_i32(&self) -> i32 {
+ self._tab.get::<i32>(ScalarStuff::VT_DEFAULT_I32, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_u32(&self) -> u32 {
+ self._tab.get::<u32>(ScalarStuff::VT_JUST_U32, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_u32(&self) -> Option<u32> {
+ self._tab.get::<u32>(ScalarStuff::VT_MAYBE_U32, None)
+ }
+ #[inline]
+ pub fn default_u32(&self) -> u32 {
+ self._tab.get::<u32>(ScalarStuff::VT_DEFAULT_U32, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_i64(&self) -> i64 {
+ self._tab.get::<i64>(ScalarStuff::VT_JUST_I64, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_i64(&self) -> Option<i64> {
+ self._tab.get::<i64>(ScalarStuff::VT_MAYBE_I64, None)
+ }
+ #[inline]
+ pub fn default_i64(&self) -> i64 {
+ self._tab.get::<i64>(ScalarStuff::VT_DEFAULT_I64, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_u64(&self) -> u64 {
+ self._tab.get::<u64>(ScalarStuff::VT_JUST_U64, Some(0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_u64(&self) -> Option<u64> {
+ self._tab.get::<u64>(ScalarStuff::VT_MAYBE_U64, None)
+ }
+ #[inline]
+ pub fn default_u64(&self) -> u64 {
+ self._tab.get::<u64>(ScalarStuff::VT_DEFAULT_U64, Some(42)).unwrap()
+ }
+ #[inline]
+ pub fn just_f32(&self) -> f32 {
+ self._tab.get::<f32>(ScalarStuff::VT_JUST_F32, Some(0.0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_f32(&self) -> Option<f32> {
+ self._tab.get::<f32>(ScalarStuff::VT_MAYBE_F32, None)
+ }
+ #[inline]
+ pub fn default_f32(&self) -> f32 {
+ self._tab.get::<f32>(ScalarStuff::VT_DEFAULT_F32, Some(42.0)).unwrap()
+ }
+ #[inline]
+ pub fn just_f64(&self) -> f64 {
+ self._tab.get::<f64>(ScalarStuff::VT_JUST_F64, Some(0.0)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_f64(&self) -> Option<f64> {
+ self._tab.get::<f64>(ScalarStuff::VT_MAYBE_F64, None)
+ }
+ #[inline]
+ pub fn default_f64(&self) -> f64 {
+ self._tab.get::<f64>(ScalarStuff::VT_DEFAULT_F64, Some(42.0)).unwrap()
+ }
+ #[inline]
+ pub fn just_bool(&self) -> bool {
+ self._tab.get::<bool>(ScalarStuff::VT_JUST_BOOL, Some(false)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_bool(&self) -> Option<bool> {
+ self._tab.get::<bool>(ScalarStuff::VT_MAYBE_BOOL, None)
+ }
+ #[inline]
+ pub fn default_bool(&self) -> bool {
+ self._tab.get::<bool>(ScalarStuff::VT_DEFAULT_BOOL, Some(true)).unwrap()
+ }
+ #[inline]
+ pub fn just_enum(&self) -> OptionalByte {
+ self._tab.get::<OptionalByte>(ScalarStuff::VT_JUST_ENUM, Some(OptionalByte::None)).unwrap()
+ }
+ #[inline]
+ pub fn maybe_enum(&self) -> Option<OptionalByte> {
+ self._tab.get::<OptionalByte>(ScalarStuff::VT_MAYBE_ENUM, None)
+ }
+ #[inline]
+ pub fn default_enum(&self) -> OptionalByte {
+ self._tab.get::<OptionalByte>(ScalarStuff::VT_DEFAULT_ENUM, Some(OptionalByte::One)).unwrap()
+ }
+}
+
+pub struct ScalarStuffArgs {
+ pub just_i8: i8,
+ pub maybe_i8: Option<i8>,
+ pub default_i8: i8,
+ pub just_u8: u8,
+ pub maybe_u8: Option<u8>,
+ pub default_u8: u8,
+ pub just_i16: i16,
+ pub maybe_i16: Option<i16>,
+ pub default_i16: i16,
+ pub just_u16: u16,
+ pub maybe_u16: Option<u16>,
+ pub default_u16: u16,
+ pub just_i32: i32,
+ pub maybe_i32: Option<i32>,
+ pub default_i32: i32,
+ pub just_u32: u32,
+ pub maybe_u32: Option<u32>,
+ pub default_u32: u32,
+ pub just_i64: i64,
+ pub maybe_i64: Option<i64>,
+ pub default_i64: i64,
+ pub just_u64: u64,
+ pub maybe_u64: Option<u64>,
+ pub default_u64: u64,
+ pub just_f32: f32,
+ pub maybe_f32: Option<f32>,
+ pub default_f32: f32,
+ pub just_f64: f64,
+ pub maybe_f64: Option<f64>,
+ pub default_f64: f64,
+ pub just_bool: bool,
+ pub maybe_bool: Option<bool>,
+ pub default_bool: bool,
+ pub just_enum: OptionalByte,
+ pub maybe_enum: Option<OptionalByte>,
+ pub default_enum: OptionalByte,
+}
+impl<'a> Default for ScalarStuffArgs {
+ #[inline]
+ fn default() -> Self {
+ ScalarStuffArgs {
+ just_i8: 0,
+ maybe_i8: None,
+ default_i8: 42,
+ just_u8: 0,
+ maybe_u8: None,
+ default_u8: 42,
+ just_i16: 0,
+ maybe_i16: None,
+ default_i16: 42,
+ just_u16: 0,
+ maybe_u16: None,
+ default_u16: 42,
+ just_i32: 0,
+ maybe_i32: None,
+ default_i32: 42,
+ just_u32: 0,
+ maybe_u32: None,
+ default_u32: 42,
+ just_i64: 0,
+ maybe_i64: None,
+ default_i64: 42,
+ just_u64: 0,
+ maybe_u64: None,
+ default_u64: 42,
+ just_f32: 0.0,
+ maybe_f32: None,
+ default_f32: 42.0,
+ just_f64: 0.0,
+ maybe_f64: None,
+ default_f64: 42.0,
+ just_bool: false,
+ maybe_bool: None,
+ default_bool: true,
+ just_enum: OptionalByte::None,
+ maybe_enum: None,
+ default_enum: OptionalByte::One,
+ }
+ }
+}
+pub struct ScalarStuffBuilder<'a: 'b, 'b> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+ start_: flatbuffers::WIPOffset<flatbuffers::TableUnfinishedWIPOffset>,
+}
+impl<'a: 'b, 'b> ScalarStuffBuilder<'a, 'b> {
+ #[inline]
+ pub fn add_just_i8(&mut self, just_i8: i8) {
+ self.fbb_.push_slot::<i8>(ScalarStuff::VT_JUST_I8, just_i8, 0);
+ }
+ #[inline]
+ pub fn add_maybe_i8(&mut self, maybe_i8: i8) {
+ self.fbb_.push_slot_always::<i8>(ScalarStuff::VT_MAYBE_I8, maybe_i8);
+ }
+ #[inline]
+ pub fn add_default_i8(&mut self, default_i8: i8) {
+ self.fbb_.push_slot::<i8>(ScalarStuff::VT_DEFAULT_I8, default_i8, 42);
+ }
+ #[inline]
+ pub fn add_just_u8(&mut self, just_u8: u8) {
+ self.fbb_.push_slot::<u8>(ScalarStuff::VT_JUST_U8, just_u8, 0);
+ }
+ #[inline]
+ pub fn add_maybe_u8(&mut self, maybe_u8: u8) {
+ self.fbb_.push_slot_always::<u8>(ScalarStuff::VT_MAYBE_U8, maybe_u8);
+ }
+ #[inline]
+ pub fn add_default_u8(&mut self, default_u8: u8) {
+ self.fbb_.push_slot::<u8>(ScalarStuff::VT_DEFAULT_U8, default_u8, 42);
+ }
+ #[inline]
+ pub fn add_just_i16(&mut self, just_i16: i16) {
+ self.fbb_.push_slot::<i16>(ScalarStuff::VT_JUST_I16, just_i16, 0);
+ }
+ #[inline]
+ pub fn add_maybe_i16(&mut self, maybe_i16: i16) {
+ self.fbb_.push_slot_always::<i16>(ScalarStuff::VT_MAYBE_I16, maybe_i16);
+ }
+ #[inline]
+ pub fn add_default_i16(&mut self, default_i16: i16) {
+ self.fbb_.push_slot::<i16>(ScalarStuff::VT_DEFAULT_I16, default_i16, 42);
+ }
+ #[inline]
+ pub fn add_just_u16(&mut self, just_u16: u16) {
+ self.fbb_.push_slot::<u16>(ScalarStuff::VT_JUST_U16, just_u16, 0);
+ }
+ #[inline]
+ pub fn add_maybe_u16(&mut self, maybe_u16: u16) {
+ self.fbb_.push_slot_always::<u16>(ScalarStuff::VT_MAYBE_U16, maybe_u16);
+ }
+ #[inline]
+ pub fn add_default_u16(&mut self, default_u16: u16) {
+ self.fbb_.push_slot::<u16>(ScalarStuff::VT_DEFAULT_U16, default_u16, 42);
+ }
+ #[inline]
+ pub fn add_just_i32(&mut self, just_i32: i32) {
+ self.fbb_.push_slot::<i32>(ScalarStuff::VT_JUST_I32, just_i32, 0);
+ }
+ #[inline]
+ pub fn add_maybe_i32(&mut self, maybe_i32: i32) {
+ self.fbb_.push_slot_always::<i32>(ScalarStuff::VT_MAYBE_I32, maybe_i32);
+ }
+ #[inline]
+ pub fn add_default_i32(&mut self, default_i32: i32) {
+ self.fbb_.push_slot::<i32>(ScalarStuff::VT_DEFAULT_I32, default_i32, 42);
+ }
+ #[inline]
+ pub fn add_just_u32(&mut self, just_u32: u32) {
+ self.fbb_.push_slot::<u32>(ScalarStuff::VT_JUST_U32, just_u32, 0);
+ }
+ #[inline]
+ pub fn add_maybe_u32(&mut self, maybe_u32: u32) {
+ self.fbb_.push_slot_always::<u32>(ScalarStuff::VT_MAYBE_U32, maybe_u32);
+ }
+ #[inline]
+ pub fn add_default_u32(&mut self, default_u32: u32) {
+ self.fbb_.push_slot::<u32>(ScalarStuff::VT_DEFAULT_U32, default_u32, 42);
+ }
+ #[inline]
+ pub fn add_just_i64(&mut self, just_i64: i64) {
+ self.fbb_.push_slot::<i64>(ScalarStuff::VT_JUST_I64, just_i64, 0);
+ }
+ #[inline]
+ pub fn add_maybe_i64(&mut self, maybe_i64: i64) {
+ self.fbb_.push_slot_always::<i64>(ScalarStuff::VT_MAYBE_I64, maybe_i64);
+ }
+ #[inline]
+ pub fn add_default_i64(&mut self, default_i64: i64) {
+ self.fbb_.push_slot::<i64>(ScalarStuff::VT_DEFAULT_I64, default_i64, 42);
+ }
+ #[inline]
+ pub fn add_just_u64(&mut self, just_u64: u64) {
+ self.fbb_.push_slot::<u64>(ScalarStuff::VT_JUST_U64, just_u64, 0);
+ }
+ #[inline]
+ pub fn add_maybe_u64(&mut self, maybe_u64: u64) {
+ self.fbb_.push_slot_always::<u64>(ScalarStuff::VT_MAYBE_U64, maybe_u64);
+ }
+ #[inline]
+ pub fn add_default_u64(&mut self, default_u64: u64) {
+ self.fbb_.push_slot::<u64>(ScalarStuff::VT_DEFAULT_U64, default_u64, 42);
+ }
+ #[inline]
+ pub fn add_just_f32(&mut self, just_f32: f32) {
+ self.fbb_.push_slot::<f32>(ScalarStuff::VT_JUST_F32, just_f32, 0.0);
+ }
+ #[inline]
+ pub fn add_maybe_f32(&mut self, maybe_f32: f32) {
+ self.fbb_.push_slot_always::<f32>(ScalarStuff::VT_MAYBE_F32, maybe_f32);
+ }
+ #[inline]
+ pub fn add_default_f32(&mut self, default_f32: f32) {
+ self.fbb_.push_slot::<f32>(ScalarStuff::VT_DEFAULT_F32, default_f32, 42.0);
+ }
+ #[inline]
+ pub fn add_just_f64(&mut self, just_f64: f64) {
+ self.fbb_.push_slot::<f64>(ScalarStuff::VT_JUST_F64, just_f64, 0.0);
+ }
+ #[inline]
+ pub fn add_maybe_f64(&mut self, maybe_f64: f64) {
+ self.fbb_.push_slot_always::<f64>(ScalarStuff::VT_MAYBE_F64, maybe_f64);
+ }
+ #[inline]
+ pub fn add_default_f64(&mut self, default_f64: f64) {
+ self.fbb_.push_slot::<f64>(ScalarStuff::VT_DEFAULT_F64, default_f64, 42.0);
+ }
+ #[inline]
+ pub fn add_just_bool(&mut self, just_bool: bool) {
+ self.fbb_.push_slot::<bool>(ScalarStuff::VT_JUST_BOOL, just_bool, false);
+ }
+ #[inline]
+ pub fn add_maybe_bool(&mut self, maybe_bool: bool) {
+ self.fbb_.push_slot_always::<bool>(ScalarStuff::VT_MAYBE_BOOL, maybe_bool);
+ }
+ #[inline]
+ pub fn add_default_bool(&mut self, default_bool: bool) {
+ self.fbb_.push_slot::<bool>(ScalarStuff::VT_DEFAULT_BOOL, default_bool, true);
+ }
+ #[inline]
+ pub fn add_just_enum(&mut self, just_enum: OptionalByte) {
+ self.fbb_.push_slot::<OptionalByte>(ScalarStuff::VT_JUST_ENUM, just_enum, OptionalByte::None);
+ }
+ #[inline]
+ pub fn add_maybe_enum(&mut self, maybe_enum: OptionalByte) {
+ self.fbb_.push_slot_always::<OptionalByte>(ScalarStuff::VT_MAYBE_ENUM, maybe_enum);
+ }
+ #[inline]
+ pub fn add_default_enum(&mut self, default_enum: OptionalByte) {
+ self.fbb_.push_slot::<OptionalByte>(ScalarStuff::VT_DEFAULT_ENUM, default_enum, OptionalByte::One);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> ScalarStuffBuilder<'a, 'b> {
+ let start = _fbb.start_table();
+ ScalarStuffBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset<ScalarStuff<'a>> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl std::fmt::Debug for ScalarStuff<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ let mut ds = f.debug_struct("ScalarStuff");
+ ds.field("just_i8", &self.just_i8());
+ ds.field("maybe_i8", &self.maybe_i8());
+ ds.field("default_i8", &self.default_i8());
+ ds.field("just_u8", &self.just_u8());
+ ds.field("maybe_u8", &self.maybe_u8());
+ ds.field("default_u8", &self.default_u8());
+ ds.field("just_i16", &self.just_i16());
+ ds.field("maybe_i16", &self.maybe_i16());
+ ds.field("default_i16", &self.default_i16());
+ ds.field("just_u16", &self.just_u16());
+ ds.field("maybe_u16", &self.maybe_u16());
+ ds.field("default_u16", &self.default_u16());
+ ds.field("just_i32", &self.just_i32());
+ ds.field("maybe_i32", &self.maybe_i32());
+ ds.field("default_i32", &self.default_i32());
+ ds.field("just_u32", &self.just_u32());
+ ds.field("maybe_u32", &self.maybe_u32());
+ ds.field("default_u32", &self.default_u32());
+ ds.field("just_i64", &self.just_i64());
+ ds.field("maybe_i64", &self.maybe_i64());
+ ds.field("default_i64", &self.default_i64());
+ ds.field("just_u64", &self.just_u64());
+ ds.field("maybe_u64", &self.maybe_u64());
+ ds.field("default_u64", &self.default_u64());
+ ds.field("just_f32", &self.just_f32());
+ ds.field("maybe_f32", &self.maybe_f32());
+ ds.field("default_f32", &self.default_f32());
+ ds.field("just_f64", &self.just_f64());
+ ds.field("maybe_f64", &self.maybe_f64());
+ ds.field("default_f64", &self.default_f64());
+ ds.field("just_bool", &self.just_bool());
+ ds.field("maybe_bool", &self.maybe_bool());
+ ds.field("default_bool", &self.default_bool());
+ ds.field("just_enum", &self.just_enum());
+ ds.field("maybe_enum", &self.maybe_enum());
+ ds.field("default_enum", &self.default_enum());
+ ds.finish()
+ }
+}
+#[inline]
+pub fn get_root_as_scalar_stuff<'a>(buf: &'a [u8]) -> ScalarStuff<'a> {
+ flatbuffers::get_root::<ScalarStuff<'a>>(buf)
+}
+
+#[inline]
+pub fn get_size_prefixed_root_as_scalar_stuff<'a>(buf: &'a [u8]) -> ScalarStuff<'a> {
+ flatbuffers::get_size_prefixed_root::<ScalarStuff<'a>>(buf)
+}
+
+pub const SCALAR_STUFF_IDENTIFIER: &str = "NULL";
+
+#[inline]
+pub fn scalar_stuff_buffer_has_identifier(buf: &[u8]) -> bool {
+ flatbuffers::buffer_has_identifier(buf, SCALAR_STUFF_IDENTIFIER, false)
+}
+
+#[inline]
+pub fn scalar_stuff_size_prefixed_buffer_has_identifier(buf: &[u8]) -> bool {
+ flatbuffers::buffer_has_identifier(buf, SCALAR_STUFF_IDENTIFIER, true)
+}
+
+pub const SCALAR_STUFF_EXTENSION: &str = "mon";
+
+#[inline]
+pub fn finish_scalar_stuff_buffer<'a, 'b>(
+ fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>,
+ root: flatbuffers::WIPOffset<ScalarStuff<'a>>) {
+ fbb.finish(root, Some(SCALAR_STUFF_IDENTIFIER));
+}
+
+#[inline]
+pub fn finish_size_prefixed_scalar_stuff_buffer<'a, 'b>(fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>, root: flatbuffers::WIPOffset<ScalarStuff<'a>>) {
+ fbb.finish_size_prefixed(root, Some(SCALAR_STUFF_IDENTIFIER));
+}
+} // pub mod optional_scalars
+
diff --git a/tests/optional_scalars_generated.ts b/tests/optional_scalars_generated.ts
new file mode 100644
index 0000000..668da8b
--- /dev/null
+++ b/tests/optional_scalars_generated.ts
@@ -0,0 +1,722 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+import * as flatbuffers from 'flatbuffers';
+/**
+ * @enum {number}
+ */
+export namespace optional_scalars{
+export enum OptionalByte{
+ None= 0,
+ One= 1,
+ Two= 2
+};
+}
+
+/**
+ * @constructor
+ */
+export namespace optional_scalars{
+export class ScalarStuff {
+ bb: flatbuffers.ByteBuffer|null = null;
+
+ bb_pos:number = 0;
+/**
+ * @param number i
+ * @param flatbuffers.ByteBuffer bb
+ * @returns ScalarStuff
+ */
+__init(i:number, bb:flatbuffers.ByteBuffer):ScalarStuff {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+};
+
+/**
+ * @param flatbuffers.ByteBuffer bb
+ * @param ScalarStuff= obj
+ * @returns ScalarStuff
+ */
+static getRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {
+ return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+};
+
+/**
+ * @param flatbuffers.ByteBuffer bb
+ * @param ScalarStuff= obj
+ * @returns ScalarStuff
+ */
+static getSizePrefixedRootAsScalarStuff(bb:flatbuffers.ByteBuffer, obj?:ScalarStuff):ScalarStuff {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new ScalarStuff()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+};
+
+/**
+ * @param flatbuffers.ByteBuffer bb
+ * @returns boolean
+ */
+static bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {
+ return bb.__has_identifier('NULL');
+};
+
+/**
+ * @returns number
+ */
+justI8():number {
+ var offset = this.bb!.__offset(this.bb_pos, 4);
+ return offset ? this.bb!.readInt8(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeI8():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 6);
+ return offset ? this.bb!.readInt8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultI8():number {
+ var offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? this.bb!.readInt8(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns number
+ */
+justU8():number {
+ var offset = this.bb!.__offset(this.bb_pos, 10);
+ return offset ? this.bb!.readUint8(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeU8():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? this.bb!.readUint8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultU8():number {
+ var offset = this.bb!.__offset(this.bb_pos, 14);
+ return offset ? this.bb!.readUint8(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns number
+ */
+justI16():number {
+ var offset = this.bb!.__offset(this.bb_pos, 16);
+ return offset ? this.bb!.readInt16(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeI16():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 18);
+ return offset ? this.bb!.readInt16(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultI16():number {
+ var offset = this.bb!.__offset(this.bb_pos, 20);
+ return offset ? this.bb!.readInt16(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns number
+ */
+justU16():number {
+ var offset = this.bb!.__offset(this.bb_pos, 22);
+ return offset ? this.bb!.readUint16(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeU16():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 24);
+ return offset ? this.bb!.readUint16(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultU16():number {
+ var offset = this.bb!.__offset(this.bb_pos, 26);
+ return offset ? this.bb!.readUint16(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns number
+ */
+justI32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 28);
+ return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeI32():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 30);
+ return offset ? this.bb!.readInt32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultI32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 32);
+ return offset ? this.bb!.readInt32(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns number
+ */
+justU32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 34);
+ return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeU32():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 36);
+ return offset ? this.bb!.readUint32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultU32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 38);
+ return offset ? this.bb!.readUint32(this.bb_pos + offset) : 42;
+};
+
+/**
+ * @returns flatbuffers.Long
+ */
+justI64():flatbuffers.Long {
+ var offset = this.bb!.__offset(this.bb_pos, 40);
+ return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);
+};
+
+/**
+ * @returns flatbuffers.Long|null
+ */
+maybeI64():flatbuffers.Long|null {
+ var offset = this.bb!.__offset(this.bb_pos, 42);
+ return offset ? this.bb!.readInt64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns flatbuffers.Long
+ */
+defaultI64():flatbuffers.Long {
+ var offset = this.bb!.__offset(this.bb_pos, 44);
+ return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(42, 0);
+};
+
+/**
+ * @returns flatbuffers.Long
+ */
+justU64():flatbuffers.Long {
+ var offset = this.bb!.__offset(this.bb_pos, 46);
+ return offset ? this.bb!.readUint64(this.bb_pos + offset) : this.bb!.createLong(0, 0);
+};
+
+/**
+ * @returns flatbuffers.Long|null
+ */
+maybeU64():flatbuffers.Long|null {
+ var offset = this.bb!.__offset(this.bb_pos, 48);
+ return offset ? this.bb!.readUint64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns flatbuffers.Long
+ */
+defaultU64():flatbuffers.Long {
+ var offset = this.bb!.__offset(this.bb_pos, 50);
+ return offset ? this.bb!.readUint64(this.bb_pos + offset) : this.bb!.createLong(42, 0);
+};
+
+/**
+ * @returns number
+ */
+justF32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 52);
+ return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeF32():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 54);
+ return offset ? this.bb!.readFloat32(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultF32():number {
+ var offset = this.bb!.__offset(this.bb_pos, 56);
+ return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 42.0;
+};
+
+/**
+ * @returns number
+ */
+justF64():number {
+ var offset = this.bb!.__offset(this.bb_pos, 58);
+ return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 0.0;
+};
+
+/**
+ * @returns number|null
+ */
+maybeF64():number|null {
+ var offset = this.bb!.__offset(this.bb_pos, 60);
+ return offset ? this.bb!.readFloat64(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns number
+ */
+defaultF64():number {
+ var offset = this.bb!.__offset(this.bb_pos, 62);
+ return offset ? this.bb!.readFloat64(this.bb_pos + offset) : 42.0;
+};
+
+/**
+ * @returns boolean
+ */
+justBool():boolean {
+ var offset = this.bb!.__offset(this.bb_pos, 64);
+ return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;
+};
+
+/**
+ * @returns boolean|null
+ */
+maybeBool():boolean|null {
+ var offset = this.bb!.__offset(this.bb_pos, 66);
+ return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : null;
+};
+
+/**
+ * @returns boolean
+ */
+defaultBool():boolean {
+ var offset = this.bb!.__offset(this.bb_pos, 68);
+ return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : true;
+};
+
+/**
+ * @returns optional_scalars.OptionalByte
+ */
+justEnum():optional_scalars.OptionalByte {
+ var offset = this.bb!.__offset(this.bb_pos, 70);
+ return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) : optional_scalars.OptionalByte.None;
+};
+
+/**
+ * @returns optional_scalars.OptionalByte|null
+ */
+maybeEnum():optional_scalars.OptionalByte|null {
+ var offset = this.bb!.__offset(this.bb_pos, 72);
+ return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) : null;
+};
+
+/**
+ * @returns optional_scalars.OptionalByte
+ */
+defaultEnum():optional_scalars.OptionalByte {
+ var offset = this.bb!.__offset(this.bb_pos, 74);
+ return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) : optional_scalars.OptionalByte.One;
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ */
+static startScalarStuff(builder:flatbuffers.Builder) {
+ builder.startObject(36);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justI8
+ */
+static addJustI8(builder:flatbuffers.Builder, justI8:number) {
+ builder.addFieldInt8(0, justI8, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeI8
+ */
+static addMaybeI8(builder:flatbuffers.Builder, maybeI8:number) {
+ builder.addFieldInt8(1, maybeI8, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultI8
+ */
+static addDefaultI8(builder:flatbuffers.Builder, defaultI8:number) {
+ builder.addFieldInt8(2, defaultI8, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justU8
+ */
+static addJustU8(builder:flatbuffers.Builder, justU8:number) {
+ builder.addFieldInt8(3, justU8, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeU8
+ */
+static addMaybeU8(builder:flatbuffers.Builder, maybeU8:number) {
+ builder.addFieldInt8(4, maybeU8, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultU8
+ */
+static addDefaultU8(builder:flatbuffers.Builder, defaultU8:number) {
+ builder.addFieldInt8(5, defaultU8, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justI16
+ */
+static addJustI16(builder:flatbuffers.Builder, justI16:number) {
+ builder.addFieldInt16(6, justI16, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeI16
+ */
+static addMaybeI16(builder:flatbuffers.Builder, maybeI16:number) {
+ builder.addFieldInt16(7, maybeI16, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultI16
+ */
+static addDefaultI16(builder:flatbuffers.Builder, defaultI16:number) {
+ builder.addFieldInt16(8, defaultI16, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justU16
+ */
+static addJustU16(builder:flatbuffers.Builder, justU16:number) {
+ builder.addFieldInt16(9, justU16, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeU16
+ */
+static addMaybeU16(builder:flatbuffers.Builder, maybeU16:number) {
+ builder.addFieldInt16(10, maybeU16, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultU16
+ */
+static addDefaultU16(builder:flatbuffers.Builder, defaultU16:number) {
+ builder.addFieldInt16(11, defaultU16, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justI32
+ */
+static addJustI32(builder:flatbuffers.Builder, justI32:number) {
+ builder.addFieldInt32(12, justI32, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeI32
+ */
+static addMaybeI32(builder:flatbuffers.Builder, maybeI32:number) {
+ builder.addFieldInt32(13, maybeI32, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultI32
+ */
+static addDefaultI32(builder:flatbuffers.Builder, defaultI32:number) {
+ builder.addFieldInt32(14, defaultI32, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justU32
+ */
+static addJustU32(builder:flatbuffers.Builder, justU32:number) {
+ builder.addFieldInt32(15, justU32, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeU32
+ */
+static addMaybeU32(builder:flatbuffers.Builder, maybeU32:number) {
+ builder.addFieldInt32(16, maybeU32, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultU32
+ */
+static addDefaultU32(builder:flatbuffers.Builder, defaultU32:number) {
+ builder.addFieldInt32(17, defaultU32, 42);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long justI64
+ */
+static addJustI64(builder:flatbuffers.Builder, justI64:flatbuffers.Long) {
+ builder.addFieldInt64(18, justI64, builder.createLong(0, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long maybeI64
+ */
+static addMaybeI64(builder:flatbuffers.Builder, maybeI64:flatbuffers.Long) {
+ builder.addFieldInt64(19, maybeI64, builder.createLong(0, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long defaultI64
+ */
+static addDefaultI64(builder:flatbuffers.Builder, defaultI64:flatbuffers.Long) {
+ builder.addFieldInt64(20, defaultI64, builder.createLong(42, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long justU64
+ */
+static addJustU64(builder:flatbuffers.Builder, justU64:flatbuffers.Long) {
+ builder.addFieldInt64(21, justU64, builder.createLong(0, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long maybeU64
+ */
+static addMaybeU64(builder:flatbuffers.Builder, maybeU64:flatbuffers.Long) {
+ builder.addFieldInt64(22, maybeU64, builder.createLong(0, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Long defaultU64
+ */
+static addDefaultU64(builder:flatbuffers.Builder, defaultU64:flatbuffers.Long) {
+ builder.addFieldInt64(23, defaultU64, builder.createLong(42, 0));
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justF32
+ */
+static addJustF32(builder:flatbuffers.Builder, justF32:number) {
+ builder.addFieldFloat32(24, justF32, 0.0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeF32
+ */
+static addMaybeF32(builder:flatbuffers.Builder, maybeF32:number) {
+ builder.addFieldFloat32(25, maybeF32, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultF32
+ */
+static addDefaultF32(builder:flatbuffers.Builder, defaultF32:number) {
+ builder.addFieldFloat32(26, defaultF32, 42.0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number justF64
+ */
+static addJustF64(builder:flatbuffers.Builder, justF64:number) {
+ builder.addFieldFloat64(27, justF64, 0.0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number maybeF64
+ */
+static addMaybeF64(builder:flatbuffers.Builder, maybeF64:number) {
+ builder.addFieldFloat64(28, maybeF64, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param number defaultF64
+ */
+static addDefaultF64(builder:flatbuffers.Builder, defaultF64:number) {
+ builder.addFieldFloat64(29, defaultF64, 42.0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param boolean justBool
+ */
+static addJustBool(builder:flatbuffers.Builder, justBool:boolean) {
+ builder.addFieldInt8(30, +justBool, +false);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param boolean maybeBool
+ */
+static addMaybeBool(builder:flatbuffers.Builder, maybeBool:boolean) {
+ builder.addFieldInt8(31, +maybeBool, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param boolean defaultBool
+ */
+static addDefaultBool(builder:flatbuffers.Builder, defaultBool:boolean) {
+ builder.addFieldInt8(32, +defaultBool, +true);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param optional_scalars.OptionalByte justEnum
+ */
+static addJustEnum(builder:flatbuffers.Builder, justEnum:optional_scalars.OptionalByte) {
+ builder.addFieldInt8(33, justEnum, optional_scalars.OptionalByte.None);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param optional_scalars.OptionalByte maybeEnum
+ */
+static addMaybeEnum(builder:flatbuffers.Builder, maybeEnum:optional_scalars.OptionalByte) {
+ builder.addFieldInt8(34, maybeEnum, 0);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param optional_scalars.OptionalByte defaultEnum
+ */
+static addDefaultEnum(builder:flatbuffers.Builder, defaultEnum:optional_scalars.OptionalByte) {
+ builder.addFieldInt8(35, defaultEnum, optional_scalars.OptionalByte.One);
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+static endScalarStuff(builder:flatbuffers.Builder):flatbuffers.Offset {
+ var offset = builder.endObject();
+ return offset;
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Offset offset
+ */
+static finishScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {
+ builder.finish(offset, 'NULL');
+};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @param flatbuffers.Offset offset
+ */
+static finishSizePrefixedScalarStuffBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {
+ builder.finish(offset, 'NULL', true);
+};
+
+static createScalarStuff(builder:flatbuffers.Builder, justI8:number, maybeI8:number|null, defaultI8:number, justU8:number, maybeU8:number|null, defaultU8:number, justI16:number, maybeI16:number|null, defaultI16:number, justU16:number, maybeU16:number|null, defaultU16:number, justI32:number, maybeI32:number|null, defaultI32:number, justU32:number, maybeU32:number|null, defaultU32:number, justI64:flatbuffers.Long, maybeI64:flatbuffers.Long|null, defaultI64:flatbuffers.Long, justU64:flatbuffers.Long, maybeU64:flatbuffers.Long|null, defaultU64:flatbuffers.Long, justF32:number, maybeF32:number|null, defaultF32:number, justF64:number, maybeF64:number|null, defaultF64:number, justBool:boolean, maybeBool:boolean|null, defaultBool:boolean, justEnum:optional_scalars.OptionalByte, maybeEnum:optional_scalars.OptionalByte|null, defaultEnum:optional_scalars.OptionalByte):flatbuffers.Offset {
+ ScalarStuff.startScalarStuff(builder);
+ ScalarStuff.addJustI8(builder, justI8);
+ if (maybeI8 !== null)
+ ScalarStuff.addMaybeI8(builder, maybeI8);
+ ScalarStuff.addDefaultI8(builder, defaultI8);
+ ScalarStuff.addJustU8(builder, justU8);
+ if (maybeU8 !== null)
+ ScalarStuff.addMaybeU8(builder, maybeU8);
+ ScalarStuff.addDefaultU8(builder, defaultU8);
+ ScalarStuff.addJustI16(builder, justI16);
+ if (maybeI16 !== null)
+ ScalarStuff.addMaybeI16(builder, maybeI16);
+ ScalarStuff.addDefaultI16(builder, defaultI16);
+ ScalarStuff.addJustU16(builder, justU16);
+ if (maybeU16 !== null)
+ ScalarStuff.addMaybeU16(builder, maybeU16);
+ ScalarStuff.addDefaultU16(builder, defaultU16);
+ ScalarStuff.addJustI32(builder, justI32);
+ if (maybeI32 !== null)
+ ScalarStuff.addMaybeI32(builder, maybeI32);
+ ScalarStuff.addDefaultI32(builder, defaultI32);
+ ScalarStuff.addJustU32(builder, justU32);
+ if (maybeU32 !== null)
+ ScalarStuff.addMaybeU32(builder, maybeU32);
+ ScalarStuff.addDefaultU32(builder, defaultU32);
+ ScalarStuff.addJustI64(builder, justI64);
+ if (maybeI64 !== null)
+ ScalarStuff.addMaybeI64(builder, maybeI64);
+ ScalarStuff.addDefaultI64(builder, defaultI64);
+ ScalarStuff.addJustU64(builder, justU64);
+ if (maybeU64 !== null)
+ ScalarStuff.addMaybeU64(builder, maybeU64);
+ ScalarStuff.addDefaultU64(builder, defaultU64);
+ ScalarStuff.addJustF32(builder, justF32);
+ if (maybeF32 !== null)
+ ScalarStuff.addMaybeF32(builder, maybeF32);
+ ScalarStuff.addDefaultF32(builder, defaultF32);
+ ScalarStuff.addJustF64(builder, justF64);
+ if (maybeF64 !== null)
+ ScalarStuff.addMaybeF64(builder, maybeF64);
+ ScalarStuff.addDefaultF64(builder, defaultF64);
+ ScalarStuff.addJustBool(builder, justBool);
+ if (maybeBool !== null)
+ ScalarStuff.addMaybeBool(builder, maybeBool);
+ ScalarStuff.addDefaultBool(builder, defaultBool);
+ ScalarStuff.addJustEnum(builder, justEnum);
+ if (maybeEnum !== null)
+ ScalarStuff.addMaybeEnum(builder, maybeEnum);
+ ScalarStuff.addDefaultEnum(builder, defaultEnum);
+ return ScalarStuff.endScalarStuff(builder);
+}
+}
+}
diff --git a/tests/prototest/test_include.golden b/tests/prototest/test_include.golden
new file mode 100644
index 0000000..16b92ed
--- /dev/null
+++ b/tests/prototest/test_include.golden
@@ -0,0 +1,57 @@
+// Generated from test.proto
+
+include "imported.fbs";
+
+namespace proto.test;
+
+/// Enum doc comment.
+enum ProtoEnum : int {
+ NUL = 0,
+ FOO = 1,
+ /// Enum 2nd value doc comment misaligned.
+ BAR = 5,
+}
+
+/// 2nd table doc comment with
+/// many lines.
+table ProtoMessage {
+ c:int = 16;
+ d:long;
+ p:uint;
+ e:ulong;
+ /// doc comment for f.
+ f:int = -1;
+ g:long;
+ h:uint;
+ q:ulong;
+ i:int;
+ j:long;
+ /// doc comment for k.
+ k:bool;
+ /// doc comment for l on 2
+ /// lines
+ l:string (required);
+ m:[ubyte];
+ n:proto.test.ProtoMessage_.OtherMessage;
+ o:[string];
+ z:proto.test.ImportedMessage;
+ /// doc comment for r.
+ r:proto.test.ProtoMessage_.Anonymous0;
+}
+
+namespace proto.test.ProtoMessage_;
+
+table OtherMessage {
+ a:double;
+ /// doc comment for b.
+ b:float = 3.14149;
+}
+
+table Anonymous0 {
+ /// doc comment for s.
+ s:proto.test.ImportedMessage;
+ /// doc comment for t on 2
+ /// lines.
+ t:proto.test.ProtoMessage_.OtherMessage;
+}
+
diff --git a/tests/prototest/test_suffix.golden b/tests/prototest/test_suffix.golden
new file mode 100644
index 0000000..94ffd26
--- /dev/null
+++ b/tests/prototest/test_suffix.golden
@@ -0,0 +1,59 @@
+// Generated from test.proto
+
+namespace proto.test.test_namespace_suffix;
+
+/// Enum doc comment.
+enum ProtoEnum : int {
+ NUL = 0,
+ FOO = 1,
+ /// Enum 2nd value doc comment misaligned.
+ BAR = 5,
+}
+
+table ImportedMessage {
+ a:int;
+}
+
+/// 2nd table doc comment with
+/// many lines.
+table ProtoMessage {
+ c:int = 16;
+ d:long;
+ p:uint;
+ e:ulong;
+ /// doc comment for f.
+ f:int = -1;
+ g:long;
+ h:uint;
+ q:ulong;
+ i:int;
+ j:long;
+ /// doc comment for k.
+ k:bool;
+ /// doc comment for l on 2
+ /// lines
+ l:string (required);
+ m:[ubyte];
+ n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;
+ o:[string];
+ z:proto.test.test_namespace_suffix.ImportedMessage;
+ /// doc comment for r.
+ r:proto.test.test_namespace_suffix.ProtoMessage_.Anonymous0;
+}
+
+namespace proto.test.test_namespace_suffix.ProtoMessage_;
+
+table OtherMessage {
+ a:double;
+ /// doc comment for b.
+ b:float = 3.14149;
+}
+
+table Anonymous0 {
+ /// doc comment for s.
+ s:proto.test.test_namespace_suffix.ImportedMessage;
+ /// doc comment for t on 2
+ /// lines.
+ t:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;
+}
+
diff --git a/tests/prototest/test_union_include.golden b/tests/prototest/test_union_include.golden
new file mode 100644
index 0000000..1ce3ac3
--- /dev/null
+++ b/tests/prototest/test_union_include.golden
@@ -0,0 +1,61 @@
+// Generated from test.proto
+
+include "imported.fbs";
+
+namespace proto.test;
+
+/// Enum doc comment.
+enum ProtoEnum : int {
+ NUL = 0,
+ FOO = 1,
+ /// Enum 2nd value doc comment misaligned.
+ BAR = 5,
+}
+
+namespace proto.test.ProtoMessage_;
+
+union RUnion {
+ /// doc comment for s.
+ proto.test.ImportedMessage,
+ /// doc comment for t on 2
+ /// lines.
+ proto.test.ProtoMessage_.OtherMessage,
+}
+
+namespace proto.test;
+
+/// 2nd table doc comment with
+/// many lines.
+table ProtoMessage {
+ c:int = 16;
+ d:long;
+ p:uint;
+ e:ulong;
+ /// doc comment for f.
+ f:int = -1;
+ g:long;
+ h:uint;
+ q:ulong;
+ i:int;
+ j:long;
+ /// doc comment for k.
+ k:bool;
+ /// doc comment for l on 2
+ /// lines
+ l:string (required);
+ m:[ubyte];
+ n:proto.test.ProtoMessage_.OtherMessage;
+ o:[string];
+ z:proto.test.ImportedMessage;
+ /// doc comment for r.
+ r:proto.test.ProtoMessage_.RUnion;
+}
+
+namespace proto.test.ProtoMessage_;
+
+table OtherMessage {
+ a:double;
+ /// doc comment for b.
+ b:float = 3.14149;
+}
+
diff --git a/tests/prototest/test_union_suffix.golden b/tests/prototest/test_union_suffix.golden
new file mode 100644
index 0000000..0b0f920
--- /dev/null
+++ b/tests/prototest/test_union_suffix.golden
@@ -0,0 +1,63 @@
+// Generated from test.proto
+
+namespace proto.test.test_namespace_suffix;
+
+/// Enum doc comment.
+enum ProtoEnum : int {
+ NUL = 0,
+ FOO = 1,
+ /// Enum 2nd value doc comment misaligned.
+ BAR = 5,
+}
+
+namespace proto.test.test_namespace_suffix.ProtoMessage_;
+
+union RUnion {
+ /// doc comment for s.
+ proto.test.test_namespace_suffix.ImportedMessage,
+ /// doc comment for t on 2
+ /// lines.
+ proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage,
+}
+
+namespace proto.test.test_namespace_suffix;
+
+table ImportedMessage {
+ a:int;
+}
+
+/// 2nd table doc comment with
+/// many lines.
+table ProtoMessage {
+ c:int = 16;
+ d:long;
+ p:uint;
+ e:ulong;
+ /// doc comment for f.
+ f:int = -1;
+ g:long;
+ h:uint;
+ q:ulong;
+ i:int;
+ j:long;
+ /// doc comment for k.
+ k:bool;
+ /// doc comment for l on 2
+ /// lines
+ l:string (required);
+ m:[ubyte];
+ n:proto.test.test_namespace_suffix.ProtoMessage_.OtherMessage;
+ o:[string];
+ z:proto.test.test_namespace_suffix.ImportedMessage;
+ /// doc comment for r.
+ r:proto.test.test_namespace_suffix.ProtoMessage_.RUnion;
+}
+
+namespace proto.test.test_namespace_suffix.ProtoMessage_;
+
+table OtherMessage {
+ a:double;
+ /// doc comment for b.
+ b:float = 3.14149;
+}
+
diff --git a/tests/py_flexbuffers_test.py b/tests/py_flexbuffers_test.py
new file mode 100644
index 0000000..6696b3e
--- /dev/null
+++ b/tests/py_flexbuffers_test.py
@@ -0,0 +1,1523 @@
+# Lint as: python3
+# Copyright 2020 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Unit tests for flexbuffers.py."""
+
+import array
+import os.path
+import struct
+import unittest
+
+from flatbuffers import flexbuffers
+
+Type = flexbuffers.Type
+
+LOG2 = {1: 0, 2: 1, 4: 2, 8: 3}
+
+GOLD_FLEXBUFFER_OBJ = {
+ 'bar': [1, 2, 3],
+ 'bar3': [1, 2, 3],
+ 'bool': True,
+ 'bools': [True, False, True, False],
+ 'foo': 100.0,
+ 'mymap': {'foo': 'Fred'},
+ 'vec': [-100, 'Fred', 4.0, b'M', False, 4.0]
+}
+
+GOLD_FLEXBUFFER_FILE = 'gold_flexbuffer_example.bin'
+
+
+def read_test_file(name):
+ with open(os.path.join(os.path.dirname(__file__), name), 'rb') as f:
+ return f.read()
+
+
+def packed_type(type_, i):
+ return (type_ << 2) | LOG2[i]
+
+
+def uint_size(value):
+ """Returns number of bytes (power of two) to represent unsigned value."""
+ assert value >= 0
+
+ n = 8
+ while not value < (1 << n):
+ n *= 2
+ return n // 8
+
+
+def int_size(value):
+ """Returns number of bytes (power of two) to represent signed value."""
+ n = 8
+ while not -(1 << (n - 1)) <= value < (1 << (n - 1)):
+ n *= 2
+ return n // 8
+
+
+def uint_sizes(value):
+ return tuple(1 << i for i in range(LOG2[uint_size(value)], 4))
+
+
+def int_sizes(value):
+ return tuple(1 << i for i in range(LOG2[int_size(value)], 4))
+
+
+def int_bytes(value, byte_width):
+ return struct.pack({1: 'b', 2: 'h', 4: 'i', 8: 'q'}[byte_width], value)
+
+
+def uint_bytes(value, byte_width):
+ return struct.pack({1: 'B', 2: 'H', 4: 'I', 8: 'Q'}[byte_width], value)
+
+
+def float_bytes(value, byte_width):
+ return struct.pack({4: 'f', 8: 'd'}[byte_width], value)
+
+
+def min_value(type_, byte_width):
+ assert byte_width > 0
+
+ if type_ in (Type.INT, Type.INDIRECT_INT):
+ return -(1 << (8 * byte_width - 1))
+ elif type_ in (Type.UINT, Type.INDIRECT_UINT):
+ return 0
+ else:
+ raise ValueError('Unsupported type %s' % type_)
+
+
+def max_value(type_, byte_width):
+ assert byte_width > 0
+
+ if type_ in (Type.INT, Type.INDIRECT_INT):
+ return (1 << (8 * byte_width - 1)) - 1
+ elif type_ in (Type.UINT, Type.INDIRECT_UINT):
+ return (1 << 8 * byte_width) - 1
+ else:
+ raise ValueError('Unsupported type %s' % type_)
+
+
+def str_bytes(value, byte_width):
+ value_bytes = value.encode('utf-8')
+ return [*uint_bytes(len(value_bytes), byte_width), *value_bytes, 0]
+
+
+def key_bytes(value):
+ return [*value.encode('ascii'), 0]
+
+
+def encode_type(type_, value, byte_width=None):
+ fbb = flexbuffers.Builder()
+ add = fbb.Adder(type_)
+ if byte_width:
+ add(value, byte_width)
+ else:
+ add(value)
+ return fbb.Finish()
+
+
+INT_MIN_MAX_VALUES = (min_value(Type.INT, 1), max_value(Type.INT, 1),
+ min_value(Type.INT, 2), max_value(Type.INT, 2),
+ min_value(Type.INT, 4), max_value(Type.INT, 4),
+ min_value(Type.INT, 8), max_value(Type.INT, 8))
+
+UINT_MIN_MAX_VALUES = (0, max_value(Type.UINT, 1), max_value(Type.UINT, 2),
+ max_value(Type.UINT, 4), max_value(Type.UINT, 8))
+
+
+class UtilTest(unittest.TestCase):
+ """Tests to check FlexBuffer utility functions."""
+
+ def _test_type_predicate(self, pred, types):
+ for type_ in types:
+ with self.subTest(type=type_, pred=pred):
+ self.assertTrue(pred(type_))
+
+ for type_ in set(Type).difference(types):
+ with self.subTest(type=type_, pred=pred):
+ self.assertFalse(pred(type_))
+
+ def test_inline_types(self):
+ self._test_type_predicate(
+ Type.IsInline, (Type.NULL, Type.INT, Type.UINT, Type.FLOAT, Type.BOOL))
+
+ def test_typed_vector(self):
+ self._test_type_predicate(
+ Type.IsTypedVector,
+ (Type.VECTOR_INT, Type.VECTOR_UINT, Type.VECTOR_FLOAT, Type.VECTOR_KEY,
+ Type.VECTOR_STRING_DEPRECATED, Type.VECTOR_BOOL))
+
+ self._test_type_predicate(
+ Type.IsTypedVectorElementType,
+ (Type.INT, Type.UINT, Type.FLOAT, Type.KEY, Type.STRING, Type.BOOL))
+
+ with self.assertRaises(ValueError):
+ Type.ToTypedVectorElementType(Type.VECTOR)
+ self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_INT), Type.INT)
+ self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_UINT), Type.UINT)
+ self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_FLOAT), Type.FLOAT)
+ self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_KEY), Type.KEY)
+ self.assertIs(
+ Type.ToTypedVectorElementType(Type.VECTOR_STRING_DEPRECATED),
+ Type.STRING)
+ self.assertIs(Type.ToTypedVectorElementType(Type.VECTOR_BOOL), Type.BOOL)
+
+ with self.assertRaises(ValueError):
+ Type.ToTypedVector(Type.VECTOR)
+ self.assertIs(Type.ToTypedVector(Type.INT), Type.VECTOR_INT)
+ self.assertIs(Type.ToTypedVector(Type.UINT), Type.VECTOR_UINT)
+ self.assertIs(Type.ToTypedVector(Type.FLOAT), Type.VECTOR_FLOAT)
+ self.assertIs(Type.ToTypedVector(Type.KEY), Type.VECTOR_KEY)
+ self.assertIs(
+ Type.ToTypedVector(Type.STRING), Type.VECTOR_STRING_DEPRECATED)
+ self.assertIs(Type.ToTypedVector(Type.BOOL), Type.VECTOR_BOOL)
+
+ def test_fixed_typed_vector(self):
+ self._test_type_predicate(
+ Type.IsFixedTypedVector,
+ (Type.VECTOR_INT2, Type.VECTOR_UINT2, Type.VECTOR_FLOAT2,
+ Type.VECTOR_INT3, Type.VECTOR_UINT3, Type.VECTOR_FLOAT3,
+ Type.VECTOR_INT4, Type.VECTOR_UINT4, Type.VECTOR_FLOAT4))
+
+ self._test_type_predicate(Type.IsFixedTypedVectorElementType,
+ (Type.INT, Type.UINT, Type.FLOAT))
+
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_INT2), (Type.INT, 2))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT2), (Type.UINT, 2))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT2), (Type.FLOAT, 2))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_INT3), (Type.INT, 3))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT3), (Type.UINT, 3))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT3), (Type.FLOAT, 3))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_INT4), (Type.INT, 4))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_UINT4), (Type.UINT, 4))
+ self.assertEqual(
+ Type.ToFixedTypedVectorElementType(Type.VECTOR_FLOAT4), (Type.FLOAT, 4))
+
+ # Invalid size
+ for type_ in Type.INT, Type.UINT, Type.FLOAT:
+ with self.assertRaises(ValueError):
+ Type.ToTypedVector(type_, 1)
+ with self.assertRaises(ValueError):
+ Type.ToTypedVector(type_, 5)
+
+ # Invalid element type
+ for length in 1, 2, 3, 4, 5:
+ with self.assertRaises(ValueError):
+ Type.ToTypedVector(Type.STRING, length)
+
+ self.assertIs(Type.ToTypedVector(Type.INT, 2), Type.VECTOR_INT2)
+ self.assertIs(Type.ToTypedVector(Type.INT, 3), Type.VECTOR_INT3)
+ self.assertIs(Type.ToTypedVector(Type.INT, 4), Type.VECTOR_INT4)
+
+ self.assertIs(Type.ToTypedVector(Type.UINT, 2), Type.VECTOR_UINT2)
+ self.assertIs(Type.ToTypedVector(Type.UINT, 3), Type.VECTOR_UINT3)
+ self.assertIs(Type.ToTypedVector(Type.UINT, 4), Type.VECTOR_UINT4)
+
+ self.assertIs(Type.ToTypedVector(Type.FLOAT, 2), Type.VECTOR_FLOAT2)
+ self.assertIs(Type.ToTypedVector(Type.FLOAT, 3), Type.VECTOR_FLOAT3)
+ self.assertIs(Type.ToTypedVector(Type.FLOAT, 4), Type.VECTOR_FLOAT4)
+
+ def test_width(self):
+ for x in range(1 << 10):
+ self.assertEqual(flexbuffers.BitWidth.U(x), LOG2[uint_size(x)])
+
+ for x in range(-(1 << 10), 1 << 10):
+ self.assertEqual(flexbuffers.BitWidth.I(x), LOG2[int_size(x)])
+
+ def test_padding(self):
+ self.assertEqual(flexbuffers._PaddingBytes(0, 4), 0)
+ self.assertEqual(flexbuffers._PaddingBytes(0, 8), 0)
+ self.assertEqual(flexbuffers._PaddingBytes(0, 16), 0)
+
+ self.assertEqual(flexbuffers._PaddingBytes(1, 8), 7)
+ self.assertEqual(flexbuffers._PaddingBytes(17, 8), 7)
+
+ self.assertEqual(flexbuffers._PaddingBytes(42, 2), 0)
+
+
+class DecoderTest(unittest.TestCase):
+ """Tests to check FlexBuffer decoding functions.
+
+ Common variable names used in the tests for compactness:
+ bw: byte_width
+ ebw: element_byte_width
+ kbw: key_byte_width
+ vbw: value_byte_width
+ tbw: type_byte_width
+
+ Having '_ignored' suffix means that variable doesn't affect the constructed
+ byte buffer size.
+ """
+
+ def test_null(self):
+ for bw in 1, 2, 4, 8:
+ for ebw_ignored in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw_ignored=ebw_ignored):
+ data = bytes([
+ *uint_bytes(0, bw),
+ packed_type(Type.NULL, ebw_ignored),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsNull)
+ self.assertEqual(root.AsBool, False)
+ self.assertEqual(root.AsInt, 0)
+ self.assertEqual(root.AsFloat, 0.0)
+
+ for prop in (type(root).AsKey, type(root).AsString, type(root).AsBlob,
+ type(root).AsVector, type(root).AsTypedVector,
+ type(root).AsFixedTypedVector, type(root).AsMap):
+ with self.assertRaises(TypeError):
+ prop.fget(root)
+
+ self.assertEqual(root.Value, None)
+
+ self.assertIsNone(flexbuffers.Loads(data))
+
+ def test_bool(self):
+ for value in False, True:
+ for bw in 1, 2, 4, 8:
+ for ebw_ignored in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw_ignored=ebw_ignored):
+ data = bytes([
+ *uint_bytes(int(value), bw),
+ packed_type(Type.BOOL, ebw_ignored),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsBool)
+ self.assertEqual(root.AsBool, value)
+ self.assertEqual(root.AsInt, int(value))
+ self.assertEqual(root.AsFloat, float(value))
+
+ for prop in (type(root).AsKey, type(root).AsString,
+ type(root).AsBlob,
+ type(root).AsVector, type(root).AsTypedVector,
+ type(root).AsFixedTypedVector, type(root).AsMap):
+ with self.assertRaises(TypeError):
+ prop.fget(root)
+
+ self.assertEqual(root.Value, value)
+
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_mutate_bool(self):
+ root = flexbuffers.GetRoot(flexbuffers.Dumps(True))
+ self.assertTrue(root.IsBool)
+ self.assertTrue(root.AsBool)
+
+ self.assertTrue(root.MutateBool(False))
+ self.assertTrue(root.IsBool)
+ self.assertFalse(root.AsBool)
+
+ self.assertTrue(root.MutateBool(True))
+ self.assertTrue(root.IsBool)
+ self.assertTrue(root.AsBool)
+
+ def _check_int(self, data, value):
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsInt)
+ self.assertEqual(root.AsInt, value)
+ self.assertEqual(root.AsBool, bool(value))
+ self.assertEqual(root.AsFloat, float(value))
+
+ for prop in (type(root).AsKey, type(root).AsString, type(root).AsBlob,
+ type(root).AsVector, type(root).AsTypedVector,
+ type(root).AsFixedTypedVector, type(root).AsMap):
+ with self.assertRaises(TypeError):
+ prop.fget(root)
+
+ self.assertEqual(root.Value, value)
+
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_int(self):
+ for value in (0, 1, -1, 15, -17, *INT_MIN_MAX_VALUES):
+ for bw in int_sizes(value):
+ for ebw_ignored in 1, 2, 4, 8:
+ with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):
+ data = bytes([
+ *int_bytes(value, bw),
+ packed_type(Type.INT, ebw_ignored),
+ bw,
+ ])
+
+ self._check_int(data, value)
+
+ def test_indirect_int(self):
+ for value in (0, 1, -1, 15, -17, *INT_MIN_MAX_VALUES):
+ for bw in 1, 2, 4, 8:
+ for ebw in int_sizes(value):
+ with self.subTest(value=value, bw=bw, ebw=ebw):
+ data = bytes([
+ # Int
+ *int_bytes(value, ebw),
+ # Root
+ *uint_bytes(ebw, bw),
+ packed_type(Type.INDIRECT_INT, ebw),
+ bw,
+ ])
+ self._check_int(data, value)
+
+ def test_uint(self):
+ for value in (1, *UINT_MIN_MAX_VALUES):
+ for bw in uint_sizes(value):
+ for ebw_ignored in 1, 2, 4, 8:
+ with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):
+ data = bytes([
+ *uint_bytes(value, bw),
+ packed_type(Type.UINT, ebw_ignored),
+ bw,
+ ])
+
+ self._check_int(data, value)
+
+ def test_inidirect_uint(self):
+ for value in (1, *UINT_MIN_MAX_VALUES):
+ for bw in 1, 2, 4, 8:
+ for ebw in uint_sizes(value):
+ with self.subTest(value=value, bw=bw, ebw=ebw):
+ data = bytes([
+ # UInt
+ *uint_bytes(value, ebw),
+ # Root
+ *uint_bytes(ebw, bw),
+ packed_type(Type.INDIRECT_UINT, ebw),
+ bw,
+ ])
+
+ self._check_int(data, value)
+
+ def test_mutate_ints(self):
+ # Signed
+ for type_ in Type.INT, Type.INDIRECT_INT:
+ with self.subTest(type=type_):
+ root = flexbuffers.GetRoot(encode_type(type_, 56))
+ self.assertEqual(root.AsInt, 56)
+
+ for new_value in 0, 1, -1, -128, 127:
+ self.assertTrue(root.MutateInt(new_value))
+ self.assertEqual(root.AsInt, new_value)
+
+ for new_value in -129, 128:
+ self.assertFalse(root.MutateInt(new_value))
+
+ # Unsigned
+ for type_ in Type.UINT, Type.INDIRECT_UINT:
+ with self.subTest(type=type_):
+ root = flexbuffers.GetRoot(encode_type(type_, 1))
+ self.assertEqual(root.AsInt, 1)
+
+ for new_value in 0, 1, 255:
+ self.assertTrue(root.MutateInt(new_value))
+ self.assertEqual(root.AsInt, new_value)
+
+ self.assertFalse(root.MutateInt(256))
+
+ # Inside vector
+ fbb = flexbuffers.Builder()
+ fbb.VectorFromElements([13, 0, -15])
+ data = fbb.Finish()
+
+ self.assertEqual(flexbuffers.Loads(data), [13, 0, -15])
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[0].MutateInt(0))
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[1].MutateInt(-7))
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[2].MutateInt(45))
+ self.assertEqual(flexbuffers.Loads(data), [0, -7, 45])
+
+ # Inside map
+ fbb = flexbuffers.Builder()
+ fbb.MapFromElements({'x': -7, 'y': 46})
+ data = fbb.Finish()
+
+ self.assertEqual(flexbuffers.Loads(data), {'x': -7, 'y': 46})
+ self.assertTrue(flexbuffers.GetRoot(data).AsMap['x'].MutateInt(14))
+ self.assertTrue(flexbuffers.GetRoot(data).AsMap['y'].MutateInt(-1))
+ self.assertEqual(flexbuffers.Loads(data), {'x': 14, 'y': -1})
+
+ def _check_float(self, data, value):
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsFloat)
+ self.assertAlmostEqual(root.AsFloat, value)
+
+ for prop in (type(root).AsKey, type(root).AsString, type(root).AsBlob,
+ type(root).AsVector, type(root).AsTypedVector,
+ type(root).AsFixedTypedVector, type(root).AsMap):
+ with self.assertRaises(TypeError):
+ prop.fget(root)
+
+ self.assertAlmostEqual(root.Value, value)
+
+ self.assertAlmostEqual(flexbuffers.Loads(data), value)
+
+ def test_float(self):
+ for value in -1.0, 0.0, 1.0, 3.141592, 1.5e6:
+ for bw in 4, 8:
+ for ebw_ignored in 1, 2, 4, 8:
+ with self.subTest(value=value, bw=bw, ebw_ignored=ebw_ignored):
+ data = bytes([
+ *float_bytes(value, bw),
+ packed_type(Type.FLOAT, ebw_ignored),
+ bw,
+ ])
+
+ self._check_float(data, value)
+
+ def test_indirect_float(self):
+ for value in -1.0, 0.0, 1.0, 3.141592, 1.5e6:
+ for bw in 1, 2, 4, 8:
+ for ebw in 4, 8:
+ with self.subTest(value=value, bw=bw, ebw=ebw):
+ data = bytes([
+ # Float
+ *float_bytes(value, ebw),
+ # Root
+ *uint_bytes(ebw, bw),
+ packed_type(Type.INDIRECT_FLOAT, ebw),
+ bw,
+ ])
+
+ self._check_float(data, value)
+
+ def test_mutate_float(self):
+ for type_ in Type.FLOAT, Type.INDIRECT_FLOAT:
+ for bw in 4, 8:
+ value = 3.141592
+ root = flexbuffers.GetRoot(encode_type(type_, value, bw))
+ self.assertAlmostEqual(root.AsFloat, value)
+
+ value = 2.71828
+ self.assertTrue(root.MutateFloat(value))
+ self.assertAlmostEqual(root.AsFloat, value, places=5)
+
+ # Inside vector
+ data = flexbuffers.Dumps([2.4, 1.5, -7.2])
+
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[0].MutateFloat(0.0))
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[1].MutateFloat(15.2))
+ self.assertTrue(flexbuffers.GetRoot(data).AsVector[2].MutateFloat(-5.1))
+
+ for a, b in zip(flexbuffers.Loads(data), [0.0, 15.2, -5.1]):
+ self.assertAlmostEqual(a, b)
+
+ def test_string(self):
+ for value in 'red', 'green', 'blue', 'flatbuffers + flexbuffers':
+ value_bytes = value.encode('utf-8')
+ for bw in 1, 2, 4, 8:
+ for lbw in 1, 2, 4, 8:
+ with self.subTest(bw=bw, lbw=lbw):
+ data = bytes([
+ # String
+ *uint_bytes(len(value_bytes), lbw),
+ *value_bytes,
+ 0,
+ # Root
+ *uint_bytes(len(value_bytes) + 1, bw), # offset
+ packed_type(Type.STRING, lbw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsString)
+ self.assertEqual(root.AsString, value)
+ self.assertEqual(root.Value, value)
+ self.assertEqual(root.AsInt, len(value))
+
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_mutate_string(self):
+ data = encode_type(Type.STRING, '12345')
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsString)
+ self.assertEqual(root.AsString, '12345')
+
+ self.assertFalse(root.MutateString('543210'))
+
+ self.assertTrue(root.MutateString('54321'))
+ self.assertTrue(root.IsString)
+ self.assertEqual(root.AsString, '54321')
+
+ self.assertTrue(root.MutateString('543'))
+ self.assertTrue(root.IsString)
+ self.assertEqual(root.AsString, '543')
+
+ self.assertFalse(root.MutateString('54321'))
+
+ def test_empty_blob(self):
+ for bw in 1, 2, 4, 8:
+ for lbw in 1, 2, 4, 8:
+ with self.subTest(bw=bw, lbw=lbw):
+ data = bytes([
+ # Blob
+ *uint_bytes(0, lbw),
+ # Root
+ *uint_bytes(0, bw),
+ packed_type(Type.BLOB, lbw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsBlob)
+ self.assertEqual(root.AsBlob, bytes())
+ self.assertEqual(root.Value, bytes())
+ self.assertEqual(flexbuffers.Loads(data), bytes())
+
+ def test_blob(self):
+ for blob in [], [215], [23, 75, 124, 0, 45, 15], 255 * [0]:
+ for bw in 1, 2, 4, 8:
+ for lbw in 1, 2, 4, 8:
+ with self.subTest(blob=blob, bw=bw, lbw=lbw):
+ data = bytes([
+ # Blob
+ *uint_bytes(len(blob), lbw),
+ *blob,
+ # Root
+ *uint_bytes(len(blob), bw),
+ packed_type(Type.BLOB, lbw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsBlob)
+ self.assertEqual(root.AsBlob, bytes(blob))
+ self.assertEqual(root.Value, bytes(blob))
+ self.assertEqual(flexbuffers.Loads(data), bytes(blob))
+
+ def test_key(self):
+ for value in '', 'x', 'color':
+ for bw in 1, 2, 4, 8:
+ with self.subTest(value=value, bw=bw):
+ value_bytes = value.encode('ascii')
+ data = bytes([
+ # Key
+ *value_bytes,
+ 0,
+ # Root
+ *uint_bytes(len(value_bytes) + 1, bw),
+ packed_type(Type.KEY, 1),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsKey)
+ self.assertEqual(root.AsKey, value)
+ self.assertEqual(root.Value, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def _check_fixed_typed_vector(self, data, vector, type_):
+ self.assertEqual(flexbuffers.Loads(data), vector)
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsFixedTypedVector)
+
+ v = root.AsFixedTypedVector
+ self.assertEqual(len(v), len(vector))
+ self.assertIs(v.ElementType, type_)
+ self.assertEqual([e.Value for e in v], vector)
+ self.assertSequenceEqual(v.Value, vector)
+
+ self.assertEqual(root.AsInt, len(vector))
+
+ def test_fixed_typed_vector_float(self):
+ for type_, vector in ((Type.VECTOR_FLOAT2, [-75.0, 34.89]),
+ (Type.VECTOR_FLOAT3, [-75.0, 34.89, 12.0]),
+ (Type.VECTOR_FLOAT4, [-75.0, 34.89, -1.0, 1.0])):
+ for bw in 1, 2, 4, 8:
+ for ebw in 4, 8:
+ with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):
+ data = bytes([
+ # FixedTypedVector
+ *b''.join(float_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(len(vector) * ebw, bw),
+ packed_type(type_, ebw),
+ bw,
+ ])
+
+ for a, b in zip(flexbuffers.Loads(data), vector):
+ self.assertAlmostEqual(a, b, places=2)
+
+ def test_fixed_typed_vector_int(self):
+ for type_, vector in ((Type.VECTOR_INT2, [0, -13]), (Type.VECTOR_INT3,
+ [127, 0, -13]),
+ (Type.VECTOR_INT4, [127, 0, -13, 0])):
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):
+ data = bytes([
+ # FixedTypeVector
+ *b''.join(int_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(ebw * len(vector), bw),
+ packed_type(type_, ebw),
+ bw,
+ ])
+
+ self._check_fixed_typed_vector(data, vector, Type.INT)
+
+ def test_fixed_typed_vector_uint(self):
+ for type_, vector in ((Type.VECTOR_UINT2, [0, 13]),
+ (Type.VECTOR_UINT3, [127, 0, 13]), (Type.VECTOR_UINT4,
+ [127, 0, 13, 0])):
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(type=type_, vector=vector, bw=bw, ebw=ebw):
+ data = bytes([
+ # FixedTypeVector
+ *b''.join(uint_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(ebw * len(vector), bw),
+ packed_type(type_, ebw),
+ bw,
+ ])
+
+ self._check_fixed_typed_vector(data, vector, Type.UINT)
+
+ def _check_typed_vector(self, data, vector, type_):
+ self.assertEqual(flexbuffers.Loads(data), vector)
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsTypedVector)
+
+ v = root.AsTypedVector
+ self.assertIs(v.ElementType, type_)
+ self.assertEqual(len(v), len(vector))
+ self.assertEqual([e.Value for e in v], vector)
+ self.assertSequenceEqual(v.Value, vector)
+
+ self.assertEqual(root.AsInt, len(vector))
+
+ def test_empty_typed_vector(self):
+ for type_ in (Type.VECTOR_BOOL, Type.VECTOR_INT, Type.VECTOR_UINT,
+ Type.VECTOR_FLOAT, Type.VECTOR_KEY,
+ Type.VECTOR_STRING_DEPRECATED):
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(type=type_, bw=bw, ebw=ebw):
+ data = bytes([
+ # TypedVector[type_]
+ *uint_bytes(0, ebw),
+ # Root
+ *uint_bytes(0, bw),
+ packed_type(type_, ebw),
+ bw
+ ])
+
+ element_type = Type.ToTypedVectorElementType(type_)
+ if element_type == Type.STRING:
+ element_type = Type.KEY
+ self._check_typed_vector(data, [], element_type)
+
+ def test_typed_vector_bool(self):
+ vector = [True, False, False, False, True]
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # TypedVector[Type.BOOL]
+ *uint_bytes(len(vector), ebw),
+ *b''.join(uint_bytes(int(e), ebw) for e in vector),
+ # Root
+ *uint_bytes(len(vector) * ebw, bw),
+ packed_type(Type.VECTOR_BOOL, ebw),
+ bw,
+ ])
+ self._check_typed_vector(data, vector, Type.BOOL)
+
+ def test_typed_vector_int(self):
+ vector = [-100, 200, -300]
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # TypedVector[Type.INT]
+ *uint_bytes(len(vector), ebw),
+ *b''.join(int_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(len(vector) * ebw, bw),
+ packed_type(Type.VECTOR_INT, ebw),
+ bw,
+ ])
+ self._check_typed_vector(data, vector, Type.INT)
+
+ def test_typed_vector_uint(self):
+ vector = [100, 200, 300, 400, 0]
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # TypedVector[Type.UINT]
+ *uint_bytes(len(vector), ebw),
+ *b''.join(int_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(len(vector) * ebw, bw),
+ packed_type(Type.VECTOR_UINT, ebw),
+ bw,
+ ])
+ self._check_typed_vector(data, vector, Type.UINT)
+
+ def test_typed_vector_float(self):
+ vector = [3.64, -6.36, 3.14, 634.0, -42.0]
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # TypedVector[Type.FLOAT]
+ *uint_bytes(len(vector), ebw),
+ *b''.join(float_bytes(e, ebw) for e in vector),
+ # Root
+ *uint_bytes(ebw * len(vector), bw),
+ packed_type(Type.VECTOR_FLOAT, ebw),
+ bw,
+ ])
+
+ for a, b in zip(flexbuffers.Loads(data), vector):
+ self.assertAlmostEqual(a, b, places=2)
+
+ def test_typed_vector_key(self):
+ vector = ['red', 'green', 'blue']
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # Keys
+ *key_bytes(vector[0]),
+ *key_bytes(vector[1]),
+ *key_bytes(vector[2]),
+ # TypedVector[Type.KEY]
+ *uint_bytes(len(vector), ebw),
+ *uint_bytes(15 + 1 * ebw, ebw), # offset to vector[0]
+ *uint_bytes(11 + 2 * ebw, ebw), # offset to vector[1]
+ *uint_bytes(5 + 3 * ebw, ebw), # offset to vector[2]
+ # Root
+ *uint_bytes(len(vector) * ebw, bw), # offset to vector
+ packed_type(Type.VECTOR_KEY, ebw),
+ bw,
+ ])
+ self._check_typed_vector(data, vector, Type.KEY)
+
+ def test_typed_vector_string(self):
+ vector = ['red', 'green', 'blue']
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw):
+ data = bytes([
+ # Strings
+ *str_bytes(vector[0], 1), # 5 bytes
+ *str_bytes(vector[1], 1), # 7 bytes
+ *str_bytes(vector[2], 1), # 6 bytes
+ # TypedVector[Type.STRING]
+ *uint_bytes(len(vector), ebw),
+ *uint_bytes(17 + 1 * ebw, ebw), # offset to vector[0]
+ *uint_bytes(12 + 2 * ebw, ebw), # offset to vector[1]
+ *uint_bytes(5 + 3 * ebw, ebw), # offset to vector[2]
+ # Root
+ *uint_bytes(len(vector) * ebw, bw), # offset to vector
+ packed_type(Type.VECTOR_STRING_DEPRECATED, ebw),
+ bw,
+ ])
+
+ # We have to pass Type.KEY because of Type.VECTOR_STRING_DEPRECATED.
+ self._check_typed_vector(data, vector, Type.KEY)
+
+ def test_typed_vector_string_deprecated(self):
+ # Check FlexBuffersDeprecatedTest() inside test.cpp for details.
+ vector = [300 * 'A', 'test']
+
+ fbb = flexbuffers.Builder()
+ with fbb.TypedVector():
+ for e in vector:
+ fbb.String(e)
+ data = fbb.Finish()
+
+ # We have to pass Type.KEY because of Type.VECTOR_STRING_DEPRECATED.
+ self._check_typed_vector(data, vector, Type.KEY)
+
+ def test_typed_vector_invalid(self):
+ fbb = flexbuffers.Builder()
+
+ with self.assertRaises(RuntimeError):
+ fbb.TypedVectorFromElements(['string', 423])
+
+ def test_empty_vector(self):
+ for bw in 1, 2, 4, 8:
+ for ebw in 1, 2, 4, 8:
+ data = bytes([
+ *uint_bytes(0, ebw),
+ # Root
+ *uint_bytes(0, bw),
+ packed_type(Type.VECTOR, ebw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsVector)
+ self.assertEqual(len(root.AsVector), 0)
+
+ self.assertEqual(flexbuffers.Loads(data), [])
+
+ def test_vector1(self):
+ vector = [300, 400, 500]
+
+ for bw in 1, 2, 4, 8:
+ for ebw in 2, 4, 8:
+ for tbw_ignored in 1, 2, 4, 8:
+ with self.subTest(bw=bw, ebw=ebw, ignore=tbw_ignored):
+ data = bytes([
+ # Vector length
+ *uint_bytes(len(vector), ebw),
+ # Vector elements
+ *int_bytes(vector[0], ebw),
+ *int_bytes(vector[1], ebw),
+ *int_bytes(vector[2], ebw),
+ # Vector types
+ packed_type(Type.INT, tbw_ignored),
+ packed_type(Type.INT, tbw_ignored),
+ packed_type(Type.INT, tbw_ignored),
+ # Root
+ *uint_bytes(ebw * len(vector) + len(vector), bw),
+ packed_type(Type.VECTOR, ebw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsVector)
+ self.assertFalse(root.IsMap)
+
+ v = root.AsVector
+ self.assertEqual(len(v), len(vector))
+
+ for i in range(len(v)):
+ self.assertTrue(v[i].IsInt)
+ self.assertEqual(v[i].AsInt, vector[i])
+
+ for i, e in enumerate(v):
+ self.assertTrue(e.IsInt)
+ self.assertEqual(e.AsInt, vector[i])
+
+ with self.assertRaises(IndexError):
+ v[-1].AsInt # pylint: disable=pointless-statement
+
+ with self.assertRaises(IndexError):
+ v[3].AsInt # pylint: disable=pointless-statement
+
+ with self.assertRaises(TypeError):
+ root.AsMap # pylint: disable=pointless-statement
+
+ self.assertEqual(root.AsInt, len(vector))
+ self.assertEqual(root.AsFloat, float(len(vector)))
+
+ self.assertEqual(flexbuffers.Loads(data), vector)
+
+ def test_vector2(self):
+ vector = [1984, 'August', True]
+
+ for bw in 1, 2, 4, 8:
+ with self.subTest(bw=bw):
+ data = bytes([
+ *str_bytes(vector[1], 1),
+ # Vector
+ *uint_bytes(len(vector), 2),
+ *int_bytes(vector[0], 2),
+ *uint_bytes(11, 2), # offset to 'August'
+ *uint_bytes(int(vector[2]), 2),
+ packed_type(Type.INT, 2),
+ packed_type(Type.STRING, 1),
+ packed_type(Type.BOOL, 2),
+ # Root
+ *uint_bytes(2 * len(vector) + len(vector), bw), # offset to vector
+ packed_type(Type.VECTOR, 2),
+ bw,
+ ])
+ self.assertEqual(flexbuffers.Loads(data), vector)
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsVector)
+
+ v = root.AsVector
+ self.assertTrue(v[0].IsInt)
+ self.assertEqual(v[0].AsInt, 1984)
+
+ self.assertTrue(v[1].IsString)
+ self.assertEqual(v[1].AsString, 'August')
+
+ self.assertTrue(v[2].IsBool)
+ self.assertTrue(v[2].AsBool)
+
+ self.assertEqual(v.Value, vector)
+
+ self.assertEqual(root.AsInt, len(vector))
+
+ def test_empty_map(self):
+ for bw in 1, 2, 4, 8:
+ for kbw in 1, 2, 4, 8:
+ for vbw in 1, 2, 4, 8:
+ data = bytes([
+ *uint_bytes(0, kbw), # Keys length
+ *uint_bytes(0, vbw),
+ *uint_bytes(kbw, vbw),
+ *uint_bytes(0, vbw), # Values length
+ # Root
+ *uint_bytes(0, bw),
+ packed_type(Type.MAP, vbw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsMap)
+ self.assertEqual(len(root.AsMap), 0)
+
+ self.assertEqual(flexbuffers.Loads(data), {})
+
+ def test_map(self):
+ value = {'foo': 13, 'bar': 14}
+
+ for bw in 1, 2, 4, 8:
+ for kbw in 1, 2, 4, 8:
+ for vbw in 1, 2, 4, 8:
+ with self.subTest(kbw=kbw, vbw=vbw, bw=bw):
+ data = bytes([
+ *key_bytes('foo'), # 4 bytes
+ *key_bytes('bar'), # 4 bytes
+ # Map
+ *uint_bytes(len(value), kbw),
+ *uint_bytes(4 + 1 * kbw, kbw), # offset to 'bar'
+ *uint_bytes(8 + 2 * kbw, kbw), # offset to 'foo'
+ *uint_bytes(len(value) * kbw, vbw), # offset to keys
+ *uint_bytes(kbw, vbw),
+ *uint_bytes(len(value), vbw),
+ *int_bytes(value['bar'], vbw),
+ *int_bytes(value['foo'], vbw),
+ packed_type(Type.INT, vbw),
+ packed_type(Type.INT, vbw),
+ # Root
+ *uint_bytes(vbw * len(value) + len(value),
+ bw), # offset to values
+ packed_type(Type.MAP, vbw),
+ bw,
+ ])
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsMap)
+
+ m = root.AsMap
+ self.assertEqual(len(m), 2)
+ self.assertEqual(m[0].AsInt, 14)
+ self.assertEqual(m[1].AsInt, 13)
+
+ self.assertEqual(m['bar'].AsInt, 14)
+ self.assertEqual(m['foo'].AsInt, 13)
+
+ for invalid_key in 'a', 'b', 'no':
+ with self.assertRaises(KeyError):
+ m[invalid_key] # pylint: disable=pointless-statement
+
+ values = m.Values
+ self.assertEqual(len(values), 2)
+ self.assertEqual(values[0].AsInt, 14)
+ self.assertEqual(values[1].AsInt, 13)
+
+ keys = m.Keys
+ self.assertEqual(len(keys), 2)
+ self.assertEqual(len(keys[0].AsKey), 3)
+ self.assertEqual(keys[0].AsKey, 'bar')
+ self.assertEqual(len(keys[1].AsKey), 3)
+ self.assertEqual(keys[1].AsKey, 'foo')
+
+ keys = [key.AsKey for key in keys]
+ self.assertEqual(sorted(keys), keys)
+
+ self.assertEqual(root.AsInt, len(value))
+
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_alignment(self):
+ value = ['test', 7]
+
+ data = bytes([
+ *key_bytes('test'), # 5 bytes: 'test' and \0
+ 0,
+ 0,
+ 0, # 3 bytes: alignment
+ # Vector
+ *uint_bytes(len(value), byte_width=8),
+ *uint_bytes(16, byte_width=8),
+ *uint_bytes(7, byte_width=8),
+ packed_type(Type.KEY, 1),
+ packed_type(Type.INT, 8),
+ # Root
+ *uint_bytes(8 * len(value) + len(value), 1),
+ packed_type(Type.VECTOR, 8),
+ 1,
+ ])
+
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+
+class EncoderTest(unittest.TestCase):
+ """Tests to check FlexBuffer encoding functions."""
+
+ def test_null(self):
+ def encode_null():
+ fbb = flexbuffers.Builder()
+ fbb.Null()
+ return fbb.Finish()
+
+ self.assertIsNone(flexbuffers.Loads(encode_null()))
+
+ def test_bool(self):
+ for value in False, True:
+ data = encode_type(Type.BOOL, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_int(self):
+ for byte_width in 1, 2, 4, 8:
+ for type_ in Type.INT, Type.INDIRECT_INT, Type.UINT, Type.INDIRECT_UINT:
+ with self.subTest(byte_width=byte_width, type=type_):
+ value = min_value(type_, byte_width)
+ data = encode_type(type_, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ value = max_value(type_, byte_width)
+ data = encode_type(type_, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_float(self):
+ for value in 3.141592, 7.62, 999.99:
+ for type_ in Type.FLOAT, Type.INDIRECT_FLOAT:
+ with self.subTest(value=value, type=type_):
+ data = encode_type(type_, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ data = encode_type(type_, value, 4)
+ self.assertAlmostEqual(flexbuffers.Loads(data), value, places=4)
+
+ data = encode_type(type_, value, 8)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_string(self):
+ for value in '', 'x', 'color', 'hello world':
+ with self.subTest(value=value):
+ data = encode_type(Type.STRING, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_blob(self):
+ for value in bytes(), bytes([240, 12, 143, 7]), bytes(1000 * [17]):
+ with self.subTest(value=value):
+ data = encode_type(Type.BLOB, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ def test_key(self):
+ for value in '', 'color', 'hello world':
+ with self.subTest(value=value):
+ data = encode_type(Type.KEY, value)
+ self.assertEqual(flexbuffers.Loads(data), value)
+
+ with self.assertRaises(ValueError):
+ encode_type(Type.KEY, (b'\x00' * 10).decode('ascii'))
+
+ def test_vector(self):
+
+ def encode_vector(elements, element_type):
+ fbb = flexbuffers.Builder()
+ with fbb.Vector():
+ add = fbb.Adder(element_type)
+ for e in elements:
+ add(e)
+ return fbb.Finish()
+
+ def encode_vector_from_elements(elements):
+ fbb = flexbuffers.Builder()
+ fbb.VectorFromElements(elements)
+ return fbb.Finish()
+
+ for elements in [], [1435], [56, 23, 0, 6783]:
+ data = encode_vector(elements, Type.INT)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ # Elements of different type: one by one
+ elements = [56.0, 'flexbuffers', 0, False, 75123]
+
+ fbb = flexbuffers.Builder()
+ with fbb.Vector():
+ fbb.Float(elements[0])
+ fbb.String(elements[1])
+ fbb.UInt(elements[2], 8)
+ fbb.Bool(elements[3])
+ fbb.Int(elements[4])
+ data = fbb.Finish()
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ # Elements of different type: all at once
+ fbb = flexbuffers.Builder()
+ fbb.VectorFromElements(elements)
+ data = fbb.Finish()
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ def test_nested_vectors(self):
+ fbb = flexbuffers.Builder()
+ with fbb.Vector():
+ fbb.String('begin')
+ fbb.IndirectInt(42)
+ with fbb.Vector():
+ for i in range(5):
+ fbb.Int(i)
+ fbb.String('end')
+ data = fbb.Finish()
+
+ self.assertEqual(
+ flexbuffers.Loads(data), ['begin', 42, [0, 1, 2, 3, 4], 'end'])
+
+ def test_big_vector(self):
+ n = 10 * 1000
+ fbb = flexbuffers.Builder()
+ with fbb.Vector():
+ for i in range(n):
+ fbb.Int(i)
+ self.assertEqual(flexbuffers.Loads(fbb.Finish()), list(range(n)))
+
+ def test_typed_vector(self):
+
+ def encode_typed_vector_from_elements(elements, element_type=None):
+ fbb = flexbuffers.Builder()
+ fbb.TypedVectorFromElements(elements, element_type)
+ return fbb.Finish()
+
+ for elements in [], [False], [True], [False, True, True, False, False]:
+ data = encode_typed_vector_from_elements(elements, Type.BOOL)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ for elements in [], [23455], [351, -2, 0, 6783, 0, -10]:
+ data = encode_typed_vector_from_elements(elements, Type.INT)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ for elements in [], [23455], [351, 2, 0, 6783, 0, 10]:
+ data = encode_typed_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements, Type.INT)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements, Type.UINT)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ for elements in [], [7.0], [52.0, 51.2, 70.0, -4.0]:
+ data = encode_typed_vector_from_elements(elements, Type.FLOAT)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ for elements in [], ['color'], ['x', 'y']:
+ data = encode_typed_vector_from_elements(elements, Type.KEY)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ data = encode_typed_vector_from_elements(elements)
+ self.assertEqual(flexbuffers.Loads(data), elements)
+
+ def test_typed_vector_from_array(self):
+
+ def encode_array(typecode, values):
+ fbb = flexbuffers.Builder()
+ fbb.VectorFromElements(array.array(typecode, values))
+ return fbb.Finish()
+
+ values = [1.0, 3.14, -2.54, 0.0]
+ data = encode_array('f', values)
+ for a, b in zip(flexbuffers.Loads(data), values):
+ self.assertAlmostEqual(a, b, places=2)
+
+ values = [1.0, 3.14, -2.54, 0.0]
+ data = encode_array('d', values)
+ self.assertEqual(flexbuffers.Loads(data), values)
+
+ values = [1, -7, 9, 26, 12]
+ data = encode_array('i', values)
+ self.assertEqual(flexbuffers.Loads(data), values)
+
+ values = [0, 1, 2, 3, 4, 5, 6]
+ data = encode_array('I', values)
+ self.assertEqual(flexbuffers.Loads(data), values)
+
+ def test_fixed_typed_vector(self):
+
+ def encode_fixed_typed_vector(elements, element_type=None):
+ fbb = flexbuffers.Builder()
+ fbb.FixedTypedVectorFromElements(elements, element_type)
+ return fbb.Finish()
+
+ for elements in ((-2, 2), (1, 2, 3), (100, -100, 200, -200), (4.0, 7.0),
+ (0.0, 1.0, 8.0), (9.0, 7.0, 1.0, 5.5)):
+ with self.subTest(elements=elements):
+ data = encode_fixed_typed_vector(elements)
+ self.assertSequenceEqual(flexbuffers.Loads(data), elements)
+
+ elements = [-170, 432, 0, -7]
+ data = encode_fixed_typed_vector(elements, Type.INT)
+ self.assertSequenceEqual(flexbuffers.Loads(data), elements)
+
+ with self.assertRaises(ValueError):
+ encode_fixed_typed_vector([]) # Invalid input length
+
+ with self.assertRaises(ValueError):
+ encode_fixed_typed_vector([1]) # Invalid input length
+
+ with self.assertRaises(ValueError):
+ encode_fixed_typed_vector([1, 2, 3, 4, 5]) # Invalid input length
+
+ with self.assertRaises(TypeError):
+ encode_fixed_typed_vector([1, 1.0]) # Invalid input types
+
+ with self.assertRaises(TypeError):
+ encode_fixed_typed_vector(['', '']) # Invalid input types
+
+ def test_map_builder(self):
+
+ def get_keys(data):
+ return [key.AsKey for key in flexbuffers.GetRoot(data).AsMap.Keys]
+
+ # Empty map
+ fbb = flexbuffers.Builder()
+ with fbb.Map():
+ pass
+ data = fbb.Finish()
+
+ self.assertEqual(flexbuffers.Loads(data), {})
+
+ # Two-element map of Int
+ fbb = flexbuffers.Builder()
+ with fbb.Map():
+ fbb.Int('y', -2)
+ fbb.Int('x', 10)
+ data = fbb.Finish()
+
+ self.assertEqual(flexbuffers.Loads(data), {'x': 10, 'y': -2})
+
+ # Multiple-element map of vectors
+ fbb = flexbuffers.Builder()
+ with fbb.Map():
+ with fbb.Vector('v'):
+ fbb.Int(45)
+ with fbb.TypedVector('tv'):
+ fbb.Int(-7)
+ fbb.FixedTypedVectorFromElements('ftv', [-2.0, 1.0])
+ data = fbb.Finish()
+
+ self.assertEqual(
+ flexbuffers.Loads(data), {
+ 'v': [45],
+ 'tv': [-7],
+ 'ftv': [-2.0, 1.0]
+ })
+
+ keys = get_keys(data)
+ self.assertEqual(sorted(keys), keys)
+
+ # Multiple-element map of different types
+ fbb = flexbuffers.Builder()
+ with fbb.Map():
+ fbb.Null('n')
+ fbb.Bool('b', False)
+ fbb.Int('i', -27)
+ fbb.UInt('u', 27)
+ fbb.Float('f', -0.85)
+ fbb.String('s', 'String')
+ fbb.Blob('bb', b'data')
+ fbb.IndirectInt('ii', -9500)
+ fbb.IndirectUInt('iu', 540)
+ fbb.IndirectFloat('if', 0.0)
+ fbb.VectorFromElements('v', [2, 1, 0.0])
+ fbb.TypedVectorFromElements('tv', [2, 1, 0])
+ fbb.FixedTypedVectorFromElements('ftv', [2.0, -6.0])
+ data = fbb.Finish()
+
+ self.assertEqual(
+ flexbuffers.Loads(data), {
+ 'n': None,
+ 'b': False,
+ 'i': -27,
+ 'u': 27,
+ 'f': -0.85,
+ 's': 'String',
+ 'bb': b'data',
+ 'ii': -9500,
+ 'iu': 540,
+ 'if': 0.0,
+ 'v': [2, 1, 0.0],
+ 'tv': [2, 1, 0],
+ 'ftv': [2.0, -6.0]
+ })
+
+ keys = get_keys(data)
+ self.assertEqual(sorted(keys), keys)
+
+ def test_map_python(self):
+ maps = [
+ {},
+ {
+ 'key': 'value'
+ },
+ {
+ 'x': None,
+ 'y': 3400,
+ 'z': -7040
+ },
+ {
+ 'zzz': 100,
+ 'aaa': 5.0,
+ 'ccc': ['Test', 32, False, None, True]
+ },
+ {
+ 'name': ['John', 'Smith'],
+ 'valid': True,
+ 'note': None,
+ 'address': {
+ 'lines': [175, 'Alhambra'],
+ 'city': 'San Francisco',
+ 'zip': 94123,
+ },
+ },
+ ]
+
+ for m in maps:
+ self.assertEqual(flexbuffers.Loads(flexbuffers.Dumps(m)), m)
+
+ def test_gold_from_file(self):
+ data = read_test_file(GOLD_FLEXBUFFER_FILE)
+ self.assertEqual(flexbuffers.Loads(data), GOLD_FLEXBUFFER_OBJ)
+
+ def test_gold_from_builder(self):
+ fbb = flexbuffers.Builder()
+ with fbb.Map():
+ with fbb.Vector('vec'):
+ fbb.Int(-100)
+ fbb.String('Fred')
+ fbb.IndirectFloat(4.0)
+ i_f = fbb.LastValue
+ fbb.Blob(bytes([77]))
+ fbb.Bool(False)
+ fbb.ReuseValue(i_f)
+
+ vec = [1, 2, 3]
+ fbb.VectorFromElements('bar', vec)
+ fbb.FixedTypedVectorFromElements('bar3', [1, 2, 3])
+ fbb.VectorFromElements('bools', [True, False, True, False])
+ fbb.Bool('bool', True)
+ fbb.Float('foo', 100)
+ with fbb.Map('mymap'):
+ fbb.String('foo', 'Fred')
+ data = fbb.Finish()
+
+ self.assertEqual(flexbuffers.Loads(data), GOLD_FLEXBUFFER_OBJ)
+
+ def test_min_bit_width(self):
+ fbb = flexbuffers.Builder(force_min_bit_width=flexbuffers.BitWidth.W8)
+ fbb.TypedVectorFromElements([0, 1, 0, 1, 0])
+ data = fbb.Finish()
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsTypedVector)
+ self.assertEqual(root.AsTypedVector.ByteWidth, 1)
+
+ fbb = flexbuffers.Builder(force_min_bit_width=flexbuffers.BitWidth.W32)
+ fbb.TypedVectorFromElements([0, 1, 0, 1, 0])
+ data = fbb.Finish()
+
+ root = flexbuffers.GetRoot(data)
+ self.assertTrue(root.IsTypedVector)
+ self.assertEqual(root.AsTypedVector.ByteWidth, 4)
+
+ def test_share_keys(self):
+
+ def encode_key_vector(value, count, share_keys):
+ fbb = flexbuffers.Builder(share_keys=share_keys)
+ with fbb.Vector():
+ for _ in range(count):
+ fbb.Key(value)
+ return fbb.Finish(), fbb.KeyPool.Elements
+
+ data, pool = encode_key_vector('test', 10, share_keys=False)
+ self.assertEqual(len(pool), 0)
+ self.assertEqual(len(data), 74)
+ self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])
+
+ data, pool = encode_key_vector('test', 10, share_keys=True)
+ self.assertEqual(len(pool), 1)
+ self.assertEqual(pool[0], 'test'.encode('ascii'))
+ self.assertEqual(len(data), 29)
+ self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])
+
+ def test_share_strings(self):
+
+ def encode_string_vector(value, count, share_strings):
+ fbb = flexbuffers.Builder(share_strings=share_strings)
+ with fbb.Vector():
+ for _ in range(count):
+ fbb.String(value)
+ return fbb.Finish(), fbb.StringPool.Elements
+
+ data, pool = encode_string_vector('test', 10, share_strings=False)
+ self.assertEqual(len(pool), 0)
+ self.assertEqual(len(data), 84)
+ self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])
+
+ data, pool = encode_string_vector('test', 10, share_strings=True)
+ self.assertEqual(len(pool), 1)
+ self.assertEqual(pool[0], 'test'.encode('utf-8'))
+ self.assertEqual(len(data), 30)
+ self.assertEqual(flexbuffers.Loads(data), 10 * ['test'])
+
+ def test_invalid_stack_size(self):
+ fbb = flexbuffers.Builder()
+
+ with self.assertRaises(RuntimeError):
+ fbb.Finish()
+
+ fbb.Int(100)
+ fbb.Int(200)
+ with self.assertRaises(RuntimeError):
+ fbb.Finish()
+
+ fbb.Clear()
+ fbb.Int(420)
+ fbb.Finish()
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/py_test.py b/tests/py_test.py
index b152270..9b31f60 100644
--- a/tests/py_test.py
+++ b/tests/py_test.py
@@ -42,6 +42,7 @@
import MyGame.Example.Stat # refers to generated code
import MyGame.Example.Vec3 # refers to generated code
import MyGame.MonsterExtra # refers to generated code
+import MyGame.InParentNamespace # refers to generated code
import MyGame.Example.ArrayTable # refers to generated code
import MyGame.Example.ArrayStruct # refers to generated code
import MyGame.Example.NestedStruct # refers to generated code
@@ -83,6 +84,449 @@
f.close()
+class TestObjectBasedAPI(unittest.TestCase):
+ ''' Tests the generated object based API.'''
+
+ def test_consistenty_with_repeated_pack_and_unpack(self):
+ ''' Checks the serialization and deserialization between a buffer and
+ its python object. It tests in the same way as the C++ object API test,
+ ObjectFlatBuffersTest in test.cpp. '''
+
+ buf, off = make_monster_from_generated_code()
+
+ # Turns a buffer into Python object (T class).
+ monster1 = MyGame.Example.Monster.Monster.GetRootAsMonster(buf, off)
+ monsterT1 = MyGame.Example.Monster.MonsterT.InitFromObj(monster1)
+
+ for sizePrefix in [True, False]:
+ # Re-serialize the data into a buffer.
+ b1 = flatbuffers.Builder(0)
+ if sizePrefix:
+ b1.FinishSizePrefixed(monsterT1.Pack(b1))
+ else:
+ b1.Finish(monsterT1.Pack(b1))
+ CheckReadBuffer(b1.Bytes, b1.Head(), sizePrefix)
+
+ # Deserializes the buffer into Python object again.
+ monster2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b1.Bytes,
+ b1.Head())
+ # Re-serializes the data into a buffer for one more time.
+ monsterT2 = MyGame.Example.Monster.MonsterT.InitFromObj(monster2)
+ for sizePrefix in [True, False]:
+ # Re-serializes the data into a buffer
+ b2 = flatbuffers.Builder(0)
+ if sizePrefix:
+ b2.FinishSizePrefixed(monsterT2.Pack(b2))
+ else:
+ b2.Finish(monsterT2.Pack(b2))
+ CheckReadBuffer(b2.Bytes, b2.Head(), sizePrefix)
+
+ def test_default_values_with_pack_and_unpack(self):
+ ''' Serializes and deserializes between a buffer with default values (no
+ specific values are filled when the buffer is created) and its python
+ object. '''
+ # Creates a flatbuffer with default values.
+ b1 = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStart(b1)
+ gen_mon = MyGame.Example.Monster.MonsterEnd(b1)
+ b1.Finish(gen_mon)
+
+ # Converts the flatbuffer into the object class.
+ monster1 = MyGame.Example.Monster.Monster.GetRootAsMonster(b1.Bytes,
+ b1.Head())
+ monsterT1 = MyGame.Example.Monster.MonsterT.InitFromObj(monster1)
+
+ # Packs the object class into another flatbuffer.
+ b2 = flatbuffers.Builder(0)
+ b2.Finish(monsterT1.Pack(b2))
+ monster2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b2.Bytes,
+ b2.Head())
+ # Checks the default values.
+ self.assertTrue(monster2.Pos() is None)
+ self.assertEqual(monster2.Mana(),150)
+ self.assertEqual(monster2.Hp(), 100)
+ self.assertTrue(monster2.Name() is None)
+ self.assertEqual(monster2.Inventory(0), 0)
+ self.assertEqual(monster2.InventoryAsNumpy(), 0)
+ self.assertEqual(monster2.InventoryLength(), 0)
+ self.assertTrue(monster2.InventoryIsNone())
+ self.assertTrue(monster2.Color() is 8)
+ self.assertEqual(monster2.TestType(), 0)
+ self.assertTrue(monster2.Test() is None)
+ self.assertTrue(monster2.Test4(0) is None)
+ self.assertEqual(monster2.Test4Length(), 0)
+ self.assertTrue(monster2.Test4IsNone())
+ self.assertTrue(monster2.Testarrayofstring(0) is "")
+ self.assertEqual(monster2.TestarrayofstringLength(), 0)
+ self.assertTrue(monster2.TestarrayofstringIsNone())
+ self.assertTrue(monster2.Testarrayoftables(0) is None)
+ self.assertEqual(monster2.TestarrayoftablesLength(), 0)
+ self.assertTrue(monster2.TestarrayoftablesIsNone())
+ self.assertTrue(monster2.Enemy() is None)
+ self.assertEqual(monster2.Testnestedflatbuffer(0), 0)
+ self.assertEqual(monster2.TestnestedflatbufferAsNumpy(), 0)
+ self.assertEqual(monster2.TestnestedflatbufferLength(), 0)
+ self.assertTrue(monster2.TestnestedflatbufferIsNone())
+ self.assertTrue(monster2.Testempty() is None)
+ self.assertTrue(monster2.Testbool() is False)
+ self.assertEqual(monster2.Testhashs32Fnv1(), 0)
+ self.assertEqual(monster2.Testhashu32Fnv1(), 0)
+ self.assertEqual(monster2.Testhashs64Fnv1(), 0)
+ self.assertEqual(monster2.Testhashu64Fnv1(), 0)
+ self.assertEqual(monster2.Testhashs32Fnv1a(), 0)
+ self.assertEqual(monster2.Testhashu32Fnv1a(), 0)
+ self.assertEqual(monster2.Testhashs64Fnv1a(), 0)
+ self.assertEqual(monster2.Testhashu64Fnv1a(), 0)
+ self.assertEqual(monster2.Testarrayofbools(0), 0)
+ self.assertEqual(monster2.TestarrayofboolsAsNumpy(), 0)
+ self.assertEqual(monster2.TestarrayofboolsLength(), 0)
+ self.assertTrue(monster2.TestarrayofboolsIsNone())
+ self.assertEqual(monster2.Testf(), 3.14159)
+ self.assertEqual(monster2.Testf2(), 3.0)
+ self.assertEqual(monster2.Testf3(), 0.0)
+ self.assertTrue(monster2.Testarrayofstring2(0) is "")
+ self.assertEqual(monster2.Testarrayofstring2Length(), 0)
+ self.assertTrue(monster2.Testarrayofstring2IsNone())
+ self.assertTrue(monster2.Testarrayofsortedstruct(0) is None)
+ self.assertEqual(monster2.TestarrayofsortedstructLength(), 0)
+ self.assertTrue(monster2.TestarrayofsortedstructIsNone())
+ self.assertEqual(monster2.Flex(0), 0)
+ self.assertEqual(monster2.FlexAsNumpy(), 0)
+ self.assertEqual(monster2.FlexLength(), 0)
+ self.assertTrue(monster2.FlexIsNone())
+ self.assertTrue(monster2.Test5(0) is None)
+ self.assertEqual(monster2.Test5Length(), 0)
+ self.assertTrue(monster2.Test5IsNone())
+ self.assertEqual(monster2.VectorOfLongs(0), 0)
+ self.assertEqual(monster2.VectorOfLongsAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfLongsLength(), 0)
+ self.assertTrue(monster2.VectorOfLongsIsNone())
+ self.assertEqual(monster2.VectorOfDoubles(0), 0)
+ self.assertEqual(monster2.VectorOfDoublesAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfDoublesLength(), 0)
+ self.assertTrue(monster2.VectorOfDoublesIsNone())
+ self.assertTrue(monster2.ParentNamespaceTest() is None)
+ self.assertTrue(monster2.VectorOfReferrables(0) is None)
+ self.assertEqual(monster2.VectorOfReferrablesLength(), 0)
+ self.assertTrue(monster2.VectorOfReferrablesIsNone())
+ self.assertEqual(monster2.SingleWeakReference(), 0)
+ self.assertEqual(monster2.VectorOfWeakReferences(0), 0)
+ self.assertEqual(monster2.VectorOfWeakReferencesAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfWeakReferencesLength(), 0)
+ self.assertTrue(monster2.VectorOfWeakReferencesIsNone())
+ self.assertTrue(monster2.VectorOfStrongReferrables(0) is None)
+ self.assertEqual(monster2.VectorOfStrongReferrablesLength(), 0)
+ self.assertTrue(monster2.VectorOfStrongReferrablesIsNone())
+ self.assertEqual(monster2.CoOwningReference(), 0)
+ self.assertEqual(monster2.VectorOfCoOwningReferences(0), 0)
+ self.assertEqual(monster2.VectorOfCoOwningReferencesAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfCoOwningReferencesLength(), 0)
+ self.assertTrue(monster2.VectorOfCoOwningReferencesIsNone())
+ self.assertEqual(monster2.NonOwningReference(), 0)
+ self.assertEqual(monster2.VectorOfNonOwningReferences(0), 0)
+ self.assertEqual(monster2.VectorOfNonOwningReferencesAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfNonOwningReferencesLength(), 0)
+ self.assertTrue(monster2.VectorOfNonOwningReferencesIsNone())
+ self.assertEqual(monster2.AnyUniqueType(), 0)
+ self.assertTrue(monster2.AnyUnique() is None)
+ self.assertEqual(monster2.AnyAmbiguousType(), 0)
+ self.assertTrue(monster2.AnyAmbiguous() is None)
+ self.assertEqual(monster2.VectorOfEnums(0), 0)
+ self.assertEqual(monster2.VectorOfEnumsAsNumpy(), 0)
+ self.assertEqual(monster2.VectorOfEnumsLength(), 0)
+ self.assertTrue(monster2.VectorOfEnumsIsNone())
+
+
+class TestAllMutableCodePathsOfExampleSchema(unittest.TestCase):
+ ''' Tests the object API generated for monster_test.fbs for mutation
+ purposes. In each test, the default values will be changed through the
+ object API. We'll then pack the object class into the buf class and read
+ the updated values out from it to validate if the values are mutated as
+ expected.'''
+
+ def setUp(self, *args, **kwargs):
+ super(TestAllMutableCodePathsOfExampleSchema, self).setUp(*args,
+ **kwargs)
+ # Creates an empty monster flatbuffer, and loads it into the object
+ # class for future tests.
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ self.monsterT = self._create_and_load_object_class(b)
+
+ def _pack_and_load_buf_class(self, monsterT):
+ ''' Packs the object class into a flatbuffer and loads it into a buf
+ class.'''
+ b = flatbuffers.Builder(0)
+ b.Finish(monsterT.Pack(b))
+ monster = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ return monster
+
+ def _create_and_load_object_class(self, b):
+ ''' Finishs the creation of a monster flatbuffer and loads it into an
+ object class.'''
+ gen_mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(gen_mon)
+ monster = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ monsterT = MyGame.Example.Monster.MonsterT()
+ monsterT.InitFromObj(monster)
+ return monsterT
+
+ def test_mutate_pos(self):
+ posT = MyGame.Example.Vec3.Vec3T()
+ posT.x = 4.0
+ posT.y = 5.0
+ posT.z = 6.0
+ posT.test1 = 6.0
+ posT.test2 = 7
+ test3T = MyGame.Example.Test.TestT()
+ test3T.a = 8
+ test3T.b = 9
+ posT.test3 = test3T
+ self.monsterT.pos = posT
+
+ # Packs the updated values.
+ monster = self._pack_and_load_buf_class(self.monsterT)
+
+ # Checks if values are loaded correctly into the object class.
+ pos = monster.Pos()
+
+ # Verifies the properties of the Vec3.
+ self.assertEqual(pos.X(), 4.0)
+ self.assertEqual(pos.Y(), 5.0)
+ self.assertEqual(pos.Z(), 6.0)
+ self.assertEqual(pos.Test1(), 6.0)
+ self.assertEqual(pos.Test2(), 7)
+ t3 = MyGame.Example.Test.Test()
+ t3 = pos.Test3(t3)
+ self.assertEqual(t3.A(), 8)
+ self.assertEqual(t3.B(), 9)
+
+ def test_mutate_mana(self):
+ self.monsterT.mana = 200
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Mana(), 200)
+
+ def test_mutate_hp(self):
+ self.monsterT.hp = 200
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Hp(), 200)
+
+ def test_mutate_name(self):
+ self.monsterT.name = "MyMonster"
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Name(), b"MyMonster")
+
+ def test_mutate_inventory(self):
+ self.monsterT.inventory = [1, 7, 8]
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Inventory(0), 1)
+ self.assertEqual(monster.Inventory(1), 7)
+ self.assertEqual(monster.Inventory(2), 8)
+
+ def test_empty_inventory(self):
+ self.monsterT.inventory = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.InventoryIsNone())
+
+ def test_mutate_color(self):
+ self.monsterT.color = MyGame.Example.Color.Color.Red
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Color(), MyGame.Example.Color.Color.Red)
+
+ def test_mutate_testtype(self):
+ self.monsterT.testType = MyGame.Example.Any.Any.Monster
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.TestType(), MyGame.Example.Any.Any.Monster)
+
+ def test_mutate_test(self):
+ testT = MyGame.Example.Monster.MonsterT()
+ testT.hp = 200
+ self.monsterT.test = testT
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ # Initializes a Table from a union field Test(...).
+ table = monster.Test()
+
+ # Initializes a Monster from the Table from the union.
+ test_monster = MyGame.Example.Monster.Monster()
+ test_monster.Init(table.Bytes, table.Pos)
+ self.assertEqual(test_monster.Hp(), 200)
+
+ def test_mutate_test4(self):
+ test0T = MyGame.Example.Test.TestT()
+ test0T.a = 10
+ test0T.b = 20
+ test1T = MyGame.Example.Test.TestT()
+ test1T.a = 30
+ test1T.b = 40
+ self.monsterT.test4 = [test0T, test1T]
+
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ test0 = monster.Test4(0)
+ self.assertEqual(test0.A(), 10)
+ self.assertEqual(test0.B(), 20)
+ test1 = monster.Test4(1)
+ self.assertEqual(test1.A(), 30)
+ self.assertEqual(test1.B(), 40)
+
+ def test_empty_test4(self):
+ self.monsterT.test4 = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.Test4IsNone())
+
+ def test_mutate_testarrayofstring(self):
+ self.monsterT.testarrayofstring = []
+ self.monsterT.testarrayofstring.append("test1")
+ self.monsterT.testarrayofstring.append("test2")
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testarrayofstring(0), b"test1")
+ self.assertEqual(monster.Testarrayofstring(1), b"test2")
+
+ def test_empty_testarrayofstring(self):
+ self.monsterT.testarrayofstring = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.TestarrayofstringIsNone())
+
+ def test_mutate_testarrayoftables(self):
+ monsterT0 = MyGame.Example.Monster.MonsterT()
+ monsterT0.hp = 200
+ monsterT1 = MyGame.Example.Monster.MonsterT()
+ monsterT1.hp = 400
+ self.monsterT.testarrayoftables = []
+ self.monsterT.testarrayoftables.append(monsterT0)
+ self.monsterT.testarrayoftables.append(monsterT1)
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testarrayoftables(0).Hp(), 200)
+ self.assertEqual(monster.Testarrayoftables(1).Hp(), 400)
+
+ def test_empty_testarrayoftables(self):
+ self.monsterT.testarrayoftables = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.TestarrayoftablesIsNone())
+
+ def test_mutate_enemy(self):
+ monsterT = MyGame.Example.Monster.MonsterT()
+ monsterT.hp = 200
+ self.monsterT.enemy = monsterT
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Enemy().Hp(), 200)
+
+ def test_mutate_testnestedflatbuffer(self):
+ self.monsterT.testnestedflatbuffer = [8, 2, 4]
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testnestedflatbuffer(0), 8)
+ self.assertEqual(monster.Testnestedflatbuffer(1), 2)
+ self.assertEqual(monster.Testnestedflatbuffer(2), 4)
+
+ def test_empty_testnestedflatbuffer(self):
+ self.monsterT.testnestedflatbuffer = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.TestnestedflatbufferIsNone())
+
+ def test_mutate_testbool(self):
+ self.monsterT.testbool = True
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertTrue(monster.Testbool())
+
+ def test_mutate_testhashes(self):
+ self.monsterT.testhashs32Fnv1 = 1
+ self.monsterT.testhashu32Fnv1 = 2
+ self.monsterT.testhashs64Fnv1 = 3
+ self.monsterT.testhashu64Fnv1 = 4
+ self.monsterT.testhashs32Fnv1a = 5
+ self.monsterT.testhashu32Fnv1a = 6
+ self.monsterT.testhashs64Fnv1a = 7
+ self.monsterT.testhashu64Fnv1a = 8
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testhashs32Fnv1(), 1)
+ self.assertEqual(monster.Testhashu32Fnv1(), 2)
+ self.assertEqual(monster.Testhashs64Fnv1(), 3)
+ self.assertEqual(monster.Testhashu64Fnv1(), 4)
+ self.assertEqual(monster.Testhashs32Fnv1a(), 5)
+ self.assertEqual(monster.Testhashu32Fnv1a(), 6)
+ self.assertEqual(monster.Testhashs64Fnv1a(), 7)
+ self.assertEqual(monster.Testhashu64Fnv1a(), 8)
+
+ def test_mutate_testarrayofbools(self):
+ self.monsterT.testarrayofbools = []
+ self.monsterT.testarrayofbools.append(True)
+ self.monsterT.testarrayofbools.append(True)
+ self.monsterT.testarrayofbools.append(False)
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testarrayofbools(0), True)
+ self.assertEqual(monster.Testarrayofbools(1), True)
+ self.assertEqual(monster.Testarrayofbools(2), False)
+
+ def test_empty_testarrayofbools(self):
+ self.monsterT.testarrayofbools = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.TestarrayofboolsIsNone())
+
+ def test_mutate_testf(self):
+ self.monsterT.testf = 2.0
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.Testf(), 2.0)
+
+ def test_mutate_vectoroflongs(self):
+ self.monsterT.vectorOfLongs = []
+ self.monsterT.vectorOfLongs.append(1)
+ self.monsterT.vectorOfLongs.append(100)
+ self.monsterT.vectorOfLongs.append(10000)
+ self.monsterT.vectorOfLongs.append(1000000)
+ self.monsterT.vectorOfLongs.append(100000000)
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.VectorOfLongs(0), 1)
+ self.assertEqual(monster.VectorOfLongs(1), 100)
+ self.assertEqual(monster.VectorOfLongs(2), 10000)
+ self.assertEqual(monster.VectorOfLongs(3), 1000000)
+ self.assertEqual(monster.VectorOfLongs(4), 100000000)
+
+ def test_empty_vectoroflongs(self):
+ self.monsterT.vectorOfLongs = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.VectorOfLongsIsNone())
+
+ def test_mutate_vectorofdoubles(self):
+ self.monsterT.vectorOfDoubles = []
+ self.monsterT.vectorOfDoubles.append(-1.7976931348623157e+308)
+ self.monsterT.vectorOfDoubles.append(0)
+ self.monsterT.vectorOfDoubles.append(1.7976931348623157e+308)
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.VectorOfDoubles(0), -1.7976931348623157e+308)
+ self.assertEqual(monster.VectorOfDoubles(1), 0)
+ self.assertEqual(monster.VectorOfDoubles(2), 1.7976931348623157e+308)
+
+ def test_empty_vectorofdoubles(self):
+ self.monsterT.vectorOfDoubles = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.VectorOfDoublesIsNone())
+
+ def test_mutate_parentnamespacetest(self):
+ self.monsterT.parentNamespaceTest = MyGame.InParentNamespace.InParentNamespaceT()
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertTrue(isinstance(monster.ParentNamespaceTest(),
+ MyGame.InParentNamespace.InParentNamespace))
+
+ def test_mutate_vectorofEnums(self):
+ self.monsterT.vectorOfEnums = []
+ self.monsterT.vectorOfEnums.append(MyGame.Example.Color.Color.Red)
+ self.monsterT.vectorOfEnums.append(MyGame.Example.Color.Color.Blue)
+ self.monsterT.vectorOfEnums.append(MyGame.Example.Color.Color.Red)
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertEqual(monster.VectorOfEnums(0),
+ MyGame.Example.Color.Color.Red)
+ self.assertEqual(monster.VectorOfEnums(1),
+ MyGame.Example.Color.Color.Blue)
+ self.assertEqual(monster.VectorOfEnums(2),
+ MyGame.Example.Color.Color.Red)
+
+ def test_empty_vectorofEnums(self):
+ self.monsterT.vectorOfEnums = []
+ monster = self._pack_and_load_buf_class(self.monsterT)
+ self.assertFalse(monster.VectorOfEnumsIsNone())
+
+
def CheckReadBuffer(buf, offset, sizePrefix=False, file_identifier=None):
''' CheckReadBuffer checks that the given buffer is evaluated correctly
as the example Monster. '''
@@ -95,6 +539,7 @@
# test prior to removal of size_prefix
asserter(util.GetBufferIdentifier(buf, offset, size_prefixed=sizePrefix) == file_identifier)
asserter(util.BufferHasIdentifier(buf, offset, file_identifier=file_identifier, size_prefixed=sizePrefix))
+ asserter(MyGame.Example.Monster.Monster.MonsterBufferHasIdentifier(buf, offset, size_prefixed=sizePrefix))
if sizePrefix:
size = util.GetSizePrefix(buf, offset)
asserter(size == len(buf[offset:])-4)
@@ -145,6 +590,7 @@
# iterate through the first monster's inventory:
asserter(monster.InventoryLength() == 5)
+ asserter(not monster.InventoryIsNone())
invsum = 0
for i in compat_range(monster.InventoryLength()):
@@ -155,6 +601,7 @@
for i in range(5):
asserter(monster.VectorOfLongs(i) == 10 ** (i * 2))
+ asserter(not monster.VectorOfDoublesIsNone())
asserter(([-1.7976931348623157e+308, 0, 1.7976931348623157e+308]
== [monster.VectorOfDoubles(i)
for i in range(monster.VectorOfDoublesLength())]))
@@ -187,6 +634,7 @@
pass
asserter(monster.Test4Length() == 2)
+ asserter(not monster.Test4IsNone())
# create a 'Test' object and populate it:
test0 = monster.Test4(0)
@@ -205,11 +653,14 @@
asserter(sumtest12 == 100)
+ asserter(not monster.TestarrayofstringIsNone())
asserter(monster.TestarrayofstringLength() == 2)
asserter(monster.Testarrayofstring(0) == b"test1")
asserter(monster.Testarrayofstring(1) == b"test2")
+ asserter(monster.TestarrayoftablesIsNone())
asserter(monster.TestarrayoftablesLength() == 0)
+ asserter(monster.TestnestedflatbufferIsNone())
asserter(monster.TestnestedflatbufferLength() == 0)
asserter(monster.Testempty() is None)
@@ -1159,6 +1610,41 @@
return b.Bytes, b.Head()
+class TestBuilderForceDefaults(unittest.TestCase):
+ """Verify that the builder adds default values when forced."""
+
+ test_flags = [N.BoolFlags(), N.Uint8Flags(), N.Uint16Flags(), \
+ N.Uint32Flags(), N.Uint64Flags(), N.Int8Flags(), \
+ N.Int16Flags(), N.Int32Flags(), N.Int64Flags(), \
+ N.Float32Flags(), N.Float64Flags(), N.UOffsetTFlags()]
+ def test_default_force_defaults(self):
+ for flag in self.test_flags:
+ b = flatbuffers.Builder(0)
+ b.StartObject(1)
+ stored_offset = b.Offset()
+ if flag != N.UOffsetTFlags():
+ b.PrependSlot(flag, 0, 0, 0)
+ else:
+ b.PrependUOffsetTRelativeSlot(0, 0, 0)
+ end_offset = b.Offset()
+ b.EndObject()
+ self.assertEqual(0, end_offset - stored_offset)
+
+ def test_force_defaults_true(self):
+ for flag in self.test_flags:
+ b = flatbuffers.Builder(0)
+ b.ForceDefaults(True)
+ b.StartObject(1)
+ stored_offset = b.Offset()
+ if flag != N.UOffsetTFlags():
+ b.PrependSlot(flag, 0, 0, 0)
+ else:
+ b.PrependUOffsetTRelativeSlot(0, 0, 0)
+ end_offset = b.Offset()
+ b.EndObject()
+ self.assertEqual(flag.bytewidth, end_offset - stored_offset)
+
+
class TestAllCodePathsOfExampleSchema(unittest.TestCase):
def setUp(self, *args, **kwargs):
super(TestAllCodePathsOfExampleSchema, self).setUp(*args, **kwargs)
@@ -1196,6 +1682,19 @@
def test_default_monster_inventory_length(self):
self.assertEqual(0, self.mon.InventoryLength())
+ self.assertTrue(self.mon.InventoryIsNone())
+
+ def test_empty_monster_inventory_vector(self):
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStartInventoryVector(b, 0)
+ inv = b.EndVector(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddInventory(b, inv)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+ mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertFalse(mon2.InventoryIsNone())
def test_default_monster_color(self):
self.assertEqual(MyGame.Example.Color.Color.Blue, self.mon.Color())
@@ -1223,12 +1722,38 @@
def test_default_monster_test4_length(self):
self.assertEqual(0, self.mon.Test4Length())
+ self.assertTrue(self.mon.Test4IsNone())
+
+ def test_empty_monster_test4_vector(self):
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStartTest4Vector(b, 0)
+ test4 = b.EndVector(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddTest4(b, test4)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+ mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertFalse(mon2.Test4IsNone())
def test_default_monster_testarrayofstring(self):
self.assertEqual("", self.mon.Testarrayofstring(0))
def test_default_monster_testarrayofstring_length(self):
self.assertEqual(0, self.mon.TestarrayofstringLength())
+ self.assertTrue(self.mon.TestarrayofstringIsNone())
+
+ def test_empty_monster_testarrayofstring_vector(self):
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStartTestarrayofstringVector(b, 0)
+ testarrayofstring = b.EndVector(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddTestarrayofstring(b, testarrayofstring)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+ mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertFalse(mon2.TestarrayofstringIsNone())
def test_default_monster_testarrayoftables(self):
self.assertEqual(None, self.mon.Testarrayoftables(0))
@@ -1256,6 +1781,23 @@
mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Output(), 0)
self.assertEqual(99, mon2.Testarrayoftables(0).Hp())
self.assertEqual(1, mon2.TestarrayoftablesLength())
+ self.assertFalse(mon2.TestarrayoftablesIsNone())
+
+ def test_default_monster_testarrayoftables_length(self):
+ self.assertEqual(0, self.mon.TestarrayoftablesLength())
+ self.assertTrue(self.mon.TestarrayoftablesIsNone())
+
+ def test_empty_monster_testarrayoftables_vector(self):
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStartTestarrayoftablesVector(b, 0)
+ testarrayoftables = b.EndVector(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddTestarrayoftables(b, testarrayoftables)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+ mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertFalse(mon2.TestarrayoftablesIsNone())
def test_default_monster_testarrayoftables_length(self):
self.assertEqual(0, self.mon.TestarrayoftablesLength())
@@ -1285,6 +1827,19 @@
def test_default_monster_testnestedflatbuffer_length(self):
self.assertEqual(0, self.mon.TestnestedflatbufferLength())
+ self.assertTrue(self.mon.TestnestedflatbufferIsNone())
+
+ def test_empty_monster_testnestedflatbuffer_vector(self):
+ b = flatbuffers.Builder(0)
+ MyGame.Example.Monster.MonsterStartTestnestedflatbufferVector(b, 0)
+ testnestedflatbuffer = b.EndVector(0)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddTestnestedflatbuffer(b, testnestedflatbuffer)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+ mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertFalse(mon2.TestnestedflatbufferIsNone())
def test_nondefault_monster_testnestedflatbuffer(self):
b = flatbuffers.Builder(0)
@@ -1305,6 +1860,7 @@
mon2 = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
b.Head())
self.assertEqual(3, mon2.TestnestedflatbufferLength())
+ self.assertFalse(mon2.TestnestedflatbufferIsNone())
self.assertEqual(0, mon2.Testnestedflatbuffer(0))
self.assertEqual(2, mon2.Testnestedflatbuffer(1))
self.assertEqual(4, mon2.Testnestedflatbuffer(2))
@@ -1389,6 +1945,24 @@
self.assertEqual(7, mon2.Testhashs64Fnv1a())
self.assertEqual(8, mon2.Testhashu64Fnv1a())
+ def test_default_monster_parent_namespace_test(self):
+ self.assertEqual(None, self.mon.ParentNamespaceTest())
+
+ def test_nondefault_monster_parent_namespace_test(self):
+ b = flatbuffers.Builder(0)
+ MyGame.InParentNamespace.InParentNamespaceStart(b)
+ parent = MyGame.InParentNamespace.InParentNamespaceEnd(b)
+ MyGame.Example.Monster.MonsterStart(b)
+ MyGame.Example.Monster.MonsterAddParentNamespaceTest(b, parent)
+ mon = MyGame.Example.Monster.MonsterEnd(b)
+ b.Finish(mon)
+
+ # Inspect the resulting data.
+ monster = MyGame.Example.Monster.Monster.GetRootAsMonster(b.Bytes,
+ b.Head())
+ self.assertTrue(isinstance(monster.ParentNamespaceTest(),
+ MyGame.InParentNamespace.InParentNamespace))
+
def test_getrootas_for_nonroot_table(self):
b = flatbuffers.Builder(0)
string = b.CreateString("MyStat")
@@ -1568,9 +2142,12 @@
MyGame.Example.TestEnum.TestEnum.B], \
[MyGame.Example.TestEnum.TestEnum.C, \
MyGame.Example.TestEnum.TestEnum.B]]
+ d_d = [[-1, 1], [-2, 2]]
+ e = 2
+ f = [-1, 1]
arrayOffset = MyGame.Example.ArrayStruct.CreateArrayStruct(builder, \
- a, b, c, d_a, d_b, d_c)
+ a, b, c, d_a, d_b, d_c, d_d, e, f)
# Create a table with the ArrayStruct.
MyGame.Example.ArrayTable.ArrayTableStart(builder)
@@ -1601,6 +2178,10 @@
self.assertEqual(table.A().D(nested, 1).C(), \
[MyGame.Example.TestEnum.TestEnum.C, \
MyGame.Example.TestEnum.TestEnum.B])
+ self.assertEqual(table.A().D(nested, 0).D(), [-1, 1])
+ self.assertEqual(table.A().D(nested, 1).D(), [-2, 2])
+ self.assertEqual(table.A().E(), 2)
+ self.assertEqual(table.A().F(), [-1, 1])
def CheckAgainstGoldDataGo():
@@ -1788,6 +2369,13 @@
kwargs = dict(argv=sys.argv[:-3])
+ # show whether numpy is present, as it changes the test logic:
+ try:
+ import numpy
+ print('numpy available')
+ except ImportError:
+ print('numpy not available')
+
# run tests, and run some language comparison checks if needed:
success = backward_compatible_run_tests(**kwargs)
if success and os.environ.get('COMPARE_GENERATED_TO_GO', 0) == "1":
diff --git a/tests/rust_usage_test/Cargo.toml b/tests/rust_usage_test/Cargo.toml
index 490d6d2..664396d 100644
--- a/tests/rust_usage_test/Cargo.toml
+++ b/tests/rust_usage_test/Cargo.toml
@@ -1,26 +1,51 @@
[package]
name = "rust_usage_test"
version = "0.1.0"
-authors = ["Robert Winslow <hello@rwinslow.com>", "FlatBuffers Maintainers"]
+authors = ["Robert Winslow <hello@rwinslow.com>",
+ "Casper Neo <cneo@google.com>",
+ "FlatBuffers Maintainers"]
[dependencies]
flatbuffers = { path = "../../rust/flatbuffers" }
+flexbuffers = { path = "../../rust/flexbuffers" }
+serde_derive = "1.0"
+serde = "1.0"
+serde_bytes = "0.11"
[[bin]]
name = "monster_example"
path = "bin/monster_example.rs"
[[bin]]
-name = "alloc_check"
-path = "bin/alloc_check.rs"
+name = "flatbuffers_alloc_check"
+path = "bin/flatbuffers_alloc_check.rs"
+
+[[bin]]
+name = "flexbuffers_alloc_check"
+path = "bin/flexbuffers_alloc_check.rs"
+
+[[bin]]
+name = "sample_flexbuffers"
+path = "../../samples/sample_flexbuffers.rs"
+
+[[bin]]
+name = "sample_flexbuffers_serde"
+path = "../../samples/sample_flexbuffers_serde.rs"
+
+[[bin]]
+name = "sample_flatbuffers"
+path = "../../samples/sample_binary.rs"
[dev-dependencies]
quickcheck = "0.6"
# TODO(rw): look into moving to criterion.rs
bencher = "0.1.5"
+static_assertions = "1.0.0"
+rand = "*"
+quickcheck_derive = "*"
[[bench]]
# setup for bencher
-name = "flatbuffers_benchmarks"
+name = "benchmarks"
harness = false
diff --git a/tests/rust_usage_test/benches/benchmarks.rs b/tests/rust_usage_test/benches/benchmarks.rs
new file mode 100644
index 0000000..bfe63b6
--- /dev/null
+++ b/tests/rust_usage_test/benches/benchmarks.rs
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#[macro_use]
+extern crate bencher;
+extern crate flatbuffers;
+extern crate flexbuffers;
+
+mod flatbuffers_benchmarks;
+mod flexbuffers_benchmarks;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/include_test1_generated.rs"]
+pub mod include_test1_generated;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/sub/include_test2_generated.rs"]
+pub mod include_test2_generated;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../monster_test_generated.rs"]
+mod monster_test_generated;
+pub use monster_test_generated::my_game;
+
+benchmark_main!(
+ flatbuffers_benchmarks::benches,
+ flexbuffers_benchmarks::benches
+);
diff --git a/tests/rust_usage_test/benches/flatbuffers_benchmarks.rs b/tests/rust_usage_test/benches/flatbuffers_benchmarks.rs
index 2c6be1f..ee6d81d 100644
--- a/tests/rust_usage_test/benches/flatbuffers_benchmarks.rs
+++ b/tests/rust_usage_test/benches/flatbuffers_benchmarks.rs
@@ -14,11 +14,15 @@
* limitations under the License.
*/
-#[macro_use]
-extern crate bencher;
use bencher::Bencher;
-extern crate flatbuffers;
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/include_test1_generated.rs"]
+pub mod include_test1_generated;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/sub/include_test2_generated.rs"]
+pub mod include_test2_generated;
#[allow(dead_code, unused_imports)]
#[path = "../../monster_test_generated.rs"]
@@ -55,42 +59,69 @@
}
#[inline(always)]
-fn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder, finish: bool) -> usize{
+fn create_serialized_example_with_generated_code(
+ builder: &mut flatbuffers::FlatBufferBuilder,
+ finish: bool,
+) -> usize {
let s0 = builder.create_string("test1");
let s1 = builder.create_string("test2");
let t0_name = builder.create_string("Barney");
let t1_name = builder.create_string("Fred");
let t2_name = builder.create_string("Wilma");
- let t0 = my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{
- hp: 1000,
- name: Some(t0_name),
- ..Default::default()
- });
- let t1 = my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{
- name: Some(t1_name),
- ..Default::default()
- });
- let t2 = my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{
- name: Some(t2_name),
- ..Default::default()
- });
+ let t0 = my_game::example::Monster::create(
+ builder,
+ &my_game::example::MonsterArgs {
+ hp: 1000,
+ name: Some(t0_name),
+ ..Default::default()
+ },
+ );
+ let t1 = my_game::example::Monster::create(
+ builder,
+ &my_game::example::MonsterArgs {
+ name: Some(t1_name),
+ ..Default::default()
+ },
+ );
+ let t2 = my_game::example::Monster::create(
+ builder,
+ &my_game::example::MonsterArgs {
+ name: Some(t2_name),
+ ..Default::default()
+ },
+ );
let mon = {
let name = builder.create_string("MyMonster");
let fred_name = builder.create_string("Fred");
let inventory = builder.create_vector_direct(&[0u8, 1, 2, 3, 4]);
- let test4 = builder.create_vector_direct(&[my_game::example::Test::new(10, 20),
- my_game::example::Test::new(30, 40)]);
- let pos = my_game::example::Vec3::new(1.0, 2.0, 3.0, 3.0, my_game::example::Color::Green, &my_game::example::Test::new(5i16, 6i8));
- let args = my_game::example::MonsterArgs{
+ let test4 = builder.create_vector_direct(&[
+ my_game::example::Test::new(10, 20),
+ my_game::example::Test::new(30, 40),
+ ]);
+ let pos = my_game::example::Vec3::new(
+ 1.0,
+ 2.0,
+ 3.0,
+ 3.0,
+ my_game::example::Color::Green,
+ &my_game::example::Test::new(5i16, 6i8),
+ );
+ let args = my_game::example::MonsterArgs {
hp: 80,
mana: 150,
name: Some(name),
pos: Some(&pos),
test_type: my_game::example::Any::Monster,
- test: Some(my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{
- name: Some(fred_name),
- ..Default::default()
- }).as_union_value()),
+ test: Some(
+ my_game::example::Monster::create(
+ builder,
+ &my_game::example::MonsterArgs {
+ name: Some(fred_name),
+ ..Default::default()
+ },
+ )
+ .as_union_value(),
+ ),
inventory: Some(inventory),
test4: Some(test4),
testarrayofstring: Some(builder.create_vector(&[s0, s1])),
@@ -147,7 +178,7 @@
}
fn create_string_10(bench: &mut Bencher) {
- let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1<<20);
+ let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1 << 20);
let mut i = 0;
bench.iter(|| {
builder.create_string("foobarbaz"); // zero-terminated -> 10 bytes
@@ -162,7 +193,7 @@
}
fn create_string_100(bench: &mut Bencher) {
- let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1<<20);
+ let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1 << 20);
let s_owned = (0..99).map(|_| "x").collect::<String>();
let s: &str = &s_owned;
@@ -180,7 +211,7 @@
}
fn create_byte_vector_100_naive(bench: &mut Bencher) {
- let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1<<20);
+ let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1 << 20);
let v_owned = (0u8..100).map(|i| i).collect::<Vec<u8>>();
let v: &[u8] = &v_owned;
@@ -198,7 +229,7 @@
}
fn create_byte_vector_100_optimal(bench: &mut Bencher) {
- let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1<<20);
+ let builder = &mut flatbuffers::FlatBufferBuilder::new_with_capacity(1 << 20);
let v_owned = (0u8..100).map(|i| i).collect::<Vec<u8>>();
let v: &[u8] = &v_owned;
@@ -215,5 +246,12 @@
bench.bytes = v.len() as u64;
}
-benchmark_group!(benches, create_byte_vector_100_naive, create_byte_vector_100_optimal, traverse_canonical_buffer, create_canonical_buffer_then_reset, create_string_10, create_string_100);
-benchmark_main!(benches);
+benchmark_group!(
+ benches,
+ create_byte_vector_100_naive,
+ create_byte_vector_100_optimal,
+ traverse_canonical_buffer,
+ create_canonical_buffer_then_reset,
+ create_string_10,
+ create_string_100
+);
diff --git a/tests/rust_usage_test/benches/flexbuffers_benchmarks.rs b/tests/rust_usage_test/benches/flexbuffers_benchmarks.rs
new file mode 100644
index 0000000..1e9c516
--- /dev/null
+++ b/tests/rust_usage_test/benches/flexbuffers_benchmarks.rs
@@ -0,0 +1,295 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use bencher::Bencher;
+use flexbuffers::*;
+
+fn push_vec_u64_to_map(b: &mut Bencher) {
+ let va = vec![u64::max_value() - 10; 512];
+ let vb = vec![u64::max_value() - 20; 512];
+ let vc = vec![u64::max_value() - 30; 512];
+ let mut n = 0;
+
+ b.iter(|| {
+ let mut fxb = Builder::default();
+ let mut m = fxb.start_map();
+ let mut ma = m.start_vector("a");
+ for &a in va.iter() {
+ ma.push(a);
+ }
+ ma.end_vector();
+ let mut mb = m.start_vector("b");
+ for &b in vb.iter() {
+ mb.push(b);
+ }
+ mb.end_vector();
+ let mut mc = m.start_vector("c");
+ for &c in vc.iter() {
+ mc.push(c);
+ }
+ mc.end_vector();
+ m.end_map();
+ n = fxb.view().len();
+ });
+ b.bytes = n as u64;
+}
+fn push_vec_u64_to_map_reused(b: &mut Bencher) {
+ let va = vec![u64::max_value() - 10; 512];
+ let vb = vec![u64::max_value() - 20; 512];
+ let vc = vec![u64::max_value() - 30; 512];
+ let mut fxb = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut m = fxb.start_map();
+ let mut ma = m.start_vector("a");
+ for &a in va.iter() {
+ ma.push(a);
+ }
+ ma.end_vector();
+ let mut mb = m.start_vector("b");
+ for &b in vb.iter() {
+ mb.push(b);
+ }
+ mb.end_vector();
+ let mut mc = m.start_vector("c");
+ for &c in vc.iter() {
+ mc.push(c);
+ }
+ mc.end_vector();
+ m.end_map();
+ n = fxb.view().len();
+ };
+ go(); // warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+fn push_vec_u64_to_map_direct(b: &mut Bencher) {
+ let va = vec![u64::max_value() - 10; 512];
+ let vb = vec![u64::max_value() - 20; 512];
+ let vc = vec![u64::max_value() - 30; 512];
+ let mut n = 0;
+
+ b.iter(|| {
+ let mut fxb = Builder::default();
+ let mut m = fxb.start_map();
+ m.push("a", &va);
+ m.push("b", &vb);
+ m.push("c", &vc);
+ m.end_map();
+ n = fxb.view().len();
+ });
+ b.bytes = n as u64;
+}
+fn push_vec_u64_to_map_direct_reused(b: &mut Bencher) {
+ let va = vec![u64::max_value() - 10; 512];
+ let vb = vec![u64::max_value() - 20; 512];
+ let vc = vec![u64::max_value() - 30; 512];
+ let mut n = 0;
+ let mut fxb = Builder::default();
+ let mut go = || {
+ let mut m = fxb.start_map();
+ m.push("a", &va);
+ m.push("b", &vb);
+ m.push("c", &vc);
+ m.end_map();
+ n = fxb.view().len();
+ };
+ go(); // warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+
+fn push_vec_without_indirect(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut b = builder.start_vector();
+ for i in 0..1024u16 {
+ b.push(i);
+ }
+ b.push(i64::max_value());
+ b.end_vector();
+ n = builder.view().len();
+ };
+ go(); // warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+// This isn't actually faster than the alternative but it is a lot smaller.
+// Based on the above benchmarks a lot of time is stuck in the `values` stack.
+fn push_vec_with_indirect(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut b = builder.start_vector();
+ for i in 0..1024u16 {
+ b.push(i);
+ }
+ b.push(IndirectInt(i64::max_value()));
+ b.end_vector();
+ n = builder.view().len();
+ };
+ go(); // warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+
+fn example_map<'a>(m: &mut MapBuilder<'a>) {
+ m.push("some_ints", &[256; 5]);
+ m.push("some_uints", &[256u16; 5]);
+ m.push("some_floats", &[256f32; 5]);
+ m.push("some_strings", "muahahahahaha");
+}
+fn hundred_maps(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut v = builder.start_vector();
+ for _ in 0..100 {
+ example_map(&mut v.start_map());
+ }
+ v.end_vector();
+ n = builder.view().len();
+ };
+ go(); // Warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+fn hundred_maps_pooled(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut v = builder.start_vector();
+ for _ in 0..100 {
+ example_map(&mut v.start_map());
+ }
+ v.end_vector();
+ n = builder.view().len();
+ };
+ go(); // Warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+fn make_monster(mut monster: MapBuilder) {
+ monster.push("type", "great orc");
+ monster.push("age", 100u8);
+ monster.push("name", "Mr. Orc");
+ monster.push("coins", &[1, 25, 50, 100, 250]);
+ monster.push("color", &[255u8, 0, 0, 0]);
+ {
+ let mut weapons = monster.start_vector("weapons");
+ {
+ let mut hammer = weapons.start_map();
+ hammer.push("name", "hammer");
+ hammer.push("damage type", "crush");
+ hammer.push("damage", 20);
+ }
+ {
+ let mut axe = weapons.start_map();
+ axe.push("name", "Great Axe");
+ axe.push("damage type", "slash");
+ axe.push("damage", 30);
+ }
+ }
+ {
+ let mut sounds = monster.start_vector("sounds");
+ sounds.push("grr");
+ sounds.push("rawr");
+ sounds.push("muahaha");
+ }
+}
+fn serialize_monsters(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut n = 0;
+ let mut go = || {
+ let mut monsters = builder.start_vector();
+ for _ in 0..100 {
+ make_monster(monsters.start_map())
+ }
+ monsters.end_vector();
+ n = builder.view().len();
+ };
+ go(); // Warm up allocations.
+ b.iter(go);
+ b.bytes = n as u64;
+}
+fn validate_monster(r: MapReader) {
+ assert_eq!(r.idx("type").as_str(), "great orc");
+ assert_eq!(r.idx("age").as_u8(), 100);
+ assert_eq!(r.idx("name").as_str(), "Mr. Orc");
+ assert!(r
+ .idx("coins")
+ .as_vector()
+ .iter()
+ .map(|c| c.as_i16())
+ .eq([1, 25, 50, 100, 250].iter().cloned()));
+ assert!(r
+ .idx("color")
+ .as_vector()
+ .iter()
+ .map(|c| c.as_u8())
+ .eq([255, 0, 0, 0].iter().cloned()));
+
+ let weapons = r.idx("weapons").as_vector();
+ assert_eq!(weapons.len(), 2);
+
+ let hammer = weapons.idx(0).as_map();
+ assert_eq!(hammer.idx("name").as_str(), "hammer");
+ assert_eq!(hammer.idx("damage type").as_str(), "crush");
+ assert_eq!(hammer.idx("damage").as_u64(), 20);
+
+ let axe = weapons.idx(1).as_map();
+ assert_eq!(axe.idx("name").as_str(), "Great Axe");
+ assert_eq!(axe.idx("damage type").as_str(), "slash");
+ assert_eq!(axe.idx("damage").as_u64(), 30);
+
+ assert!(r
+ .idx("sounds")
+ .as_vector()
+ .iter()
+ .map(|s| s.as_str())
+ .eq(["grr", "rawr", "muahaha"].iter().cloned()));
+}
+fn read_monsters(b: &mut Bencher) {
+ let mut builder = Builder::default();
+ let mut monsters = builder.start_vector();
+ for _ in 0..100 {
+ make_monster(monsters.start_map());
+ }
+ monsters.end_vector();
+ b.bytes = builder.view().len() as u64;
+ let go = || {
+ let r = Reader::get_root(builder.view()).unwrap().as_vector();
+ assert_eq!(r.len(), 100);
+ for i in 0..100 {
+ validate_monster(r.idx(i).as_map());
+ }
+ };
+ b.iter(go);
+}
+
+benchmark_group!(
+ benches,
+ push_vec_u64_to_map,
+ push_vec_u64_to_map_reused,
+ push_vec_u64_to_map_direct,
+ push_vec_u64_to_map_direct_reused,
+ push_vec_without_indirect,
+ push_vec_with_indirect,
+ hundred_maps,
+ hundred_maps_pooled,
+ serialize_monsters,
+ read_monsters,
+);
+benchmark_main!(benches);
diff --git a/tests/rust_usage_test/bin/alloc_check.rs b/tests/rust_usage_test/bin/flatbuffers_alloc_check.rs
similarity index 68%
rename from tests/rust_usage_test/bin/alloc_check.rs
rename to tests/rust_usage_test/bin/flatbuffers_alloc_check.rs
index ae1039c..c47e86e 100644
--- a/tests/rust_usage_test/bin/alloc_check.rs
+++ b/tests/rust_usage_test/bin/flatbuffers_alloc_check.rs
@@ -29,6 +29,14 @@
// import the flatbuffers generated code:
extern crate flatbuffers;
#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/include_test1_generated.rs"]
+pub mod include_test1_generated;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/sub/include_test2_generated.rs"]
+pub mod include_test2_generated;
+
+#[allow(dead_code, unused_imports)]
#[path = "../../monster_test_generated.rs"]
mod monster_test_generated;
pub use monster_test_generated::my_game;
@@ -36,7 +44,15 @@
// verbatim from the test suite:
fn create_serialized_example_with_generated_code(builder: &mut flatbuffers::FlatBufferBuilder) {
let mon = {
- let _ = builder.create_vector_of_strings(&["these", "unused", "strings", "check", "the", "create_vector_of_strings", "function"]);
+ let _ = builder.create_vector_of_strings(&[
+ "these",
+ "unused",
+ "strings",
+ "check",
+ "the",
+ "create_vector_of_strings",
+ "function",
+ ]);
let s0 = builder.create_string("test1");
let s1 = builder.create_string("test2");
@@ -44,21 +60,36 @@
// can't inline creation of this Vec3 because we refer to it by reference, so it must live
// long enough to be used by MonsterArgs.
- let pos = my_game::example::Vec3::new(1.0, 2.0, 3.0, 3.0, my_game::example::Color::Green, &my_game::example::Test::new(5i16, 6i8));
+ let pos = my_game::example::Vec3::new(
+ 1.0,
+ 2.0,
+ 3.0,
+ 3.0,
+ my_game::example::Color::Green,
+ &my_game::example::Test::new(5i16, 6i8),
+ );
- let args = my_game::example::MonsterArgs{
+ let args = my_game::example::MonsterArgs {
hp: 80,
mana: 150,
name: Some(builder.create_string("MyMonster")),
pos: Some(&pos),
test_type: my_game::example::Any::Monster,
- test: Some(my_game::example::Monster::create(builder, &my_game::example::MonsterArgs{
- name: Some(fred_name),
- ..Default::default()
- }).as_union_value()),
+ test: Some(
+ my_game::example::Monster::create(
+ builder,
+ &my_game::example::MonsterArgs {
+ name: Some(fred_name),
+ ..Default::default()
+ },
+ )
+ .as_union_value(),
+ ),
inventory: Some(builder.create_vector_direct(&[0u8, 1, 2, 3, 4][..])),
- test4: Some(builder.create_vector_direct(&[my_game::example::Test::new(10, 20),
- my_game::example::Test::new(30, 40)])),
+ test4: Some(builder.create_vector_direct(&[
+ my_game::example::Test::new(10, 20),
+ my_game::example::Test::new(30, 40),
+ ])),
testarrayofstring: Some(builder.create_vector(&[s0, s1])),
..Default::default()
};
@@ -106,10 +137,13 @@
assert_eq!("MyMonster", m.name());
let pos = m.pos().unwrap();
- assert_eq!(pos.x(), 1.0f32);
- assert_eq!(pos.y(), 2.0f32);
- assert_eq!(pos.z(), 3.0f32);
- assert_eq!(pos.test1(), 3.0f64);
+ // We know the bits should be exactly equal here but compilers may
+ // optimize floats in subtle ways so we're playing it safe and using
+ // epsilon comparison
+ assert!((pos.x() - 1.0f32).abs() < std::f32::EPSILON);
+ assert!((pos.y() - 2.0f32).abs() < std::f32::EPSILON);
+ assert!((pos.z() - 3.0f32).abs() < std::f32::EPSILON);
+ assert!((pos.test1() - 3.0f64).abs() < std::f64::EPSILON);
assert_eq!(pos.test2(), my_game::example::Color::Green);
let pos_test3 = pos.test3();
assert_eq!(pos_test3.a(), 5i16);
@@ -126,8 +160,13 @@
let test4 = m.test4().unwrap();
assert_eq!(test4.len(), 2);
- assert_eq!(test4[0].a() as i32 + test4[0].b() as i32 +
- test4[1].a() as i32 + test4[1].b() as i32, 100);
+ assert_eq!(
+ i32::from(test4[0].a())
+ + i32::from(test4[1].a())
+ + i32::from(test4[0].b())
+ + i32::from(test4[1].b()),
+ 100
+ );
let testarrayofstring = m.testarrayofstring().unwrap();
assert_eq!(testarrayofstring.len(), 2);
diff --git a/tests/rust_usage_test/bin/flexbuffers_alloc_check.rs b/tests/rust_usage_test/bin/flexbuffers_alloc_check.rs
new file mode 100644
index 0000000..310d1a9
--- /dev/null
+++ b/tests/rust_usage_test/bin/flexbuffers_alloc_check.rs
@@ -0,0 +1,138 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+extern crate flexbuffers;
+
+use flexbuffers::*;
+use std::alloc::{GlobalAlloc, Layout, System};
+
+/// We take over the Rust allocator to count allocations. This is super not thread safe.
+static mut NUM_ALLOCS: usize = 0;
+fn current_allocs() -> usize {
+ unsafe { NUM_ALLOCS }
+}
+struct TrackingAllocator;
+unsafe impl GlobalAlloc for TrackingAllocator {
+ unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
+ NUM_ALLOCS += 1;
+ System.alloc(layout)
+ }
+ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
+ System.dealloc(ptr, layout)
+ }
+}
+#[global_allocator]
+static T: TrackingAllocator = TrackingAllocator;
+
+/// Make some example data
+fn make_monster(mut monster: MapBuilder) {
+ monster.push("type", "great orc");
+ monster.push("age", 100u8);
+ monster.push("name", "Mr. Orc");
+ monster.push("coins", &[1, 25, 50, 100, 250]);
+ monster.push("color", &[255u8, 0, 0, 0]);
+ {
+ let mut weapons = monster.start_vector("weapons");
+ {
+ let mut hammer = weapons.start_map();
+ hammer.push("name", "hammer");
+ hammer.push("damage type", "crush");
+ hammer.push("damage", 20);
+ }
+ {
+ let mut axe = weapons.start_map();
+ axe.push("name", "Great Axe");
+ axe.push("damage type", "slash");
+ axe.push("damage", 30);
+ }
+ }
+ {
+ let mut sounds = monster.start_vector("sounds");
+ sounds.push("grr");
+ sounds.push("rawr");
+ sounds.push("muahaha");
+ }
+ // TODO(cneo): Directly pushing string slices has alloc.
+}
+
+// Read back the data from make_monster.
+fn validate_monster(flexbuffer: &[u8]) {
+ let r = Reader::get_root(flexbuffer).unwrap().as_map();
+
+ assert_eq!(r.idx("type").as_str(), "great orc");
+ assert_eq!(r.idx("age").as_u8(), 100);
+ assert_eq!(r.idx("name").as_str(), "Mr. Orc");
+
+ let coins = r.idx("coins").as_vector();
+ for (i, &c) in [1, 25, 50, 100, 250].iter().enumerate() {
+ assert_eq!(coins.idx(i).as_u16(), c);
+ }
+ let color = r.idx("color").as_vector();
+ for (i, &c) in [255, 0, 0, 0].iter().enumerate() {
+ assert_eq!(color.idx(i).as_i32(), c);
+ }
+ let weapons = r.idx("weapons").as_vector();
+ assert_eq!(weapons.len(), 2);
+
+ let hammer = weapons.idx(0).as_map();
+ assert_eq!(hammer.idx("name").as_str(), "hammer");
+ assert_eq!(hammer.idx("damage type").as_str(), "crush");
+ assert_eq!(hammer.idx("damage").as_u64(), 20);
+
+ let axe = weapons.idx(1).as_map();
+ assert_eq!(axe.idx("name").as_str(), "Great Axe");
+ assert_eq!(axe.idx("damage type").as_str(), "slash");
+ assert_eq!(axe.idx("damage").as_u64(), 30);
+
+ let sounds = r.idx("sounds").as_vector();
+ for (i, &s) in ["grr", "rawr", "muahaha"].iter().enumerate() {
+ assert_eq!(sounds.idx(i).as_str(), s);
+ }
+}
+
+// This is in a separate binary than tests because taking over the global allocator is not
+// hermetic and not thread safe.
+fn main() {
+ let start_up = current_allocs();
+
+ // Let's build a flexbuffer from a new (cold) flexbuffer builder.
+ let mut builder = Builder::default();
+ make_monster(builder.start_map());
+ let after_warmup = current_allocs();
+
+ // The builder makes some allocations while warming up.
+ assert!(after_warmup > start_up);
+ assert!(after_warmup < start_up + 20);
+
+ // A warm builder should make no allocations.
+ make_monster(builder.start_map());
+ assert_eq!(after_warmup, current_allocs());
+
+ // Nor should a reader.
+ validate_monster(builder.view());
+ assert_eq!(after_warmup, current_allocs());
+
+ // Do it again just for kicks.
+ make_monster(builder.start_map());
+ validate_monster(builder.view());
+ assert_eq!(after_warmup, current_allocs());
+
+ let final_allocs = current_allocs(); // dbg! does allocate.
+ dbg!(start_up, after_warmup, final_allocs);
+}
+
+#[test]
+fn no_extra_allocations() {
+ main()
+}
diff --git a/tests/rust_usage_test/bin/monster_example.rs b/tests/rust_usage_test/bin/monster_example.rs
index 3c9a0a0..d0b75d7 100644
--- a/tests/rust_usage_test/bin/monster_example.rs
+++ b/tests/rust_usage_test/bin/monster_example.rs
@@ -1,6 +1,14 @@
extern crate flatbuffers;
#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/include_test1_generated.rs"]
+pub mod include_test1_generated;
+
+#[allow(dead_code, unused_imports)]
+#[path = "../../include_test/sub/include_test2_generated.rs"]
+pub mod include_test2_generated;
+
+#[allow(dead_code, unused_imports)]
#[path = "../../monster_test_generated.rs"]
mod monster_test_generated;
pub use monster_test_generated::my_game;
@@ -13,7 +21,7 @@
f.read_to_end(&mut buf).expect("file reading failed");
let monster = my_game::example::get_root_as_monster(&buf[..]);
- println!("{}", monster.hp()); // `80`
- println!("{}", monster.mana()); // default value of `150`
+ println!("{}", monster.hp()); // `80`
+ println!("{}", monster.mana()); // default value of `150`
println!("{:?}", monster.name()); // Some("MyMonster")
}
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/binary_format.rs b/tests/rust_usage_test/tests/flexbuffers_tests/binary_format.rs
new file mode 100644
index 0000000..ce69511
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/binary_format.rs
@@ -0,0 +1,536 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use flexbuffers::*;
+use serde::Serialize;
+
+#[test]
+fn store_13() {
+ let buf = singleton(13i32);
+ assert_eq!(&buf, &[13, 4, 1]);
+}
+#[test]
+fn store_2pow20() {
+ let buf = singleton(1_048_576i32);
+ assert_eq!(
+ &buf,
+ &[
+ 0,
+ 0,
+ 16,
+ 0, // 2^20 in LE bytes.
+ 1 << 2 | 2, // Int 32bit
+ 4 // Root width 32 bit
+ ]
+ );
+}
+
+#[test]
+fn heterogenous_vector_of_string_because_width() {
+ // Each string is 32 characters. They are 256 bytes altogether.
+ // This forces the vector to be W16 because of the large offsets.
+ let test_data = [
+ "0aaabbbbccccddddeeeeffffgggghhh",
+ "1aaabbbbccccddddeeeeffffgggghhh",
+ "2aaabbbbccccddddeeeeffffgggghhh",
+ "3aaabbbbccccddddeeeeffffgggghhh",
+ "4aaabbbbccccddddeeeeffffgggghhh",
+ "5aaabbbbccccddddeeeeffffgggghhh",
+ "6aaabbbbccccddddeeeeffffgggghhh",
+ "7aaabbbbccccddddeeeeffffgggghhh",
+ ];
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ for &s in test_data.iter() {
+ v.push(s);
+ }
+ v.end_vector();
+ let mut expected = vec![];
+ for &s in test_data.iter() {
+ expected.push(s.len() as u8);
+ expected.extend(s.bytes());
+ expected.push(b'\0');
+ }
+ expected.extend(8u16.to_le_bytes().iter()); // Length.
+ for i in 0..test_data.len() as u16 {
+ let offset = 32 * (8 - i) + 9 + i;
+ expected.extend(offset.to_le_bytes().iter());
+ }
+ for _ in 0..test_data.len() {
+ expected.push(5 << 2 | 0); // String, W8.
+ }
+ expected.push(24); // Offset to Vector.
+ expected.push(10 << 2 | 1); // Vector, W16.
+ expected.push(1); // Root width W8.
+ assert_eq!(fxb.view(), expected.as_slice());
+}
+
+#[test]
+fn store_vec_uint_16() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(256u16);
+ v.push(257u16);
+ v.push(258u16);
+ v.push(259u16);
+ v.push(0u8); // This still becomes u16.
+ v.end_vector();
+ assert_eq!(
+ fxb.view(),
+ &[
+ 5,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 3,
+ 1,
+ 0,
+ 0, // Data
+ 10, // Vector offset.
+ 12 << 2 | 1, // (VectorUInt, W16 - referring to data).
+ 1, // Root width W8 - referring to vector.
+ ]
+ );
+}
+
+quickcheck! {
+ fn qc_f32(x: f32) -> bool {
+ let fxb = singleton(x);
+ let mut expected = x.to_le_bytes().to_vec();
+ expected.push(3 << 2 | 2); // Float W32.
+ expected.push(4); // Root width W32.
+ println!("{:?}: {:?} vs {:?} cmp {:?}", x, &fxb, &expected, fxb==expected);
+ fxb == expected
+ }
+}
+
+#[test]
+fn singleton_vector_uint_4_16bit() {
+ let buf = singleton(&[4u16, 16, 64, 256]);
+ assert_eq!(
+ &buf,
+ &[
+ 4,
+ 0,
+ 16,
+ 0,
+ 64,
+ 0,
+ 0,
+ 1, // Data
+ 8, // Vector offset.
+ 23 << 2 | 1, // (VectorUInt, W16 - referring to data).
+ 1, // Root width W8 - referring to vector.
+ ]
+ );
+}
+#[test]
+fn store_u64() {
+ let buf = singleton(u64::max_value() - 10);
+ assert_eq!(
+ &buf,
+ &[
+ 245,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255, // max value - 10.
+ 2 << 2 | 3, // (UInt, W64)
+ 8, // Root width W64.
+ ]
+ );
+}
+#[test]
+fn vector_uint4() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(2u8);
+ v.push(3u8);
+ v.push(5u8);
+ v.push(7u8);
+ v.end_vector();
+ assert_eq!(
+ &fxb.view(),
+ &[
+ 2,
+ 3,
+ 5,
+ 7, // data
+ 4, // Root (offset)
+ 23 << 2 | 0, // Root type VectorUInt4, BitWidth::W8
+ 1, // Root bitwidth W8
+ ]
+ );
+}
+#[test]
+fn nested_vector() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(0u8);
+ {
+ let mut nested = v.start_vector();
+ nested.push(1u8);
+ nested.push(2u8);
+ nested.push(3u8);
+ }
+ v.push(-42i8);
+ v.end_vector();
+ assert_eq!(
+ fxb.view(),
+ &[
+ 1,
+ 2,
+ 3, // Nested vector
+ 3,
+ 0,
+ 5,
+ 214, // Root Vector: size, v[0], v[1] (offset), v[2] as u8
+ 2 << 2 | 0, // v[0]: (UInt, W8)
+ 20 << 2 | 0, // v[1]: (VectorUInt3, W8)
+ 1 << 2 | 0, // v[2]: (Int, W8)
+ 6, // Root points to Root vector
+ 10 << 2 | 0, // Root type and width (Vector, W8)
+ 1, // Root bytes
+ ]
+ )
+}
+
+#[test]
+fn nested_vector_push_direct() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(0u8);
+ v.push(&[1u8, 2, 3]);
+ v.push(-42i8);
+ v.end_vector();
+ assert_eq!(
+ fxb.view(),
+ &[
+ 1,
+ 2,
+ 3, // Nested VectorUInt3
+ 3,
+ 0,
+ 5,
+ 214, // Root Vector: size, v[0], v[1] (offset), v[2] as u8
+ 2 << 2 | 0, // v[0]: (UInt, W8)
+ 20 << 2 | 0, // v[1]: (VectorUInt3, W8)
+ 1 << 2 | 0, // v[2]: (Int, W8)
+ 6, // Root points to Root vector
+ 10 << 2 | 0, // Root type and width (Vector, W8)
+ 1, // Root bytes
+ ]
+ )
+}
+#[test]
+fn store_map_index_into_it() {
+ let mut fxb = Builder::default();
+ {
+ let mut m = fxb.start_map();
+ m.push("foo", 17u8);
+ m.push("bar", 33u16);
+ m.push("baz", 41u32);
+ }
+ assert_eq!(
+ fxb.view(),
+ &[
+ b'f',
+ b'o',
+ b'o',
+ b'\0',
+ b'b',
+ b'a',
+ b'r',
+ b'\0',
+ b'b',
+ b'a',
+ b'z',
+ b'\0',
+ 3,
+ 9,
+ 6,
+ 15, // Keys vector (note "bar" < "baz" < "foo").
+ 3,
+ 1,
+ 3, // map prefix
+ 33,
+ 41,
+ 17, // values
+ 8,
+ 8,
+ 8, // types (UInt, W8) ~ (2 << 2 | 0)
+ 6, // Offset to map (root)
+ 9 << 2 | 0, // Root type (map)
+ 1, // Root bytes
+ ]
+ );
+}
+#[test]
+fn utf8_snowman() {
+ let buf = singleton("snowman ☃︎");
+ assert_eq!(
+ &buf,
+ &[
+ 14, // Byte length (besides extra null terminator).
+ b's',
+ b'n',
+ b'o',
+ b'w',
+ b'm',
+ b'a',
+ b'n',
+ b' ',
+ 226,
+ 152,
+ 131, // snowman bytes
+ 239,
+ 184,
+ 142, // UTF Variation selector 15
+ 0, // extra null terminator.
+ 15, // Offset to string start.
+ 5 << 2, // String, W8
+ 1, // Root bytes
+ ]
+ );
+ let r = Reader::get_root(&buf).unwrap();
+ assert_eq!(r.get_str(), Ok("snowman ☃︎"));
+}
+#[test]
+fn indirect_numbers() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(IndirectUInt(u64::max_value()));
+ v.push(IndirectInt(i64::min_value()));
+ // TODO(cneo): Something about Float EPSILON and casting leads to a different binary format.
+ v.push(IndirectFloat(std::f64::consts::PI));
+ v.push(0u32); // This is stored in 8 bits instead of 64 because of indirection.
+ v.end_vector();
+ assert_eq!(
+ fxb.view(),
+ vec![
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255, // u64 max
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 128, // i64 min value
+ 24,
+ 45,
+ 68,
+ 84,
+ 251,
+ 33,
+ 9,
+ 64, // f64 PI.
+ 4, // Vector length
+ 25,
+ 18,
+ 11,
+ 0, // offsets to the indirect numbers and zero.
+ 7 << 2 | 3, // IndirectUInt 64 bit
+ 6 << 2 | 3, // IndirectInt 64 bit
+ 8 << 2 | 3, // IndirectFloat 64 bit
+ 2 << 2 | 0, // (inline) UInt 8 bit
+ 8, // Offset to Root.
+ 10 << 2 | 0, // Vector 8 bit
+ 1, // 1 byte root
+ ]
+ .as_slice()
+ )
+}
+#[test]
+fn indirect_2p5x_smaller() {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for i in 0..512 {
+ v.push(i);
+ }
+ v.push(i64::max_value());
+ v.end_vector();
+ let len_without_indirect = builder.view().len() as f32;
+
+ let mut v = builder.start_vector();
+ for i in 0..512 {
+ v.push(i);
+ }
+ v.push(IndirectInt(i64::max_value()));
+ v.end_vector();
+ let len_with_indirect = builder.view().len() as f32;
+ dbg!(len_with_indirect, len_without_indirect);
+ assert!(len_with_indirect * 2.5 < len_without_indirect);
+}
+#[test]
+fn key_pool() {
+ let mut builder = Builder::default();
+ let mut vector = builder.start_vector();
+ for _ in 0..2 {
+ let mut m = vector.start_map();
+ m.push("a", 42u8);
+ m.push("b", 42u8);
+ m.push("c", 42u8);
+ }
+ vector.end_vector();
+
+ assert_eq!(
+ builder.view(),
+ vec![
+ b'a',
+ b'\0',
+ b'b',
+ b'\0',
+ b'c',
+ b'\0',
+ 3,
+ 7,
+ 6,
+ 5, // Key vector 0
+ 3,
+ 1,
+ 3,
+ 42,
+ 42,
+ 42,
+ 2 << 2,
+ 2 << 2,
+ 2 << 2, // Map 0.
+ 3,
+ 20,
+ 19,
+ 18, // Key vector 1 (shares keys with key vector 0).
+ 3,
+ 1,
+ 3,
+ 42,
+ 42,
+ 42,
+ 2 << 2,
+ 2 << 2,
+ 2 << 2, // Map 1.
+ 2,
+ 20,
+ 8,
+ 9 << 2,
+ 9 << 2, // Vector containing the maps.
+ 4,
+ 10 << 2,
+ 1, // Root.
+ ]
+ .as_slice()
+ );
+}
+
+#[test]
+fn serialize_unit() {
+ #[derive(Serialize)]
+ struct Foo;
+ let mut s = FlexbufferSerializer::new();
+ Foo.serialize(&mut s).unwrap();
+ assert_eq!(s.view(), &[0, 0, 1]);
+}
+
+#[test]
+fn serialize_i8() {
+ let mut s = FlexbufferSerializer::new();
+ 13i8.serialize(&mut s).unwrap();
+ assert_eq!(s.view(), &[13, 4, 1]);
+}
+#[test]
+fn serialize_tuple_struct_i8() {
+ #[derive(Serialize)]
+ struct Foo(i32);
+ let mut s = FlexbufferSerializer::new();
+ Foo(13).serialize(&mut s).unwrap();
+ assert_eq!(s.view(), &[13, 4, 1]);
+}
+#[test]
+fn serialize_tuple_tuple_struct_i8_is_inlined() {
+ #[derive(Serialize)]
+ struct Foo(i32);
+ #[derive(Serialize)]
+ struct Bar(Foo);
+ let mut s = FlexbufferSerializer::new();
+ Bar(Foo(13)).serialize(&mut s).unwrap();
+ assert_eq!(s.view(), &[13, 4, 1]);
+}
+#[test]
+fn align_8byte() {
+ let mut b = Builder::default();
+ let mut v = b.start_vector();
+ v.push(IndirectUInt(42));
+ v.push(&[u64::max_value(); 2]);
+ v.end_vector();
+ assert_eq!(
+ b.view()[..16],
+ [
+ 42, 0, 0, 0, 0, 0, 0, 0, // padding
+ 255, 255, 255, 255, 255, 255, 255, 255, // the first u64 max value.
+ ]
+ );
+}
+#[test]
+fn align_4byte() {
+ let mut b = Builder::default();
+ let mut v = b.start_vector();
+ v.push(IndirectUInt(42));
+ v.push(&[u32::max_value(); 2]);
+ v.end_vector();
+ assert_eq!(
+ b.view()[..8],
+ [
+ 42, 0, 0, 0, // padding
+ 255, 255, 255, 255, // the first u32 max value.
+ ]
+ );
+}
+#[test]
+fn align_2byte() {
+ let mut b = Builder::default();
+ let mut v = b.start_vector();
+ v.push(IndirectUInt(42));
+ v.push(&[u16::max_value(); 2]);
+ v.end_vector();
+ assert_eq!(
+ b.view()[..4],
+ [
+ 42, 0, // padding
+ 255, 255, // the first u16 max value.
+ ]
+ );
+}
+#[test]
+fn align_1byte() {
+ let mut b = Builder::default();
+ let mut v = b.start_vector();
+ v.push(IndirectUInt(42));
+ v.push(&[u8::max_value(); 2]);
+ v.end_vector();
+ assert_eq!(b.view()[..2], [42, 255]); // No padding.
+}
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/interop.rs b/tests/rust_usage_test/tests/flexbuffers_tests/interop.rs
new file mode 100644
index 0000000..54ae1fd
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/interop.rs
@@ -0,0 +1,50 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use flexbuffers::*;
+
+#[test]
+fn read_golden_flexbuffer() {
+ let s =
+ std::fs::read("../gold_flexbuffer_example.bin").expect("Unable to read golden flexbuffer.");
+ let r = Reader::get_root(&s).unwrap();
+ let m = r.as_map();
+
+ let vec = m.idx("vec").as_vector();
+ assert_eq!(vec.idx(0).as_i8(), -100);
+ assert_eq!(vec.idx(1).as_str(), "Fred");
+ assert_eq!(vec.idx(2).as_f32(), 4.0);
+ assert_eq!(vec.idx(3).as_blob(), Blob(&[77]));
+ assert_eq!(vec.idx(4).flexbuffer_type(), FlexBufferType::Bool);
+ assert_eq!(vec.idx(4).as_bool(), false);
+ assert_eq!(vec.idx(5).as_f64(), 4.0);
+
+ let bar = m.idx("bar").as_vector();
+ for (i, &x) in [1, 2, 3].iter().enumerate() {
+ assert_eq!(bar.idx(i).as_i8(), x);
+ }
+ let bar3 = m.idx("bar3").as_vector();
+ for (i, &x) in [1, 2, 3].iter().enumerate() {
+ assert_eq!(bar3.idx(i).as_i8(), x);
+ }
+ let bools = m.idx("bools").as_vector();
+ for (i, &b) in [true, false, true, false].iter().enumerate() {
+ assert_eq!(bools.idx(i).as_bool(), b)
+ }
+
+ assert_eq!(m.idx("bool").as_bool(), true);
+ assert_eq!(m.idx("foo").as_f64(), 100.0);
+ let mymap = m.idx("mymap").as_map();
+ assert_eq!(mymap.idx("foo").as_str(), "Fred");
+}
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/mod.rs b/tests/rust_usage_test/tests/flexbuffers_tests/mod.rs
new file mode 100644
index 0000000..2fccdb3
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/mod.rs
@@ -0,0 +1,19 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+mod binary_format;
+mod interop;
+mod other_api;
+mod qc_serious;
+mod rwyw;
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/other_api.rs b/tests/rust_usage_test/tests/flexbuffers_tests/other_api.rs
new file mode 100644
index 0000000..430cae5
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/other_api.rs
@@ -0,0 +1,190 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use flexbuffers::*;
+use quickcheck::QuickCheck;
+
+#[test]
+fn qc_reader_no_crash() {
+ fn no_crash(xs: Vec<u8>) -> bool {
+ let r = Reader::get_root(&xs);
+ r.is_err() || r.is_ok()
+ }
+ QuickCheck::new()
+ .min_tests_passed(10_000_000)
+ .quicktest(no_crash as fn(Vec<u8>) -> bool)
+ .unwrap();
+
+ no_crash(vec![0, 10 << 2 | 2, 0]);
+}
+#[test]
+fn as_num() {
+ let mut fxb = Builder::default();
+ let mut m = fxb.start_map();
+ m.push("a", &[-1i8, -2, -3, -4]);
+ m.push("b", 250i64);
+ m.push("c", 5000u16);
+ m.end_map();
+
+ let r = Reader::get_root(fxb.view()).unwrap();
+ assert_eq!(r.as_i8(), 3); // length.
+ assert_eq!(r.as_i16(), 3);
+ assert_eq!(r.as_i32(), 3);
+ assert_eq!(r.as_i64(), 3);
+ assert_eq!(r.as_u8(), 3);
+ assert_eq!(r.as_u16(), 3);
+ assert_eq!(r.as_u32(), 3);
+ assert_eq!(r.as_u64(), 3);
+ assert_eq!(r.as_f32(), 3.0);
+ assert_eq!(r.as_f64(), 3.0);
+
+ let m = r.as_map();
+ let a = m.index("a").unwrap();
+ assert_eq!(a.as_f32(), 4.0); // length.
+ assert_eq!(a.as_f64(), 4.0); // length.
+ assert_eq!(a.as_vector().idx(0).as_i8(), -1);
+ assert_eq!(a.as_vector().idx(1).as_i16(), -2);
+ assert_eq!(a.as_vector().idx(2).as_i32(), -3);
+ assert_eq!(a.as_vector().idx(3).as_i64(), -4);
+
+ let b = m.index("b").unwrap();
+ assert_eq!(b.as_u8(), 250);
+ assert_eq!(b.as_u16(), 250);
+ assert_eq!(b.as_u32(), 250);
+ assert_eq!(b.as_u64(), 250);
+ assert_eq!(b.as_i8(), 0); // overflow
+ assert_eq!(b.as_i16(), 250);
+ assert_eq!(b.as_i32(), 250);
+ assert_eq!(b.as_i64(), 250);
+
+ let c = m.index("c").unwrap();
+ assert_eq!(c.as_i64(), 5000);
+ assert_eq!(c.as_u64(), 5000);
+ assert_eq!(c.as_f32(), 5000.0);
+ assert_eq!(c.as_u8(), 0); // overflow
+ assert_eq!(c.as_u16(), 5000);
+ assert_eq!(c.as_u32(), 5000);
+ assert_eq!(c.as_u64(), 5000);
+ assert_eq!(c.as_i8(), 0); // overflow
+ assert_eq!(c.as_i16(), 5000);
+ assert_eq!(c.as_i32(), 5000);
+ assert_eq!(c.as_i64(), 5000);
+}
+#[test]
+fn string_as_num() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push("3.1415");
+ v.push("9.001e3");
+ v.push("42");
+ v.end_vector();
+ let r = Reader::get_root(fxb.view()).unwrap();
+
+ let v0 = r.as_vector().idx(0);
+ assert_eq!(v0.as_f64(), 3.1415);
+ assert_eq!(v0.as_f32(), 3.1415);
+ assert_eq!(v0.as_u8(), 0);
+ assert_eq!(v0.as_u16(), 0);
+ assert_eq!(v0.as_u32(), 0);
+ assert_eq!(v0.as_u64(), 0);
+ assert_eq!(v0.as_i8(), 0);
+ assert_eq!(v0.as_i16(), 0);
+ assert_eq!(v0.as_i32(), 0);
+ assert_eq!(v0.as_i64(), 0);
+
+ let v1 = r.as_vector().idx(1);
+ assert_eq!(v1.as_f64(), 9001.0);
+ assert_eq!(v1.as_f32(), 9001.0);
+ assert_eq!(v1.as_u8(), 0);
+ assert_eq!(v1.as_u16(), 0);
+ assert_eq!(v1.as_u32(), 0);
+ assert_eq!(v1.as_u64(), 0);
+ assert_eq!(v1.as_i8(), 0);
+ assert_eq!(v1.as_i16(), 0);
+ assert_eq!(v1.as_i32(), 0);
+ assert_eq!(v1.as_i64(), 0);
+ assert_eq!(v1.as_i32(), 0);
+
+ let v2 = r.as_vector().idx(2);
+ assert_eq!(v2.as_f64(), 42.0);
+ assert_eq!(v2.as_f32(), 42.0);
+ assert_eq!(v2.as_u8(), 42);
+ assert_eq!(v2.as_u16(), 42);
+ assert_eq!(v2.as_u32(), 42);
+ assert_eq!(v2.as_u64(), 42);
+ assert_eq!(v2.as_i8(), 42);
+ assert_eq!(v2.as_i16(), 42);
+ assert_eq!(v2.as_i32(), 42);
+ assert_eq!(v2.as_i64(), 42);
+ assert_eq!(v2.as_i32(), 42);
+}
+#[test]
+fn null_reader() {
+ let n = Reader::default();
+ assert_eq!(n.as_i8(), 0);
+ assert_eq!(n.as_i16(), 0);
+ assert_eq!(n.as_i32(), 0);
+ assert_eq!(n.as_i64(), 0);
+ assert_eq!(n.as_u8(), 0);
+ assert_eq!(n.as_u16(), 0);
+ assert_eq!(n.as_u32(), 0);
+ assert_eq!(n.as_u64(), 0);
+ assert_eq!(n.as_f32(), 0.0);
+ assert_eq!(n.as_f64(), 0.0);
+ assert!(n.get_i64().is_err());
+ assert!(n.get_u64().is_err());
+ assert!(n.get_f64().is_err());
+ assert!(n.as_vector().is_empty());
+ assert!(n.as_map().is_empty());
+ assert_eq!(n.as_vector().idx(1).flexbuffer_type(), FlexBufferType::Null);
+ assert_eq!(n.as_map().idx("1").flexbuffer_type(), FlexBufferType::Null);
+}
+#[test]
+fn get_root_deref_oob() {
+ let s = &[
+ 4, // Deref out of bounds
+ (FlexBufferType::Vector as u8) << 2 | BitWidth::W8 as u8,
+ 1,
+ ];
+ assert!(Reader::get_root(s).is_err());
+}
+#[test]
+fn get_root_deref_u64() {
+ let s = &[
+ 0,
+ 0,
+ (FlexBufferType::IndirectUInt as u8) << 2 | BitWidth::W64 as u8,
+ 1,
+ ];
+ // The risk of crashing is reading 8 bytes from index 0.
+ assert_eq!(Reader::get_root(s).unwrap().as_u64(), 0);
+}
+
+#[test]
+#[should_panic]
+fn build_map_panic_on_repeated_key() {
+ let mut b = Builder::default();
+ let mut m = b.start_map();
+ m.push("foo", 5u8);
+ m.push("foo", 6u8);
+ m.end_map();
+}
+#[test]
+#[should_panic]
+fn build_map_panic_on_internal_null() {
+ let mut b = Builder::default();
+ let mut m = b.start_map();
+ m.push("foo\0", 5u8);
+ m.end_map();
+}
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/qc_serious.rs b/tests/rust_usage_test/tests/flexbuffers_tests/qc_serious.rs
new file mode 100644
index 0000000..abd1ced
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/qc_serious.rs
@@ -0,0 +1,145 @@
+use super::rwyw::NonNullString;
+use flexbuffers::*;
+use quickcheck::{Arbitrary, Gen};
+use serde::{Deserialize, Serialize};
+use std::collections::BTreeMap;
+
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
+enum Enum {
+ Unit,
+ U8(u8),
+ U16(u16),
+ U32(u32),
+ U64(u64),
+ Us(u8, u16, u32, u64),
+ I8(i8),
+ I16(i16),
+ I32(i32),
+ I64(i64),
+ Is(i8, i16, i32, i64),
+ F32(f32),
+ F64(f64),
+ Fs(f32, f64),
+ String(String),
+ Strings(String, String),
+ Everything(u8, u16, u32, u64, i8, i16, i32, i64, f32, f64, String),
+ Arrays {
+ a: Array3<u16>,
+ b: Array4<i32>,
+ c: Array2<f64>,
+ },
+ Blobs(#[serde(with = "serde_bytes")] Vec<u8>),
+}
+
+// There is some upstream bug in deriving Arbitrary for Enum so we manually implement it here.
+impl Arbitrary for Enum {
+ fn arbitrary<G: Gen>(g: &mut G) -> Self {
+ match g.gen_range(0, 18) {
+ 0 => Enum::Unit,
+ 1 => Enum::U8(<u8>::arbitrary(g)),
+ 2 => Enum::U16(<u16>::arbitrary(g)),
+ 3 => Enum::U32(<u32>::arbitrary(g)),
+ 4 => Enum::U64(<u64>::arbitrary(g)),
+ 5 => {
+ let (a, b, c, d) = <(u8, u16, u32, u64)>::arbitrary(g);
+ Enum::Us(a, b, c, d)
+ }
+ 6 => Enum::I8(<i8>::arbitrary(g)),
+ 7 => Enum::I16(<i16>::arbitrary(g)),
+ 8 => Enum::I32(<i32>::arbitrary(g)),
+ 9 => Enum::I64(<i64>::arbitrary(g)),
+ 10 => {
+ let (a, b, c, d) = <(i8, i16, i32, i64)>::arbitrary(g);
+ Enum::Is(a, b, c, d)
+ }
+ 11 => Enum::F32(<f32>::arbitrary(g)),
+ 12 => Enum::F64(<f64>::arbitrary(g)),
+ 13 => {
+ let (a, b) = <(f32, f64)>::arbitrary(g);
+ Enum::Fs(a, b)
+ }
+ 14 => Enum::String(String::arbitrary(g)),
+ 15 => {
+ let (a, b) = <(String, String)>::arbitrary(g);
+ Enum::Strings(a, b)
+ }
+ 16 => Enum::Everything(
+ <u8>::arbitrary(g),
+ <u16>::arbitrary(g),
+ <u32>::arbitrary(g),
+ <u64>::arbitrary(g),
+ <i8>::arbitrary(g),
+ <i16>::arbitrary(g),
+ <i32>::arbitrary(g),
+ <i64>::arbitrary(g),
+ <f32>::arbitrary(g),
+ <f64>::arbitrary(g),
+ <String>::arbitrary(g),
+ ),
+ 17 => {
+ let a = Array3::arbitrary(g);
+ let b = Array4::arbitrary(g);
+ let c = Array2::arbitrary(g);
+ Enum::Arrays { a, b, c }
+ }
+ _ => unreachable!(),
+ }
+ }
+}
+
+#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]
+struct Unit;
+
+#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]
+struct NewType(bool);
+
+#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]
+struct Tuple(bool, u8, i16, f32, String);
+
+#[derive(Debug, Clone, Arbitrary, PartialEq, Serialize, Deserialize)]
+struct Struct {
+ a: Vec<Enum>,
+ b: BTreeMap<NonNullString, Enum>,
+ c: Tuple,
+ d: (Unit, Unit),
+ e: Array4<NewType>,
+}
+
+#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]
+struct Array2<A: Arbitrary>([A; 2]);
+#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]
+struct Array3<A: Arbitrary>([A; 3]);
+#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize)]
+struct Array4<A: Arbitrary>([A; 4]);
+
+impl<A: Arbitrary> Arbitrary for Array2<A> {
+ fn arbitrary<G: Gen>(g: &mut G) -> Self {
+ Array2([A::arbitrary(g), A::arbitrary(g)])
+ }
+}
+impl<A: Arbitrary> Arbitrary for Array3<A> {
+ fn arbitrary<G: Gen>(g: &mut G) -> Self {
+ Array3([A::arbitrary(g), A::arbitrary(g), A::arbitrary(g)])
+ }
+}
+impl<A: Arbitrary> Arbitrary for Array4<A> {
+ fn arbitrary<G: Gen>(g: &mut G) -> Self {
+ Array4([
+ A::arbitrary(g),
+ A::arbitrary(g),
+ A::arbitrary(g),
+ A::arbitrary(g),
+ ])
+ }
+}
+
+quickcheck! {
+ fn qc_serious(x: Struct) -> bool {
+ let mut s = FlexbufferSerializer::new();
+ x.serialize(&mut s).unwrap();
+ let r = Reader::get_root(s.view()).unwrap();
+ println!("{}", r);
+ let x2 = Struct::deserialize(r).unwrap();
+ x == x2
+ }
+}
diff --git a/tests/rust_usage_test/tests/flexbuffers_tests/rwyw.rs b/tests/rust_usage_test/tests/flexbuffers_tests/rwyw.rs
new file mode 100644
index 0000000..7ae7974
--- /dev/null
+++ b/tests/rust_usage_test/tests/flexbuffers_tests/rwyw.rs
@@ -0,0 +1,508 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Read what you wrote.
+use flexbuffers::*;
+use quickcheck;
+use serde::{Deserialize, Serialize};
+
+// TODO(cneo): Upstream this to the quickcheck crate. Also, write a macro to derive Arbitrary.
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Serialize, Deserialize)]
+pub struct NonNullString(String);
+impl quickcheck::Arbitrary for NonNullString {
+ fn arbitrary<G: quickcheck::Gen>(g: &mut G) -> Self {
+ let size = std::cmp::min(1, usize::arbitrary(g));
+ NonNullString(
+ (0..)
+ .map(|_| <char>::arbitrary(g))
+ .filter(|&b| b != '\0')
+ .take(size)
+ .collect(),
+ )
+ }
+}
+
+quickcheck! {
+ fn qc_vec_bool(xs: Vec<bool>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for &x in &xs {
+ v.push(x);
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(|(i, &x)| r.index(i).unwrap().get_bool().unwrap() == x)
+ }
+ fn qc_vec_uint(xs: Vec<u64>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for &x in &xs {
+ v.push(x);
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(|(i, &x)| r.idx(i).as_u64() == x)
+ }
+ fn qc_vec_int(xs: Vec<i64>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for &x in &xs {
+ v.push(x);
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(|(i, &x)| r.idx(i).as_i64() == x)
+ }
+ fn qc_vec_float(xs: Vec<f64>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for &x in &xs {
+ v.push(x);
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(|(i, &x)| (r.idx(i).as_f64() - x).abs() < std::f64::EPSILON)
+ }
+ fn qc_vec_string(xs: Vec<String>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for x in &xs {
+ v.push(x as &str);
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(|(i, x)| (r.idx(i).as_str() == x))
+ }
+ fn qc_map_int(xs: std::collections::BTreeMap<NonNullString, i64>) -> bool {
+ let mut builder = Builder::default();
+ let mut m = builder.start_map();
+ for (k, &v) in &xs {
+ m.push(&k.0, v);
+ }
+ m.end_map();
+ let r = Reader::get_root(&builder.view()).unwrap().as_map();
+ xs.iter().enumerate().all(|(i, (k, &v))| {
+ r.idx(i).as_i64() == v && r.idx(k.0.as_str()).as_i64() == v
+ })
+ }
+ fn qc_map_string(xs: std::collections::BTreeMap<NonNullString, String>) -> bool {
+ let mut builder = Builder::default();
+ let mut m = builder.start_map();
+ for (k, v) in &xs {
+ m.push(&k.0, v as &str);
+ }
+ m.end_map();
+ let r = Reader::get_root(&builder.view()).unwrap().as_map();
+ xs.iter().enumerate().all(|(i, (k, v))| {
+ r.idx(i).as_str() == v && r.idx(k.0.as_str()).as_str() == v
+ })
+ }
+ fn qc_blob(xs: Vec<Vec<u8>>) -> bool {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ for x in &xs {
+ v.push(Blob(&x));
+ }
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ xs.iter().enumerate().all(
+ |(i, x)| r.idx(i).get_blob().unwrap().0.iter().eq(x.iter())
+ )
+ }
+ fn qc_serde_ints(
+ u8s: Vec<u8>,
+ u16s: Vec<u16>,
+ u32s: Vec<u32>,
+ u64s: Vec<u64>,
+ i8s: Vec<i8>,
+ i16s: Vec<i16>,
+ i32s: Vec<i32>,
+ i64s: Vec<i64>
+ ) -> bool {
+ #[derive(Serialize, Deserialize, PartialEq)]
+ struct Foo {
+ u8s: Vec<u8>,
+ u16s: Vec<u16>,
+ u32s: Vec<u32>,
+ u64s: Vec<u64>,
+ i8s: Vec<i8>,
+ i16s: Vec<i16>,
+ i32s: Vec<i32>,
+ i64s: Vec<i64>,
+ }
+ let mut ser = FlexbufferSerializer::new();
+ let foo1 = Foo { u8s, u16s, u32s, u64s, i8s, i16s, i32s, i64s };
+ foo1.serialize(&mut ser).unwrap();
+ let r = Reader::get_root(ser.view()).unwrap();
+ let foo2 = Foo::deserialize(r).unwrap();
+ foo1 == foo2
+ }
+ fn qc_serde_others(
+ bools: Vec<bool>,
+ strings: Vec<String>,
+ f32s: Vec<f32>,
+ f64s: Vec<f64>
+ ) -> bool {
+ #[derive(Serialize, Deserialize, PartialEq)]
+ struct Foo {
+ bools: Vec<bool>,
+ strings: Vec<String>,
+ f32s: Vec<f32>,
+ f64s: Vec<f64>,
+ }
+ let mut ser = FlexbufferSerializer::new();
+ let foo1 = Foo { bools, strings, f32s, f64s };
+ foo1.serialize(&mut ser).unwrap();
+ let r = Reader::get_root(ser.view()).unwrap();
+ let foo2 = Foo::deserialize(r).unwrap();
+ foo1 == foo2
+ }
+ fn qc_serde_others2(
+ bools: Vec<bool>,
+ strings: Vec<String>,
+ f32s: Vec<f32>,
+ f64s: Vec<f64>
+ ) -> bool {
+ #[derive(Serialize, Deserialize, PartialEq)]
+ struct Foo (Vec<bool>, Vec<String>, Vec<f32>, Vec<f64>);
+ let mut ser = FlexbufferSerializer::new();
+ let foo1 = Foo(bools, strings, f32s, f64s);
+ foo1.serialize(&mut ser).unwrap();
+ let r = Reader::get_root(ser.view()).unwrap();
+ let foo2 = Foo::deserialize(r).unwrap();
+ foo1 == foo2
+ }
+
+}
+
+#[test]
+fn empty_vectors() {
+ #[derive(PartialEq, Serialize, Deserialize, Default, Debug)]
+ struct Foo(Vec<u8>, Vec<i8>);
+ let foo1 = Foo::default();
+ let mut s = FlexbufferSerializer::new();
+ foo1.serialize(&mut s).unwrap();
+ dbg!(s.view());
+ let r = Reader::get_root(s.view()).unwrap();
+ let foo2 = Foo::deserialize(r).unwrap();
+ assert_eq!(foo1, foo2);
+}
+
+#[test]
+fn string() {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ v.push("foo");
+ v.push("barrr");
+ v.push("bazzzzzz");
+ v.end_vector();
+ let r = Reader::get_root(&builder.view()).unwrap().as_vector();
+ assert_eq!(r.idx(0).as_str(), "foo");
+ assert_eq!(r.idx(1).as_str(), "barrr");
+ assert_eq!(r.idx(2).as_str(), "bazzzzzz");
+}
+
+#[test]
+fn store_13() {
+ let finished = singleton::<i32>(13);
+ let r = Reader::get_root(&finished).unwrap();
+ assert_eq!(r.as_i32(), 13);
+}
+#[test]
+fn singleton_vector_uint_4_16bit() {
+ let mut builder = Builder::default();
+ let mut v = builder.start_vector();
+ v.push(2u8);
+ v.push(3u8);
+ v.push(5u8);
+ v.end_vector();
+ let buf1 = builder.view();
+ let buf2 = singleton(&[2u8, 3, 5]);
+ assert_eq!(buf1, buf2.as_slice());
+
+ let r = Reader::get_root(&buf1).unwrap().as_vector();
+ assert_eq!(r.idx(0).get_u64(), Ok(2));
+ assert_eq!(r.idx(1).get_u64(), Ok(3));
+ assert_eq!(r.idx(2).get_u64(), Ok(5));
+ assert_eq!(r.index(3).unwrap_err(), ReaderError::IndexOutOfBounds);
+}
+#[test]
+fn vector_uint4() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(2u8);
+ v.push(3u8);
+ v.push(5u8);
+ v.push(7u8);
+ v.end_vector();
+ let r = Reader::get_root(&fxb.view()).unwrap();
+ let v = r.as_vector();
+ assert_eq!(v.idx(0).get_u64(), Ok(2));
+ assert_eq!(v.idx(1).get_u64(), Ok(3));
+ assert_eq!(v.idx(2).get_u64(), Ok(5));
+ assert_eq!(v.idx(3).get_u64(), Ok(7));
+ assert!(v.index(4).is_err());
+ #[cfg(target_endian = "little")]
+ {
+ assert_eq!(r.get_slice::<u8>().unwrap(), [2, 3, 5, 7]);
+ }
+}
+#[test]
+fn store_and_read_blob() {
+ let mut fxb = Builder::default();
+ let mut v = fxb.start_vector();
+ v.push(Blob(&[1, 2, 3, 4]));
+ v.push(Blob(&[5, 6, 7]));
+ v.end_vector();
+
+ let r = Reader::get_root(&fxb.view()).unwrap().as_vector();
+ assert_eq!(r.idx(0).get_blob(), Ok(Blob(&[1, 2, 3, 4])));
+ assert_eq!(r.idx(1).get_blob(), Ok(Blob(&[5, 6, 7])));
+}
+#[test]
+fn map_64bit() {
+ let mut fxb = Builder::default();
+ let mut m = fxb.start_map();
+ m.push("a", 257u16);
+ m.push("b", u64::max_value() - 3);
+ m.end_map();
+
+ let r = Reader::get_root(&fxb.view()).unwrap().as_map();
+ assert_eq!(r.idx("a").as_u16(), 257);
+ assert_eq!(r.idx("b").as_u64(), u64::max_value() - 3);
+}
+#[test]
+fn index_map() {
+ let mut fxb = Builder::default();
+ let mut m = fxb.start_map();
+ m.push("foo", 17u8);
+ m.push("bar", 33u16);
+ m.push("baz", 41u32);
+ m.end_map();
+
+ let r = Reader::get_root(fxb.view()).unwrap().as_map();
+ assert_eq!(r.idx(0).get_u64(), Ok(33));
+ assert_eq!(r.idx(1).get_u64(), Ok(41));
+ assert_eq!(r.idx(2).as_u8(), 17);
+ assert_eq!(r.index(3).unwrap_err(), ReaderError::IndexOutOfBounds);
+
+ assert_eq!(r.idx("bar").as_u64(), 33);
+ assert_eq!(r.idx("baz").as_u32(), 41);
+ assert_eq!(r.idx("foo").as_u16(), 17);
+ assert_eq!(r.index("???").unwrap_err(), ReaderError::KeyNotFound);
+}
+
+#[test]
+fn map_strings() {
+ let mut fxb = Builder::default();
+ {
+ let mut m = fxb.start_map();
+ let mut a = m.start_vector("a");
+ for &s in ["b", "c", "d", "e"].iter() {
+ a.push(s);
+ }
+ a.end_vector();
+ let mut f = m.start_vector("f");
+ for &s in ["gh", "ij"].iter() {
+ f.push(s);
+ }
+ }
+ let r = Reader::get_root(fxb.view()).unwrap().as_map();
+ let a = r.idx("a").as_vector();
+
+ assert_eq!(a.idx(0).as_str(), "b");
+ assert_eq!(a.idx(1).as_str(), "c");
+ assert_eq!(a.idx(2).as_str(), "d");
+ assert_eq!(a.idx(3).as_str(), "e");
+
+ let f = r.idx("f").as_vector();
+ assert_eq!(f.idx(0).as_str(), "gh");
+ assert_eq!(f.idx(1).as_str(), "ij");
+
+ // Defaults to empty string for index errors.
+ assert_eq!(r.idx("a").as_vector().idx(4).as_str(), "");
+ assert_eq!(r.idx("b").as_vector().idx(2).as_str(), "");
+ assert_eq!(r.idx("c").as_str(), "");
+}
+
+#[test]
+fn store_u64() {
+ let finished = singleton(u64::max_value() - 10);
+ let r = Reader::get_root(&finished).unwrap();
+ assert_eq!(r.get_u64(), Ok(u64::max_value() - 10));
+}
+#[test]
+fn store_indirects() {
+ let mut b = Builder::default();
+ let mut v = b.start_vector();
+ v.push(IndirectInt(-42));
+ v.push(IndirectUInt(9000));
+ v.push(IndirectFloat(3.14));
+ v.end_vector();
+ let r = Reader::get_root(b.view()).unwrap().as_vector();
+ assert_eq!(r.idx(0).get_i64().unwrap(), -42);
+ assert_eq!(r.idx(1).get_u64().unwrap(), 9000);
+ assert_eq!(r.idx(2).get_f64().unwrap(), 3.14);
+}
+
+#[derive(Serialize, Deserialize, Debug, PartialEq)]
+struct Foo {
+ a: i8,
+ b: f64,
+ c: Vec<u32>,
+ d: String,
+}
+quickcheck! {
+ fn serde_foo(a: i8,
+ b: f64,
+ c: Vec<u32>,
+ d: String) -> bool {
+ let mut s = FlexbufferSerializer::new();
+ let data = Foo { a, b, c, d };
+ data.serialize(&mut s).unwrap();
+
+ let read = Foo::deserialize(Reader::get_root(s.view()).unwrap()).unwrap();
+ data == read
+ }
+}
+
+#[test]
+fn serde_serious() {
+ #[derive(Debug, PartialEq, Serialize, Deserialize)]
+ enum MyEnum {
+ Unit,
+ NewType([i32; 3]),
+ Tuple(f32, f64),
+ Struct { a: u8, b: u16, c: u32 },
+ }
+ #[derive(Debug, PartialEq, Serialize, Deserialize)]
+ struct MyNewType;
+
+ #[derive(Debug, PartialEq, Serialize, Deserialize)]
+ struct MyStruct {
+ a: u8,
+ b: u16,
+ c: u32,
+ d: u64,
+ };
+
+ #[derive(Debug, PartialEq, Serialize, Deserialize)]
+ struct MyUnitStruct(Vec<String>);
+
+ #[derive(Debug, PartialEq, Serialize, Deserialize)]
+ struct MyTupleStruct(MyNewType, MyUnitStruct, MyStruct, Vec<MyEnum>);
+
+ let data = MyTupleStruct(
+ MyNewType,
+ MyUnitStruct(vec!["Hello".to_string(), "World".to_string()]),
+ MyStruct {
+ a: 2,
+ b: 4,
+ c: 8,
+ d: 16,
+ },
+ vec![
+ MyEnum::Unit,
+ MyEnum::NewType([-1, 0, 1]),
+ MyEnum::Unit,
+ MyEnum::Tuple(3.14, 2.71),
+ MyEnum::Struct {
+ a: 32,
+ b: 64,
+ c: 128,
+ },
+ ],
+ );
+
+ let mut s = FlexbufferSerializer::new();
+ data.serialize(&mut s).unwrap();
+
+ let reader = Reader::get_root(s.view()).unwrap();
+ let read = MyTupleStruct::deserialize(reader).unwrap();
+ assert_eq!(data, read);
+}
+#[test]
+fn serialize_serde_with_bytes_as_blob() {
+ #[derive(Serialize, Deserialize)]
+ struct Foo(#[serde(with = "serde_bytes")] Vec<u8>);
+ let mut s = FlexbufferSerializer::new();
+ Foo(vec![5, 6, 7, 8]).serialize(&mut s).unwrap();
+ let reader = Reader::get_root(s.view()).unwrap();
+ assert_eq!(reader.flexbuffer_type(), FlexBufferType::Blob);
+ assert_eq!(reader.as_blob(), Blob(&[5, 6, 7, 8]));
+}
+#[test]
+fn iter() {
+ let mut fxb = Builder::default();
+ {
+ let mut m = fxb.start_map();
+ m.push("a", "42");
+ m.push("b", 250i64);
+ m.push("c", 5000u16);
+ }
+ let r = Reader::get_root(fxb.view()).unwrap();
+
+ let v: Vec<u32> = r.as_vector().iter().map(|x| x.as_u32()).collect();
+ assert_eq!(&v, &[42, 250, 5000]);
+}
+
+#[test]
+fn deserialize_newtype_i8() {
+ #[derive(Deserialize)]
+ struct Foo(u8);
+ let data = [13, 4, 1];
+ let r = Reader::get_root(&data).unwrap();
+ let foo = Foo::deserialize(r).unwrap();
+ assert_eq!(foo.0, 13);
+}
+#[test]
+fn deserialize_newtype_str() {
+ #[derive(Deserialize)]
+ struct Foo<'a>(&'a str);
+ let data = [5, b'h', b'e', b'l', b'l', b'o', b'\0', 6, 5 << 2, 1];
+ let r = Reader::get_root(&data).unwrap();
+ let foo = Foo::deserialize(r).unwrap();
+ assert_eq!(foo.0, "hello");
+}
+#[test]
+#[rustfmt::skip]
+fn deserialize_tuple_struct_to_vec_uint4() {
+ #[derive(Deserialize)]
+ struct Foo(u8, u16, u32, u64);
+ let data = [
+ 4, 0, 16, 0, 64, 0, 0, 1, // Data
+ 8, // Vector offset.
+ 23 << 2 | 1, // (VectorUInt4, W16 - referring to data).
+ 1, // Root width W8 - referring to vector.
+ ];
+ let r = Reader::get_root(&data).unwrap();
+ let foo = Foo::deserialize(r).unwrap();
+ assert_eq!(foo.0, 4);
+ assert_eq!(foo.1, 16);
+ assert_eq!(foo.2, 64);
+ assert_eq!(foo.3, 256);
+
+ let data = [
+ 1, 2, 3, 4, // The vector.
+ 4, // Root data (offset).
+ 23 << 2, // Root type: VectorUInt4, W8.
+ 1, // Root width: W8.
+ ];
+ let r = Reader::get_root(&data).unwrap();
+ let foo = Foo::deserialize(r).unwrap();
+ assert_eq!(foo.0, 1);
+ assert_eq!(foo.1, 2);
+ assert_eq!(foo.2, 3);
+ assert_eq!(foo.3, 4);
+}
diff --git a/tests/rust_usage_test/tests/integration_test.rs b/tests/rust_usage_test/tests/integration_test.rs
index 0dace96..5957e2c 100644
--- a/tests/rust_usage_test/tests/integration_test.rs
+++ b/tests/rust_usage_test/tests/integration_test.rs
@@ -15,15 +15,39 @@
* limitations under the License.
*/
+#[macro_use]
extern crate quickcheck;
-
extern crate flatbuffers;
+extern crate flexbuffers;
+extern crate rand;
+extern crate serde;
+#[macro_use]
+extern crate serde_derive;
+#[macro_use]
+extern crate quickcheck_derive;
-#[allow(dead_code, unused_imports)]
+mod flexbuffers_tests;
+mod optional_scalars_test;
+
+#[path = "../../include_test/include_test1_generated.rs"]
+pub mod include_test1_generated;
+
+#[path = "../../include_test/sub/include_test2_generated.rs"]
+pub mod include_test2_generated;
+
#[path = "../../monster_test_generated.rs"]
mod monster_test_generated;
pub use monster_test_generated::my_game;
+#[allow(dead_code, unused_imports)]
+#[path = "../../optional_scalars_generated.rs"]
+mod optional_scalars_generated;
+
+#[rustfmt::skip] // TODO: Use standard rust formatting and remove dead code.
+#[allow(dead_code)]
+mod flatbuffers_tests {
+use super::*;
+
// Include simple random number generator to ensure results will be the
// same across platforms.
// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator
@@ -184,6 +208,7 @@
let inv = m.inventory().unwrap();
check_eq!(inv.len(), 5)?;
check_eq!(inv.iter().sum::<u8>(), 10u8)?;
+ check_eq!(inv.iter().rev().sum::<u8>(), 10u8)?;
check_is_some!(m.test4())?;
let test4 = m.test4().unwrap();
@@ -234,6 +259,45 @@
fn monster_file_extension() {
assert_eq!("mon", my_game::example::MONSTER_EXTENSION);
}
+
+ #[test]
+ fn enum_constants_are_public() {
+ assert_eq!(-1, my_game::example::Race::ENUM_MIN);
+ assert_eq!(2, my_game::example::Race::ENUM_MAX);
+ assert_eq!(my_game::example::Race::ENUM_VALUES, [
+ my_game::example::Race::None,
+ my_game::example::Race::Human,
+ my_game::example::Race::Dwarf,
+ my_game::example::Race::Elf,
+ ]);
+
+ assert_eq!(0, my_game::example::Any::ENUM_MIN);
+ assert_eq!(3, my_game::example::Any::ENUM_MAX);
+ assert_eq!(my_game::example::Any::ENUM_VALUES, [
+ my_game::example::Any::NONE,
+ my_game::example::Any::Monster,
+ my_game::example::Any::TestSimpleTableWithEnum,
+ my_game::example::Any::MyGame_Example2_Monster,
+ ]);
+
+ assert_eq!(0, my_game::example::AnyUniqueAliases::ENUM_MIN);
+ assert_eq!(3, my_game::example::AnyUniqueAliases::ENUM_MAX);
+ assert_eq!(my_game::example::AnyUniqueAliases::ENUM_VALUES, [
+ my_game::example::AnyUniqueAliases::NONE,
+ my_game::example::AnyUniqueAliases::M,
+ my_game::example::AnyUniqueAliases::TS,
+ my_game::example::AnyUniqueAliases::M2,
+ ]);
+
+ assert_eq!(0, my_game::example::AnyAmbiguousAliases::ENUM_MIN);
+ assert_eq!(3, my_game::example::AnyAmbiguousAliases::ENUM_MAX);
+ assert_eq!(my_game::example::AnyAmbiguousAliases::ENUM_VALUES, [
+ my_game::example::AnyAmbiguousAliases::NONE,
+ my_game::example::AnyAmbiguousAliases::M1,
+ my_game::example::AnyAmbiguousAliases::M2,
+ my_game::example::AnyAmbiguousAliases::M3,
+ ]);
+ }
}
#[cfg(test)]
@@ -509,6 +573,18 @@
assert_eq!(m.testarrayofstring().unwrap().len(), 2);
assert_eq!(m.testarrayofstring().unwrap().get(0), "foobar");
assert_eq!(m.testarrayofstring().unwrap().get(1), "baz");
+
+ let rust_vec_inst = m.testarrayofstring().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect.len(), 2);
+ assert_eq!(rust_vec_iter_collect[0], "foobar");
+ assert_eq!(rust_vec_iter_collect[1], "baz");
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect.len(), 2);
+ assert_eq!(rust_vec_iter_rev_collect[1], "foobar");
+ assert_eq!(rust_vec_iter_rev_collect[0], "baz");
+
}
#[test]
fn vector_of_string_store_manual_build() {
@@ -523,6 +599,17 @@
assert_eq!(m.testarrayofstring().unwrap().len(), 2);
assert_eq!(m.testarrayofstring().unwrap().get(0), "foobar");
assert_eq!(m.testarrayofstring().unwrap().get(1), "baz");
+
+ let rust_vec_inst = m.testarrayofstring().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect.len(), 2);
+ assert_eq!(rust_vec_iter_collect[0], "foobar");
+ assert_eq!(rust_vec_iter_collect[1], "baz");
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect.len(), 2);
+ assert_eq!(rust_vec_iter_rev_collect[0], "baz");
+ assert_eq!(rust_vec_iter_rev_collect[1], "foobar");
}
#[test]
fn vector_of_ubyte_store() {
@@ -543,6 +630,13 @@
name: Some(name),
testarrayofbools: Some(v), ..Default::default()});
assert_eq!(m.testarrayofbools().unwrap(), &[false, true, false, true][..]);
+
+ let rust_vec_inst = m.testarrayofbools().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect, &[&false, &true, &false, &true][..]);
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect, &[&true, &false, &true, &false][..]);
}
#[test]
fn vector_of_f64_store() {
@@ -554,6 +648,15 @@
vector_of_doubles: Some(v), ..Default::default()});
assert_eq!(m.vector_of_doubles().unwrap().len(), 1);
assert_eq!(m.vector_of_doubles().unwrap().get(0), 3.14159265359f64);
+
+ let rust_vec_inst = m.vector_of_doubles().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect.len(), 1);
+ assert_eq!(rust_vec_iter_collect[0], 3.14159265359f64);
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect.len(), 1);
+ assert_eq!(rust_vec_iter_rev_collect[0], 3.14159265359f64);
}
#[test]
fn vector_of_struct_store() {
@@ -564,6 +667,13 @@
name: Some(name),
test4: Some(v), ..Default::default()});
assert_eq!(m.test4().unwrap(), &[my_game::example::Test::new(127, -128), my_game::example::Test::new(3, 123)][..]);
+
+ let rust_vec_inst = m.test4().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect, &[&my_game::example::Test::new(127, -128), &my_game::example::Test::new(3, 123)][..]);
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect, &[&my_game::example::Test::new(3, 123), &my_game::example::Test::new(127, -128)][..]);
}
#[test]
fn vector_of_struct_store_with_type_inference() {
@@ -577,19 +687,18 @@
test4: Some(v), ..Default::default()});
assert_eq!(m.test4().unwrap(), &[my_game::example::Test::new(127, -128), my_game::example::Test::new(3, 123), my_game::example::Test::new(100, 101)][..]);
}
- // TODO(rw) this passes, but I don't want to change the monster test schema right now
- // #[test]
- // fn vector_of_enum_store() {
- // let mut b = flatbuffers::FlatBufferBuilder::new();
- // let v = b.create_vector::<my_game::example::Color>(&[my_game::example::Color::Red, my_game::example::Color::Green][..]);
- // let name = b.create_string("foo");
- // let m = build_mon(&mut b, &my_game::example::MonsterArgs{
- // name: Some(name),
- // vector_of_enum: Some(v), ..Default::default()});
- // assert_eq!(m.vector_of_enum().unwrap().len(), 2);
- // assert_eq!(m.vector_of_enum().unwrap().get(0), my_game::example::Color::Red);
- // assert_eq!(m.vector_of_enum().unwrap().get(1), my_game::example::Color::Green);
- // }
+ #[test]
+ fn vector_of_enums_store() {
+ let mut b = flatbuffers::FlatBufferBuilder::new();
+ let v = b.create_vector::<my_game::example::Color>(&[my_game::example::Color::Red, my_game::example::Color::Green][..]);
+ let name = b.create_string("foo");
+ let m = build_mon(&mut b, &my_game::example::MonsterArgs{
+ name: Some(name),
+ vector_of_enums: Some(v), ..Default::default()});
+ assert_eq!(m.vector_of_enums().unwrap().len(), 2);
+ assert_eq!(m.vector_of_enums().unwrap().get(0), my_game::example::Color::Red);
+ assert_eq!(m.vector_of_enums().unwrap().get(1), my_game::example::Color::Green);
+ }
#[test]
fn vector_of_table_store() {
let b = &mut flatbuffers::FlatBufferBuilder::new();
@@ -613,6 +722,21 @@
assert_eq!(m.testarrayoftables().unwrap().get(0).name(), "foo");
assert_eq!(m.testarrayoftables().unwrap().get(1).hp(), 100);
assert_eq!(m.testarrayoftables().unwrap().get(1).name(), "bar");
+
+ let rust_vec_inst = m.testarrayoftables().unwrap();
+ let rust_vec_iter_collect = rust_vec_inst.iter().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_collect.len(), 2);
+ assert_eq!(rust_vec_iter_collect[0].hp(), 55);
+ assert_eq!(rust_vec_iter_collect[0].name(), "foo");
+ assert_eq!(rust_vec_iter_collect[1].hp(), 100);
+ assert_eq!(rust_vec_iter_collect[1].name(), "bar");
+
+ let rust_vec_iter_rev_collect = rust_vec_inst.iter().rev().collect::<Vec<_>>();
+ assert_eq!(rust_vec_iter_rev_collect.len(), 2);
+ assert_eq!(rust_vec_iter_rev_collect[0].hp(), 100);
+ assert_eq!(rust_vec_iter_rev_collect[0].name(), "bar");
+ assert_eq!(rust_vec_iter_rev_collect[1].hp(), 55);
+ assert_eq!(rust_vec_iter_rev_collect[1].name(), "foo");
}
}
@@ -721,6 +845,12 @@
let aln = ::std::mem::align_of::<my_game::example::Ability>();
assert_eq!((a_ptr - start_ptr) % aln, 0);
}
+ for a in abilities.iter().rev() {
+ let a_ptr = a as *const my_game::example::Ability as usize;
+ assert!(a_ptr > start_ptr);
+ let aln = ::std::mem::align_of::<my_game::example::Ability>();
+ assert_eq!((a_ptr - start_ptr) % aln, 0);
+ }
}
}
@@ -765,10 +895,12 @@
assert_eq!(x, back_again);
}
- #[test]
- fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f32 as fn(f32)); }
- #[test]
- fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f64 as fn(f64)); }
+ // TODO(rw): Replace the implementations with the new stdlib endian-conversion functions.
+ // TODO(rw): Re-enable these tests (currently, rare CI failures occur that seem spurious).
+ // #[test]
+ // fn fuzz_f32() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f32 as fn(f32)); }
+ // #[test]
+ // fn fuzz_f64() { quickcheck::QuickCheck::new().max_tests(N).quickcheck(prop_f64 as fn(f64)); }
}
#[cfg(test)]
@@ -806,6 +938,13 @@
result_vec.push(got.get(i));
}
assert_eq!(result_vec, xs);
+
+ let rust_vec_iter = got.iter().collect::<Vec<T>>();
+ assert_eq!(rust_vec_iter, xs);
+
+ let mut rust_vec_rev_iter = got.iter().rev().collect::<Vec<T>>();
+ rust_vec_rev_iter.reverse();
+ assert_eq!(rust_vec_rev_iter, xs);
}
#[test]
@@ -1394,6 +1533,58 @@
}
#[test]
+ fn generated_code_debug_prints_correctly() {
+ let b = &mut flatbuffers::FlatBufferBuilder::new();
+ create_serialized_example_with_generated_code(b);
+ let buf = b.finished_data();
+ serialized_example_is_accessible_and_correct(&buf, true, false).unwrap();
+ let m = super::my_game::example::get_root_as_monster(buf);
+ assert_eq!(
+ format!("{:.5?}", &m),
+ "Monster { pos: Some(Vec3 { x: 1.00000, y: 2.00000, z: 3.00000, \
+ test1: 3.00000, test2: Green, test3: Test { a: 5, b: 6 } }), \
+ mana: 150, hp: 80, name: \"MyMonster\", \
+ inventory: Some([0, 1, 2, 3, 4]), color: Blue, test_type: Monster, \
+ test: Monster { pos: None, mana: 150, hp: 100, name: \"Fred\", \
+ inventory: None, color: Blue, test_type: NONE, test: None, \
+ test4: None, testarrayofstring: None, testarrayoftables: None, \
+ enemy: None, testnestedflatbuffer: None, testempty: None, \
+ testbool: false, testhashs32_fnv1: 0, testhashu32_fnv1: 0, \
+ testhashs64_fnv1: 0, testhashu64_fnv1: 0, testhashs32_fnv1a: 0, \
+ testhashu32_fnv1a: 0, testhashs64_fnv1a: 0, testhashu64_fnv1a: 0, \
+ testarrayofbools: None, testf: 3.14159, testf2: 3.00000, testf3: 0.00000, \
+ testarrayofstring2: None, testarrayofsortedstruct: None, flex: None, \
+ test5: None, vector_of_longs: None, vector_of_doubles: None, \
+ parent_namespace_test: None, vector_of_referrables: None, \
+ single_weak_reference: 0, vector_of_weak_references: None, \
+ vector_of_strong_referrables: None, co_owning_reference: 0, \
+ vector_of_co_owning_references: None, non_owning_reference: 0, \
+ vector_of_non_owning_references: None, any_unique_type: NONE, \
+ any_unique: None, any_ambiguous_type: NONE, any_ambiguous: None, \
+ vector_of_enums: None, signed_enum: None, \
+ testrequirednestedflatbuffer: None }, test4: Some([Test { \
+ a: 10, b: 20 }, Test { a: 30, b: 40 }]), \
+ testarrayofstring: Some([\"test1\", \"test2\"]), \
+ testarrayoftables: None, enemy: None, testnestedflatbuffer: None, \
+ testempty: None, testbool: false, testhashs32_fnv1: 0, \
+ testhashu32_fnv1: 0, testhashs64_fnv1: 0, testhashu64_fnv1: 0, \
+ testhashs32_fnv1a: 0, testhashu32_fnv1a: 0, testhashs64_fnv1a: 0, \
+ testhashu64_fnv1a: 0, testarrayofbools: None, testf: 3.14159, \
+ testf2: 3.00000, testf3: 0.00000, testarrayofstring2: None, \
+ testarrayofsortedstruct: None, flex: None, test5: None, \
+ vector_of_longs: None, vector_of_doubles: None, \
+ parent_namespace_test: None, vector_of_referrables: None, \
+ single_weak_reference: 0, vector_of_weak_references: None, \
+ vector_of_strong_referrables: None, co_owning_reference: 0, \
+ vector_of_co_owning_references: None, non_owning_reference: 0, \
+ vector_of_non_owning_references: None, any_unique_type: NONE, \
+ any_unique: None, any_ambiguous_type: NONE, any_ambiguous: None, \
+ vector_of_enums: None, signed_enum: None, \
+ testrequirednestedflatbuffer: None }"
+ );
+ }
+
+ #[test]
fn generated_code_creates_correct_example_repeatedly_with_reset() {
let b = &mut flatbuffers::FlatBufferBuilder::new();
for _ in 0..100 {
@@ -2281,6 +2472,25 @@
}
#[test]
+ fn layout_09b_vtable_with_one_default_bool_force_defaults() {
+ let mut b = flatbuffers::FlatBufferBuilder::new();
+ check(&b, &[]);
+ let off = b.start_table();
+ check(&b, &[]);
+ b.force_defaults(true);
+ b.push_slot(fi2fo(0), false, false);
+ b.end_table(off);
+ check(&b, &[
+ 6, 0, // vtable bytes
+ 8, 0, // length of object including vtable offset
+ 7, 0, // start of bool value
+ 6, 0, 0, 0, // offset for start of vtable (int32)
+ 0, 0, 0, // padded to 4 bytes
+ 0, // bool value
+ ]);
+ }
+
+ #[test]
fn layout_10_vtable_with_one_int16() {
let mut b = flatbuffers::FlatBufferBuilder::new();
check(&b, &[]);
@@ -2694,6 +2904,33 @@
}
}
+#[cfg(test)]
+mod copy_clone_traits {
+ #[test]
+ fn follow_types_implement_copy_and_clone() {
+ static_assertions::assert_impl_all!(flatbuffers::WIPOffset<u32>: Copy, Clone);
+ static_assertions::assert_impl_all!(flatbuffers::WIPOffset<Vec<u32>>: Copy, Clone);
+
+ static_assertions::assert_impl_all!(flatbuffers::ForwardsUOffset<u32>: Copy, Clone);
+ static_assertions::assert_impl_all!(flatbuffers::ForwardsUOffset<Vec<u32>>: Copy, Clone);
+
+ static_assertions::assert_impl_all!(flatbuffers::Vector<'static, u32>: Copy, Clone);
+ static_assertions::assert_impl_all!(flatbuffers::Vector<'static, Vec<u32>>: Copy, Clone);
+ }
+}
+
+#[cfg(test)]
+mod fully_qualified_name {
+ #[test]
+ fn fully_qualified_name_generated() {
+ assert!(check_eq!(::my_game::example::Monster::get_fully_qualified_name(), "MyGame.Example.Monster").is_ok());
+ assert!(check_eq!(::my_game::example_2::Monster::get_fully_qualified_name(), "MyGame.Example2.Monster").is_ok());
+
+ assert!(check_eq!(::my_game::example::Vec3::get_fully_qualified_name(), "MyGame.Example.Vec3").is_ok());
+ assert!(check_eq!(::my_game::example::Ability::get_fully_qualified_name(), "MyGame.Example.Ability").is_ok());
+ }
+}
+
// this is not technically a test, but we want to always keep this generated
// file up-to-date, and the simplest way to do that is to make sure that when
// tests are run, the file is generated.
@@ -2714,3 +2951,4 @@
f.read_to_end(&mut buf)?;
Ok(buf)
}
+}
diff --git a/tests/rust_usage_test/tests/optional_scalars_test.rs b/tests/rust_usage_test/tests/optional_scalars_test.rs
new file mode 100644
index 0000000..f029d03
--- /dev/null
+++ b/tests/rust_usage_test/tests/optional_scalars_test.rs
@@ -0,0 +1,87 @@
+#[allow(dead_code, unused_imports)]
+#[path = "../../optional_scalars_generated.rs"]
+mod optional_scalars_generated;
+use crate::optional_scalars_generated::optional_scalars::*;
+
+// There are 3 variants of scalars in tables - those specified with default=42,
+// optional scalars, and those with nothing specified (implicitly default=0).
+// This tests that you can read what you write.
+macro_rules! make_test {
+ (
+ $test_name: ident,
+ $just: ident, $default: ident, $maybe: ident,
+ $five: expr, $zero: expr, $fortytwo: expr
+ ) => {
+ #[test]
+ fn $test_name() {
+ let mut builder = flatbuffers::FlatBufferBuilder::new();
+ // Test five makes sense when specified.
+ let ss = ScalarStuff::create(
+ &mut builder,
+ &ScalarStuffArgs {
+ $just: $five,
+ $default: $five,
+ $maybe: Some($five),
+ ..Default::default()
+ },
+ );
+ builder.finish(ss, None);
+
+ let s = flatbuffers::get_root::<ScalarStuff>(builder.finished_data());
+ assert_eq!(s.$just(), $five);
+ assert_eq!(s.$default(), $five);
+ assert_eq!(s.$maybe(), Some($five));
+
+ // Test defaults are used when not specified.
+ let s = flatbuffers::get_root::<ScalarStuff>(&[0; 8]);
+ assert_eq!(s.$just(), $zero);
+ assert_eq!(s.$default(), $fortytwo);
+ assert_eq!(s.$maybe(), None);
+ }
+ };
+}
+
+make_test!(optional_i8, just_i8, default_i8, maybe_i8, 5, 0, 42);
+make_test!(optional_u8, just_u8, default_u8, maybe_u8, 5, 0, 42);
+make_test!(optional_i16, just_i16, default_i16, maybe_i16, 5, 0, 42);
+make_test!(optional_u16, just_u16, default_u16, maybe_u16, 5, 0, 42);
+make_test!(optional_i32, just_i32, default_i32, maybe_i32, 5, 0, 42);
+make_test!(optional_u32, just_u32, default_u32, maybe_u32, 5, 0, 42);
+make_test!(optional_i64, just_i64, default_i64, maybe_i64, 5, 0, 42);
+make_test!(optional_u64, just_u64, default_u64, maybe_u64, 5, 0, 42);
+make_test!(
+ optional_f32,
+ just_f32,
+ default_f32,
+ maybe_f32,
+ 5.0,
+ 0.0,
+ 42.0
+);
+make_test!(
+ optional_f64,
+ just_f64,
+ default_f64,
+ maybe_f64,
+ 5.0,
+ 0.0,
+ 42.0
+);
+make_test!(
+ optional_bool,
+ just_bool,
+ default_bool,
+ maybe_bool,
+ true,
+ false,
+ true
+);
+make_test!(
+ optional_enum,
+ just_enum,
+ default_enum,
+ maybe_enum,
+ OptionalByte::Two,
+ OptionalByte::None,
+ OptionalByte::One
+);
diff --git a/tests/test.cpp b/tests/test.cpp
index 461840c..6afcb74 100644
--- a/tests/test.cpp
+++ b/tests/test.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
#include <cmath>
+
#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h"
#include "flatbuffers/minireflect.h"
@@ -22,7 +23,6 @@
// clang-format off
#ifdef FLATBUFFERS_CPP98_STL
- #include "flatbuffers/stl_emulation.h"
namespace std {
using flatbuffers::unique_ptr;
}
@@ -34,15 +34,18 @@
#include "namespace_test/namespace_test2_generated.h"
#include "union_vector/union_vector_generated.h"
#include "monster_extra_generated.h"
+#include "optional_scalars_generated.h"
#if !defined(_MSC_VER) || _MSC_VER >= 1700
-#include "arrays_test_generated.h"
+# include "arrays_test_generated.h"
+# include "evolution_test/evolution_v1_generated.h"
+# include "evolution_test/evolution_v2_generated.h"
#endif
#include "native_type_test_generated.h"
#include "test_assert.h"
#include "flatbuffers/flexbuffers.h"
-
+#include "monster_test_bfbs_generated.h" // Generated using --bfbs-comments --bfbs-builtins --cpp --bfbs-gen-embed
// clang-format off
// Check that char* and uint8_t* are interoperable types.
@@ -72,7 +75,8 @@
// http://en.wikipedia.org/wiki/Park%E2%80%93Miller_random_number_generator
uint32_t lcg_seed = 48271;
uint32_t lcg_rand() {
- return lcg_seed = (static_cast<uint64_t>(lcg_seed) * 279470273UL) % 4294967291UL;
+ return lcg_seed =
+ (static_cast<uint64_t>(lcg_seed) * 279470273UL) % 4294967291UL;
}
void lcg_reset() { lcg_seed = 48271; }
@@ -200,14 +204,13 @@
auto vecofcolors = builder.CreateVectorScalarCast<uint8_t, Color>(colors, 2);
// shortcut for creating monster with all fields set:
- auto mloc = CreateMonster(builder, &vec, 150, 80, name, inventory, Color_Blue,
- Any_Monster, mlocs[1].Union(), // Store a union.
- 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, testv2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, AnyUniqueAliases_NONE, 0,
- AnyAmbiguousAliases_NONE, 0, vecofcolors);
+ auto mloc = CreateMonster(
+ builder, &vec, 150, 80, name, inventory, Color_Blue, Any_Monster,
+ mlocs[1].Union(), // Store a union.
+ 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, testv2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ AnyUniqueAliases_NONE, 0, AnyAmbiguousAliases_NONE, 0, vecofcolors);
FinishMonsterBuffer(builder, mloc);
@@ -339,8 +342,9 @@
// Example of accessing a vector of tables:
auto vecoftables = monster->testarrayoftables();
TEST_EQ(vecoftables->size(), 3U);
- for (auto it = vecoftables->begin(); it != vecoftables->end(); ++it)
+ for (auto it = vecoftables->begin(); it != vecoftables->end(); ++it) {
TEST_EQ(strlen(it->name()->c_str()) >= 4, true);
+ }
TEST_EQ_STR(vecoftables->Get(0)->name()->c_str(), "Barney");
TEST_EQ(vecoftables->Get(0)->hp(), 1000);
TEST_EQ_STR(vecoftables->Get(1)->name()->c_str(), "Fred");
@@ -566,8 +570,7 @@
// Create size prefixed buffer.
flatbuffers::FlatBufferBuilder fbb;
FinishSizePrefixedMonsterBuffer(
- fbb,
- CreateMonster(fbb, 0, 200, 300, fbb.CreateString("bob")));
+ fbb, CreateMonster(fbb, 0, 200, 300, fbb.CreateString("bob")));
// Verify it.
flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());
@@ -597,7 +600,8 @@
// load FlatBuffer schema (.fbs) from disk
std::string schemafile;
TEST_EQ(flatbuffers::LoadFile((test_data_path + "monster_test.fbs").c_str(),
- false, &schemafile), true);
+ false, &schemafile),
+ true);
// parse schema first, so we can use it to parse the data after
flatbuffers::Parser parser;
auto include_test_path =
@@ -647,6 +651,19 @@
auto result = GenerateText(parser, builder.GetBufferPointer(), &jsongen);
TEST_EQ(result, true);
TEST_EQ(std::string::npos != jsongen.find("color: \"Red Blue\""), true);
+ // Test forward compatibility with 'output_enum_identifiers = true'.
+ // Current Color doesn't have '(1u << 2)' field, let's add it.
+ builder.Clear();
+ std::string future_json;
+ auto future_name = builder.CreateString("future bitflag_enum");
+ MonsterBuilder future_color(builder);
+ future_color.add_name(future_name);
+ future_color.add_color(
+ static_cast<Color>((1u << 2) | Color_Blue | Color_Red));
+ FinishMonsterBuffer(builder, future_color.Finish());
+ result = GenerateText(parser, builder.GetBufferPointer(), &future_json);
+ TEST_EQ(result, true);
+ TEST_EQ(std::string::npos != future_json.find("color: 13"), true);
}
#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)
@@ -661,12 +678,23 @@
std::memcpy(&b, &v, sizeof(T));
return ((b & qnan_base) == qnan_base);
}
+#if defined(__mips__) || defined(__hppa__)
+static bool is_quiet_nan(float v) {
+ return is_quiet_nan_impl<float, uint32_t, 0x7FC00000u>(v) ||
+ is_quiet_nan_impl<float, uint32_t, 0x7FBFFFFFu>(v);
+}
+static bool is_quiet_nan(double v) {
+ return is_quiet_nan_impl<double, uint64_t, 0x7FF8000000000000ul>(v) ||
+ is_quiet_nan_impl<double, uint64_t, 0x7FF7FFFFFFFFFFFFu>(v);
+}
+#else
static bool is_quiet_nan(float v) {
return is_quiet_nan_impl<float, uint32_t, 0x7FC00000u>(v);
}
static bool is_quiet_nan(double v) {
return is_quiet_nan_impl<double, uint64_t, 0x7FF8000000000000ul>(v);
}
+#endif
void TestMonsterExtraFloats() {
TEST_EQ(is_quiet_nan(1.0), false);
@@ -770,7 +798,7 @@
true);
auto include_test_path =
- flatbuffers::ConCatPathFileName(test_data_path, "include_test");
+ flatbuffers::ConCatPathFileName(test_data_path, "include_test");
const char *include_directories[] = { test_data_path.c_str(),
include_test_path.c_str(), nullptr };
@@ -781,8 +809,10 @@
reinterpret_cast<const uint8_t *>(schemafile.c_str()),
schemafile.size());
TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);
- //auto schema = reflection::GetSchema(schemafile.c_str());
- TEST_EQ(parser.Deserialize((const uint8_t *)schemafile.c_str(), schemafile.size()), true);
+ // auto schema = reflection::GetSchema(schemafile.c_str());
+ TEST_EQ(parser.Deserialize((const uint8_t *)schemafile.c_str(),
+ schemafile.size()),
+ true);
} else {
TEST_EQ(parser.Parse(schemafile.c_str(), include_directories), true);
}
@@ -870,6 +900,7 @@
TEST_EQ_STR(hp_field.name()->c_str(), "hp");
TEST_EQ(hp_field.id(), 2);
TEST_EQ(hp_field.type()->base_type(), reflection::Short);
+
auto friendly_field_ptr = fields->LookupByKey("friendly");
TEST_NOTNULL(friendly_field_ptr);
TEST_NOTNULL(friendly_field_ptr->attributes());
@@ -883,6 +914,12 @@
TEST_NOTNULL(pos_table_ptr);
TEST_EQ_STR(pos_table_ptr->name()->c_str(), "MyGame.Example.Vec3");
+ // Test nullability of fields: hp is a 0-default scalar, pos is a struct =>
+ // optional, and name is a required string => not optional.
+ TEST_EQ(hp_field.optional(), false);
+ TEST_EQ(pos_field_ptr->optional(), true);
+ TEST_EQ(fields->LookupByKey("name")->optional(), false);
+
// Now use it to dynamically access a buffer.
auto &root = *flatbuffers::GetAnyRoot(flatbuf);
@@ -1028,7 +1065,8 @@
}
void MiniReflectFlatBuffersTest(uint8_t *flatbuf) {
- auto s = flatbuffers::FlatBufferToString(flatbuf, Monster::MiniReflectTypeTable());
+ auto s =
+ flatbuffers::FlatBufferToString(flatbuf, Monster::MiniReflectTypeTable());
TEST_EQ_STR(
s.c_str(),
"{ "
@@ -1059,15 +1097,39 @@
"}");
Test test(16, 32);
- Vec3 vec(1,2,3, 1.5, Color_Red, test);
+ Vec3 vec(1, 2, 3, 1.5, Color_Red, test);
flatbuffers::FlatBufferBuilder vec_builder;
vec_builder.Finish(vec_builder.CreateStruct(vec));
auto vec_buffer = vec_builder.Release();
auto vec_str = flatbuffers::FlatBufferToString(vec_buffer.data(),
Vec3::MiniReflectTypeTable());
+ TEST_EQ_STR(vec_str.c_str(),
+ "{ x: 1.0, y: 2.0, z: 3.0, test1: 1.5, test2: Red, test3: { a: "
+ "16, b: 32 } }");
+}
+
+void MiniReflectFixedLengthArrayTest() {
+ // VS10 does not support typed enums, exclude from tests
+#if !defined(_MSC_VER) || _MSC_VER >= 1700
+ flatbuffers::FlatBufferBuilder fbb;
+ MyGame::Example::ArrayStruct aStruct(2, 12, 1);
+ auto aTable = MyGame::Example::CreateArrayTable(fbb, &aStruct);
+ fbb.Finish(aTable);
+
+ auto flatbuf = fbb.Release();
+ auto s = flatbuffers::FlatBufferToString(
+ flatbuf.data(), MyGame::Example::ArrayTableTypeTable());
TEST_EQ_STR(
- vec_str.c_str(),
- "{ x: 1.0, y: 2.0, z: 3.0, test1: 1.5, test2: Red, test3: { a: 16, b: 32 } }");
+ "{ "
+ "a: { a: 2.0, "
+ "b: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "
+ "c: 12, "
+ "d: [ { a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] }, "
+ "{ a: [ 0, 0 ], b: A, c: [ A, A ], d: [ 0, 0 ] } ], "
+ "e: 1, f: [ 0, 0 ] } "
+ "}",
+ s.c_str());
+#endif
}
// Parse a .proto schema, output as .fbs
@@ -1084,11 +1146,10 @@
flatbuffers::LoadFile((test_data_path + "prototest/test.golden").c_str(),
false, &goldenfile),
true);
- TEST_EQ(
- flatbuffers::LoadFile((test_data_path +
- "prototest/test_union.golden").c_str(),
- false, &goldenunionfile),
- true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/test_union.golden").c_str(), false,
+ &goldenunionfile),
+ true);
flatbuffers::IDLOptions opts;
opts.include_dependence_headers = false;
@@ -1122,6 +1183,124 @@
TEST_EQ_STR(fbs_union.c_str(), goldenunionfile.c_str());
}
+// Parse a .proto schema, output as .fbs
+void ParseProtoTestWithSuffix() {
+ // load the .proto and the golden file from disk
+ std::string protofile;
+ std::string goldenfile;
+ std::string goldenunionfile;
+ TEST_EQ(
+ flatbuffers::LoadFile((test_data_path + "prototest/test.proto").c_str(),
+ false, &protofile),
+ true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/test_suffix.golden").c_str(), false,
+ &goldenfile),
+ true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/test_union_suffix.golden").c_str(),
+ false, &goldenunionfile),
+ true);
+
+ flatbuffers::IDLOptions opts;
+ opts.include_dependence_headers = false;
+ opts.proto_mode = true;
+ opts.proto_namespace_suffix = "test_namespace_suffix";
+
+ // Parse proto.
+ flatbuffers::Parser parser(opts);
+ auto protopath = test_data_path + "prototest/";
+ const char *include_directories[] = { protopath.c_str(), nullptr };
+ TEST_EQ(parser.Parse(protofile.c_str(), include_directories), true);
+
+ // Generate fbs.
+ auto fbs = flatbuffers::GenerateFBS(parser, "test");
+
+ // Ensure generated file is parsable.
+ flatbuffers::Parser parser2;
+ TEST_EQ(parser2.Parse(fbs.c_str(), nullptr), true);
+ TEST_EQ_STR(fbs.c_str(), goldenfile.c_str());
+
+ // Parse proto with --oneof-union option.
+ opts.proto_oneof_union = true;
+ flatbuffers::Parser parser3(opts);
+ TEST_EQ(parser3.Parse(protofile.c_str(), include_directories), true);
+
+ // Generate fbs.
+ auto fbs_union = flatbuffers::GenerateFBS(parser3, "test");
+
+ // Ensure generated file is parsable.
+ flatbuffers::Parser parser4;
+ TEST_EQ(parser4.Parse(fbs_union.c_str(), nullptr), true);
+ TEST_EQ_STR(fbs_union.c_str(), goldenunionfile.c_str());
+}
+
+// Parse a .proto schema, output as .fbs
+void ParseProtoTestWithIncludes() {
+ // load the .proto and the golden file from disk
+ std::string protofile;
+ std::string goldenfile;
+ std::string goldenunionfile;
+ std::string importprotofile;
+ TEST_EQ(
+ flatbuffers::LoadFile((test_data_path + "prototest/test.proto").c_str(),
+ false, &protofile),
+ true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/imported.proto").c_str(), false,
+ &importprotofile),
+ true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/test_include.golden").c_str(), false,
+ &goldenfile),
+ true);
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "prototest/test_union_include.golden").c_str(),
+ false, &goldenunionfile),
+ true);
+
+ flatbuffers::IDLOptions opts;
+ opts.include_dependence_headers = true;
+ opts.proto_mode = true;
+
+ // Parse proto.
+ flatbuffers::Parser parser(opts);
+ auto protopath = test_data_path + "prototest/";
+ const char *include_directories[] = { protopath.c_str(), nullptr };
+ TEST_EQ(parser.Parse(protofile.c_str(), include_directories), true);
+
+ // Generate fbs.
+ auto fbs = flatbuffers::GenerateFBS(parser, "test");
+
+ // Generate fbs from import.proto
+ flatbuffers::Parser import_parser(opts);
+ TEST_EQ(import_parser.Parse(importprotofile.c_str(), include_directories),
+ true);
+ auto import_fbs = flatbuffers::GenerateFBS(import_parser, "test");
+
+ // Ensure generated file is parsable.
+ flatbuffers::Parser parser2;
+ TEST_EQ(
+ parser2.Parse(import_fbs.c_str(), include_directories, "imported.fbs"),
+ true);
+ TEST_EQ(parser2.Parse(fbs.c_str(), nullptr), true);
+ TEST_EQ_STR(fbs.c_str(), goldenfile.c_str());
+
+ // Parse proto with --oneof-union option.
+ opts.proto_oneof_union = true;
+ flatbuffers::Parser parser3(opts);
+ TEST_EQ(parser3.Parse(protofile.c_str(), include_directories), true);
+
+ // Generate fbs.
+ auto fbs_union = flatbuffers::GenerateFBS(parser3, "test");
+
+ // Ensure generated file is parsable.
+ flatbuffers::Parser parser4;
+ TEST_EQ(parser4.Parse(import_fbs.c_str(), nullptr, "imported.fbs"), true);
+ TEST_EQ(parser4.Parse(fbs_union.c_str(), nullptr), true);
+ TEST_EQ_STR(fbs_union.c_str(), goldenunionfile.c_str());
+}
+
template<typename T>
void CompareTableFieldValue(flatbuffers::Table *table,
flatbuffers::voffset_t voffset, T val) {
@@ -1389,7 +1568,7 @@
break;
}
}
- TEST_NOTNULL(NULL);
+ TEST_NOTNULL(nullptr); //-V501 (this comment supresses CWE-570 warning)
}
// clang-format off
@@ -1412,7 +1591,7 @@
("parser.Parse(\"" + std::string(src) + "\")").c_str(), file, line,
func);
} else if (!strstr(parser.error_.c_str(), error_substr)) {
- TestFail(parser.error_.c_str(), error_substr,
+ TestFail(error_substr, parser.error_.c_str(),
("parser.Parse(\"" + std::string(src) + "\")").c_str(), file, line,
func);
}
@@ -1468,7 +1647,7 @@
TestError("enum X:byte { Y } enum X {", "enum already");
TestError("enum X:float {}", "underlying");
TestError("enum X:byte { Y, Y }", "value already");
- TestError("enum X:byte { Y=2, Z=1 }", "ascending");
+ TestError("enum X:byte { Y=2, Z=2 }", "unique");
TestError("table X { Y:int; } table X {", "datatype already");
TestError("struct X (force_align: 7) { Y:int; }", "force_align");
TestError("struct X {}", "size 0");
@@ -1486,6 +1665,11 @@
TestError("table X { Y:int; } root_type X; { Y:1.0 }", "float");
TestError("table X { Y:bool; } root_type X; { Y:1.0 }", "float");
TestError("enum X:bool { Y = true }", "must be integral");
+ // Array of non-scalar
+ TestError("table X { x:int; } struct Y { y:[X:2]; }",
+ "may contain only scalar or struct fields");
+ // Non-snake case field names
+ TestError("table X { Y: int; } root_type Y: {Y:1.0}", "snake_case");
}
template<typename T>
@@ -1497,7 +1681,7 @@
if (check_default) { parser.opts.output_default_scalars_in_json = true; }
// Simple schema.
std::string schema = std::string(decls ? decls : "") + "\n" +
- "table X { Y:" + std::string(type_name) +
+ "table X { y:" + std::string(type_name) +
"; } root_type X;";
auto schema_done = parser.Parse(schema.c_str());
TEST_EQ_STR(parser.error_.c_str(), "");
@@ -1525,47 +1709,46 @@
// Additional parser testing not covered elsewhere.
void ValueTest() {
// Test scientific notation numbers.
- TEST_EQ(FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"),
- 3.14159f),
- true);
+ TEST_EQ(
+ FloatCompare(TestValue<float>("{ y:0.0314159e+2 }", "float"), 3.14159f),
+ true);
// number in string
- TEST_EQ(FloatCompare(TestValue<float>("{ Y:\"0.0314159e+2\" }", "float"),
+ TEST_EQ(FloatCompare(TestValue<float>("{ y:\"0.0314159e+2\" }", "float"),
3.14159f),
true);
// Test conversion functions.
- TEST_EQ(FloatCompare(TestValue<float>("{ Y:cos(rad(180)) }", "float"), -1),
+ TEST_EQ(FloatCompare(TestValue<float>("{ y:cos(rad(180)) }", "float"), -1),
true);
// int embedded to string
- TEST_EQ(TestValue<int>("{ Y:\"-876\" }", "int=-123"), -876);
- TEST_EQ(TestValue<int>("{ Y:\"876\" }", "int=-123"), 876);
+ TEST_EQ(TestValue<int>("{ y:\"-876\" }", "int=-123"), -876);
+ TEST_EQ(TestValue<int>("{ y:\"876\" }", "int=-123"), 876);
// Test negative hex constant.
- TEST_EQ(TestValue<int>("{ Y:-0x8ea0 }", "int=-0x8ea0"), -36512);
+ TEST_EQ(TestValue<int>("{ y:-0x8ea0 }", "int=-0x8ea0"), -36512);
TEST_EQ(TestValue<int>(nullptr, "int=-0x8ea0"), -36512);
// positive hex constant
- TEST_EQ(TestValue<int>("{ Y:0x1abcdef }", "int=0x1"), 0x1abcdef);
+ TEST_EQ(TestValue<int>("{ y:0x1abcdef }", "int=0x1"), 0x1abcdef);
// with optional '+' sign
- TEST_EQ(TestValue<int>("{ Y:+0x1abcdef }", "int=+0x1"), 0x1abcdef);
+ TEST_EQ(TestValue<int>("{ y:+0x1abcdef }", "int=+0x1"), 0x1abcdef);
// hex in string
- TEST_EQ(TestValue<int>("{ Y:\"0x1abcdef\" }", "int=+0x1"), 0x1abcdef);
+ TEST_EQ(TestValue<int>("{ y:\"0x1abcdef\" }", "int=+0x1"), 0x1abcdef);
// Make sure we do unsigned 64bit correctly.
- TEST_EQ(TestValue<uint64_t>("{ Y:12335089644688340133 }", "ulong"),
+ TEST_EQ(TestValue<uint64_t>("{ y:12335089644688340133 }", "ulong"),
12335089644688340133ULL);
// bool in string
- TEST_EQ(TestValue<bool>("{ Y:\"false\" }", "bool=true"), false);
- TEST_EQ(TestValue<bool>("{ Y:\"true\" }", "bool=\"true\""), true);
- TEST_EQ(TestValue<bool>("{ Y:'false' }", "bool=true"), false);
- TEST_EQ(TestValue<bool>("{ Y:'true' }", "bool=\"true\""), true);
+ TEST_EQ(TestValue<bool>("{ y:\"false\" }", "bool=true"), false);
+ TEST_EQ(TestValue<bool>("{ y:\"true\" }", "bool=\"true\""), true);
+ TEST_EQ(TestValue<bool>("{ y:'false' }", "bool=true"), false);
+ TEST_EQ(TestValue<bool>("{ y:'true' }", "bool=\"true\""), true);
// check comments before and after json object
- TEST_EQ(TestValue<int>("/*before*/ { Y:1 } /*after*/", "int"), 1);
- TEST_EQ(TestValue<int>("//before \n { Y:1 } //after", "int"), 1);
-
+ TEST_EQ(TestValue<int>("/*before*/ { y:1 } /*after*/", "int"), 1);
+ TEST_EQ(TestValue<int>("//before \n { y:1 } //after", "int"), 1);
}
void NestedListTest() {
@@ -1607,8 +1790,8 @@
// For details see C++17 standard or explanation on the SO:
// stackoverflow.com/questions/18195312/what-happens-if-you-static-cast-invalid-value-to-enum-class
TEST_EQ_STR("", EnumNameColor(static_cast<Color>(0)));
- TEST_EQ_STR("", EnumNameColor(static_cast<Color>(Color_ANY-1)));
- TEST_EQ_STR("", EnumNameColor(static_cast<Color>(Color_ANY+1)));
+ TEST_EQ_STR("", EnumNameColor(static_cast<Color>(Color_ANY - 1)));
+ TEST_EQ_STR("", EnumNameColor(static_cast<Color>(Color_ANY + 1)));
}
void EnumOutOfRangeTest() {
@@ -1618,9 +1801,7 @@
TestError("enum X:ubyte { Y = -1 }", "enum value does not fit");
TestError("enum X:ubyte { Y = 256 }", "enum value does not fit");
TestError("enum X:ubyte { Y = 255, Z }", "enum value does not fit");
- // Unions begin with an implicit "NONE = 0".
- TestError("table Y{} union X { Y = -1 }",
- "enum values must be specified in ascending order");
+ TestError("table Y{} union X { Y = -1 }", "enum value does not fit");
TestError("table Y{} union X { Y = 256 }", "enum value does not fit");
TestError("table Y{} union X { Y = 255, Z:Y }", "enum value does not fit");
TestError("enum X:int { Y = -2147483649 }", "enum value does not fit");
@@ -1628,27 +1809,29 @@
TestError("enum X:uint { Y = -1 }", "enum value does not fit");
TestError("enum X:uint { Y = 4294967297 }", "enum value does not fit");
TestError("enum X:long { Y = 9223372036854775808 }", "does not fit");
- TestError("enum X:long { Y = 9223372036854775807, Z }", "enum value does not fit");
+ TestError("enum X:long { Y = 9223372036854775807, Z }",
+ "enum value does not fit");
TestError("enum X:ulong { Y = -1 }", "does not fit");
TestError("enum X:ubyte (bit_flags) { Y=8 }", "bit flag out");
- TestError("enum X:byte (bit_flags) { Y=7 }", "must be unsigned"); // -128
+ TestError("enum X:byte (bit_flags) { Y=7 }", "must be unsigned"); // -128
// bit_flgs out of range
- TestError("enum X:ubyte (bit_flags) { Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8 }", "out of range");
+ TestError("enum X:ubyte (bit_flags) { Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8 }",
+ "out of range");
}
void EnumValueTest() {
- // json: "{ Y:0 }", schema: table X { Y : "E"}
+ // json: "{ Y:0 }", schema: table X { y: "E"}
// 0 in enum (V=0) E then Y=0 is valid.
- TEST_EQ(TestValue<int>("{ Y:0 }", "E", "enum E:int { V }"), 0);
- TEST_EQ(TestValue<int>("{ Y:V }", "E", "enum E:int { V }"), 0);
+ TEST_EQ(TestValue<int>("{ y:0 }", "E", "enum E:int { V }"), 0);
+ TEST_EQ(TestValue<int>("{ y:V }", "E", "enum E:int { V }"), 0);
// A default value of Y is 0.
TEST_EQ(TestValue<int>("{ }", "E", "enum E:int { V }"), 0);
- TEST_EQ(TestValue<int>("{ Y:5 }", "E=V", "enum E:int { V=5 }"), 5);
+ TEST_EQ(TestValue<int>("{ y:5 }", "E=V", "enum E:int { V=5 }"), 5);
// Generate json with defaults and check.
TEST_EQ(TestValue<int>(nullptr, "E=V", "enum E:int { V=5 }"), 5);
// 5 in enum
- TEST_EQ(TestValue<int>("{ Y:5 }", "E", "enum E:int { Z, V=5 }"), 5);
- TEST_EQ(TestValue<int>("{ Y:5 }", "E=V", "enum E:int { Z, V=5 }"), 5);
+ TEST_EQ(TestValue<int>("{ y:5 }", "E", "enum E:int { Z, V=5 }"), 5);
+ TEST_EQ(TestValue<int>("{ y:5 }", "E=V", "enum E:int { Z, V=5 }"), 5);
// Generate json with defaults and check.
TEST_EQ(TestValue<int>(nullptr, "E", "enum E:int { Z, V=5 }"), 0);
TEST_EQ(TestValue<int>(nullptr, "E=V", "enum E:int { Z, V=5 }"), 5);
@@ -1660,7 +1843,9 @@
"enum E:ulong { V = 18446744073709551615 }"),
18446744073709551615ULL);
// Assign non-enum value to enum field. Is it right?
- TEST_EQ(TestValue<int>("{ Y:7 }", "E", "enum E:int { V = 0 }"), 7);
+ TEST_EQ(TestValue<int>("{ y:7 }", "E", "enum E:int { V = 0 }"), 7);
+ // Check that non-ascending values are valid.
+ TEST_EQ(TestValue<int>("{ y:5 }", "E=V", "enum E:int { Z=10, V=5 }"), 5);
}
void IntegerOutOfRangeTest() {
@@ -1733,11 +1918,12 @@
void IntegerBoundaryTest() {
// Check numerical compatibility with non-C++ languages.
- // By the C++ standard, std::numerical_limits<int64_t>::min() == -9223372036854775807 (-2^63+1) or less*
- // The Flatbuffers grammar and most of the languages (C#, Java, Rust) expect
- // that minimum values are: -128, -32768,.., -9223372036854775808.
- // Since C++20, static_cast<int64>(0x8000000000000000ULL) is well-defined two's complement cast.
- // Therefore -9223372036854775808 should be valid negative value.
+ // By the C++ standard, std::numerical_limits<int64_t>::min() ==
+ // -9223372036854775807 (-2^63+1) or less* The Flatbuffers grammar and most of
+ // the languages (C#, Java, Rust) expect that minimum values are: -128,
+ // -32768,.., -9223372036854775808. Since C++20,
+ // static_cast<int64>(0x8000000000000000ULL) is well-defined two's complement
+ // cast. Therefore -9223372036854775808 should be valid negative value.
TEST_EQ(flatbuffers::numeric_limits<int8_t>::min(), -128);
TEST_EQ(flatbuffers::numeric_limits<int8_t>::max(), 127);
TEST_EQ(flatbuffers::numeric_limits<int16_t>::min(), -32768);
@@ -1753,26 +1939,26 @@
TEST_EQ(flatbuffers::numeric_limits<uint64_t>::max(),
18446744073709551615ULL);
- TEST_EQ(TestValue<int8_t>("{ Y:127 }", "byte"), 127);
- TEST_EQ(TestValue<int8_t>("{ Y:-128 }", "byte"), -128);
- TEST_EQ(TestValue<uint8_t>("{ Y:255 }", "ubyte"), 255);
- TEST_EQ(TestValue<uint8_t>("{ Y:0 }", "ubyte"), 0);
- TEST_EQ(TestValue<int16_t>("{ Y:32767 }", "short"), 32767);
- TEST_EQ(TestValue<int16_t>("{ Y:-32768 }", "short"), -32768);
- TEST_EQ(TestValue<uint16_t>("{ Y:65535 }", "ushort"), 65535);
- TEST_EQ(TestValue<uint16_t>("{ Y:0 }", "ushort"), 0);
- TEST_EQ(TestValue<int32_t>("{ Y:2147483647 }", "int"), 2147483647);
- TEST_EQ(TestValue<int32_t>("{ Y:-2147483648 }", "int") + 1, -2147483647);
- TEST_EQ(TestValue<uint32_t>("{ Y:4294967295 }", "uint"), 4294967295);
- TEST_EQ(TestValue<uint32_t>("{ Y:0 }", "uint"), 0);
- TEST_EQ(TestValue<int64_t>("{ Y:9223372036854775807 }", "long"),
+ TEST_EQ(TestValue<int8_t>("{ y:127 }", "byte"), 127);
+ TEST_EQ(TestValue<int8_t>("{ y:-128 }", "byte"), -128);
+ TEST_EQ(TestValue<uint8_t>("{ y:255 }", "ubyte"), 255);
+ TEST_EQ(TestValue<uint8_t>("{ y:0 }", "ubyte"), 0);
+ TEST_EQ(TestValue<int16_t>("{ y:32767 }", "short"), 32767);
+ TEST_EQ(TestValue<int16_t>("{ y:-32768 }", "short"), -32768);
+ TEST_EQ(TestValue<uint16_t>("{ y:65535 }", "ushort"), 65535);
+ TEST_EQ(TestValue<uint16_t>("{ y:0 }", "ushort"), 0);
+ TEST_EQ(TestValue<int32_t>("{ y:2147483647 }", "int"), 2147483647);
+ TEST_EQ(TestValue<int32_t>("{ y:-2147483648 }", "int") + 1, -2147483647);
+ TEST_EQ(TestValue<uint32_t>("{ y:4294967295 }", "uint"), 4294967295);
+ TEST_EQ(TestValue<uint32_t>("{ y:0 }", "uint"), 0);
+ TEST_EQ(TestValue<int64_t>("{ y:9223372036854775807 }", "long"),
9223372036854775807LL);
- TEST_EQ(TestValue<int64_t>("{ Y:-9223372036854775808 }", "long") + 1LL,
+ TEST_EQ(TestValue<int64_t>("{ y:-9223372036854775808 }", "long") + 1LL,
-9223372036854775807LL);
- TEST_EQ(TestValue<uint64_t>("{ Y:18446744073709551615 }", "ulong"),
+ TEST_EQ(TestValue<uint64_t>("{ y:18446744073709551615 }", "ulong"),
18446744073709551615ULL);
- TEST_EQ(TestValue<uint64_t>("{ Y:0 }", "ulong"), 0);
- TEST_EQ(TestValue<uint64_t>("{ Y: 18446744073709551615 }", "uint64"),
+ TEST_EQ(TestValue<uint64_t>("{ y:0 }", "ulong"), 0);
+ TEST_EQ(TestValue<uint64_t>("{ y: 18446744073709551615 }", "uint64"),
18446744073709551615ULL);
// check that the default works
TEST_EQ(TestValue<uint64_t>(nullptr, "uint64 = 18446744073709551615"),
@@ -1781,77 +1967,77 @@
void ValidFloatTest() {
// check rounding to infinity
- TEST_EQ(TestValue<float>("{ Y:+3.4029e+38 }", "float"), +infinityf);
- TEST_EQ(TestValue<float>("{ Y:-3.4029e+38 }", "float"), -infinityf);
- TEST_EQ(TestValue<double>("{ Y:+1.7977e+308 }", "double"), +infinityd);
- TEST_EQ(TestValue<double>("{ Y:-1.7977e+308 }", "double"), -infinityd);
+ TEST_EQ(TestValue<float>("{ y:+3.4029e+38 }", "float"), +infinityf);
+ TEST_EQ(TestValue<float>("{ y:-3.4029e+38 }", "float"), -infinityf);
+ TEST_EQ(TestValue<double>("{ y:+1.7977e+308 }", "double"), +infinityd);
+ TEST_EQ(TestValue<double>("{ y:-1.7977e+308 }", "double"), -infinityd);
TEST_EQ(
- FloatCompare(TestValue<float>("{ Y:0.0314159e+2 }", "float"), 3.14159f),
+ FloatCompare(TestValue<float>("{ y:0.0314159e+2 }", "float"), 3.14159f),
true);
// float in string
- TEST_EQ(FloatCompare(TestValue<float>("{ Y:\" 0.0314159e+2 \" }", "float"),
+ TEST_EQ(FloatCompare(TestValue<float>("{ y:\" 0.0314159e+2 \" }", "float"),
3.14159f),
true);
- TEST_EQ(TestValue<float>("{ Y:1 }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:1.0 }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:1. }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:+1. }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:-1. }", "float"), -1.0f);
- TEST_EQ(TestValue<float>("{ Y:1.e0 }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:1.e+0 }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:1.e-0 }", "float"), 1.0f);
- TEST_EQ(TestValue<float>("{ Y:0.125 }", "float"), 0.125f);
- TEST_EQ(TestValue<float>("{ Y:.125 }", "float"), 0.125f);
- TEST_EQ(TestValue<float>("{ Y:-.125 }", "float"), -0.125f);
- TEST_EQ(TestValue<float>("{ Y:+.125 }", "float"), +0.125f);
- TEST_EQ(TestValue<float>("{ Y:5 }", "float"), 5.0f);
- TEST_EQ(TestValue<float>("{ Y:\"5\" }", "float"), 5.0f);
+ TEST_EQ(TestValue<float>("{ y:1 }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:1.0 }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:1. }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:+1. }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:-1. }", "float"), -1.0f);
+ TEST_EQ(TestValue<float>("{ y:1.e0 }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:1.e+0 }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:1.e-0 }", "float"), 1.0f);
+ TEST_EQ(TestValue<float>("{ y:0.125 }", "float"), 0.125f);
+ TEST_EQ(TestValue<float>("{ y:.125 }", "float"), 0.125f);
+ TEST_EQ(TestValue<float>("{ y:-.125 }", "float"), -0.125f);
+ TEST_EQ(TestValue<float>("{ y:+.125 }", "float"), +0.125f);
+ TEST_EQ(TestValue<float>("{ y:5 }", "float"), 5.0f);
+ TEST_EQ(TestValue<float>("{ y:\"5\" }", "float"), 5.0f);
- #if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)
+#if defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0)
// Old MSVC versions may have problem with this check.
// https://www.exploringbinary.com/visual-c-plus-plus-strtod-still-broken/
- TEST_EQ(TestValue<double>("{ Y:6.9294956446009195e15 }", "double"),
- 6929495644600920.0);
+ TEST_EQ(TestValue<double>("{ y:6.9294956446009195e15 }", "double"),
+ 6929495644600920.0);
// check nan's
- TEST_EQ(std::isnan(TestValue<double>("{ Y:nan }", "double")), true);
- TEST_EQ(std::isnan(TestValue<float>("{ Y:nan }", "float")), true);
- TEST_EQ(std::isnan(TestValue<float>("{ Y:\"nan\" }", "float")), true);
- TEST_EQ(std::isnan(TestValue<float>("{ Y:+nan }", "float")), true);
- TEST_EQ(std::isnan(TestValue<float>("{ Y:-nan }", "float")), true);
+ TEST_EQ(std::isnan(TestValue<double>("{ y:nan }", "double")), true);
+ TEST_EQ(std::isnan(TestValue<float>("{ y:nan }", "float")), true);
+ TEST_EQ(std::isnan(TestValue<float>("{ y:\"nan\" }", "float")), true);
+ TEST_EQ(std::isnan(TestValue<float>("{ y:+nan }", "float")), true);
+ TEST_EQ(std::isnan(TestValue<float>("{ y:-nan }", "float")), true);
TEST_EQ(std::isnan(TestValue<float>(nullptr, "float=nan")), true);
TEST_EQ(std::isnan(TestValue<float>(nullptr, "float=-nan")), true);
// check inf
- TEST_EQ(TestValue<float>("{ Y:inf }", "float"), infinityf);
- TEST_EQ(TestValue<float>("{ Y:\"inf\" }", "float"), infinityf);
- TEST_EQ(TestValue<float>("{ Y:+inf }", "float"), infinityf);
- TEST_EQ(TestValue<float>("{ Y:-inf }", "float"), -infinityf);
+ TEST_EQ(TestValue<float>("{ y:inf }", "float"), infinityf);
+ TEST_EQ(TestValue<float>("{ y:\"inf\" }", "float"), infinityf);
+ TEST_EQ(TestValue<float>("{ y:+inf }", "float"), infinityf);
+ TEST_EQ(TestValue<float>("{ y:-inf }", "float"), -infinityf);
TEST_EQ(TestValue<float>(nullptr, "float=inf"), infinityf);
TEST_EQ(TestValue<float>(nullptr, "float=-inf"), -infinityf);
TestValue<double>(
- "{ Y : [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, "
+ "{ y: [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, "
"3.0e2] }",
"[double]");
TestValue<float>(
- "{ Y : [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, "
+ "{ y: [0.2, .2, 1.0, -1.0, -2., 2., 1e0, -1e0, 1.0e0, -1.0e0, -3.e2, "
"3.0e2] }",
"[float]");
// Test binary format of float point.
// https://en.cppreference.com/w/cpp/language/floating_literal
// 0x11.12p-1 = (1*16^1 + 2*16^0 + 3*16^-1 + 4*16^-2) * 2^-1 =
- TEST_EQ(TestValue<double>("{ Y:0x12.34p-1 }", "double"), 9.1015625);
+ TEST_EQ(TestValue<double>("{ y:0x12.34p-1 }", "double"), 9.1015625);
// hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
- TEST_EQ(TestValue<float>("{ Y:-0x0.2p0 }", "float"), -0.125f);
- TEST_EQ(TestValue<float>("{ Y:-0x.2p1 }", "float"), -0.25f);
- TEST_EQ(TestValue<float>("{ Y:0x1.2p3 }", "float"), 9.0f);
- TEST_EQ(TestValue<float>("{ Y:0x10.1p0 }", "float"), 16.0625f);
- TEST_EQ(TestValue<double>("{ Y:0x1.2p3 }", "double"), 9.0);
- TEST_EQ(TestValue<double>("{ Y:0x10.1p0 }", "double"), 16.0625);
- TEST_EQ(TestValue<double>("{ Y:0xC.68p+2 }", "double"), 49.625);
- TestValue<double>("{ Y : [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }", "[double]");
- TestValue<float>("{ Y : [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }", "[float]");
+ TEST_EQ(TestValue<float>("{ y:-0x0.2p0 }", "float"), -0.125f);
+ TEST_EQ(TestValue<float>("{ y:-0x.2p1 }", "float"), -0.25f);
+ TEST_EQ(TestValue<float>("{ y:0x1.2p3 }", "float"), 9.0f);
+ TEST_EQ(TestValue<float>("{ y:0x10.1p0 }", "float"), 16.0625f);
+ TEST_EQ(TestValue<double>("{ y:0x1.2p3 }", "double"), 9.0);
+ TEST_EQ(TestValue<double>("{ y:0x10.1p0 }", "double"), 16.0625);
+ TEST_EQ(TestValue<double>("{ y:0xC.68p+2 }", "double"), 49.625);
+ TestValue<double>("{ y: [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }", "[double]");
+ TestValue<float>("{ y: [0x20.4ep1, +0x20.4ep1, -0x20.4ep1] }", "[float]");
#else // FLATBUFFERS_HAS_NEW_STRTOD
TEST_OUTPUT_LINE("FLATBUFFERS_HAS_NEW_STRTOD tests skipped");
@@ -1880,6 +2066,9 @@
TestError("table T { F:float; } root_type T; { F:0x0 }", invalid_msg);
TestError("table T { F:float; } root_type T; { F:-0x. }", invalid_msg);
TestError("table T { F:float; } root_type T; { F:0x. }", invalid_msg);
+ TestError("table T { F:float; } root_type T; { F:0Xe }", invalid_msg);
+ TestError("table T { F:float; } root_type T; { F:\"0Xe\" }", invalid_msg);
+ TestError("table T { F:float; } root_type T; { F:\"nan(1)\" }", invalid_msg);
// eE not exponent in hex-float!
TestError("table T { F:float; } root_type T; { F:0x0.0e+ }", invalid_msg);
TestError("table T { F:float; } root_type T; { F:0x0.0e- }", invalid_msg);
@@ -1935,8 +2124,8 @@
TEST_EQ(ok, true);
auto include_test_path =
flatbuffers::ConCatPathFileName(test_data_path, "include_test");
- const char *include_directories[] = {test_data_path.c_str(),
- include_test_path.c_str(), nullptr};
+ const char *include_directories[] = { test_data_path.c_str(),
+ include_test_path.c_str(), nullptr };
flatbuffers::IDLOptions opt;
opt.indent_step = -1;
flatbuffers::Parser parser(opt);
@@ -2236,7 +2425,7 @@
// Check independence of identifier from locale.
std::string locale_ident;
locale_ident += "table T { F";
- locale_ident += static_cast<char>(-32); // unsigned 0xE0
+ locale_ident += static_cast<char>(-32); // unsigned 0xE0
locale_ident += " :string; }";
locale_ident += "root_type T;";
locale_ident += "{}";
@@ -2303,15 +2492,121 @@
TEST_EQ(parser1.Parse("{ name: \"Bender\", testnestedflatbuffer: { name: "
"\"Leela\", color: \"nonexistent\"}}"),
false);
- // Check that Parser is destroyed correctly after parsing invalid json
+}
+
+void EvolutionTest() {
+ // VS10 does not support typed enums, exclude from tests
+#if !defined(_MSC_VER) || _MSC_VER >= 1700
+ const int NUM_VERSIONS = 2;
+ std::string schemas[NUM_VERSIONS];
+ std::string jsonfiles[NUM_VERSIONS];
+ std::vector<uint8_t> binaries[NUM_VERSIONS];
+
+ flatbuffers::IDLOptions idl_opts;
+ idl_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;
+ flatbuffers::Parser parser(idl_opts);
+
+ // Load all the schema versions and their associated data.
+ for (int i = 0; i < NUM_VERSIONS; ++i) {
+ std::string schema = test_data_path + "evolution_test/evolution_v" +
+ flatbuffers::NumToString(i + 1) + ".fbs";
+ TEST_ASSERT(flatbuffers::LoadFile(schema.c_str(), false, &schemas[i]));
+ std::string json = test_data_path + "evolution_test/evolution_v" +
+ flatbuffers::NumToString(i + 1) + ".json";
+ TEST_ASSERT(flatbuffers::LoadFile(json.c_str(), false, &jsonfiles[i]));
+
+ TEST_ASSERT(parser.Parse(schemas[i].c_str()));
+ TEST_ASSERT(parser.Parse(jsonfiles[i].c_str()));
+
+ auto bufLen = parser.builder_.GetSize();
+ auto buf = parser.builder_.GetBufferPointer();
+ binaries[i].reserve(bufLen);
+ std::copy(buf, buf + bufLen, std::back_inserter(binaries[i]));
+ }
+
+ // Assert that all the verifiers for the different schema versions properly
+ // verify any version data.
+ for (int i = 0; i < NUM_VERSIONS; ++i) {
+ flatbuffers::Verifier verifier(&binaries[i].front(), binaries[i].size());
+ TEST_ASSERT(Evolution::V1::VerifyRootBuffer(verifier));
+ TEST_ASSERT(Evolution::V2::VerifyRootBuffer(verifier));
+ }
+
+ // Test backwards compatibility by reading old data with an evolved schema.
+ auto root_v1_viewed_from_v2 = Evolution::V2::GetRoot(&binaries[0].front());
+ // field 'k' is new in version 2, so it should be null.
+ TEST_ASSERT(nullptr == root_v1_viewed_from_v2->k());
+ // field 'l' is new in version 2 with a default of 56.
+ TEST_EQ(root_v1_viewed_from_v2->l(), 56);
+ // field 'c' of 'TableA' is new in version 2, so it should be null.
+ TEST_ASSERT(nullptr == root_v1_viewed_from_v2->e()->c());
+ // 'TableC' was added to field 'c' union in version 2, so it should be null.
+ TEST_ASSERT(nullptr == root_v1_viewed_from_v2->c_as_TableC());
+ // The field 'c' union should be of type 'TableB' regardless of schema version
+ TEST_ASSERT(root_v1_viewed_from_v2->c_type() == Evolution::V2::Union::TableB);
+ // The field 'f' was renamed to 'ff' in version 2, it should still be
+ // readable.
+ TEST_EQ(root_v1_viewed_from_v2->ff()->a(), 16);
+
+ // Test forwards compatibility by reading new data with an old schema.
+ auto root_v2_viewed_from_v1 = Evolution::V1::GetRoot(&binaries[1].front());
+ // The field 'c' union in version 2 is a new table (index = 3) and should
+ // still be accessible, but not interpretable.
+ TEST_EQ(static_cast<uint8_t>(root_v2_viewed_from_v1->c_type()), 3);
+ TEST_NOTNULL(root_v2_viewed_from_v1->c());
+ // The field 'd' enum in verison 2 has new members and should still be
+ // accessible, but not interpretable.
+ TEST_EQ(static_cast<int8_t>(root_v2_viewed_from_v1->d()), 3);
+ // The field 'a' in version 2 is deprecated and should return the default
+ // value (0) instead of the value stored in the in the buffer (42).
+ TEST_EQ(root_v2_viewed_from_v1->a(), 0);
+ // The field 'ff' was originally named 'f' in version 1, it should still be
+ // readable.
+ TEST_EQ(root_v2_viewed_from_v1->f()->a(), 35);
+#endif
+}
+
+void UnionDeprecationTest() {
+ const int NUM_VERSIONS = 2;
+ std::string schemas[NUM_VERSIONS];
+ std::string jsonfiles[NUM_VERSIONS];
+ std::vector<uint8_t> binaries[NUM_VERSIONS];
+
+ flatbuffers::IDLOptions idl_opts;
+ idl_opts.lang_to_generate |= flatbuffers::IDLOptions::kBinary;
+ flatbuffers::Parser parser(idl_opts);
+
+ // Load all the schema versions and their associated data.
+ for (int i = 0; i < NUM_VERSIONS; ++i) {
+ std::string schema = test_data_path + "evolution_test/evolution_v" +
+ flatbuffers::NumToString(i + 1) + ".fbs";
+ TEST_ASSERT(flatbuffers::LoadFile(schema.c_str(), false, &schemas[i]));
+ std::string json = test_data_path + "evolution_test/evolution_v" +
+ flatbuffers::NumToString(i + 1) + ".json";
+ TEST_ASSERT(flatbuffers::LoadFile(json.c_str(), false, &jsonfiles[i]));
+
+ TEST_ASSERT(parser.Parse(schemas[i].c_str()));
+ TEST_ASSERT(parser.Parse(jsonfiles[i].c_str()));
+
+ auto bufLen = parser.builder_.GetSize();
+ auto buf = parser.builder_.GetBufferPointer();
+ binaries[i].reserve(bufLen);
+ std::copy(buf, buf + bufLen, std::back_inserter(binaries[i]));
+ }
+
+ auto v2 = parser.LookupStruct("Evolution.V2.Root");
+ TEST_NOTNULL(v2);
+ auto j_type_field = v2->fields.Lookup("j_type");
+ TEST_NOTNULL(j_type_field);
+ TEST_ASSERT(j_type_field->deprecated);
}
void UnionVectorTest() {
// load FlatBuffer fbs schema and json.
std::string schemafile, jsonfile;
TEST_EQ(flatbuffers::LoadFile(
- (test_data_path + "union_vector/union_vector.fbs").c_str(),
- false, &schemafile),
+ (test_data_path + "union_vector/union_vector.fbs").c_str(), false,
+ &schemafile),
true);
TEST_EQ(flatbuffers::LoadFile(
(test_data_path + "union_vector/union_vector.json").c_str(),
@@ -2348,12 +2643,11 @@
fbb.CreateStruct(Rapunzel(/*hair_length=*/6)).Union(),
fbb.CreateVector(types), fbb.CreateVector(characters));
FinishMovieBuffer(fbb, movie_offset);
- auto buf = fbb.GetBufferPointer();
- flatbuffers::Verifier verifier(buf, fbb.GetSize());
+ flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());
TEST_EQ(VerifyMovieBuffer(verifier), true);
- auto flat_movie = GetMovie(buf);
+ auto flat_movie = GetMovie(fbb.GetBufferPointer());
auto TestMovie = [](const Movie *movie) {
TEST_EQ(movie->main_character_type() == Character_Rapunzel, true);
@@ -2410,6 +2704,7 @@
TestMovie(repacked_movie);
+ // Generate text using mini-reflection.
auto s =
flatbuffers::FlatBufferToString(fbb.GetBufferPointer(), MovieTypeTable());
TEST_EQ_STR(
@@ -2419,43 +2714,81 @@
"characters: [ { books_read: 7 }, { sword_attack_damage: 5 }, "
"{ books_read: 2 }, \"Other\", \"Unused\" ] }");
-
flatbuffers::ToStringVisitor visitor("\n", true, " ");
IterateFlatBuffer(fbb.GetBufferPointer(), MovieTypeTable(), &visitor);
- TEST_EQ_STR(
- visitor.s.c_str(),
- "{\n"
- " \"main_character_type\": \"Rapunzel\",\n"
- " \"main_character\": {\n"
- " \"hair_length\": 6\n"
- " },\n"
- " \"characters_type\": [\n"
- " \"Belle\",\n"
- " \"MuLan\",\n"
- " \"BookFan\",\n"
- " \"Other\",\n"
- " \"Unused\"\n"
- " ],\n"
- " \"characters\": [\n"
- " {\n"
- " \"books_read\": 7\n"
- " },\n"
- " {\n"
- " \"sword_attack_damage\": 5\n"
- " },\n"
- " {\n"
- " \"books_read\": 2\n"
- " },\n"
- " \"Other\",\n"
- " \"Unused\"\n"
- " ]\n"
- "}");
+ TEST_EQ_STR(visitor.s.c_str(),
+ "{\n"
+ " \"main_character_type\": \"Rapunzel\",\n"
+ " \"main_character\": {\n"
+ " \"hair_length\": 6\n"
+ " },\n"
+ " \"characters_type\": [\n"
+ " \"Belle\",\n"
+ " \"MuLan\",\n"
+ " \"BookFan\",\n"
+ " \"Other\",\n"
+ " \"Unused\"\n"
+ " ],\n"
+ " \"characters\": [\n"
+ " {\n"
+ " \"books_read\": 7\n"
+ " },\n"
+ " {\n"
+ " \"sword_attack_damage\": 5\n"
+ " },\n"
+ " {\n"
+ " \"books_read\": 2\n"
+ " },\n"
+ " \"Other\",\n"
+ " \"Unused\"\n"
+ " ]\n"
+ "}");
+
+ // Generate text using parsed schema.
+ std::string jsongen;
+ auto result = GenerateText(parser, fbb.GetBufferPointer(), &jsongen);
+ TEST_EQ(result, true);
+ TEST_EQ_STR(jsongen.c_str(),
+ "{\n"
+ " main_character_type: \"Rapunzel\",\n"
+ " main_character: {\n"
+ " hair_length: 6\n"
+ " },\n"
+ " characters_type: [\n"
+ " \"Belle\",\n"
+ " \"MuLan\",\n"
+ " \"BookFan\",\n"
+ " \"Other\",\n"
+ " \"Unused\"\n"
+ " ],\n"
+ " characters: [\n"
+ " {\n"
+ " books_read: 7\n"
+ " },\n"
+ " {\n"
+ " sword_attack_damage: 5\n"
+ " },\n"
+ " {\n"
+ " books_read: 2\n"
+ " },\n"
+ " \"Other\",\n"
+ " \"Unused\"\n"
+ " ]\n"
+ "}\n");
+
+ // Simple test with reflection.
+ parser.Serialize();
+ auto schema = reflection::GetSchema(parser.builder_.GetBufferPointer());
+ auto ok = flatbuffers::Verify(*schema, *schema->root_table(),
+ fbb.GetBufferPointer(), fbb.GetSize());
+ TEST_EQ(ok, true);
flatbuffers::Parser parser2(idl_opts);
TEST_EQ(parser2.Parse("struct Bool { b:bool; }"
"union Any { Bool }"
"table Root { a:Any; }"
- "root_type Root;"), true);
+ "root_type Root;"),
+ true);
TEST_EQ(parser2.Parse("{a_type:Bool,a:{b:true}}"), true);
}
@@ -2514,9 +2847,11 @@
slb += -100; // Equivalent to slb.Add(-100) or slb.Int(-100);
slb += "Fred";
slb.IndirectFloat(4.0f);
+ auto i_f = slb.LastValue();
uint8_t blob[] = { 77 };
slb.Blob(blob, 1);
slb += false;
+ slb.ReuseValue(i_f);
});
int ints[] = { 1, 2, 3 };
slb.Vector("bar", ints, 3);
@@ -2537,9 +2872,11 @@
slb3 += -100; // Equivalent to slb.Add(-100) or slb.Int(-100);
slb3 += "Fred";
slb3.IndirectFloat(4.0f);
+ auto i_f = slb3.LastValue();
uint8_t blob[] = { 77 };
slb3.Blob(blob, 1);
slb3 += false;
+ slb3.ReuseValue(i_f);
}, slb2);
int ints[] = { 1, 2, 3 };
slb2.Vector("bar", ints, 3);
@@ -2563,7 +2900,7 @@
auto map = flexbuffers::GetRoot(slb.GetBuffer()).AsMap();
TEST_EQ(map.size(), 7);
auto vec = map["vec"].AsVector();
- TEST_EQ(vec.size(), 5);
+ TEST_EQ(vec.size(), 6);
TEST_EQ(vec[0].AsInt64(), -100);
TEST_EQ_STR(vec[1].AsString().c_str(), "Fred");
TEST_EQ(vec[1].AsInt64(), 0); // Number parsing failed.
@@ -2571,13 +2908,11 @@
TEST_EQ(vec[2].AsString().IsTheEmptyString(), true); // Wrong Type.
TEST_EQ_STR(vec[2].AsString().c_str(), ""); // This still works though.
TEST_EQ_STR(vec[2].ToString().c_str(), "4.0"); // Or have it converted.
-
// Few tests for templated version of As.
TEST_EQ(vec[0].As<int64_t>(), -100);
TEST_EQ_STR(vec[1].As<std::string>().c_str(), "Fred");
TEST_EQ(vec[1].As<int64_t>(), 0); // Number parsing failed.
TEST_EQ(vec[2].As<double>(), 4.0);
-
// Test that the blob can be accessed.
TEST_EQ(vec[3].IsBlob(), true);
auto blob = vec[3].AsBlob();
@@ -2585,6 +2920,7 @@
TEST_EQ(blob.data()[0], 77);
TEST_EQ(vec[4].IsBool(), true); // Check if type is a bool
TEST_EQ(vec[4].AsBool(), false); // Check if value is false
+ TEST_EQ(vec[5].AsDouble(), 4.0); // This is shared with vec[2] !
auto tvec = map["bar"].AsTypedVector();
TEST_EQ(tvec.size(), 3);
TEST_EQ(tvec[2].AsInt8(), 3);
@@ -2631,6 +2967,79 @@
// And from FlexBuffer back to JSON:
auto jsonback = jroot.ToString();
TEST_EQ_STR(jsontest, jsonback.c_str());
+
+ slb.Clear();
+ slb.Vector([&]() {
+ for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));
+ slb.Vector([&]() {
+ for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));
+ slb.Vector([] {});
+ });
+ });
+ slb.Finish();
+ TEST_EQ(slb.GetSize(), 664);
+}
+
+void FlexBuffersDeprecatedTest() {
+ // FlexBuffers as originally designed had a flaw involving the
+ // FBT_VECTOR_STRING datatype, and this test documents/tests the fix for it.
+ // Discussion: https://github.com/google/flatbuffers/issues/5627
+ flexbuffers::Builder slb;
+ // FBT_VECTOR_* are "typed vectors" where all elements are of the same type.
+ // Problem is, when storing FBT_STRING elements, it relies on that type to
+ // get the bit-width for the size field of the string, which in this case
+ // isn't present, and instead defaults to 8-bit. This means that any strings
+ // stored inside such a vector, when accessed thru the old API that returns
+ // a String reference, will appear to be truncated if the string stored is
+ // actually >=256 bytes.
+ std::string test_data(300, 'A');
+ auto start = slb.StartVector();
+ // This one will have a 16-bit size field.
+ slb.String(test_data);
+ // This one will have an 8-bit size field.
+ slb.String("hello");
+ // We're asking this to be serialized as a typed vector (true), but not
+ // fixed size (false). The type will be FBT_VECTOR_STRING with a bit-width
+ // of whatever the offsets in the vector need, the bit-widths of the strings
+ // are not stored(!) <- the actual design flaw.
+ // Note that even in the fixed code, we continue to serialize the elements of
+ // FBT_VECTOR_STRING as FBT_STRING, since there may be old code out there
+ // reading new data that we want to continue to function.
+ // Thus, FBT_VECTOR_STRING, while deprecated, will always be represented the
+ // same way, the fix lies on the reading side.
+ slb.EndVector(start, true, false);
+ slb.Finish();
+ // So now lets read this data back.
+ // For existing data, since we have no way of knowing what the actual
+ // bit-width of the size field of the string is, we are going to ignore this
+ // field, and instead treat these strings as FBT_KEY (null-terminated), so we
+ // can deal with strings of arbitrary length. This of course truncates strings
+ // with embedded nulls, but we think that that is preferrable over truncating
+ // strings >= 256 bytes.
+ auto vec = flexbuffers::GetRoot(slb.GetBuffer()).AsTypedVector();
+ // Even though this was serialized as FBT_VECTOR_STRING, it is read as
+ // FBT_VECTOR_KEY:
+ TEST_EQ(vec.ElementType(), flexbuffers::FBT_KEY);
+ // Access the long string. Previously, this would return a string of size 1,
+ // since it would read the high-byte of the 16-bit length.
+ // This should now correctly test the full 300 bytes, using AsKey():
+ TEST_EQ_STR(vec[0].AsKey(), test_data.c_str());
+ // Old code that called AsString will continue to work, as the String
+ // accessor objects now use a cached size that can come from a key as well.
+ TEST_EQ_STR(vec[0].AsString().c_str(), test_data.c_str());
+ // Short strings work as before:
+ TEST_EQ_STR(vec[1].AsKey(), "hello");
+ TEST_EQ_STR(vec[1].AsString().c_str(), "hello");
+ // So, while existing code and data mostly "just work" with the fixes applied
+ // to AsTypedVector and AsString, what do you do going forward?
+ // Code accessing existing data doesn't necessarily need to change, though
+ // you could consider using AsKey instead of AsString for a) documenting
+ // that you are accessing keys, or b) a speedup if you don't actually use
+ // the string size.
+ // For new data, or data that doesn't need to be backwards compatible,
+ // instead serialize as FBT_VECTOR (call EndVector with typed = false, then
+ // read elements with AsString), or, for maximum compactness, use
+ // FBT_VECTOR_KEY (call slb.Key above instead, read with AsKey or AsString).
}
void TypeAliasesTest() {
@@ -2659,7 +3068,7 @@
TEST_EQ(ta->u64(), flatbuffers::numeric_limits<uint64_t>::max());
TEST_EQ(ta->f32(), 2.3f);
TEST_EQ(ta->f64(), 2.3);
- using namespace flatbuffers; // is_same
+ using namespace flatbuffers; // is_same
static_assert(is_same<decltype(ta->i8()), int8_t>::value, "invalid type");
static_assert(is_same<decltype(ta->i16()), int16_t>::value, "invalid type");
static_assert(is_same<decltype(ta->i32()), int32_t>::value, "invalid type");
@@ -2685,14 +3094,16 @@
flatbuffers::FlatBufferBuilder builder;
Test *buf = nullptr;
- auto vector_offset = builder.CreateUninitializedVectorOfStructs<Test>(2, &buf);
+ auto vector_offset =
+ builder.CreateUninitializedVectorOfStructs<Test>(2, &buf);
TEST_NOTNULL(buf);
buf[0] = Test(10, 20);
buf[1] = Test(30, 40);
auto required_name = builder.CreateString("myMonster");
auto monster_builder = MonsterBuilder(builder);
- monster_builder.add_name(required_name); // required field mandated for monster.
+ monster_builder.add_name(
+ required_name); // required field mandated for monster.
monster_builder.add_test4(vector_offset);
builder.Finish(monster_builder.Finish());
@@ -2737,11 +3148,11 @@
// For testing any binaries, e.g. from fuzzing.
void LoadVerifyBinaryTest() {
std::string binary;
- if (flatbuffers::LoadFile((test_data_path +
- "fuzzer/your-filename-here").c_str(),
- true, &binary)) {
+ if (flatbuffers::LoadFile(
+ (test_data_path + "fuzzer/your-filename-here").c_str(), true,
+ &binary)) {
flatbuffers::Verifier verifier(
- reinterpret_cast<const uint8_t *>(binary.data()), binary.size());
+ reinterpret_cast<const uint8_t *>(binary.data()), binary.size());
TEST_EQ(VerifyMonsterBuffer(verifier), true);
}
}
@@ -2757,24 +3168,28 @@
TEST_EQ(onetwo.o != two.o, true);
// Support for embedded nulls
- const char chars_b[] = {'a', '\0', 'b'};
- const char chars_c[] = {'a', '\0', 'c'};
+ const char chars_b[] = { 'a', '\0', 'b' };
+ const char chars_c[] = { 'a', '\0', 'c' };
const auto null_b1 = builder.CreateSharedString(chars_b, sizeof(chars_b));
const auto null_c = builder.CreateSharedString(chars_c, sizeof(chars_c));
const auto null_b2 = builder.CreateSharedString(chars_b, sizeof(chars_b));
- TEST_EQ(null_b1.o != null_c.o, true); // Issue#5058 repro
+ TEST_EQ(null_b1.o != null_c.o, true); // Issue#5058 repro
TEST_EQ(null_b1.o, null_b2.o);
// Put the strings into an array for round trip verification.
- const flatbuffers::Offset<flatbuffers::String> array[7] = { one1, two, one2, onetwo, null_b1, null_c, null_b2 };
- const auto vector_offset = builder.CreateVector(array, flatbuffers::uoffset_t(7));
+ const flatbuffers::Offset<flatbuffers::String> array[7] = {
+ one1, two, one2, onetwo, null_b1, null_c, null_b2
+ };
+ const auto vector_offset =
+ builder.CreateVector(array, flatbuffers::uoffset_t(7));
MonsterBuilder monster_builder(builder);
monster_builder.add_name(two);
monster_builder.add_testarrayofstring(vector_offset);
builder.Finish(monster_builder.Finish());
// Read the Monster back.
- const auto *monster = flatbuffers::GetRoot<Monster>(builder.GetBufferPointer());
+ const auto *monster =
+ flatbuffers::GetRoot<Monster>(builder.GetBufferPointer());
TEST_EQ_STR(monster->name()->c_str(), "two");
const auto *testarrayofstring = monster->testarrayofstring();
TEST_EQ(testarrayofstring->size(), flatbuffers::uoffset_t(7));
@@ -2787,7 +3202,8 @@
TEST_EQ(a[5]->str(), (std::string(chars_c, sizeof(chars_c))));
TEST_EQ(a[6]->str(), (std::string(chars_b, sizeof(chars_b))));
- // Make sure String::operator< works, too, since it is related to StringOffsetCompare.
+ // Make sure String::operator< works, too, since it is related to
+ // StringOffsetCompare.
TEST_EQ((*a[0]) < (*a[1]), true);
TEST_EQ((*a[1]) < (*a[0]), false);
TEST_EQ((*a[1]) < (*a[2]), false);
@@ -2798,6 +3214,89 @@
TEST_EQ((*a[6]) < (*a[5]), true);
}
+#if !defined(FLATBUFFERS_SPAN_MINIMAL)
+void FlatbuffersSpanTest() {
+ // Compile-time checking of non-const [] to const [] conversions.
+ using flatbuffers::internal::is_span_convertable;
+ (void)is_span_convertable<int, 1, int, 1>::type(123);
+ (void)is_span_convertable<const int, 1, int, 1>::type(123);
+ (void)is_span_convertable<const int64_t, 1, int64_t, 1>::type(123);
+ (void)is_span_convertable<const uint64_t, 1, uint64_t, 1>::type(123);
+ (void)is_span_convertable<const int, 1, const int, 1>::type(123);
+ (void)is_span_convertable<const int64_t, 1, const int64_t, 1>::type(123);
+ (void)is_span_convertable<const uint64_t, 1, const uint64_t, 1>::type(123);
+
+ using flatbuffers::span;
+ span<char, 0> c1;
+ TEST_EQ(c1.size(), 0);
+ span<char, flatbuffers::dynamic_extent> c2;
+ TEST_EQ(c2.size(), 0);
+ span<char> c3;
+ TEST_EQ(c3.size(), 0);
+ TEST_ASSERT(c1.empty() && c2.empty() && c3.empty());
+
+ int i_data7[7] = { 0, 1, 2, 3, 4, 5, 6 };
+ span<int, 7> i1(&i_data7[0], 7);
+ span<int> i2(i1); // make dynamic from static
+ TEST_EQ(i1.size(), 7);
+ TEST_EQ(i1.empty(), false);
+ TEST_EQ(i1.size(), i2.size());
+ TEST_EQ(i1.data(), i_data7);
+ TEST_EQ(i1[2], 2);
+ // Make const span from a non-const one.
+ span<const int, 7> i3(i1);
+ // Construct from a C-array.
+ span<int, 7> i4(i_data7);
+ span<const int, 7> i5(i_data7);
+ span<int> i6(i_data7);
+ span<const int> i7(i_data7);
+ TEST_EQ(i7.size(), 7);
+ // Check construction from a const array.
+ const int i_cdata5[5] = { 4, 3, 2, 1, 0 };
+ span<const int, 5> i8(i_cdata5);
+ span<const int> i9(i_cdata5);
+ TEST_EQ(i9.size(), 5);
+ // Construction from a (ptr, size) pair.
+ span<int, 7> i10(i_data7, 7);
+ span<int> i11(i_data7, 7);
+ TEST_EQ(i11.size(), 7);
+ span<const int, 5> i12(i_cdata5, 5);
+ span<const int> i13(i_cdata5, 5);
+ TEST_EQ(i13.size(), 5);
+ // Construction from std::array.
+ std::array<int, 6> i_arr6 = { { 0, 1, 2, 3, 4, 5 } };
+ span<int, 6> i14(i_arr6);
+ span<const int, 6> i15(i_arr6);
+ span<int> i16(i_arr6);
+ span<const int> i17(i_arr6);
+ TEST_EQ(i17.size(), 6);
+ const std::array<int, 8> i_carr8 = { { 0, 1, 2, 3, 4, 5, 6, 7 } };
+ span<const int, 8> i18(i_carr8);
+ span<const int> i19(i_carr8);
+ TEST_EQ(i18.size(), 8);
+ TEST_EQ(i19.size(), 8);
+ TEST_EQ(i19[7], 7);
+ // Check compatibility with flatbuffers::Array.
+ int fbs_int3_underlaying[3] = { 0 };
+ int fbs_int3_data[3] = { 1, 2, 3 };
+ auto &fbs_int3 = flatbuffers::CastToArray(fbs_int3_underlaying);
+ fbs_int3.CopyFromSpan(fbs_int3_data);
+ TEST_EQ(fbs_int3.Get(1), 2);
+ const int fbs_cint3_data[3] = { 2, 3, 4 };
+ fbs_int3.CopyFromSpan(fbs_cint3_data);
+ TEST_EQ(fbs_int3.Get(1), 3);
+ // Check with Array<Enum, N>
+ enum class Dummy : uint16_t { Zero = 0, One, Two };
+ Dummy fbs_dummy3_underlaying[3] = {};
+ Dummy fbs_dummy3_data[3] = { Dummy::One, Dummy::Two, Dummy::Two };
+ auto &fbs_dummy3 = flatbuffers::CastToArray(fbs_dummy3_underlaying);
+ fbs_dummy3.CopyFromSpan(fbs_dummy3_data);
+ TEST_EQ(fbs_dummy3.Get(1), Dummy::Two);
+}
+#else
+void FlatbuffersSpanTest() {}
+#endif
+
void FixedLengthArrayTest() {
// VS10 does not support typed enums, exclude from tests
#if !defined(_MSC_VER) || _MSC_VER >= 1700
@@ -2810,6 +3309,9 @@
TEST_NOTNULL(nStruct0.mutable_c());
nStruct0.mutable_c()->Mutate(0, MyGame::Example::TestEnum::C);
nStruct0.mutable_c()->Mutate(1, MyGame::Example::TestEnum::A);
+ TEST_NOTNULL(nStruct0.mutable_d());
+ nStruct0.mutable_d()->Mutate(0, flatbuffers::numeric_limits<int64_t>::max());
+ nStruct0.mutable_d()->Mutate(1, flatbuffers::numeric_limits<int64_t>::min());
MyGame::Example::NestedStruct nStruct1(MyGame::Example::TestEnum::C);
TEST_NOTNULL(nStruct1.mutable_a());
nStruct1.mutable_a()->Mutate(0, 3);
@@ -2817,16 +3319,20 @@
TEST_NOTNULL(nStruct1.mutable_c());
nStruct1.mutable_c()->Mutate(0, MyGame::Example::TestEnum::C);
nStruct1.mutable_c()->Mutate(1, MyGame::Example::TestEnum::A);
- MyGame::Example::ArrayStruct aStruct(2, 12);
+ TEST_NOTNULL(nStruct1.mutable_d());
+ nStruct1.mutable_d()->Mutate(0, flatbuffers::numeric_limits<int64_t>::min());
+ nStruct1.mutable_d()->Mutate(1, flatbuffers::numeric_limits<int64_t>::max());
+ MyGame::Example::ArrayStruct aStruct(2, 12, 1);
TEST_NOTNULL(aStruct.b());
TEST_NOTNULL(aStruct.mutable_b());
TEST_NOTNULL(aStruct.mutable_d());
+ TEST_NOTNULL(aStruct.mutable_f());
for (int i = 0; i < aStruct.b()->size(); i++)
aStruct.mutable_b()->Mutate(i, i + 1);
aStruct.mutable_d()->Mutate(0, nStruct0);
aStruct.mutable_d()->Mutate(1, nStruct1);
auto aTable = MyGame::Example::CreateArrayTable(fbb, &aStruct);
- fbb.Finish(aTable);
+ MyGame::Example::FinishArrayTableBuffer(fbb, aTable);
// Verify correctness of the ArrayTable.
flatbuffers::Verifier verifier(fbb.GetBufferPointer(), fbb.GetSize());
@@ -2836,40 +3342,120 @@
TEST_NOTNULL(mArStruct);
TEST_NOTNULL(mArStruct->b());
TEST_NOTNULL(mArStruct->d());
+ TEST_NOTNULL(mArStruct->f());
TEST_NOTNULL(mArStruct->mutable_b());
TEST_NOTNULL(mArStruct->mutable_d());
+ TEST_NOTNULL(mArStruct->mutable_f());
mArStruct->mutable_b()->Mutate(14, -14);
TEST_EQ(mArStruct->a(), 2);
TEST_EQ(mArStruct->b()->size(), 15);
TEST_EQ(mArStruct->b()->Get(aStruct.b()->size() - 1), -14);
TEST_EQ(mArStruct->c(), 12);
- TEST_NOTNULL(mArStruct->d()->Get(0).a());
- TEST_EQ(mArStruct->d()->Get(0).a()->Get(0), 1);
- TEST_EQ(mArStruct->d()->Get(0).a()->Get(1), 2);
- TEST_NOTNULL(mArStruct->d()->Get(1).a());
- TEST_EQ(mArStruct->d()->Get(1).a()->Get(0), 3);
- TEST_EQ(mArStruct->d()->Get(1).a()->Get(1), 4);
+ TEST_NOTNULL(mArStruct->d()->Get(0));
+ TEST_NOTNULL(mArStruct->d()->Get(0)->a());
+ TEST_EQ(mArStruct->d()->Get(0)->a()->Get(0), 1);
+ TEST_EQ(mArStruct->d()->Get(0)->a()->Get(1), 2);
+ TEST_NOTNULL(mArStruct->d()->Get(1));
+ TEST_NOTNULL(mArStruct->d()->Get(1)->a());
+ TEST_EQ(mArStruct->d()->Get(1)->a()->Get(0), 3);
+ TEST_EQ(mArStruct->d()->Get(1)->a()->Get(1), 4);
TEST_NOTNULL(mArStruct->mutable_d()->GetMutablePointer(1));
TEST_NOTNULL(mArStruct->mutable_d()->GetMutablePointer(1)->mutable_a());
mArStruct->mutable_d()->GetMutablePointer(1)->mutable_a()->Mutate(1, 5);
- TEST_EQ(mArStruct->d()->Get(1).a()->Get(1), 5);
- TEST_EQ(mArStruct->d()->Get(0).b() == MyGame::Example::TestEnum::B, true);
- TEST_NOTNULL(mArStruct->d()->Get(0).c());
- TEST_EQ(mArStruct->d()->Get(0).c()->Get(0) == MyGame::Example::TestEnum::C,
- true);
- TEST_EQ(mArStruct->d()->Get(0).c()->Get(1) == MyGame::Example::TestEnum::A,
- true);
- TEST_EQ(mArStruct->d()->Get(1).b() == MyGame::Example::TestEnum::C, true);
- TEST_NOTNULL(mArStruct->d()->Get(1).c());
- TEST_EQ(mArStruct->d()->Get(1).c()->Get(0) == MyGame::Example::TestEnum::C,
- true);
- TEST_EQ(mArStruct->d()->Get(1).c()->Get(1) == MyGame::Example::TestEnum::A,
- true);
+ TEST_EQ(5, mArStruct->d()->Get(1)->a()->Get(1));
+ TEST_EQ(MyGame::Example::TestEnum::B, mArStruct->d()->Get(0)->b());
+ TEST_NOTNULL(mArStruct->d()->Get(0)->c());
+ TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(0)->c()->Get(0));
+ TEST_EQ(MyGame::Example::TestEnum::A, mArStruct->d()->Get(0)->c()->Get(1));
+ TEST_EQ(flatbuffers::numeric_limits<int64_t>::max(),
+ mArStruct->d()->Get(0)->d()->Get(0));
+ TEST_EQ(flatbuffers::numeric_limits<int64_t>::min(),
+ mArStruct->d()->Get(0)->d()->Get(1));
+ TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(1)->b());
+ TEST_NOTNULL(mArStruct->d()->Get(1)->c());
+ TEST_EQ(MyGame::Example::TestEnum::C, mArStruct->d()->Get(1)->c()->Get(0));
+ TEST_EQ(MyGame::Example::TestEnum::A, mArStruct->d()->Get(1)->c()->Get(1));
+ TEST_EQ(flatbuffers::numeric_limits<int64_t>::min(),
+ mArStruct->d()->Get(1)->d()->Get(0));
+ TEST_EQ(flatbuffers::numeric_limits<int64_t>::max(),
+ mArStruct->d()->Get(1)->d()->Get(1));
for (int i = 0; i < mArStruct->b()->size() - 1; i++)
TEST_EQ(mArStruct->b()->Get(i), i + 1);
+ // Check alignment
+ TEST_EQ(0, reinterpret_cast<uintptr_t>(mArStruct->d()) % 8);
+ TEST_EQ(0, reinterpret_cast<uintptr_t>(mArStruct->f()) % 8);
+
+ // Check if default constructor set all memory zero
+ const size_t arr_size = sizeof(MyGame::Example::ArrayStruct);
+ char non_zero_memory[arr_size];
+ // set memory chunk of size ArrayStruct to 1's
+ std::memset(static_cast<void *>(non_zero_memory), 1, arr_size);
+ // after placement-new it should be all 0's
+#if defined (_MSC_VER) && defined (_DEBUG)
+ #undef new
+#endif
+ MyGame::Example::ArrayStruct *ap = new (non_zero_memory) MyGame::Example::ArrayStruct;
+#if defined (_MSC_VER) && defined (_DEBUG)
+ #define new DEBUG_NEW
+#endif
+ (void)ap;
+ for (size_t i = 0; i < arr_size; ++i) {
+ TEST_EQ(non_zero_memory[i], 0);
+ }
#endif
}
+#if !defined(FLATBUFFERS_SPAN_MINIMAL) && (!defined(_MSC_VER) || _MSC_VER >= 1700)
+void FixedLengthArrayConstructorTest() {
+ const int32_t nested_a[2] = { 1, 2 };
+ MyGame::Example::TestEnum nested_c[2] = { MyGame::Example::TestEnum::A,
+ MyGame::Example::TestEnum::B };
+ const int64_t int64_2[2] = { -2, -1 };
+
+ std::array<MyGame::Example::NestedStruct, 2> init_d = {
+ { MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::B,
+ nested_c, int64_2),
+ MyGame::Example::NestedStruct(nested_a, MyGame::Example::TestEnum::A,
+ nested_c,
+ std::array<int64_t, 2>{ { 12, 13 } }) }
+ };
+
+ MyGame::Example::ArrayStruct arr_struct(
+ 8.125,
+ std::array<int32_t, 0xF>{
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } },
+ -17, init_d, 10, int64_2);
+ TEST_EQ(arr_struct.a(), 8.125);
+ TEST_EQ(arr_struct.b()->Get(2), 3);
+ TEST_EQ(arr_struct.c(), -17);
+
+ TEST_NOTNULL(arr_struct.d());
+ const auto &arr_d_0 = *arr_struct.d()->Get(0);
+ TEST_EQ(arr_d_0.a()->Get(0), 1);
+ TEST_EQ(arr_d_0.a()->Get(1), 2);
+ TEST_EQ(arr_d_0.b(), MyGame::Example::TestEnum::B);
+ TEST_EQ(arr_d_0.c()->Get(0), MyGame::Example::TestEnum::A);
+ TEST_EQ(arr_d_0.c()->Get(1), MyGame::Example::TestEnum::B);
+ TEST_EQ(arr_d_0.d()->Get(0), -2);
+ TEST_EQ(arr_d_0.d()->Get(1), -1);
+ const auto &arr_d_1 = *arr_struct.d()->Get(1);
+ TEST_EQ(arr_d_1.a()->Get(0), 1);
+ TEST_EQ(arr_d_1.a()->Get(1), 2);
+ TEST_EQ(arr_d_1.b(), MyGame::Example::TestEnum::A);
+ TEST_EQ(arr_d_1.c()->Get(0), MyGame::Example::TestEnum::A);
+ TEST_EQ(arr_d_1.c()->Get(1), MyGame::Example::TestEnum::B);
+ TEST_EQ(arr_d_1.d()->Get(0), 12);
+ TEST_EQ(arr_d_1.d()->Get(1), 13);
+
+ TEST_EQ(arr_struct.e(), 10);
+ TEST_EQ(arr_struct.f()->Get(0), -2);
+ TEST_EQ(arr_struct.f()->Get(1), -1);
+}
+#else
+void FixedLengthArrayConstructorTest() {
+}
+#endif
+
void NativeTypeTest() {
const int N = 3;
@@ -2877,23 +3463,24 @@
src_data.vectors.reserve(N);
for (int i = 0; i < N; ++i) {
- src_data.vectors.push_back (Native::Vector3D(10 * i + 0.1f, 10 * i + 0.2f, 10 * i + 0.3f));
+ src_data.vectors.push_back(
+ Native::Vector3D(10 * i + 0.1f, 10 * i + 0.2f, 10 * i + 0.3f));
}
flatbuffers::FlatBufferBuilder fbb;
fbb.Finish(Geometry::ApplicationData::Pack(fbb, &src_data));
- auto dstDataT = Geometry::UnPackApplicationData(fbb.GetBufferPointer());
+ auto dstDataT = Geometry::UnPackApplicationData(fbb.GetBufferPointer());
for (int i = 0; i < N; ++i) {
- Native::Vector3D& v = dstDataT->vectors[i];
+ Native::Vector3D &v = dstDataT->vectors[i];
TEST_EQ(v.x, 10 * i + 0.1f);
TEST_EQ(v.y, 10 * i + 0.2f);
TEST_EQ(v.z, 10 * i + 0.3f);
}
}
-void FixedLengthArrayJsonTest(bool binary) {
+void FixedLengthArrayJsonTest(bool binary) {
// VS10 does not support typed enums, exclude from tests
#if !defined(_MSC_VER) || _MSC_VER >= 1700
// load FlatBuffer schema (.fbs) and JSON from disk
@@ -2957,6 +3544,172 @@
#endif
}
+void TestEmbeddedBinarySchema() {
+ // load JSON from disk
+ std::string jsonfile;
+ TEST_EQ(flatbuffers::LoadFile(
+ (test_data_path + "monsterdata_test.golden").c_str(), false,
+ &jsonfile),
+ true);
+
+ // parse schema first, so we can use it to parse the data after
+ flatbuffers::Parser parserOrg, parserGen;
+ flatbuffers::Verifier verifier(MyGame::Example::MonsterBinarySchema::data(),
+ MyGame::Example::MonsterBinarySchema::size());
+ TEST_EQ(reflection::VerifySchemaBuffer(verifier), true);
+ TEST_EQ(parserOrg.Deserialize(MyGame::Example::MonsterBinarySchema::data(),
+ MyGame::Example::MonsterBinarySchema::size()),
+ true);
+ TEST_EQ(parserGen.Deserialize(MyGame::Example::MonsterBinarySchema::data(),
+ MyGame::Example::MonsterBinarySchema::size()),
+ true);
+ TEST_EQ(parserOrg.Parse(jsonfile.c_str()), true);
+
+ // First, verify it, just in case:
+ flatbuffers::Verifier verifierOrg(parserOrg.builder_.GetBufferPointer(),
+ parserOrg.builder_.GetSize());
+ TEST_EQ(VerifyMonsterBuffer(verifierOrg), true);
+
+ // Export to JSON
+ std::string jsonGen;
+ TEST_EQ(
+ GenerateText(parserOrg, parserOrg.builder_.GetBufferPointer(), &jsonGen),
+ true);
+
+ // Import from JSON
+ TEST_EQ(parserGen.Parse(jsonGen.c_str()), true);
+
+ // Verify buffer from generated JSON
+ flatbuffers::Verifier verifierGen(parserGen.builder_.GetBufferPointer(),
+ parserGen.builder_.GetSize());
+ TEST_EQ(VerifyMonsterBuffer(verifierGen), true);
+
+ // Compare generated buffer to original
+ TEST_EQ(parserOrg.builder_.GetSize(), parserGen.builder_.GetSize());
+ TEST_EQ(std::memcmp(parserOrg.builder_.GetBufferPointer(),
+ parserGen.builder_.GetBufferPointer(),
+ parserOrg.builder_.GetSize()),
+ 0);
+}
+
+void OptionalScalarsTest() {
+ // Simple schemas and a "has optional scalar" sentinal.
+ std::vector<std::string> schemas;
+ schemas.push_back("table Monster { mana : int; }");
+ schemas.push_back("table Monster { mana : int = 42; }");
+ schemas.push_back("table Monster { mana : int = null; }");
+ schemas.push_back("table Monster { mana : long; }");
+ schemas.push_back("table Monster { mana : long = 42; }");
+ schemas.push_back("table Monster { mana : long = null; }");
+ schemas.push_back("table Monster { mana : float; }");
+ schemas.push_back("table Monster { mana : float = 42; }");
+ schemas.push_back("table Monster { mana : float = null; }");
+ schemas.push_back("table Monster { mana : double; }");
+ schemas.push_back("table Monster { mana : double = 42; }");
+ schemas.push_back("table Monster { mana : double = null; }");
+ schemas.push_back("table Monster { mana : bool; }");
+ schemas.push_back("table Monster { mana : bool = 42; }");
+ schemas.push_back("table Monster { mana : bool = null; }");
+ schemas.push_back("enum Enum: int {A=0, B=1} "
+ "table Monster { mana : Enum; }");
+ schemas.push_back("enum Enum: int {A=0, B=1} "
+ "table Monster { mana : Enum = B; }");
+ schemas.push_back("enum Enum: int {A=0, B=1} "
+ "table Monster { mana : Enum = null; }");
+
+ // Check the FieldDef is correctly set.
+ for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {
+ const bool has_null = schema->find("null") != std::string::npos;
+ flatbuffers::Parser parser;
+ TEST_ASSERT(parser.Parse(schema->c_str()));
+ const auto *mana = parser.structs_.Lookup("Monster")->fields.Lookup("mana");
+ TEST_EQ(mana->optional, has_null);
+ }
+
+ // Test if nullable scalars are allowed for each language.
+ for (unsigned lang = 1; lang < flatbuffers::IDLOptions::kMAX; lang <<= 1) {
+ flatbuffers::IDLOptions opts;
+ opts.lang_to_generate = lang;
+ if (false == flatbuffers::Parser::SupportsOptionalScalars(opts)) {
+ continue;
+ }
+ for (auto schema = schemas.begin(); schema < schemas.end(); schema++) {
+ flatbuffers::Parser parser(opts);
+ auto done = parser.Parse(schema->c_str());
+ TEST_EQ_STR(parser.error_.c_str(), "");
+ TEST_ASSERT(done);
+ }
+ }
+
+ // test C++ nullable
+ flatbuffers::FlatBufferBuilder fbb;
+ FinishScalarStuffBuffer(
+ fbb, optional_scalars::CreateScalarStuff(fbb, 1, static_cast<int8_t>(2)));
+ auto opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());
+ TEST_ASSERT(!opts->maybe_bool());
+ TEST_ASSERT(!opts->maybe_f32().has_value());
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 2);
+ TEST_ASSERT(opts->mutate_maybe_i8(3));
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 3);
+ TEST_ASSERT(!opts->mutate_maybe_i16(-10));
+
+ optional_scalars::ScalarStuffT obj;
+ TEST_ASSERT(!obj.maybe_bool);
+ TEST_ASSERT(!obj.maybe_f32.has_value());
+ opts->UnPackTo(&obj);
+ TEST_ASSERT(!obj.maybe_bool);
+ TEST_ASSERT(!obj.maybe_f32.has_value());
+ TEST_ASSERT(obj.maybe_i8.has_value() && obj.maybe_i8.value() == 3);
+ TEST_ASSERT(obj.maybe_i8 && *obj.maybe_i8 == 3);
+ obj.maybe_i32 = -1;
+ obj.maybe_enum = optional_scalars::OptionalByte_Two;
+
+ fbb.Clear();
+ FinishScalarStuffBuffer(fbb, optional_scalars::ScalarStuff::Pack(fbb, &obj));
+ opts = optional_scalars::GetMutableScalarStuff(fbb.GetBufferPointer());
+ TEST_ASSERT(opts->maybe_i8().has_value());
+ TEST_EQ(opts->maybe_i8().value(), 3);
+ TEST_ASSERT(opts->maybe_i32().has_value());
+ TEST_EQ(opts->maybe_i32().value(), -1);
+ TEST_EQ(opts->maybe_enum().value(), optional_scalars::OptionalByte_Two);
+ TEST_ASSERT(opts->maybe_i32() == flatbuffers::Optional<int64_t>(-1));
+}
+
+void ParseFlexbuffersFromJsonWithNullTest() {
+ // Test nulls are handled appropriately through flexbuffers to exercise other
+ // code paths of ParseSingleValue in the optional scalars change.
+ // TODO(cneo): Json -> Flatbuffers test once some language can generate code
+ // with optional scalars.
+ {
+ char json[] = "{\"opt_field\": 123 }";
+ flatbuffers::Parser parser;
+ flexbuffers::Builder flexbuild;
+ parser.ParseFlexBuffer(json, nullptr, &flexbuild);
+ auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());
+ TEST_EQ(root.AsMap()["opt_field"].AsInt64(), 123);
+ }
+ {
+ char json[] = "{\"opt_field\": 123.4 }";
+ flatbuffers::Parser parser;
+ flexbuffers::Builder flexbuild;
+ parser.ParseFlexBuffer(json, nullptr, &flexbuild);
+ auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());
+ TEST_EQ(root.AsMap()["opt_field"].AsDouble(), 123.4);
+ }
+ {
+ char json[] = "{\"opt_field\": null }";
+ flatbuffers::Parser parser;
+ flexbuffers::Builder flexbuild;
+ parser.ParseFlexBuffer(json, nullptr, &flexbuild);
+ auto root = flexbuffers::GetRoot(flexbuild.GetBuffer());
+ TEST_ASSERT(!root.AsMap().IsTheEmptyMap());
+ TEST_ASSERT(root.AsMap()["opt_field"].IsNull());
+ TEST_EQ(root.ToString(), std::string("{ opt_field: null }"));
+ }
+}
+
int FlatBufferTests() {
// clang-format off
@@ -2981,6 +3734,7 @@
ObjectFlatBuffersTest(flatbuf.data());
MiniReflectFlatBuffersTest(flatbuf.data());
+ MiniReflectFixedLengthArrayTest();
SizePrefixedTest();
@@ -2995,9 +3749,14 @@
FixedLengthArrayJsonTest(true);
ReflectionTest(flatbuf.data(), flatbuf.size());
ParseProtoTest();
+ ParseProtoTestWithSuffix();
+ ParseProtoTestWithIncludes();
+ EvolutionTest();
+ UnionDeprecationTest();
UnionVectorTest();
LoadVerifyBinaryTest();
GenerateTableTextTest();
+ TestEmbeddedBinarySchema();
#endif
// clang-format on
@@ -3029,6 +3788,7 @@
JsonDefaultTest();
JsonEnumsTest();
FlexBuffersTest();
+ FlexBuffersDeprecatedTest();
UninitializedVectorTest();
EqualOperatorTest();
NumericUtilsTest();
@@ -3038,10 +3798,14 @@
TestMonsterExtraFloats();
FixedLengthArrayTest();
NativeTypeTest();
+ OptionalScalarsTest();
+ ParseFlexbuffersFromJsonWithNullTest();
+ FlatbuffersSpanTest();
+ FixedLengthArrayConstructorTest();
return 0;
}
-int main(int /*argc*/, const char * /*argv*/ []) {
+int main(int /*argc*/, const char * /*argv*/[]) {
InitTestEngine();
std::string req_locale;
diff --git a/tests/test_assert.cpp b/tests/test_assert.cpp
index 794ffe7..e2b43a7 100644
--- a/tests/test_assert.cpp
+++ b/tests/test_assert.cpp
@@ -12,8 +12,8 @@
void TestFail(const char *expval, const char *val, const char *exp,
const char *file, int line, const char *func) {
- TEST_OUTPUT_LINE("VALUE: \"%s\"", expval);
- TEST_OUTPUT_LINE("EXPECTED: \"%s\"", val);
+ TEST_OUTPUT_LINE("EXPECTED: \"%s\"", expval);
+ TEST_OUTPUT_LINE("VALUE: \"%s\"", val);
TEST_OUTPUT_LINE("TEST FAILED: %s:%d, %s in %s", file, line, exp,
func ? func : "");
testing_fails++;
@@ -25,13 +25,15 @@
}
void TestEqStr(const char *expval, const char *val, const char *exp,
- const char *file, int line) {
- if (strcmp(expval, val) != 0) { TestFail(expval, val, exp, file, line); }
+ const char *file, int line, const char *func) {
+ if (strcmp(expval, val) != 0) {
+ TestFail(expval, val, exp, file, line, func);
+ }
}
#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && defined(_MSC_VER) && \
defined(_DEBUG)
-#define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC
+# define FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC
#endif
void InitTestEngine(TestFailEventListener listener) {
@@ -58,12 +60,12 @@
int CloseTestEngine(bool force_report) {
if (!testing_fails || force_report) {
- #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
- auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
- flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;
- flags |= _CRTDBG_LEAK_CHECK_DF;
- _CrtSetDbgFlag(flags);
- #endif
+#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING_MSVC)
+ auto flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
+ flags &= ~_CRTDBG_DELAY_FREE_MEM_DF;
+ flags |= _CRTDBG_LEAK_CHECK_DF;
+ _CrtSetDbgFlag(flags);
+#endif
}
return (0 != testing_fails);
}
diff --git a/tests/test_assert.h b/tests/test_assert.h
index 883586b..353e3ce 100644
--- a/tests/test_assert.h
+++ b/tests/test_assert.h
@@ -13,20 +13,20 @@
#define FLATBUFFERS_NO_FILE_TESTS
#else
#define TEST_OUTPUT_LINE(...) \
- { printf(__VA_ARGS__); printf("\n"); }
+ do { printf(__VA_ARGS__); printf("\n"); } while(!IsConstTrue(true))
#endif
-#define TEST_EQ(exp, val) TestEq(exp, val, #exp, __FILE__, __LINE__)
-#define TEST_ASSERT(exp) TestEq(exp, true, #exp, __FILE__, __LINE__)
-#define TEST_NOTNULL(exp) TestEq(exp == NULL, false, #exp, __FILE__, __LINE__)
-#define TEST_EQ_STR(exp, val) TestEqStr(exp, val, #exp, __FILE__, __LINE__)
+#define TEST_EQ(exp, val) TestEq(exp, val, "'" #exp "' != '" #val "'", __FILE__, __LINE__, "")
+#define TEST_ASSERT(val) TestEq(true, !!(val), "'" "true" "' != '" #val "'", __FILE__, __LINE__, "")
+#define TEST_NOTNULL(val) TestEq(true, (val) != nullptr, "'" "nullptr" "' == '" #val "'", __FILE__, __LINE__, "")
+#define TEST_EQ_STR(exp, val) TestEqStr(exp, val, "'" #exp "' != '" #val "'", __FILE__, __LINE__, "")
#ifdef _WIN32
- #define TEST_ASSERT_FUNC(exp) TestEq(exp, true, #exp, __FILE__, __LINE__, __FUNCTION__)
- #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, #exp, __FILE__, __LINE__, __FUNCTION__)
+ #define TEST_ASSERT_FUNC(val) TestEq(true, !!(val), "'" "true" "' != '" #val "'", __FILE__, __LINE__, __FUNCTION__)
+ #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, "'" #exp "' != '" #val "'", __FILE__, __LINE__, __FUNCTION__)
#else
- #define TEST_ASSERT_FUNC(exp) TestEq(exp, true, #exp, __FILE__, __LINE__, __PRETTY_FUNCTION__)
- #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, #exp, __FILE__, __LINE__, __PRETTY_FUNCTION__)
+ #define TEST_ASSERT_FUNC(val) TestEq(true, !!(val), "'" "true" "' != '" #val "'", __FILE__, __LINE__, __PRETTY_FUNCTION__)
+ #define TEST_EQ_FUNC(exp, val) TestEq(exp, val, "'" #exp "' != '" #val "'", __FILE__, __LINE__, __PRETTY_FUNCTION__)
#endif
// clang-format on
@@ -54,14 +54,55 @@
const char *file, int line, const char *func = 0);
void TestEqStr(const char *expval, const char *val, const char *exp,
- const char *file, int line);
+ const char *file, int line, const char *func = 0);
+
+// Workaround for `enum class` printing.
+// There is an issue with the printing of enums with a fixed underlying type.
+// These enums are generated by `flatc` if `--scoped-enums` is active.
+// All modern compilers have problems with `std::stringstream&<<(T v)` if T is
+// an enum with fixed type. For details see DR1601:
+// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1601
+// https://stackoverflow.com/questions/34336024/ambiguous-overload-when-writing-an-enum-with-an-enum-base-but-only-with-clang
+
+template<typename T, bool is_enum_type = flatbuffers::is_enum<T>::value>
+struct underlying_of_scalar {
+ static_assert(flatbuffers::is_scalar<T>::value, "invalid type T");
+ typedef T type;
+};
+
+template<typename T> struct underlying_of_scalar<T, true> {
+// clang-format off
+ // There are old compilers without full C++11 support (see stl_emulation.h).
+ #if defined(FLATBUFFERS_TEMPLATES_ALIASES) && !defined(FLATBUFFERS_CPP98_STL)
+ using type = typename std::underlying_type<T>::type;
+ #else
+ typedef int64_t type;
+ #endif
+ // clang-format on
+};
+
+template<typename T>
+typename underlying_of_scalar<T>::type scalar_as_underlying(T v) {
+ return static_cast<typename underlying_of_scalar<T>::type>(v);
+}
template<typename T, typename U>
void TestEq(T expval, U val, const char *exp, const char *file, int line,
- const char *func = 0) {
- if (U(expval) != val) {
- TestFail(flatbuffers::NumToString(expval).c_str(),
- flatbuffers::NumToString(val).c_str(), exp, file, line, func);
+ const char *func) {
+ if (static_cast<U>(expval) != val) {
+ TestFail(flatbuffers::NumToString(scalar_as_underlying(expval)).c_str(),
+ flatbuffers::NumToString(scalar_as_underlying(val)).c_str(), exp,
+ file, line, func);
+ }
+}
+
+template<>
+inline void TestEq<std::string, std::string>(std::string expval,
+ std::string val, const char *exp,
+ const char *file, int line,
+ const char *func) {
+ if (expval != val) {
+ TestFail(expval.c_str(), val.c_str(), exp, file, line, func);
}
}
diff --git a/tests/test_builder.cpp b/tests/test_builder.cpp
index 8c070c1..3a12d79 100644
--- a/tests/test_builder.cpp
+++ b/tests/test_builder.cpp
@@ -1,19 +1,14 @@
-#include "flatbuffers/stl_emulation.h"
-
-#include "monster_test_generated.h"
#include "test_builder.h"
-using namespace MyGame::Example;
+#include "flatbuffers/stl_emulation.h"
+#include "monster_test_generated.h"
-const std::string m1_name = "Cyberdemon";
-const Color m1_color = Color_Red;
-const std::string m2_name = "Imp";
-const Color m2_color = Color_Green;
+using namespace MyGame::Example;
struct OwnedAllocator : public flatbuffers::DefaultAllocator {};
class TestHeapBuilder : public flatbuffers::FlatBufferBuilder {
-private:
+ private:
// clang-format off
#if !defined(FLATBUFFERS_CPP98_STL)
TestHeapBuilder(const TestHeapBuilder &);
@@ -21,15 +16,15 @@
#endif // !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
-public:
+ public:
TestHeapBuilder()
- : flatbuffers::FlatBufferBuilder(2048, new OwnedAllocator(), true) {}
+ : flatbuffers::FlatBufferBuilder(2048, new OwnedAllocator(), true) {}
// clang-format off
#if !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
TestHeapBuilder(TestHeapBuilder &&other)
- : FlatBufferBuilder(std::move(other)) { }
+ : FlatBufferBuilder(std::move(other)) {}
TestHeapBuilder &operator=(TestHeapBuilder &&other) {
FlatBufferBuilder::operator=(std::move(other));
@@ -47,16 +42,16 @@
struct GrpcLikeMessageBuilder : private AllocatorMember,
public flatbuffers::FlatBufferBuilder {
-private:
+ private:
GrpcLikeMessageBuilder(const GrpcLikeMessageBuilder &);
GrpcLikeMessageBuilder &operator=(const GrpcLikeMessageBuilder &);
-public:
+ public:
GrpcLikeMessageBuilder()
- : flatbuffers::FlatBufferBuilder(1024, &member_allocator_, false) {}
+ : flatbuffers::FlatBufferBuilder(1024, &member_allocator_, false) {}
GrpcLikeMessageBuilder(GrpcLikeMessageBuilder &&other)
- : FlatBufferBuilder(1024, &member_allocator_, false) {
+ : FlatBufferBuilder(1024, &member_allocator_, false) {
// Default construct and swap idiom.
Swap(other);
}
@@ -77,53 +72,63 @@
void Swap(GrpcLikeMessageBuilder &other) {
// No need to swap member_allocator_ because it's stateless.
FlatBufferBuilder::Swap(other);
- // After swapping the FlatBufferBuilder, we swap back the allocator, which restores
- // the original allocator back in place. This is necessary because MessageBuilder's
- // allocator is its own member (SliceAllocatorMember). The allocator passed to
- // FlatBufferBuilder::vector_downward must point to this member.
+ // After swapping the FlatBufferBuilder, we swap back the allocator, which
+ // restores the original allocator back in place. This is necessary because
+ // MessageBuilder's allocator is its own member (SliceAllocatorMember). The
+ // allocator passed to FlatBufferBuilder::vector_downward must point to this
+ // member.
buf_.swap_allocator(other.buf_);
}
};
-flatbuffers::Offset<Monster> populate1(flatbuffers::FlatBufferBuilder &builder) {
- auto name_offset = builder.CreateString(m1_name);
- return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m1_color);
+flatbuffers::Offset<Monster> populate1(
+ flatbuffers::FlatBufferBuilder &builder) {
+ auto name_offset = builder.CreateString(m1_name());
+ return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m1_color());
}
-flatbuffers::Offset<Monster> populate2(flatbuffers::FlatBufferBuilder &builder) {
- auto name_offset = builder.CreateString(m2_name);
- return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m2_color);
+flatbuffers::Offset<Monster> populate2(
+ flatbuffers::FlatBufferBuilder &builder) {
+ auto name_offset = builder.CreateString(m2_name());
+ return CreateMonster(builder, nullptr, 0, 0, name_offset, 0, m2_color());
}
-uint8_t *release_raw_base(flatbuffers::FlatBufferBuilder &fbb, size_t &size, size_t &offset) {
+uint8_t *release_raw_base(flatbuffers::FlatBufferBuilder &fbb, size_t &size,
+ size_t &offset) {
return fbb.ReleaseRaw(size, offset);
}
void free_raw(flatbuffers::grpc::MessageBuilder &, uint8_t *) {
- // release_raw_base calls FlatBufferBuilder::ReleaseRaw on the argument MessageBuilder.
- // It's semantically wrong as MessageBuilder has its own ReleaseRaw member function that
- // takes three arguments. In such cases though, ~MessageBuilder() invokes
- // ~SliceAllocator() that takes care of deleting memory as it calls grpc_slice_unref.
- // Obviously, this behavior is very surprising as the pointer returned by
- // FlatBufferBuilder::ReleaseRaw is not valid as soon as MessageBuilder goes out of scope.
- // This problem does not occur with FlatBufferBuilder.
+ // release_raw_base calls FlatBufferBuilder::ReleaseRaw on the argument
+ // MessageBuilder. It's semantically wrong as MessageBuilder has its own
+ // ReleaseRaw member function that takes three arguments. In such cases
+ // though, ~MessageBuilder() invokes ~SliceAllocator() that takes care of
+ // deleting memory as it calls grpc_slice_unref. Obviously, this behavior is
+ // very surprising as the pointer returned by FlatBufferBuilder::ReleaseRaw is
+ // not valid as soon as MessageBuilder goes out of scope. This problem does
+ // not occur with FlatBufferBuilder.
}
void free_raw(flatbuffers::FlatBufferBuilder &, uint8_t *buf) {
flatbuffers::DefaultAllocator().deallocate(buf, 0);
}
-bool verify(const flatbuffers::DetachedBuffer &buf, const std::string &expected_name, Color color) {
+bool verify(const flatbuffers::DetachedBuffer &buf,
+ const std::string &expected_name, Color color) {
const Monster *monster = flatbuffers::GetRoot<Monster>(buf.data());
- return (monster->name()->str() == expected_name) && (monster->color() == color);
+ return (monster->name()->str() == expected_name) &&
+ (monster->color() == color);
}
-bool verify(const uint8_t *buf, size_t offset, const std::string &expected_name, Color color) {
- const Monster *monster = flatbuffers::GetRoot<Monster>(buf+offset);
- return (monster->name()->str() == expected_name) && (monster->color() == color);
+bool verify(const uint8_t *buf, size_t offset, const std::string &expected_name,
+ Color color) {
+ const Monster *monster = flatbuffers::GetRoot<Monster>(buf + offset);
+ return (monster->name()->str() == expected_name) &&
+ (monster->color() == color);
}
-bool release_n_verify(flatbuffers::FlatBufferBuilder &fbb, const std::string &expected_name, Color color) {
+bool release_n_verify(flatbuffers::FlatBufferBuilder &fbb,
+ const std::string &expected_name, Color color) {
flatbuffers::DetachedBuffer buf = fbb.Release();
return verify(buf, expected_name, color);
}
@@ -136,13 +141,18 @@
BuilderTests<GrpcLikeMessageBuilder>::all_tests();
BuilderReuseTestSelector tests[4] = {
- REUSABLE_AFTER_RELEASE,
- REUSABLE_AFTER_RELEASE_RAW,
+ REUSABLE_AFTER_RELEASE, REUSABLE_AFTER_RELEASE_RAW,
REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN,
REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN
};
- BuilderReuseTests<FlatBufferBuilder, FlatBufferBuilder>::run_tests(TestSelector(tests, tests+4));
- BuilderReuseTests<TestHeapBuilder, TestHeapBuilder>::run_tests(TestSelector(tests, tests+4));
- BuilderReuseTests<GrpcLikeMessageBuilder, GrpcLikeMessageBuilder>::run_tests(TestSelector(tests, tests+4));
+ BuilderReuseTests<FlatBufferBuilder, FlatBufferBuilder>::run_tests(
+ TestSelector(tests, tests + 4));
+ BuilderReuseTests<TestHeapBuilder, TestHeapBuilder>::run_tests(
+ TestSelector(tests, tests + 4));
+ BuilderReuseTests<GrpcLikeMessageBuilder, GrpcLikeMessageBuilder>::run_tests(
+ TestSelector(tests, tests + 4));
}
+
+// Link-time check using pointer type.
+void CheckTestGeneratedIsValid(const MyGame::Example::Color &) {}
\ No newline at end of file
diff --git a/tests/test_builder.h b/tests/test_builder.h
index 1e2fa0a..5555e90 100644
--- a/tests/test_builder.h
+++ b/tests/test_builder.h
@@ -3,8 +3,9 @@
#include <set>
#include <type_traits>
-#include "monster_test_generated.h"
+
#include "flatbuffers/flatbuffers.h"
+#include "monster_test_generated.h"
#include "test_assert.h"
using MyGame::Example::Color;
@@ -14,50 +15,59 @@
namespace grpc {
class MessageBuilder;
}
+} // namespace flatbuffers
+
+template<class T, class U> struct is_same { static const bool value = false; };
+
+template<class T> struct is_same<T, T> { static const bool value = true; };
+
+inline std::string m1_name() { return "Cyberdemon"; }
+inline std::string m2_name() { return "Imp"; }
+inline MyGame::Example::Color m1_color() {
+ return MyGame::Example::Color_Red;
}
-
-template <class T, class U>
-struct is_same {
- static const bool value = false;
-};
-
-template <class T>
-struct is_same<T, T> {
- static const bool value = true;
-};
-
-extern const std::string m1_name;
-extern const Color m1_color;
-extern const std::string m2_name;
-extern const Color m2_color;
+inline MyGame::Example::Color m2_color() {
+ return MyGame::Example::Color_Green;
+}
+inline void m1_color_check() {
+ // Ensure that all compilation units see the same monster_test_generated.h.
+ extern void CheckTestGeneratedIsValid(const MyGame::Example::Color&);
+ CheckTestGeneratedIsValid(m1_color());
+}
flatbuffers::Offset<Monster> populate1(flatbuffers::FlatBufferBuilder &builder);
flatbuffers::Offset<Monster> populate2(flatbuffers::FlatBufferBuilder &builder);
-uint8_t *release_raw_base(flatbuffers::FlatBufferBuilder &fbb, size_t &size, size_t &offset);
+uint8_t *release_raw_base(flatbuffers::FlatBufferBuilder &fbb, size_t &size,
+ size_t &offset);
void free_raw(flatbuffers::grpc::MessageBuilder &mbb, uint8_t *buf);
void free_raw(flatbuffers::FlatBufferBuilder &fbb, uint8_t *buf);
-bool verify(const flatbuffers::DetachedBuffer &buf, const std::string &expected_name, Color color);
-bool verify(const uint8_t *buf, size_t offset, const std::string &expected_name, Color color);
+bool verify(const flatbuffers::DetachedBuffer &buf,
+ const std::string &expected_name, Color color);
+bool verify(const uint8_t *buf, size_t offset, const std::string &expected_name,
+ Color color);
-bool release_n_verify(flatbuffers::FlatBufferBuilder &fbb, const std::string &expected_name, Color color);
-bool release_n_verify(flatbuffers::grpc::MessageBuilder &mbb, const std::string &expected_name, Color color);
+bool release_n_verify(flatbuffers::FlatBufferBuilder &fbb,
+ const std::string &expected_name, Color color);
+bool release_n_verify(flatbuffers::grpc::MessageBuilder &mbb,
+ const std::string &expected_name, Color color);
// clang-format off
#if !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
// Invokes this function when testing the following Builder types
// FlatBufferBuilder, TestHeapBuilder, and GrpcLikeMessageBuilder
-template <class Builder>
+template<class Builder>
void builder_move_assign_after_releaseraw_test(Builder b1) {
auto root_offset1 = populate1(b1);
b1.Finish(root_offset1);
size_t size, offset;
- std::shared_ptr<uint8_t> raw(b1.ReleaseRaw(size, offset), [size](uint8_t *ptr) {
- flatbuffers::DefaultAllocator::dealloc(ptr, size);
- });
+ std::shared_ptr<uint8_t> raw(
+ b1.ReleaseRaw(size, offset), [size](uint8_t *ptr) {
+ flatbuffers::DefaultAllocator::dealloc(ptr, size);
+ });
Builder src;
auto root_offset2 = populate2(src);
src.Finish(root_offset2);
@@ -65,16 +75,17 @@
// Move into a released builder.
b1 = std::move(src);
TEST_EQ_FUNC(b1.GetSize(), src_size);
- TEST_ASSERT_FUNC(release_n_verify(b1, m2_name, m2_color));
+ TEST_ASSERT_FUNC(release_n_verify(b1, m2_name(), m2_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
// clang-format off
#endif // !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
-void builder_move_assign_after_releaseraw_test(flatbuffers::grpc::MessageBuilder b1);
+void builder_move_assign_after_releaseraw_test(
+ flatbuffers::grpc::MessageBuilder b1);
-template <class DestBuilder, class SrcBuilder = DestBuilder>
+template<class DestBuilder, class SrcBuilder = DestBuilder>
struct BuilderTests {
// clang-format off
#if !defined(FLATBUFFERS_CPP98_STL)
@@ -102,7 +113,7 @@
auto root_offset1 = populate1(src);
DestBuilder dst(std::move(src));
dst.Finish(root_offset1);
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
@@ -113,7 +124,7 @@
auto src_size = src.GetSize();
DestBuilder dst(std::move(src));
TEST_EQ_FUNC(dst.GetSize(), src_size);
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
@@ -124,7 +135,7 @@
populate2(dst);
dst = std::move(src);
dst.Finish(root_offset1);
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
@@ -138,7 +149,7 @@
dst.Finish(root_offset2);
dst = std::move(src);
TEST_EQ_FUNC(dst.GetSize(), src_size);
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
@@ -157,16 +168,17 @@
// Move into a released builder.
dst = std::move(src);
TEST_EQ_FUNC(dst.GetSize(), src_size);
- TEST_ASSERT_FUNC(release_n_verify(dst, m2_name, m2_color));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m2_name(), m2_color()));
TEST_EQ_FUNC(src.GetSize(), 0);
}
// clang-format off
#endif // !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
- static void builder_swap_before_finish_test(bool run = is_same<DestBuilder, SrcBuilder>::value) {
+ static void builder_swap_before_finish_test(
+ bool run = is_same<DestBuilder, SrcBuilder>::value) {
/// Swap is allowed only when lhs and rhs are the same concrete type.
- if(run) {
+ if (run) {
SrcBuilder src;
auto root_offset1 = populate1(src);
auto size1 = src.GetSize();
@@ -178,14 +190,15 @@
dst.Finish(root_offset1);
TEST_EQ_FUNC(src.GetSize() > size2, true);
TEST_EQ_FUNC(dst.GetSize() > size1, true);
- TEST_ASSERT_FUNC(release_n_verify(src, m2_name, m2_color));
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color()));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
}
}
- static void builder_swap_after_finish_test(bool run = is_same<DestBuilder, SrcBuilder>::value) {
+ static void builder_swap_after_finish_test(
+ bool run = is_same<DestBuilder, SrcBuilder>::value) {
/// Swap is allowed only when lhs and rhs are the same concrete type.
- if(run) {
+ if (run) {
SrcBuilder src;
auto root_offset1 = populate1(src);
src.Finish(root_offset1);
@@ -197,8 +210,8 @@
src.Swap(dst);
TEST_EQ_FUNC(src.GetSize(), size2);
TEST_EQ_FUNC(dst.GetSize(), size1);
- TEST_ASSERT_FUNC(release_n_verify(src, m2_name, m2_color));
- TEST_ASSERT_FUNC(release_n_verify(dst, m1_name, m1_color));
+ TEST_ASSERT_FUNC(release_n_verify(src, m2_name(), m2_color()));
+ TEST_ASSERT_FUNC(release_n_verify(dst, m1_name(), m1_color()));
}
}
@@ -233,12 +246,9 @@
typedef std::set<BuilderReuseTestSelector> TestSelector;
-template <class DestBuilder, class SrcBuilder>
-struct BuilderReuseTests {
+template<class DestBuilder, class SrcBuilder> struct BuilderReuseTests {
static void builder_reusable_after_release_test(TestSelector selector) {
- if (!selector.count(REUSABLE_AFTER_RELEASE)) {
- return;
- }
+ if (!selector.count(REUSABLE_AFTER_RELEASE)) { return; }
DestBuilder fbb;
std::vector<flatbuffers::DetachedBuffer> buffers;
@@ -246,14 +256,12 @@
auto root_offset1 = populate1(fbb);
fbb.Finish(root_offset1);
buffers.push_back(fbb.Release());
- TEST_ASSERT_FUNC(verify(buffers[i], m1_name, m1_color));
+ TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));
}
}
static void builder_reusable_after_releaseraw_test(TestSelector selector) {
- if (!selector.count(REUSABLE_AFTER_RELEASE_RAW)) {
- return;
- }
+ if (!selector.count(REUSABLE_AFTER_RELEASE_RAW)) { return; }
DestBuilder fbb;
for (int i = 0; i < 5; ++i) {
@@ -261,7 +269,7 @@
fbb.Finish(root_offset1);
size_t size, offset;
uint8_t *buf = release_raw_base(fbb, size, offset);
- TEST_ASSERT_FUNC(verify(buf, offset, m1_name, m1_color));
+ TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));
free_raw(fbb, buf);
}
}
@@ -269,10 +277,9 @@
// clang-format off
#if !defined(FLATBUFFERS_CPP98_STL)
// clang-format on
- static void builder_reusable_after_release_and_move_assign_test(TestSelector selector) {
- if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) {
- return;
- }
+ static void builder_reusable_after_release_and_move_assign_test(
+ TestSelector selector) {
+ if (!selector.count(REUSABLE_AFTER_RELEASE_AND_MOVE_ASSIGN)) { return; }
DestBuilder dst;
std::vector<flatbuffers::DetachedBuffer> buffers;
@@ -280,17 +287,16 @@
auto root_offset1 = populate1(dst);
dst.Finish(root_offset1);
buffers.push_back(dst.Release());
- TEST_ASSERT_FUNC(verify(buffers[i], m1_name, m1_color));
+ TEST_ASSERT_FUNC(verify(buffers[i], m1_name(), m1_color()));
SrcBuilder src;
dst = std::move(src);
TEST_EQ_FUNC(src.GetSize(), 0);
}
}
- static void builder_reusable_after_releaseraw_and_move_assign_test(TestSelector selector) {
- if (!selector.count(REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN)) {
- return;
- }
+ static void builder_reusable_after_releaseraw_and_move_assign_test(
+ TestSelector selector) {
+ if (!selector.count(REUSABLE_AFTER_RELEASE_RAW_AND_MOVE_ASSIGN)) { return; }
DestBuilder dst;
for (int i = 0; i < 5; ++i) {
@@ -298,7 +304,7 @@
dst.Finish(root_offset1);
size_t size, offset;
uint8_t *buf = release_raw_base(dst, size, offset);
- TEST_ASSERT_FUNC(verify(buf, offset, m1_name, m1_color));
+ TEST_ASSERT_FUNC(verify(buf, offset, m1_name(), m1_color()));
free_raw(dst, buf);
SrcBuilder src;
dst = std::move(src);
@@ -323,4 +329,4 @@
}
};
-#endif // TEST_BUILDER_H
+#endif // TEST_BUILDER_H
diff --git a/tests/unicode_test.json b/tests/unicode_test.json
index 2894f0c..7bd2671 100644
--- a/tests/unicode_test.json
+++ b/tests/unicode_test.json
@@ -13,7 +13,7 @@
"name": "Цлїςσδε"
},
{
- "name": "フムアムカモケモ"
+ "name": "☳☶☲"
},
{
"name": "フムヤムカモケモ"
@@ -22,7 +22,7 @@
"name": "㊀㊁㊂㊃㊄"
},
{
- "name": "☳☶☲"
+ "name": "フムアムカモケモ"
},
{
"name": "𡇙𝌆"
diff --git a/tests/union_vector/Attacker.cs b/tests/union_vector/Attacker.cs
index 0e3300a..870643f 100644
--- a/tests/union_vector/Attacker.cs
+++ b/tests/union_vector/Attacker.cs
@@ -3,13 +3,14 @@
// </auto-generated>
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Attacker : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Attacker GetRootAsAttacker(ByteBuffer _bb) { return GetRootAsAttacker(_bb, new Attacker()); }
public static Attacker GetRootAsAttacker(ByteBuffer _bb, Attacker obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
@@ -31,5 +32,29 @@
int o = builder.EndTable();
return new Offset<Attacker>(o);
}
+ public AttackerT UnPack() {
+ var _o = new AttackerT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(AttackerT _o) {
+ _o.SwordAttackDamage = this.SwordAttackDamage;
+ }
+ public static Offset<Attacker> Pack(FlatBufferBuilder builder, AttackerT _o) {
+ if (_o == null) return default(Offset<Attacker>);
+ return CreateAttacker(
+ builder,
+ _o.SwordAttackDamage);
+ }
};
+public class AttackerT
+{
+ [Newtonsoft.Json.JsonProperty("sword_attack_damage")]
+ public int SwordAttackDamage { get; set; }
+
+ public AttackerT() {
+ this.SwordAttackDamage = 0;
+ }
+}
+
diff --git a/tests/union_vector/Attacker.java b/tests/union_vector/Attacker.java
index afe6945..2221944 100644
--- a/tests/union_vector/Attacker.java
+++ b/tests/union_vector/Attacker.java
@@ -7,7 +7,7 @@
@SuppressWarnings("unused")
public final class Attacker extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Attacker getRootAsAttacker(ByteBuffer _bb) { return getRootAsAttacker(_bb, new Attacker()); }
public static Attacker getRootAsAttacker(ByteBuffer _bb, Attacker obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
@@ -29,5 +29,12 @@
int o = builder.endTable();
return o;
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Attacker get(int j) { return get(new Attacker(), j); }
+ public Attacker get(Attacker obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/union_vector/Attacker.kt b/tests/union_vector/Attacker.kt
index 7d3dc68..d398227 100644
--- a/tests/union_vector/Attacker.kt
+++ b/tests/union_vector/Attacker.kt
@@ -30,7 +30,7 @@
}
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsAttacker(_bb: ByteBuffer): Attacker = getRootAsAttacker(_bb, Attacker())
fun getRootAsAttacker(_bb: ByteBuffer, obj: Attacker): Attacker {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/union_vector/BookReader.cs b/tests/union_vector/BookReader.cs
index 53fe736..3f80cdf 100644
--- a/tests/union_vector/BookReader.cs
+++ b/tests/union_vector/BookReader.cs
@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct BookReader : IFlatbufferObject
@@ -20,5 +21,29 @@
builder.PutInt(BooksRead);
return new Offset<BookReader>(builder.Offset);
}
+ public BookReaderT UnPack() {
+ var _o = new BookReaderT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(BookReaderT _o) {
+ _o.BooksRead = this.BooksRead;
+ }
+ public static Offset<BookReader> Pack(FlatBufferBuilder builder, BookReaderT _o) {
+ if (_o == null) return default(Offset<BookReader>);
+ return CreateBookReader(
+ builder,
+ _o.BooksRead);
+ }
};
+public class BookReaderT
+{
+ [Newtonsoft.Json.JsonProperty("books_read")]
+ public int BooksRead { get; set; }
+
+ public BookReaderT() {
+ this.BooksRead = 0;
+ }
+}
+
diff --git a/tests/union_vector/BookReader.java b/tests/union_vector/BookReader.java
index 20ff9e2..a6d1b43 100644
--- a/tests/union_vector/BookReader.java
+++ b/tests/union_vector/BookReader.java
@@ -18,5 +18,12 @@
builder.putInt(booksRead);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public BookReader get(int j) { return get(new BookReader(), j); }
+ public BookReader get(BookReader obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/union_vector/Character.cs b/tests/union_vector/Character.cs
index 73a5cba..d067e22 100644
--- a/tests/union_vector/Character.cs
+++ b/tests/union_vector/Character.cs
@@ -2,6 +2,7 @@
// automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>
+[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum Character : byte
{
NONE = 0,
@@ -13,3 +14,79 @@
Unused = 6,
};
+public class CharacterUnion {
+ public Character Type { get; set; }
+ public object Value { get; set; }
+
+ public CharacterUnion() {
+ this.Type = Character.NONE;
+ this.Value = null;
+ }
+
+ public T As<T>() where T : class { return this.Value as T; }
+ public AttackerT AsMuLan() { return this.As<AttackerT>(); }
+ public RapunzelT AsRapunzel() { return this.As<RapunzelT>(); }
+ public BookReaderT AsBelle() { return this.As<BookReaderT>(); }
+ public BookReaderT AsBookFan() { return this.As<BookReaderT>(); }
+ public string AsOther() { return this.As<string>(); }
+ public string AsUnused() { return this.As<string>(); }
+
+ public static int Pack(FlatBuffers.FlatBufferBuilder builder, CharacterUnion _o) {
+ switch (_o.Type) {
+ default: return 0;
+ case Character.MuLan: return Attacker.Pack(builder, _o.AsMuLan()).Value;
+ case Character.Rapunzel: return Rapunzel.Pack(builder, _o.AsRapunzel()).Value;
+ case Character.Belle: return BookReader.Pack(builder, _o.AsBelle()).Value;
+ case Character.BookFan: return BookReader.Pack(builder, _o.AsBookFan()).Value;
+ case Character.Other: return builder.CreateString(_o.AsOther()).Value;
+ case Character.Unused: return builder.CreateString(_o.AsUnused()).Value;
+ }
+ }
+}
+
+public class CharacterUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
+ public override bool CanConvert(System.Type objectType) {
+ return objectType == typeof(CharacterUnion) || objectType == typeof(System.Collections.Generic.List<CharacterUnion>);
+ }
+ public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = value as System.Collections.Generic.List<CharacterUnion>;
+ if (_olist != null) {
+ writer.WriteStartArray();
+ foreach (var _o in _olist) { this.WriteJson(writer, _o, serializer); }
+ writer.WriteEndArray();
+ } else {
+ this.WriteJson(writer, value as CharacterUnion, serializer);
+ }
+ }
+ public void WriteJson(Newtonsoft.Json.JsonWriter writer, CharacterUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return;
+ serializer.Serialize(writer, _o.Value);
+ }
+ public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) {
+ var _olist = existingValue as System.Collections.Generic.List<CharacterUnion>;
+ if (_olist != null) {
+ for (var _j = 0; _j < _olist.Count; ++_j) {
+ reader.Read();
+ _olist[_j] = this.ReadJson(reader, _olist[_j], serializer);
+ }
+ reader.Read();
+ return _olist;
+ } else {
+ return this.ReadJson(reader, existingValue as CharacterUnion, serializer);
+ }
+ }
+ public CharacterUnion ReadJson(Newtonsoft.Json.JsonReader reader, CharacterUnion _o, Newtonsoft.Json.JsonSerializer serializer) {
+ if (_o == null) return null;
+ switch (_o.Type) {
+ default: break;
+ case Character.MuLan: _o.Value = serializer.Deserialize<AttackerT>(reader); break;
+ case Character.Rapunzel: _o.Value = serializer.Deserialize<RapunzelT>(reader); break;
+ case Character.Belle: _o.Value = serializer.Deserialize<BookReaderT>(reader); break;
+ case Character.BookFan: _o.Value = serializer.Deserialize<BookReaderT>(reader); break;
+ case Character.Other: _o.Value = serializer.Deserialize<string>(reader); break;
+ case Character.Unused: _o.Value = serializer.Deserialize<string>(reader); break;
+ }
+ return _o;
+ }
+}
+
diff --git a/tests/union_vector/Movie.cs b/tests/union_vector/Movie.cs
index 13dbfac..dfbdd8d 100644
--- a/tests/union_vector/Movie.cs
+++ b/tests/union_vector/Movie.cs
@@ -3,13 +3,14 @@
// </auto-generated>
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Movie : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
- public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_1_12_0(); }
public static Movie GetRootAsMovie(ByteBuffer _bb) { return GetRootAsMovie(_bb, new Movie()); }
public static Movie GetRootAsMovie(ByteBuffer _bb, Movie obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public static bool MovieBufferHasIdentifier(ByteBuffer _bb) { return Table.__has_identifier(_bb, "MOVI"); }
@@ -17,18 +18,24 @@
public Movie __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public Character MainCharacterType { get { int o = __p.__offset(4); return o != 0 ? (Character)__p.bb.Get(o + __p.bb_pos) : Character.NONE; } }
- public bool MutateMainCharacterType(Character main_character_type) { int o = __p.__offset(4); if (o != 0) { __p.bb.Put(o + __p.bb_pos, (byte)main_character_type); return true; } else { return false; } }
- public TTable? MainCharacter<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o) : null; }
+ public TTable? MainCharacter<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }
+ public string MainCharacterAsString() { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; }
+ public Attacker MainCharacterAsMuLan() { return MainCharacter<Attacker>().Value; }
+ public Rapunzel MainCharacterAsRapunzel() { return MainCharacter<Rapunzel>().Value; }
+ public BookReader MainCharacterAsBelle() { return MainCharacter<BookReader>().Value; }
+ public BookReader MainCharacterAsBookFan() { return MainCharacter<BookReader>().Value; }
+ public string MainCharacterAsOther() { return MainCharacterAsString(); }
+ public string MainCharacterAsUnused() { return MainCharacterAsString(); }
public Character CharactersType(int j) { int o = __p.__offset(8); return o != 0 ? (Character)__p.bb.Get(__p.__vector(o) + j * 1) : (Character)0; }
public int CharactersTypeLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
- public Span<byte> GetCharactersTypeBytes() { return __p.__vector_as_span(8); }
+ public Span<Character> GetCharactersTypeBytes() { return __p.__vector_as_span<Character>(8, 1); }
#else
public ArraySegment<byte>? GetCharactersTypeBytes() { return __p.__vector_as_arraysegment(8); }
#endif
- public Character[] GetCharactersTypeArray() { return __p.__vector_as_array<Character>(8); }
- public bool MutateCharactersType(int j, Character characters_type) { int o = __p.__offset(8); if (o != 0) { __p.bb.Put(__p.__vector(o) + j * 1, (byte)characters_type); return true; } else { return false; } }
- public TTable? Characters<TTable>(int j) where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(__p.__vector(o) + j * 4 - __p.bb_pos) : null; }
+ public Character[] GetCharactersTypeArray() { int o = __p.__offset(8); if (o == 0) return null; int p = __p.__vector(o); int l = __p.__vector_len(o); Character[] a = new Character[l]; for (int i = 0; i < l; i++) { a[i] = (Character)__p.bb.Get(p + i * 1); } return a; }
+ public TTable? Characters<TTable>(int j) where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(__p.__vector(o) + j * 4) : null; }
+ public string CharactersAsString(int j) { int o = __p.__offset(10); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }
public int CharactersLength { get { int o = __p.__offset(10); return o != 0 ? __p.__vector_len(o) : 0; } }
public static Offset<Movie> CreateMovie(FlatBufferBuilder builder,
@@ -61,5 +68,142 @@
}
public static void FinishMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.Finish(offset.Value, "MOVI"); }
public static void FinishSizePrefixedMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.FinishSizePrefixed(offset.Value, "MOVI"); }
+ public MovieT UnPack() {
+ var _o = new MovieT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(MovieT _o) {
+ _o.MainCharacter = new CharacterUnion();
+ _o.MainCharacter.Type = this.MainCharacterType;
+ switch (this.MainCharacterType) {
+ default: break;
+ case Character.MuLan:
+ _o.MainCharacter.Value = this.MainCharacter<Attacker>().HasValue ? this.MainCharacter<Attacker>().Value.UnPack() : null;
+ break;
+ case Character.Rapunzel:
+ _o.MainCharacter.Value = this.MainCharacter<Rapunzel>().HasValue ? this.MainCharacter<Rapunzel>().Value.UnPack() : null;
+ break;
+ case Character.Belle:
+ _o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;
+ break;
+ case Character.BookFan:
+ _o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;
+ break;
+ case Character.Other:
+ _o.MainCharacter.Value = this.MainCharacterAsString();
+ break;
+ case Character.Unused:
+ _o.MainCharacter.Value = this.MainCharacterAsString();
+ break;
+ }
+ _o.Characters = new List<CharacterUnion>();
+ for (var _j = 0; _j < this.CharactersLength; ++_j) {
+ var _o_Characters = new CharacterUnion();
+ _o_Characters.Type = this.CharactersType(_j);
+ switch (this.CharactersType(_j)) {
+ default: break;
+ case Character.MuLan:
+ _o_Characters.Value = this.Characters<Attacker>(_j).HasValue ? this.Characters<Attacker>(_j).Value.UnPack() : null;
+ break;
+ case Character.Rapunzel:
+ _o_Characters.Value = this.Characters<Rapunzel>(_j).HasValue ? this.Characters<Rapunzel>(_j).Value.UnPack() : null;
+ break;
+ case Character.Belle:
+ _o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;
+ break;
+ case Character.BookFan:
+ _o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;
+ break;
+ case Character.Other:
+ _o_Characters.Value = this.CharactersAsString(_j);
+ break;
+ case Character.Unused:
+ _o_Characters.Value = this.CharactersAsString(_j);
+ break;
+ }
+ _o.Characters.Add(_o_Characters);
+ }
+ }
+ public static Offset<Movie> Pack(FlatBufferBuilder builder, MovieT _o) {
+ if (_o == null) return default(Offset<Movie>);
+ var _main_character_type = _o.MainCharacter == null ? Character.NONE : _o.MainCharacter.Type;
+ var _main_character = _o.MainCharacter == null ? 0 : CharacterUnion.Pack(builder, _o.MainCharacter);
+ var _characters_type = default(VectorOffset);
+ if (_o.Characters != null) {
+ var __characters_type = new Character[_o.Characters.Count];
+ for (var _j = 0; _j < __characters_type.Length; ++_j) { __characters_type[_j] = _o.Characters[_j].Type; }
+ _characters_type = CreateCharactersTypeVector(builder, __characters_type);
+ }
+ var _characters = default(VectorOffset);
+ if (_o.Characters != null) {
+ var __characters = new int[_o.Characters.Count];
+ for (var _j = 0; _j < __characters.Length; ++_j) { __characters[_j] = CharacterUnion.Pack(builder, _o.Characters[_j]); }
+ _characters = CreateCharactersVector(builder, __characters);
+ }
+ return CreateMovie(
+ builder,
+ _main_character_type,
+ _main_character,
+ _characters_type,
+ _characters);
+ }
};
+public class MovieT
+{
+ [Newtonsoft.Json.JsonProperty("main_character_type")]
+ private Character MainCharacterType {
+ get {
+ return this.MainCharacter != null ? this.MainCharacter.Type : Character.NONE;
+ }
+ set {
+ this.MainCharacter = new CharacterUnion();
+ this.MainCharacter.Type = value;
+ }
+ }
+ [Newtonsoft.Json.JsonProperty("main_character")]
+ [Newtonsoft.Json.JsonConverter(typeof(CharacterUnion_JsonConverter))]
+ public CharacterUnion MainCharacter { get; set; }
+ [Newtonsoft.Json.JsonProperty("characters_type")]
+ private Character[] CharactersType {
+ get {
+ if (this.Characters == null) return null;
+ var _o = new Character[this.Characters.Count];
+ for (var _j = 0; _j < _o.Length; ++_j) { _o[_j] = this.Characters[_j].Type; }
+ return _o;
+ }
+ set {
+ this.Characters = new List<CharacterUnion>();
+ for (var _j = 0; _j < value.Length; ++_j) {
+ var _o = new CharacterUnion();
+ _o.Type = value[_j];
+ this.Characters.Add(_o);
+ }
+ }
+ }
+ [Newtonsoft.Json.JsonProperty("characters")]
+ [Newtonsoft.Json.JsonConverter(typeof(CharacterUnion_JsonConverter))]
+ public List<CharacterUnion> Characters { get; set; }
+
+ public MovieT() {
+ this.MainCharacter = null;
+ this.Characters = null;
+ }
+
+ public static MovieT DeserializeFromJson(string jsonText) {
+ return Newtonsoft.Json.JsonConvert.DeserializeObject<MovieT>(jsonText);
+ }
+ public string SerializeToJson() {
+ return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
+ }
+ public static MovieT DeserializeFromBinary(byte[] fbBuffer) {
+ return Movie.GetRootAsMovie(new ByteBuffer(fbBuffer)).UnPack();
+ }
+ public byte[] SerializeToBinary() {
+ var fbb = new FlatBufferBuilder(0x10000);
+ Movie.FinishMovieBuffer(fbb, Movie.Pack(fbb, this));
+ return fbb.DataBuffer.ToSizedArray();
+ }
+}
+
diff --git a/tests/union_vector/Movie.java b/tests/union_vector/Movie.java
index 0f6a19c..d8a97bf 100644
--- a/tests/union_vector/Movie.java
+++ b/tests/union_vector/Movie.java
@@ -7,7 +7,7 @@
@SuppressWarnings("unused")
public final class Movie extends Table {
- public static void ValidateVersion() { Constants.FLATBUFFERS_1_11_1(); }
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
public static Movie getRootAsMovie(ByteBuffer _bb) { return getRootAsMovie(_bb, new Movie()); }
public static Movie getRootAsMovie(ByteBuffer _bb, Movie obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public static boolean MovieBufferHasIdentifier(ByteBuffer _bb) { return __has_identifier(_bb, "MOVI"); }
@@ -15,15 +15,17 @@
public Movie __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public byte mainCharacterType() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) : 0; }
- public boolean mutateMainCharacterType(byte main_character_type) { int o = __offset(4); if (o != 0) { bb.put(o + bb_pos, main_character_type); return true; } else { return false; } }
- public Table mainCharacter(Table obj) { int o = __offset(6); return o != 0 ? __union(obj, o) : null; }
+ public Table mainCharacter(Table obj) { int o = __offset(6); return o != 0 ? __union(obj, o + bb_pos) : null; }
public byte charactersType(int j) { int o = __offset(8); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; }
public int charactersTypeLength() { int o = __offset(8); return o != 0 ? __vector_len(o) : 0; }
+ public ByteVector charactersTypeVector() { return charactersTypeVector(new ByteVector()); }
+ public ByteVector charactersTypeVector(ByteVector obj) { int o = __offset(8); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
public ByteBuffer charactersTypeAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }
public ByteBuffer charactersTypeInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }
- public boolean mutateCharactersType(int j, byte characters_type) { int o = __offset(8); if (o != 0) { bb.put(__vector(o) + j * 1, characters_type); return true; } else { return false; } }
- public Table characters(Table obj, int j) { int o = __offset(10); return o != 0 ? __union(obj, __vector(o) + j * 4 - bb_pos) : null; }
+ public Table characters(Table obj, int j) { int o = __offset(10); return o != 0 ? __union(obj, __vector(o) + j * 4) : null; }
public int charactersLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; }
+ public UnionVector charactersVector() { return charactersVector(new UnionVector()); }
+ public UnionVector charactersVector(UnionVector obj) { int o = __offset(10); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
public static int createMovie(FlatBufferBuilder builder,
byte main_character_type,
@@ -53,5 +55,12 @@
}
public static void finishMovieBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset, "MOVI"); }
public static void finishSizePrefixedMovieBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset, "MOVI"); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Movie get(int j) { return get(new Movie(), j); }
+ public Movie get(Movie obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
}
diff --git a/tests/union_vector/Movie.kt b/tests/union_vector/Movie.kt
index b8a135b..714d46f 100644
--- a/tests/union_vector/Movie.kt
+++ b/tests/union_vector/Movie.kt
@@ -30,7 +30,7 @@
}
}
fun mainCharacter(obj: Table) : Table? {
- val o = __offset(6); return if (o != 0) __union(obj, o) else null
+ val o = __offset(6); return if (o != 0) __union(obj, o + bb_pos) else null
}
fun charactersType(j: Int) : UByte {
val o = __offset(8)
@@ -58,7 +58,7 @@
fun characters(obj: Table, j: Int) : Table? {
val o = __offset(10)
return if (o != 0) {
- __union(obj, __vector(o) + j * 4 - bb_pos)
+ __union(obj, __vector(o) + j * 4)
} else {
null
}
@@ -68,7 +68,7 @@
val o = __offset(10); return if (o != 0) __vector_len(o) else 0
}
companion object {
- fun validateVersion() = Constants.FLATBUFFERS_1_11_1()
+ fun validateVersion() = Constants.FLATBUFFERS_1_12_0()
fun getRootAsMovie(_bb: ByteBuffer): Movie = getRootAsMovie(_bb, Movie())
fun getRootAsMovie(_bb: ByteBuffer, obj: Movie): Movie {
_bb.order(ByteOrder.LITTLE_ENDIAN)
diff --git a/tests/union_vector/Rapunzel.cs b/tests/union_vector/Rapunzel.cs
index cb05d4a..e5ffff8 100644
--- a/tests/union_vector/Rapunzel.cs
+++ b/tests/union_vector/Rapunzel.cs
@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
+using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Rapunzel : IFlatbufferObject
@@ -20,5 +21,29 @@
builder.PutInt(HairLength);
return new Offset<Rapunzel>(builder.Offset);
}
+ public RapunzelT UnPack() {
+ var _o = new RapunzelT();
+ this.UnPackTo(_o);
+ return _o;
+ }
+ public void UnPackTo(RapunzelT _o) {
+ _o.HairLength = this.HairLength;
+ }
+ public static Offset<Rapunzel> Pack(FlatBufferBuilder builder, RapunzelT _o) {
+ if (_o == null) return default(Offset<Rapunzel>);
+ return CreateRapunzel(
+ builder,
+ _o.HairLength);
+ }
};
+public class RapunzelT
+{
+ [Newtonsoft.Json.JsonProperty("hair_length")]
+ public int HairLength { get; set; }
+
+ public RapunzelT() {
+ this.HairLength = 0;
+ }
+}
+
diff --git a/tests/union_vector/Rapunzel.java b/tests/union_vector/Rapunzel.java
index 852c061..96d3cfe 100644
--- a/tests/union_vector/Rapunzel.java
+++ b/tests/union_vector/Rapunzel.java
@@ -18,5 +18,12 @@
builder.putInt(hairLength);
return builder.offset();
}
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public Rapunzel get(int j) { return get(new Rapunzel(), j); }
+ public Rapunzel get(Rapunzel obj, int j) { return obj.__assign(__element(j), bb); }
+ }
}
diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h
index 150c8f4..e6c7971 100644
--- a/tests/union_vector/union_vector_generated.h
+++ b/tests/union_vector/union_vector_generated.h
@@ -7,6 +7,7 @@
#include "flatbuffers/flatbuffers.h"
struct Attacker;
+struct AttackerBuilder;
struct AttackerT;
struct Rapunzel;
@@ -14,6 +15,7 @@
struct BookReader;
struct Movie;
+struct MovieBuilder;
struct MovieT;
bool operator==(const AttackerT &lhs, const AttackerT &rhs);
@@ -73,7 +75,7 @@
}
inline const char *EnumNameCharacter(Character e) {
- if (e < Character_NONE || e > Character_Unused) return "";
+ if (flatbuffers::IsOutRange(e, Character_NONE, Character_Unused)) return "";
const size_t index = static_cast<size_t>(e);
return EnumNamesCharacter()[index];
}
@@ -86,8 +88,8 @@
CharacterUnion(CharacterUnion&& u) FLATBUFFERS_NOEXCEPT :
type(Character_NONE), value(nullptr)
{ std::swap(type, u.type); std::swap(value, u.value); }
- CharacterUnion(const CharacterUnion &) FLATBUFFERS_NOEXCEPT;
- CharacterUnion &operator=(const CharacterUnion &u) FLATBUFFERS_NOEXCEPT
+ CharacterUnion(const CharacterUnion &);
+ CharacterUnion &operator=(const CharacterUnion &u)
{ CharacterUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; }
CharacterUnion &operator=(CharacterUnion &&u) FLATBUFFERS_NOEXCEPT
{ std::swap(type, u.type); std::swap(value, u.value); return *this; }
@@ -200,8 +202,11 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return RapunzelTypeTable();
}
- Rapunzel() {
- memset(static_cast<void *>(this), 0, sizeof(Rapunzel));
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "Rapunzel";
+ }
+ Rapunzel()
+ : hair_length_(0) {
}
Rapunzel(int32_t _hair_length)
: hair_length_(flatbuffers::EndianScalar(_hair_length)) {
@@ -233,8 +238,11 @@
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return BookReaderTypeTable();
}
- BookReader() {
- memset(static_cast<void *>(this), 0, sizeof(BookReader));
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "BookReader";
+ }
+ BookReader()
+ : books_read_(0) {
}
BookReader(int32_t _books_read)
: books_read_(flatbuffers::EndianScalar(_books_read)) {
@@ -260,6 +268,9 @@
struct AttackerT : public flatbuffers::NativeTable {
typedef Attacker TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "AttackerT";
+ }
int32_t sword_attack_damage;
AttackerT()
: sword_attack_damage(0) {
@@ -278,9 +289,13 @@
struct Attacker FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef AttackerT NativeTableType;
+ typedef AttackerBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return AttackerTypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "Attacker";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_SWORD_ATTACK_DAMAGE = 4
};
@@ -301,6 +316,7 @@
};
struct AttackerBuilder {
+ typedef Attacker Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_sword_attack_damage(int32_t sword_attack_damage) {
@@ -310,7 +326,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- AttackerBuilder &operator=(const AttackerBuilder &);
flatbuffers::Offset<Attacker> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<Attacker>(end);
@@ -330,6 +345,9 @@
struct MovieT : public flatbuffers::NativeTable {
typedef Movie TableType;
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "MovieT";
+ }
CharacterUnion main_character;
std::vector<CharacterUnion> characters;
MovieT() {
@@ -349,9 +367,13 @@
struct Movie FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
typedef MovieT NativeTableType;
+ typedef MovieBuilder Builder;
static const flatbuffers::TypeTable *MiniReflectTypeTable() {
return MovieTypeTable();
}
+ static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {
+ return "Movie";
+ }
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_MAIN_CHARACTER_TYPE = 4,
VT_MAIN_CHARACTER = 6,
@@ -361,9 +383,6 @@
Character main_character_type() const {
return static_cast<Character>(GetField<uint8_t>(VT_MAIN_CHARACTER_TYPE, 0));
}
- bool mutate_main_character_type(Character _main_character_type) {
- return SetField<uint8_t>(VT_MAIN_CHARACTER_TYPE, static_cast<uint8_t>(_main_character_type), 0);
- }
const void *main_character() const {
return GetPointer<const void *>(VT_MAIN_CHARACTER);
}
@@ -418,6 +437,7 @@
};
struct MovieBuilder {
+ typedef Movie Table;
flatbuffers::FlatBufferBuilder &fbb_;
flatbuffers::uoffset_t start_;
void add_main_character_type(Character main_character_type) {
@@ -436,7 +456,6 @@
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
- MovieBuilder &operator=(const MovieBuilder &);
flatbuffers::Offset<Movie> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = flatbuffers::Offset<Movie>(end);
@@ -477,15 +496,15 @@
flatbuffers::Offset<Movie> CreateMovie(flatbuffers::FlatBufferBuilder &_fbb, const MovieT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr);
inline AttackerT *Attacker::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new AttackerT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<AttackerT> _o = flatbuffers::unique_ptr<AttackerT>(new AttackerT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Attacker::UnPackTo(AttackerT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = sword_attack_damage(); _o->sword_attack_damage = _e; };
+ { auto _e = sword_attack_damage(); _o->sword_attack_damage = _e; }
}
inline flatbuffers::Offset<Attacker> Attacker::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AttackerT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -503,18 +522,18 @@
}
inline MovieT *Movie::UnPack(const flatbuffers::resolver_function_t *_resolver) const {
- auto _o = new MovieT();
- UnPackTo(_o, _resolver);
- return _o;
+ flatbuffers::unique_ptr<MovieT> _o = flatbuffers::unique_ptr<MovieT>(new MovieT());
+ UnPackTo(_o.get(), _resolver);
+ return _o.release();
}
inline void Movie::UnPackTo(MovieT *_o, const flatbuffers::resolver_function_t *_resolver) const {
(void)_o;
(void)_resolver;
- { auto _e = main_character_type(); _o->main_character.type = _e; };
- { auto _e = main_character(); if (_e) _o->main_character.value = CharacterUnion::UnPack(_e, main_character_type(), _resolver); };
- { auto _e = characters_type(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].type = static_cast<Character>(_e->Get(_i)); } } };
- { auto _e = characters(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].value = CharacterUnion::UnPack(_e->Get(_i), characters_type()->GetEnum<Character>(_i), _resolver); } } };
+ { auto _e = main_character_type(); _o->main_character.type = _e; }
+ { auto _e = main_character(); if (_e) _o->main_character.value = CharacterUnion::UnPack(_e, main_character_type(), _resolver); }
+ { auto _e = characters_type(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].type = static_cast<Character>(_e->Get(_i)); } } }
+ { auto _e = characters(); if (_e) { _o->characters.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->characters[_i].value = CharacterUnion::UnPack(_e->Get(_i), characters_type()->GetEnum<Character>(_i), _resolver); } } }
}
inline flatbuffers::Offset<Movie> Movie::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MovieT* _o, const flatbuffers::rehasher_function_t *_rehasher) {
@@ -563,7 +582,7 @@
auto ptr = reinterpret_cast<const flatbuffers::String *>(obj);
return verifier.VerifyString(ptr);
}
- default: return false;
+ default: return true;
}
}
@@ -639,7 +658,7 @@
}
}
-inline CharacterUnion::CharacterUnion(const CharacterUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) {
+inline CharacterUnion::CharacterUnion(const CharacterUnion &u) : type(u.type), value(nullptr) {
switch (type) {
case Character_MuLan: {
value = new AttackerT(*reinterpret_cast<AttackerT *>(u.value));
@@ -733,7 +752,7 @@
"Unused"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_UNION, 7, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_UNION, 7, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
@@ -746,7 +765,7 @@
"sword_attack_damage"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names
+ flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, nullptr, names
};
return &tt;
}
@@ -760,7 +779,7 @@
"hair_length"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 1, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 1, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
@@ -774,7 +793,7 @@
"books_read"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_STRUCT, 1, type_codes, nullptr, values, names
+ flatbuffers::ST_STRUCT, 1, type_codes, nullptr, nullptr, values, names
};
return &tt;
}
@@ -796,7 +815,7 @@
"characters"
};
static const flatbuffers::TypeTable tt = {
- flatbuffers::ST_TABLE, 4, type_codes, type_refs, nullptr, names
+ flatbuffers::ST_TABLE, 4, type_codes, type_refs, nullptr, nullptr, names
};
return &tt;
}
diff --git a/tests/union_vector/union_vector_generated.js b/tests/union_vector/union_vector_generated.js
index 406cb2f..9e8b76e 100644
--- a/tests/union_vector/union_vector_generated.js
+++ b/tests/union_vector/union_vector_generated.js
@@ -17,13 +17,13 @@
* @enum {string}
*/
var CharacterName = {
- 0: 'NONE',
- 1: 'MuLan',
- 2: 'Rapunzel',
- 3: 'Belle',
- 4: 'BookFan',
- 5: 'Other',
- 6: 'Unused'
+ '0': 'NONE',
+ '1': 'MuLan',
+ '2': 'Rapunzel',
+ '3': 'Belle',
+ '4': 'BookFan',
+ '5': 'Other',
+ '6': 'Unused'
};
/**
@@ -67,6 +67,7 @@
* @returns {Attacker}
*/
Attacker.getSizePrefixedRootAsAttacker = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new Attacker).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -94,6 +95,13 @@
};
/**
+ * @returns {string}
+ */
+Attacker.getFullyQualifiedName = function() {
+ return 'Attacker';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
Attacker.startAttacker = function(builder) {
@@ -166,17 +174,25 @@
* @returns {boolean}
*/
Rapunzel.prototype.mutate_hair_length = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt32(this.bb_pos + offset, value);
+ this.bb.writeInt32(this.bb_pos + 0, value);
return true;
};
/**
+ * @returns {string}
+ */
+Rapunzel.getFullyQualifiedName = function() {
+ return 'Rapunzel';
+}
+
+/**
+ * @returns {number}
+ */
+Rapunzel.sizeOf = function() {
+ return 4;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} hair_length
* @returns {flatbuffers.Offset}
@@ -225,17 +241,25 @@
* @returns {boolean}
*/
BookReader.prototype.mutate_books_read = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeInt32(this.bb_pos + offset, value);
+ this.bb.writeInt32(this.bb_pos + 0, value);
return true;
};
/**
+ * @returns {string}
+ */
+BookReader.getFullyQualifiedName = function() {
+ return 'BookReader';
+}
+
+/**
+ * @returns {number}
+ */
+BookReader.sizeOf = function() {
+ return 4;
+}
+
+/**
* @param {flatbuffers.Builder} builder
* @param {number} books_read
* @returns {flatbuffers.Offset}
@@ -287,6 +311,7 @@
* @returns {Movie}
*/
Movie.getSizePrefixedRootAsMovie = function(bb, obj) {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
return (obj || new Movie).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
@@ -307,21 +332,6 @@
};
/**
- * @param {Character} value
- * @returns {boolean}
- */
-Movie.prototype.mutate_main_character_type = function(value) {
- var offset = this.bb.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param {flatbuffers.Table} obj
* @returns {?flatbuffers.Table}
*/
@@ -374,6 +384,13 @@
};
/**
+ * @returns {string}
+ */
+Movie.getFullyQualifiedName = function() {
+ return 'Movie';
+}
+
+/**
* @param {flatbuffers.Builder} builder
*/
Movie.startMovie = function(builder) {
diff --git a/tests/union_vector/union_vector_generated.ts b/tests/union_vector/union_vector_generated.ts
index 642f672..806c07f 100644
--- a/tests/union_vector/union_vector_generated.ts
+++ b/tests/union_vector/union_vector_generated.ts
@@ -1,5 +1,6 @@
// automatically generated by the FlatBuffers compiler, do not modify
+import * as flatbuffers from 'flatbuffers';
/**
* @enum {number}
*/
@@ -13,6 +14,39 @@
Unused= 6
};
+export function unionToCharacter(
+ type: Character,
+ accessor: (obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null
+): Attacker|BookReader|Rapunzel|string|null {
+ switch(Character[type]) {
+ case 'NONE': return null;
+ case 'MuLan': return accessor(new Attacker())! as Attacker;
+ case 'Rapunzel': return accessor(new Rapunzel())! as Rapunzel;
+ case 'Belle': return accessor(new BookReader())! as BookReader;
+ case 'BookFan': return accessor(new BookReader())! as BookReader;
+ case 'Other': return accessor('') as string;
+ case 'Unused': return accessor('') as string;
+ default: return null;
+ }
+}
+
+export function unionListToCharacter(
+ type: Character,
+ accessor: (index: number, obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null,
+ index: number
+): Attacker|BookReader|Rapunzel|string|null {
+ switch(Character[type]) {
+ case 'NONE': return null;
+ case 'MuLan': return accessor(index, new Attacker())! as Attacker;
+ case 'Rapunzel': return accessor(index, new Rapunzel())! as Rapunzel;
+ case 'Belle': return accessor(index, new BookReader())! as BookReader;
+ case 'BookFan': return accessor(index, new BookReader())! as BookReader;
+ case 'Other': return accessor(index, '') as string;
+ case 'Unused': return accessor(index, '') as string;
+ default: return null;
+ }
+}
+
/**
* @constructor
*/
@@ -37,7 +71,7 @@
* @returns Attacker
*/
static getRootAsAttacker(bb:flatbuffers.ByteBuffer, obj?:Attacker):Attacker {
- return (obj || new Attacker).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -46,7 +80,8 @@
* @returns Attacker
*/
static getSizePrefixedRootAsAttacker(bb:flatbuffers.ByteBuffer, obj?:Attacker):Attacker {
- return (obj || new Attacker).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Attacker()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -73,6 +108,13 @@
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'Attacker';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startAttacker(builder:flatbuffers.Builder) {
@@ -101,6 +143,42 @@
Attacker.addSwordAttackDamage(builder, swordAttackDamage);
return Attacker.endAttacker(builder);
}
+
+/**
+ * @returns AttackerT
+ */
+unpack(): AttackerT {
+ return new AttackerT(
+ this.swordAttackDamage()
+ );
+};
+
+/**
+ * @param AttackerT _o
+ */
+unpackTo(_o: AttackerT): void {
+ _o.swordAttackDamage = this.swordAttackDamage();
+};
+}
+
+export class AttackerT {
+/**
+ * @constructor
+ * @param number swordAttackDamage
+ */
+constructor(
+ public swordAttackDamage: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return Attacker.createAttacker(builder,
+ this.swordAttackDamage
+ );
+};
}
/**
* @constructor
@@ -132,17 +210,25 @@
* @returns boolean
*/
mutate_hair_length(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt32(this.bb_pos + offset, value);
+ this.bb!.writeInt32(this.bb_pos + 0, value);
return true;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'Rapunzel';
+}
+
+/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 4;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number hair_length
* @returns flatbuffers.Offset
@@ -153,6 +239,42 @@
return builder.offset();
};
+
+/**
+ * @returns RapunzelT
+ */
+unpack(): RapunzelT {
+ return new RapunzelT(
+ this.hairLength()
+ );
+};
+
+/**
+ * @param RapunzelT _o
+ */
+unpackTo(_o: RapunzelT): void {
+ _o.hairLength = this.hairLength();
+};
+}
+
+export class RapunzelT {
+/**
+ * @constructor
+ * @param number hairLength
+ */
+constructor(
+ public hairLength: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return Rapunzel.createRapunzel(builder,
+ this.hairLength
+ );
+};
}
/**
* @constructor
@@ -184,17 +306,25 @@
* @returns boolean
*/
mutate_books_read(value:number):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 0);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeInt32(this.bb_pos + offset, value);
+ this.bb!.writeInt32(this.bb_pos + 0, value);
return true;
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'BookReader';
+}
+
+/**
+ * @returns number
+ */
+static sizeOf():number {
+ return 4;
+}
+
+/**
* @param flatbuffers.Builder builder
* @param number books_read
* @returns flatbuffers.Offset
@@ -205,6 +335,42 @@
return builder.offset();
};
+
+/**
+ * @returns BookReaderT
+ */
+unpack(): BookReaderT {
+ return new BookReaderT(
+ this.booksRead()
+ );
+};
+
+/**
+ * @param BookReaderT _o
+ */
+unpackTo(_o: BookReaderT): void {
+ _o.booksRead = this.booksRead();
+};
+}
+
+export class BookReaderT {
+/**
+ * @constructor
+ * @param number booksRead
+ */
+constructor(
+ public booksRead: number = 0
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ return BookReader.createBookReader(builder,
+ this.booksRead
+ );
+};
}
/**
* @constructor
@@ -230,7 +396,7 @@
* @returns Movie
*/
static getRootAsMovie(bb:flatbuffers.ByteBuffer, obj?:Movie):Movie {
- return (obj || new Movie).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ return (obj || new Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -239,7 +405,8 @@
* @returns Movie
*/
static getSizePrefixedRootAsMovie(bb:flatbuffers.ByteBuffer, obj?:Movie):Movie {
- return (obj || new Movie).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new Movie()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
@@ -259,27 +426,12 @@
};
/**
- * @param Character value
- * @returns boolean
- */
-mutate_main_character_type(value:Character):boolean {
- var offset = this.bb!.__offset(this.bb_pos, 4);
-
- if (offset === 0) {
- return false;
- }
-
- this.bb!.writeUint8(this.bb_pos + offset, value);
- return true;
-};
-
-/**
* @param flatbuffers.Table obj
* @returns ?flatbuffers.Table
*/
-mainCharacter<T extends flatbuffers.Table>(obj:T):T|null {
+mainCharacter<T extends flatbuffers.Table>(obj:T|string):T|string|null {
var offset = this.bb!.__offset(this.bb_pos, 6);
- return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;
+ return offset ? this.bb!.__union_with_string(obj, this.bb_pos + offset) : null;
};
/**
@@ -312,9 +464,9 @@
* @param flatbuffers.Table= obj
* @returns ?flatbuffers.Table
*/
-characters<T extends flatbuffers.Table>(index: number, obj:T):T|null {
+characters<T extends flatbuffers.Table>(index: number, obj:T|string):T|string|null {
var offset = this.bb!.__offset(this.bb_pos, 10);
- return offset ? this.bb!.__union(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null;
+ return offset ? this.bb!.__union_with_string(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null;
};
/**
@@ -326,6 +478,13 @@
};
/**
+ * @returns string
+ */
+static getFullyQualifiedName():string {
+ return 'Movie';
+}
+
+/**
* @param flatbuffers.Builder builder
*/
static startMovie(builder:flatbuffers.Builder) {
@@ -439,4 +598,93 @@
Movie.addCharacters(builder, charactersOffset);
return Movie.endMovie(builder);
}
+
+/**
+ * @returns MovieT
+ */
+unpack(): MovieT {
+ return new MovieT(
+ this.mainCharacterType(),
+ (() => {
+ let temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));
+ if(temp === null) { return null; }
+ if(typeof temp === 'string') { return temp; }
+ return temp.unpack()
+ })(),
+ this.bb!.createScalarList(this.charactersType.bind(this), this.charactersTypeLength()),
+ (() => {
+ let ret = [];
+ for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {
+ let targetEnum = this.charactersType(targetEnumIndex);
+ if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }
+
+ let temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);
+ if(temp === null) { continue; }
+ if(typeof temp === 'string') { ret.push(temp); continue; }
+ ret.push(temp.unpack());
+ }
+ return ret;
+ })()
+ );
+};
+
+/**
+ * @param MovieT _o
+ */
+unpackTo(_o: MovieT): void {
+ _o.mainCharacterType = this.mainCharacterType();
+ _o.mainCharacter = (() => {
+ let temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));
+ if(temp === null) { return null; }
+ if(typeof temp === 'string') { return temp; }
+ return temp.unpack()
+ })();
+ _o.charactersType = this.bb!.createScalarList(this.charactersType.bind(this), this.charactersTypeLength());
+ _o.characters = (() => {
+ let ret = [];
+ for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {
+ let targetEnum = this.charactersType(targetEnumIndex);
+ if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }
+
+ let temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);
+ if(temp === null) { continue; }
+ if(typeof temp === 'string') { ret.push(temp); continue; }
+ ret.push(temp.unpack());
+ }
+ return ret;
+ })();
+};
+}
+
+export class MovieT {
+/**
+ * @constructor
+ * @param Character mainCharacterType
+ * @param AttackerT|BookReaderT|RapunzelT|string|null mainCharacter
+ * @param (Character)[] charactersType
+ * @param (AttackerT|BookReaderT|RapunzelT|string)[] characters
+ */
+constructor(
+ public mainCharacterType: Character = Character.NONE,
+ public mainCharacter: AttackerT|BookReaderT|RapunzelT|string|null = null,
+ public charactersType: (Character)[] = [],
+ public characters: (AttackerT|BookReaderT|RapunzelT|string)[] = []
+){};
+
+/**
+ * @param flatbuffers.Builder builder
+ * @returns flatbuffers.Offset
+ */
+pack(builder:flatbuffers.Builder): flatbuffers.Offset {
+ const mainCharacter = builder.createObjectOffset(this.mainCharacter);
+ const charactersType = Movie.createCharactersTypeVector(builder, this.charactersType);
+ const characters = Movie.createCharactersVector(builder, builder.createObjectOffsetList(this.characters));
+
+ return Movie.createMovie(builder,
+ this.mainCharacterType,
+ mainCharacter,
+ charactersType,
+ characters
+ );
+};
}