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/rust/flexbuffers/src/reader/de.rs b/rust/flexbuffers/src/reader/de.rs
new file mode 100644
index 0000000..8cc3b6e
--- /dev/null
+++ b/rust/flexbuffers/src/reader/de.rs
@@ -0,0 +1,254 @@
+// 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 super::Error;
+use crate::{FlexBufferType, Reader, ReaderIterator};
+use serde::de::{
+    DeserializeSeed, Deserializer, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
+    VariantAccess, Visitor,
+};
+
+/// Errors that may happen when deserializing a flexbuffer with serde.
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum DeserializationError {
+    Reader(Error),
+    Serde(String),
+}
+
+impl std::error::Error for DeserializationError {}
+impl std::fmt::Display for DeserializationError {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+        match self {
+            Self::Reader(r) => write!(f, "Flexbuffer Read Error: {:?}", r),
+            Self::Serde(s) => write!(f, "Serde Error: {}", s),
+        }
+    }
+}
+impl serde::de::Error for DeserializationError {
+    fn custom<T>(msg: T) -> Self
+    where
+        T: std::fmt::Display,
+    {
+        Self::Serde(format!("{}", msg))
+    }
+}
+impl std::convert::From<super::Error> for DeserializationError {
+    fn from(e: super::Error) -> Self {
+        Self::Reader(e)
+    }
+}
+
+impl<'de> SeqAccess<'de> for ReaderIterator<'de> {
+    type Error = DeserializationError;
+    fn next_element_seed<T>(
+        &mut self,
+        seed: T,
+    ) -> Result<Option<<T as DeserializeSeed<'de>>::Value>, Self::Error>
+    where
+        T: DeserializeSeed<'de>,
+    {
+        if let Some(elem) = self.next() {
+            seed.deserialize(elem).map(Some)
+        } else {
+            Ok(None)
+        }
+    }
+    fn size_hint(&self) -> Option<usize> {
+        Some(self.len())
+    }
+}
+
+struct EnumReader<'de> {
+    variant: &'de str,
+    value: Option<Reader<'de>>,
+}
+
+impl<'de> EnumAccess<'de> for EnumReader<'de> {
+    type Error = DeserializationError;
+    type Variant = Reader<'de>;
+    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
+    where
+        V: DeserializeSeed<'de>,
+    {
+        seed.deserialize(self.variant.into_deserializer())
+            .map(|v| (v, self.value.unwrap_or_default()))
+    }
+}
+
+struct MapAccessor<'de> {
+    keys: ReaderIterator<'de>,
+    vals: ReaderIterator<'de>,
+}
+impl<'de> MapAccess<'de> for MapAccessor<'de> {
+    type Error = DeserializationError;
+
+    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
+    where
+        K: DeserializeSeed<'de>,
+    {
+        if let Some(k) = self.keys.next() {
+            seed.deserialize(k).map(Some)
+        } else {
+            Ok(None)
+        }
+    }
+    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
+    where
+        V: DeserializeSeed<'de>,
+    {
+        let val = self.vals.next().ok_or(Error::IndexOutOfBounds)?;
+        seed.deserialize(val)
+    }
+}
+
+impl<'de> VariantAccess<'de> for Reader<'de> {
+    type Error = DeserializationError;
+    fn unit_variant(self) -> Result<(), Self::Error> {
+        Ok(())
+    }
+    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
+    where
+        T: DeserializeSeed<'de>,
+    {
+        seed.deserialize(self)
+    }
+    // Tuple variants have an internally tagged representation. They are vectors where Index 0 is
+    // the discriminant and index N is field N-1.
+    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        visitor.visit_seq(self.as_vector().iter())
+    }
+    // Struct variants have an internally tagged representation. They are vectors where Index 0 is
+    // the discriminant and index N is field N-1.
+    fn struct_variant<V>(
+        self,
+        _fields: &'static [&'static str],
+        visitor: V,
+    ) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        let m = self.get_map()?;
+        visitor.visit_map(MapAccessor {
+            keys: m.keys_vector().iter(),
+            vals: m.iter_values(),
+        })
+    }
+}
+
+impl<'de> Deserializer<'de> for crate::Reader<'de> {
+    type Error = DeserializationError;
+    fn is_human_readable(&self) -> bool {
+        cfg!(deserialize_human_readable)
+    }
+
+    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        use crate::BitWidth::*;
+        use crate::FlexBufferType::*;
+        match (self.flexbuffer_type(), self.bitwidth()) {
+            (Bool, _) => visitor.visit_bool(self.as_bool()),
+            (UInt, W8) => visitor.visit_u8(self.as_u8()),
+            (UInt, W16) => visitor.visit_u16(self.as_u16()),
+            (UInt, W32) => visitor.visit_u32(self.as_u32()),
+            (UInt, W64) => visitor.visit_u64(self.as_u64()),
+            (Int, W8) => visitor.visit_i8(self.as_i8()),
+            (Int, W16) => visitor.visit_i16(self.as_i16()),
+            (Int, W32) => visitor.visit_i32(self.as_i32()),
+            (Int, W64) => visitor.visit_i64(self.as_i64()),
+            (Float, W32) => visitor.visit_f32(self.as_f32()),
+            (Float, W64) => visitor.visit_f64(self.as_f64()),
+            (Float, _) => Err(Error::InvalidPackedType.into()), // f8 and f16 are not supported.
+            (Null, _) => visitor.visit_unit(),
+            (String, _) | (Key, _) => visitor.visit_borrowed_str(self.as_str()),
+            (Blob, _) => visitor.visit_borrowed_bytes(self.get_blob()?.0),
+            (Map, _) => {
+                let m = self.get_map()?;
+                visitor.visit_map(MapAccessor {
+                    keys: m.keys_vector().iter(),
+                    vals: m.iter_values(),
+                })
+            }
+            (ty, _) if ty.is_vector() => visitor.visit_seq(self.as_vector().iter()),
+            (ty, bw) => unreachable!("TODO deserialize_any {:?} {:?}.", ty, bw),
+        }
+    }
+    serde::forward_to_deserialize_any! {
+        bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 str unit unit_struct bytes
+        ignored_any map identifier struct tuple tuple_struct seq string
+    }
+    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        visitor.visit_char(self.as_u8() as char)
+    }
+    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        visitor.visit_byte_buf(self.get_blob()?.0.to_vec())
+    }
+    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        if self.flexbuffer_type() == FlexBufferType::Null {
+            visitor.visit_none()
+        } else {
+            visitor.visit_some(self)
+        }
+    }
+    fn deserialize_newtype_struct<V>(
+        self,
+        _name: &'static str,
+        visitor: V,
+    ) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        visitor.visit_newtype_struct(self)
+    }
+    fn deserialize_enum<V>(
+        self,
+        _name: &'static str,
+        _variants: &'static [&'static str],
+        visitor: V,
+    ) -> Result<V::Value, Self::Error>
+    where
+        V: Visitor<'de>,
+    {
+        let (variant, value) = match self.fxb_type {
+            FlexBufferType::String => (self.as_str(), None),
+            FlexBufferType::Map => {
+                let m = self.get_map()?;
+                let variant = m.keys_vector().idx(0).get_key()?;
+                let value = Some(m.idx(0));
+                (variant, value)
+            }
+            _ => {
+                return Err(Error::UnexpectedFlexbufferType {
+                    expected: FlexBufferType::Map,
+                    actual: self.fxb_type,
+                }
+                .into());
+            }
+        };
+        visitor.visit_enum(EnumReader { variant, value })
+    }
+}
diff --git a/rust/flexbuffers/src/reader/iter.rs b/rust/flexbuffers/src/reader/iter.rs
new file mode 100644
index 0000000..8e06171
--- /dev/null
+++ b/rust/flexbuffers/src/reader/iter.rs
@@ -0,0 +1,63 @@
+// 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 super::{Reader, VectorReader};
+use std::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator};
+
+/// Iterates over a flexbuffer vector, typed vector, or map. Yields [Readers](struct.Reader.html).
+///
+/// If any error occurs, the Reader is defaulted to a Null flexbuffer Reader.
+pub struct ReaderIterator<'de> {
+    pub(super) reader: VectorReader<'de>,
+    pub(super) front: usize,
+    end: usize,
+}
+impl<'de> ReaderIterator<'de> {
+    pub(super) fn new(reader: VectorReader<'de>) -> Self {
+        let end = reader.len();
+        ReaderIterator {
+            reader,
+            front: 0,
+            end,
+        }
+    }
+}
+impl<'de> Iterator for ReaderIterator<'de> {
+    type Item = Reader<'de>;
+    fn next(&mut self) -> Option<Self::Item> {
+        if self.front < self.end {
+            let r = self.reader.idx(self.front);
+            self.front += 1;
+            Some(r)
+        } else {
+            None
+        }
+    }
+    fn size_hint(&self) -> (usize, Option<usize>) {
+        let remaining = self.end - self.front;
+        (remaining, Some(remaining))
+    }
+}
+impl<'de> DoubleEndedIterator for ReaderIterator<'de> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        if self.front < self.end {
+            self.end -= 1;
+            Some(self.reader.idx(self.end))
+        } else {
+            None
+        }
+    }
+}
+impl<'de> ExactSizeIterator for ReaderIterator<'de> {}
+impl<'de> FusedIterator for ReaderIterator<'de> {}
diff --git a/rust/flexbuffers/src/reader/map.rs b/rust/flexbuffers/src/reader/map.rs
new file mode 100644
index 0000000..cdf59e0
--- /dev/null
+++ b/rust/flexbuffers/src/reader/map.rs
@@ -0,0 +1,157 @@
+// 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 super::{deref_offset, unpack_type, Error, Reader, ReaderIterator, VectorReader};
+use crate::BitWidth;
+use std::cmp::Ordering;
+use std::iter::{DoubleEndedIterator, ExactSizeIterator, FusedIterator, Iterator};
+
+/// Allows indexing on a flexbuffer map.
+///
+/// MapReaders may be indexed with strings or usizes. `index` returns a result type,
+/// which may indicate failure due to a missing key or bad data, `idx` returns an Null Reader in
+/// cases of error.
+#[derive(Default, Clone)]
+pub struct MapReader<'de> {
+    pub(super) buffer: &'de [u8],
+    pub(super) values_address: usize,
+    pub(super) keys_address: usize,
+    pub(super) values_width: BitWidth,
+    pub(super) keys_width: BitWidth,
+    pub(super) length: usize,
+}
+
+// manual implementation of Debug because buffer slice can't be automatically displayed
+impl<'de> std::fmt::Debug for MapReader<'de> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        // skips buffer field
+        f.debug_struct("MapReader")
+            .field("values_address", &self.values_address)
+            .field("keys_address", &self.keys_address)
+            .field("values_width", &self.values_width)
+            .field("keys_width", &self.keys_width)
+            .field("length", &self.length)
+            .finish()
+    }
+}
+
+impl<'de> MapReader<'de> {
+    /// Returns the number of key/value pairs are in the map.
+    pub fn len(&self) -> usize {
+        self.length
+    }
+    /// Returns true if the map has zero key/value pairs.
+    pub fn is_empty(&self) -> bool {
+        self.length == 0
+    }
+    // Using &CStr will eagerly compute the length of the key. &str needs length info AND utf8
+    // validation. This version is faster than both.
+    fn lazy_strcmp(&self, key_addr: usize, key: &str) -> Ordering {
+        // TODO: Can we know this won't OOB and panic?
+        let k = self.buffer[key_addr..].iter().take_while(|&&b| b != b'\0');
+        k.cmp(key.as_bytes().iter())
+    }
+    /// Returns the index of a given key in the map.
+    pub fn index_key(&self, key: &str) -> Option<usize> {
+        let (mut low, mut high) = (0, self.length);
+        while low < high {
+            let i = (low + high) / 2;
+            let key_offset_address = self.keys_address + i * self.keys_width.n_bytes();
+            let key_address =
+                deref_offset(self.buffer, key_offset_address, self.keys_width).ok()?;
+            match self.lazy_strcmp(key_address, key) {
+                Ordering::Equal => return Some(i),
+                Ordering::Less => low = if i == low { i + 1 } else { i },
+                Ordering::Greater => high = i,
+            }
+        }
+        None
+    }
+    /// Index into a map with a key or usize.
+    pub fn index<I: MapReaderIndexer>(&self, i: I) -> Result<Reader<'de>, Error> {
+        i.index_map_reader(self)
+    }
+    /// Index into a map with a key or usize. If any errors occur a Null reader is returned.
+    pub fn idx<I: MapReaderIndexer>(&self, i: I) -> Reader<'de> {
+        i.index_map_reader(self).unwrap_or_default()
+    }
+    fn usize_index(&self, i: usize) -> Result<Reader<'de>, Error> {
+        if i >= self.length {
+            return Err(Error::IndexOutOfBounds);
+        }
+        let data_address = self.values_address + self.values_width.n_bytes() * i;
+        let type_address = self.values_address + self.values_width.n_bytes() * self.length + i;
+        let (fxb_type, width) = self
+            .buffer
+            .get(type_address)
+            .ok_or(Error::FlexbufferOutOfBounds)
+            .and_then(|&b| unpack_type(b))?;
+        Reader::new(
+            &self.buffer,
+            data_address,
+            fxb_type,
+            width,
+            self.values_width,
+        )
+    }
+    fn key_index(&self, k: &str) -> Result<Reader<'de>, Error> {
+        let i = self.index_key(k).ok_or(Error::KeyNotFound)?;
+        self.usize_index(i)
+    }
+    /// Iterate over the values of the map.
+    pub fn iter_values(&self) -> ReaderIterator<'de> {
+        ReaderIterator::new(VectorReader {
+            reader: Reader {
+                buffer: self.buffer,
+                fxb_type: crate::FlexBufferType::Map,
+                width: self.values_width,
+                address: self.values_address,
+            },
+            length: self.length,
+        })
+    }
+    /// Iterate over the keys of the map.
+    pub fn iter_keys(
+        &self,
+    ) -> impl Iterator<Item = &'de str> + DoubleEndedIterator + ExactSizeIterator + FusedIterator
+    {
+        self.keys_vector().iter().map(|k| k.as_str())
+    }
+    pub fn keys_vector(&self) -> VectorReader<'de> {
+        VectorReader {
+            reader: Reader {
+                buffer: self.buffer,
+                fxb_type: crate::FlexBufferType::VectorKey,
+                width: self.keys_width,
+                address: self.keys_address,
+            },
+            length: self.length,
+        }
+    }
+}
+pub trait MapReaderIndexer {
+    fn index_map_reader<'de>(self, r: &MapReader<'de>) -> Result<Reader<'de>, Error>;
+}
+impl MapReaderIndexer for usize {
+    #[inline]
+    fn index_map_reader<'de>(self, r: &MapReader<'de>) -> Result<Reader<'de>, Error> {
+        r.usize_index(self)
+    }
+}
+impl MapReaderIndexer for &str {
+    #[inline]
+    fn index_map_reader<'de>(self, r: &MapReader<'de>) -> Result<Reader<'de>, Error> {
+        r.key_index(self)
+    }
+}
diff --git a/rust/flexbuffers/src/reader/mod.rs b/rust/flexbuffers/src/reader/mod.rs
new file mode 100644
index 0000000..4a3f472
--- /dev/null
+++ b/rust/flexbuffers/src/reader/mod.rs
@@ -0,0 +1,604 @@
+// 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 crate::bitwidth::BitWidth;
+use crate::flexbuffer_type::FlexBufferType;
+use crate::Blob;
+use std::convert::{TryFrom, TryInto};
+use std::fmt;
+use std::ops::Rem;
+use std::str::FromStr;
+mod de;
+mod iter;
+mod map;
+mod vector;
+pub use de::DeserializationError;
+pub use iter::ReaderIterator;
+pub use map::{MapReader, MapReaderIndexer};
+pub use vector::VectorReader;
+
+/// All the possible errors when reading a flexbuffer.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+pub enum Error {
+    /// One of the following data errors occured:
+    ///
+    /// *    The read flexbuffer had an offset that pointed outside the flexbuffer.
+    /// *    The 'negative indicies' where length and map keys are stored were out of bounds
+    /// *    The buffer was too small to contain a flexbuffer root.
+    FlexbufferOutOfBounds,
+    /// Failed to parse a valid FlexbufferType and Bitwidth from a type byte.
+    InvalidPackedType,
+    /// Flexbuffer type of the read data does not match function used.
+    UnexpectedFlexbufferType {
+        expected: FlexBufferType,
+        actual: FlexBufferType,
+    },
+    /// BitWidth type of the read data does not match function used.
+    UnexpectedBitWidth {
+        expected: BitWidth,
+        actual: BitWidth,
+    },
+    /// Read a flexbuffer offset or length that overflowed usize.
+    ReadUsizeOverflowed,
+    /// Tried to index a type that's not one of the Flexbuffer vector types.
+    CannotIndexAsVector,
+    /// Tried to index a Flexbuffer vector or map out of bounds.
+    IndexOutOfBounds,
+    /// A Map was indexed with a key that it did not contain.
+    KeyNotFound,
+    /// Failed to parse a Utf8 string.
+    /// The Option will be `None` if and only if this Error was deserialized.
+    // NOTE: std::str::Utf8Error does not implement Serialize, Deserialize, nor Default. We tell
+    // serde to skip the field and default to None. We prefer to have the boxed error so it can be
+    // used with std::error::Error::source, though another (worse) option could be to drop that
+    // information.
+    Utf8Error(#[serde(skip)] Option<Box<std::str::Utf8Error>>),
+    /// get_slice failed because the given data buffer is misaligned.
+    AlignmentError,
+    InvalidRootWidth,
+    InvalidMapKeysVectorWidth,
+}
+impl std::convert::From<std::str::Utf8Error> for Error {
+    fn from(e: std::str::Utf8Error) -> Self {
+        Self::Utf8Error(Some(Box::new(e)))
+    }
+}
+impl fmt::Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::UnexpectedBitWidth { expected, actual } => write!(
+                f,
+                "Error reading flexbuffer: Expected bitwidth: {:?}, found bitwidth: {:?}",
+                expected, actual
+            ),
+            Self::UnexpectedFlexbufferType { expected, actual } => write!(
+                f,
+                "Error reading flexbuffer: Expected type: {:?}, found type: {:?}",
+                expected, actual
+            ),
+            _ => write!(f, "Error reading flexbuffer: {:?}", self),
+        }
+    }
+}
+impl std::error::Error for Error {
+    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
+        if let Self::Utf8Error(Some(e)) = self {
+            Some(e)
+        } else {
+            None
+        }
+    }
+}
+
+pub trait ReadLE: crate::private::Sealed + std::marker::Sized {
+    const VECTOR_TYPE: FlexBufferType;
+    const WIDTH: BitWidth;
+}
+macro_rules! rle {
+    ($T: ty, $VECTOR_TYPE: ident, $WIDTH: ident) => {
+        impl ReadLE for $T {
+            const VECTOR_TYPE: FlexBufferType = FlexBufferType::$VECTOR_TYPE;
+            const WIDTH: BitWidth = BitWidth::$WIDTH;
+        }
+    };
+}
+rle!(u8, VectorUInt, W8);
+rle!(u16, VectorUInt, W16);
+rle!(u32, VectorUInt, W32);
+rle!(u64, VectorUInt, W64);
+rle!(i8, VectorInt, W8);
+rle!(i16, VectorInt, W16);
+rle!(i32, VectorInt, W32);
+rle!(i64, VectorInt, W64);
+rle!(f32, VectorFloat, W32);
+rle!(f64, VectorFloat, W64);
+
+macro_rules! as_default {
+    ($as: ident, $get: ident, $T: ty) => {
+        pub fn $as(&self) -> $T {
+            self.$get().unwrap_or_default()
+        }
+    };
+}
+
+/// `Reader`s allow access to data stored in a Flexbuffer.
+///
+/// Each reader represents a single address in the buffer so data is read lazily. Start a reader
+/// by calling `get_root` on your flexbuffer `&[u8]`.
+///
+/// - The `get_T` methods return a `Result<T, Error>`. They return an OK value if and only if the
+/// flexbuffer type matches `T`. This is analogous to the behavior of Rust's json library, though
+/// with Result instead of Option.
+/// - The `as_T` methods will try their best to return to a value of type `T`
+/// (by casting or even parsing a string if necessary) but ultimately returns `T::default` if it
+/// fails. This behavior is analogous to that of flexbuffers C++.
+#[derive(Default, Clone)]
+pub struct Reader<'de> {
+    fxb_type: FlexBufferType,
+    width: BitWidth,
+    address: usize,
+    buffer: &'de [u8],
+}
+
+// manual implementation of Debug because buffer slice can't be automatically displayed
+impl<'de> std::fmt::Debug for Reader<'de> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        // skips buffer field
+        f.debug_struct("Reader")
+            .field("fxb_type", &self.fxb_type)
+            .field("width", &self.width)
+            .field("address", &self.address)
+            .finish()
+    }
+}
+
+
+macro_rules! try_cast_fn {
+    ($name: ident, $full_width: ident, $Ty: ident) => {
+        pub fn $name(&self) -> $Ty {
+            self.$full_width().try_into().unwrap_or_default()
+        }
+    }
+}
+
+fn safe_sub(a: usize, b: usize) -> Result<usize, Error> {
+    a.checked_sub(b).ok_or(Error::FlexbufferOutOfBounds)
+}
+
+fn deref_offset(buffer: &[u8], address: usize, width: BitWidth) -> Result<usize, Error> {
+    let off = read_usize(buffer, address, width);
+    safe_sub(address, off)
+}
+
+impl<'de> Reader<'de> {
+    fn new(
+        buffer: &'de [u8],
+        mut address: usize,
+        mut fxb_type: FlexBufferType,
+        width: BitWidth,
+        parent_width: BitWidth,
+    ) -> Result<Self, Error> {
+        if fxb_type.is_reference() {
+            address = deref_offset(buffer, address, parent_width)?;
+            // Indirects were dereferenced.
+            if let Some(t) = fxb_type.to_direct() {
+                fxb_type = t;
+            }
+        }
+        Ok(Reader {
+            address,
+            fxb_type,
+            width,
+            buffer,
+        })
+    }
+    /// Parses the flexbuffer from the given buffer. Assumes the flexbuffer root is the last byte
+    /// of the buffer.
+    pub fn get_root(buffer: &'de [u8]) -> Result<Self, Error> {
+        let end = buffer.len();
+        if end < 3 {
+            return Err(Error::FlexbufferOutOfBounds);
+        }
+        // Last byte is the root width.
+        let root_width = BitWidth::from_nbytes(buffer[end - 1]).ok_or(Error::InvalidRootWidth)?;
+        // Second last byte is root type.
+        let (fxb_type, width) = unpack_type(buffer[end - 2])?;
+        // Location of root data. (BitWidth bits before root type)
+        let address = safe_sub(end - 2, root_width.n_bytes())?;
+        Self::new(buffer, address, fxb_type, width, root_width)
+    }
+    /// Returns the FlexBufferType of this Reader.
+    pub fn flexbuffer_type(&self) -> FlexBufferType {
+        self.fxb_type
+    }
+    /// Returns the bitwidth of this Reader.
+    pub fn bitwidth(&self) -> BitWidth {
+        self.width
+    }
+    /// Returns the length of the Flexbuffer. If the type has no length, or if an error occurs,
+    /// 0 is returned.
+    pub fn length(&self) -> usize {
+        if let Some(len) = self.fxb_type.fixed_length_vector_length() {
+            len
+        } else if self.fxb_type.has_length_slot() && self.address >= self.width.n_bytes() {
+            read_usize(self.buffer, self.address - self.width.n_bytes(), self.width)
+        } else {
+            0
+        }
+    }
+    /// Returns true if the flexbuffer is aligned to 8 bytes. This guarantees, for valid
+    /// flexbuffers, that the data is correctly aligned in memory and slices can be read directly
+    /// e.g. with `get_f64s` or `get_i16s`.
+    pub fn is_aligned(&self) -> bool {
+        (self.buffer.as_ptr() as usize).rem(8) == 0
+    }
+    as_default!(as_vector, get_vector, VectorReader<'de>);
+    as_default!(as_map, get_map, MapReader<'de>);
+
+    fn expect_type(&self, ty: FlexBufferType) -> Result<(), Error> {
+        if self.fxb_type == ty {
+            Ok(())
+        } else {
+            Err(Error::UnexpectedFlexbufferType {
+                expected: ty,
+                actual: self.fxb_type,
+            })
+        }
+    }
+    fn expect_bw(&self, bw: BitWidth) -> Result<(), Error> {
+        if self.width == bw {
+            Ok(())
+        } else {
+            Err(Error::UnexpectedBitWidth {
+                expected: bw,
+                actual: self.width,
+            })
+        }
+    }
+    /// Directly reads a slice of type `T`where `T` is one of `u8,u16,u32,u64,i8,i16,i32,i64,f32,f64`.
+    /// Returns Err if the type, bitwidth, or memory alignment does not match. Since the bitwidth is
+    /// dynamic, its better to use a VectorReader unless you know your data and performance is critical.
+    #[cfg(target_endian = "little")]
+    pub fn get_slice<T: ReadLE>(&self) -> Result<&'de [T], Error> {
+        if self.flexbuffer_type().typed_vector_type() != T::VECTOR_TYPE.typed_vector_type() {
+            self.expect_type(T::VECTOR_TYPE)?;
+        }
+        if self.bitwidth().n_bytes() != std::mem::size_of::<T>() {
+            self.expect_bw(T::WIDTH)?;
+        }
+        let end = self.address + self.length() * std::mem::size_of::<T>();
+        let slice = &self
+            .buffer
+            .get(self.address..end)
+            .ok_or(Error::FlexbufferOutOfBounds)?;
+        // `align_to` is required because the point of this function is to directly hand back a
+        // slice of scalars. This can fail because Rust's default allocator is not 16byte aligned
+        // (though in practice this only happens for small buffers).
+        let (pre, mid, suf) = unsafe { slice.align_to::<T>() };
+        if pre.is_empty() && suf.is_empty() {
+            Ok(mid)
+        } else {
+            Err(Error::AlignmentError)
+        }
+    }
+
+    pub fn get_bool(&self) -> Result<bool, Error> {
+        self.expect_type(FlexBufferType::Bool)?;
+        Ok(
+            self.buffer[self.address..self.address + self.width.n_bytes()]
+                .iter()
+                .any(|&b| b != 0),
+        )
+    }
+    pub fn get_key(&self) -> Result<&'de str, Error> {
+        self.expect_type(FlexBufferType::Key)?;
+        let (length, _) = self.buffer[self.address..]
+            .iter()
+            .enumerate()
+            .find(|(_, &b)| b == b'\0')
+            .unwrap_or((0, &0));
+        let bytes = &self.buffer[self.address..self.address + length];
+        Ok(std::str::from_utf8(bytes)?)
+    }
+    pub fn get_blob(&self) -> Result<Blob<'de>, Error> {
+        self.expect_type(FlexBufferType::Blob)?;
+        Ok(Blob(
+            &self.buffer[self.address..self.address + self.length()],
+        ))
+    }
+    pub fn as_blob(&self) -> Blob<'de> {
+        self.get_blob().unwrap_or(Blob(&[]))
+    }
+    pub fn get_str(&self) -> Result<&'de str, Error> {
+        self.expect_type(FlexBufferType::String)?;
+        let bytes = &self.buffer[self.address..self.address + self.length()];
+        Ok(std::str::from_utf8(bytes)?)
+    }
+    fn get_map_info(&self) -> Result<(usize, BitWidth), Error> {
+        self.expect_type(FlexBufferType::Map)?;
+        if 3 * self.width.n_bytes() >= self.address {
+            return Err(Error::FlexbufferOutOfBounds);
+        }
+        let keys_offset_address = self.address - 3 * self.width.n_bytes();
+        let keys_width = {
+            let kw_addr = self.address - 2 * self.width.n_bytes();
+            let kw = read_usize(self.buffer, kw_addr, self.width);
+            BitWidth::from_nbytes(kw).ok_or(Error::InvalidMapKeysVectorWidth)
+        }?;
+        Ok((keys_offset_address, keys_width))
+    }
+    pub fn get_map(&self) -> Result<MapReader<'de>, Error> {
+        let (keys_offset_address, keys_width) = self.get_map_info()?;
+        let keys_address = deref_offset(self.buffer, keys_offset_address, self.width)?;
+        // TODO(cneo): Check that vectors length equals keys length.
+        Ok(MapReader {
+            buffer: self.buffer,
+            values_address: self.address,
+            values_width: self.width,
+            keys_address,
+            keys_width,
+            length: self.length(),
+        })
+    }
+    /// Tries to read a FlexBufferType::UInt. Returns Err if the type is not a UInt or if the
+    /// address is out of bounds.
+    pub fn get_u64(&self) -> Result<u64, Error> {
+        self.expect_type(FlexBufferType::UInt)?;
+        let cursor = self
+            .buffer
+            .get(self.address..self.address + self.width.n_bytes());
+        match self.width {
+            BitWidth::W8 => cursor.map(|s| s[0] as u8).map(Into::into),
+            BitWidth::W16 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<u16>::from_le_bytes)
+                .map(Into::into),
+            BitWidth::W32 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<u32>::from_le_bytes)
+                .map(Into::into),
+            BitWidth::W64 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<u64>::from_le_bytes),
+        }
+        .ok_or(Error::FlexbufferOutOfBounds)
+    }
+    /// Tries to read a FlexBufferType::Int. Returns Err if the type is not a UInt or if the
+    /// address is out of bounds.
+    pub fn get_i64(&self) -> Result<i64, Error> {
+        self.expect_type(FlexBufferType::Int)?;
+        let cursor = self
+            .buffer
+            .get(self.address..self.address + self.width.n_bytes());
+        match self.width {
+            BitWidth::W8 => cursor.map(|s| s[0] as i8).map(Into::into),
+            BitWidth::W16 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<i16>::from_le_bytes)
+                .map(Into::into),
+            BitWidth::W32 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<i32>::from_le_bytes)
+                .map(Into::into),
+            BitWidth::W64 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(<i64>::from_le_bytes),
+        }
+        .ok_or(Error::FlexbufferOutOfBounds)
+    }
+    /// Tries to read a FlexBufferType::Float. Returns Err if the type is not a UInt, if the
+    /// address is out of bounds, or if its a f16 or f8 (not currently supported).
+    pub fn get_f64(&self) -> Result<f64, Error> {
+        self.expect_type(FlexBufferType::Float)?;
+        let cursor = self
+            .buffer
+            .get(self.address..self.address + self.width.n_bytes());
+        match self.width {
+            BitWidth::W8 | BitWidth::W16 => return Err(Error::InvalidPackedType),
+            BitWidth::W32 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(f32_from_le_bytes)
+                .map(Into::into),
+            BitWidth::W64 => cursor
+                .and_then(|s| s.try_into().ok())
+                .map(f64_from_le_bytes),
+        }
+        .ok_or(Error::FlexbufferOutOfBounds)
+    }
+    pub fn as_bool(&self) -> bool {
+        use FlexBufferType::*;
+        match self.fxb_type {
+            Bool => self.get_bool().unwrap_or_default(),
+            UInt => self.as_u64() != 0,
+            Int => self.as_i64() != 0,
+            Float => self.as_f64().abs() > std::f64::EPSILON,
+            String | Key => !self.as_str().is_empty(),
+            Null => false,
+            Blob => self.length() != 0,
+            ty if ty.is_vector() => self.length() != 0,
+            _ => unreachable!(),
+        }
+    }
+    /// Returns a u64, casting if necessary. For Maps and Vectors, their length is
+    /// returned. If anything fails, 0 is returned.
+    pub fn as_u64(&self) -> u64 {
+        match self.fxb_type {
+            FlexBufferType::UInt => self.get_u64().unwrap_or_default(),
+            FlexBufferType::Int => self
+                .get_i64()
+                .unwrap_or_default()
+                .try_into()
+                .unwrap_or_default(),
+            FlexBufferType::Float => self.get_f64().unwrap_or_default() as u64,
+            FlexBufferType::String => {
+                if let Ok(s) = self.get_str() {
+                    if let Ok(f) = u64::from_str(s) {
+                        return f;
+                    }
+                }
+                0
+            }
+            _ if self.fxb_type.is_vector() => self.length() as u64,
+            _ => 0,
+        }
+    }
+    try_cast_fn!(as_u32, as_u64, u32);
+    try_cast_fn!(as_u16, as_u64, u16);
+    try_cast_fn!(as_u8, as_u64, u8);
+
+    /// Returns an i64, casting if necessary. For Maps and Vectors, their length is
+    /// returned. If anything fails, 0 is returned.
+    pub fn as_i64(&self) -> i64 {
+        match self.fxb_type {
+            FlexBufferType::Int => self.get_i64().unwrap_or_default(),
+            FlexBufferType::UInt => self
+                .get_u64()
+                .unwrap_or_default()
+                .try_into()
+                .unwrap_or_default(),
+            FlexBufferType::Float => self.get_f64().unwrap_or_default() as i64,
+            FlexBufferType::String => {
+                if let Ok(s) = self.get_str() {
+                    if let Ok(f) = i64::from_str(s) {
+                        return f;
+                    }
+                }
+                0
+            }
+            _ if self.fxb_type.is_vector() => self.length() as i64,
+            _ => 0,
+        }
+    }
+    try_cast_fn!(as_i32, as_i64, i32);
+    try_cast_fn!(as_i16, as_i64, i16);
+    try_cast_fn!(as_i8, as_i64, i8);
+
+    /// Returns an f64, casting if necessary. For Maps and Vectors, their length is
+    /// returned. If anything fails, 0 is returned.
+    pub fn as_f64(&self) -> f64 {
+        match self.fxb_type {
+            FlexBufferType::Int => self.get_i64().unwrap_or_default() as f64,
+            FlexBufferType::UInt => self.get_u64().unwrap_or_default() as f64,
+            FlexBufferType::Float => self.get_f64().unwrap_or_default(),
+            FlexBufferType::String => {
+                if let Ok(s) = self.get_str() {
+                    if let Ok(f) = f64::from_str(s) {
+                        return f;
+                    }
+                }
+                0.0
+            }
+            _ if self.fxb_type.is_vector() => self.length() as f64,
+            _ => 0.0,
+        }
+    }
+    pub fn as_f32(&self) -> f32 {
+        self.as_f64() as f32
+    }
+
+    /// Returns empty string if you're not trying to read a string.
+    pub fn as_str(&self) -> &'de str {
+        match self.fxb_type {
+            FlexBufferType::String => self.get_str().unwrap_or_default(),
+            FlexBufferType::Key => self.get_key().unwrap_or_default(),
+            _ => "",
+        }
+    }
+    pub fn get_vector(&self) -> Result<VectorReader<'de>, Error> {
+        if !self.fxb_type.is_vector() {
+            self.expect_type(FlexBufferType::Vector)?;
+        };
+        Ok(VectorReader {
+            reader: self.clone(),
+            length: self.length(),
+        })
+    }
+}
+
+impl<'de> fmt::Display for Reader<'de> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        use FlexBufferType::*;
+        match self.flexbuffer_type() {
+            Null => write!(f, "null"),
+            UInt => write!(f, "{}", self.as_u64()),
+            Int => write!(f, "{}", self.as_i64()),
+            Float => write!(f, "{}", self.as_f64()),
+            Key | String => write!(f, "{:?}", self.as_str()),
+            Bool => write!(f, "{}", self.as_bool()),
+            Blob => write!(f, "blob"),
+            Map => {
+                write!(f, "{{")?;
+                let m = self.as_map();
+                let mut pairs = m.iter_keys().zip(m.iter_values());
+                if let Some((k, v)) = pairs.next() {
+                    write!(f, "{:?}: {}", k, v)?;
+                    for (k, v) in pairs {
+                        write!(f, ", {:?}: {}", k, v)?;
+                    }
+                }
+                write!(f, "}}")
+            }
+            t if t.is_vector() => {
+                write!(f, "[")?;
+                let mut elems = self.as_vector().iter();
+                if let Some(first) = elems.next() {
+                    write!(f, "{}", first)?;
+                    for e in elems {
+                        write!(f, ", {}", e)?;
+                    }
+                }
+                write!(f, "]")
+            }
+            _ => unreachable!("Display not implemented for {:?}", self),
+        }
+    }
+}
+
+// TODO(cneo): Use <f..>::from_le_bytes when we move past rustc 1.39.
+fn f32_from_le_bytes(bytes: [u8; 4]) -> f32 {
+    let bits = <u32>::from_le_bytes(bytes);
+    <f32>::from_bits(bits)
+}
+fn f64_from_le_bytes(bytes: [u8; 8]) -> f64 {
+    let bits = <u64>::from_le_bytes(bytes);
+    <f64>::from_bits(bits)
+}
+
+fn read_usize(buffer: &[u8], address: usize, width: BitWidth) -> usize {
+    let cursor = &buffer[address..];
+    match width {
+        BitWidth::W8 => cursor[0] as usize,
+        BitWidth::W16 => cursor
+            .get(0..2)
+            .and_then(|s| s.try_into().ok())
+            .map(<u16>::from_le_bytes)
+            .unwrap_or_default() as usize,
+        BitWidth::W32 => cursor
+            .get(0..4)
+            .and_then(|s| s.try_into().ok())
+            .map(<u32>::from_le_bytes)
+            .unwrap_or_default() as usize,
+        BitWidth::W64 => cursor
+            .get(0..8)
+            .and_then(|s| s.try_into().ok())
+            .map(<u64>::from_le_bytes)
+            .unwrap_or_default() as usize,
+    }
+}
+
+fn unpack_type(ty: u8) -> Result<(FlexBufferType, BitWidth), Error> {
+    let w = BitWidth::try_from(ty & 3u8).map_err(|_| Error::InvalidPackedType)?;
+    let t = FlexBufferType::try_from(ty >> 2).map_err(|_| Error::InvalidPackedType)?;
+    Ok((t, w))
+}
diff --git a/rust/flexbuffers/src/reader/vector.rs b/rust/flexbuffers/src/reader/vector.rs
new file mode 100644
index 0000000..8ba8fe5
--- /dev/null
+++ b/rust/flexbuffers/src/reader/vector.rs
@@ -0,0 +1,74 @@
+// 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 super::{unpack_type, Error, Reader, ReaderIterator};
+use crate::{BitWidth, FlexBufferType};
+
+#[derive(Default, Clone)]
+/// Allows indexing on any flexbuffer vector type, (heterogenous vector, typed vector, or fixed
+/// length typed vector).
+///
+/// VectorReaders may be indexed with usize, `index` returns a result type
+/// which may indicate failure due to indexing out of bounds or bad data. `idx` returns a
+/// Null Reader in the event of any failure.
+pub struct VectorReader<'de> {
+    pub(super) reader: Reader<'de>,
+    // Cache the length because read_usize can be slow.
+    pub(super) length: usize,
+}
+
+impl<'de> VectorReader<'de> {
+    /// Returns the number of elements in the vector.
+    pub fn len(&self) -> usize {
+        self.length
+    }
+    /// Returns true if there are 0 elements in the vector.
+    pub fn is_empty(&self) -> bool {
+        self.length == 0
+    }
+    fn get_elem_type(&self, i: usize) -> Result<(FlexBufferType, BitWidth), Error> {
+        if let Some(ty) = self.reader.fxb_type.typed_vector_type() {
+            Ok((ty, self.reader.width))
+        } else {
+            let types_addr = self.reader.address + self.length * self.reader.width.n_bytes();
+            self.reader
+                .buffer
+                .get(types_addr + i)
+                .ok_or(Error::FlexbufferOutOfBounds)
+                .and_then(|&t| unpack_type(t))
+        }
+    }
+    /// Index into a flexbuffer vector. Any errors are defaulted to Null Readers.
+    pub fn idx(&self, i: usize) -> Reader<'de> {
+        self.index(i).unwrap_or_default()
+    }
+    /// Index into a flexbuffer.
+    pub fn index(&self, i: usize) -> Result<Reader<'de>, Error> {
+        if i >= self.length {
+            return Err(Error::IndexOutOfBounds);
+        }
+        let (fxb_type, bw) = self.get_elem_type(i)?;
+        let data_address = self.reader.address + self.reader.width.n_bytes() * i;
+        Reader::new(
+            self.reader.buffer,
+            data_address,
+            fxb_type,
+            bw,
+            self.reader.width,
+        )
+    }
+    pub fn iter(&self) -> ReaderIterator<'de> {
+        ReaderIterator::new(self.clone())
+    }
+}