diff options
| author | Pimyn Girgis <pimyn@google.com> | 2025-12-02 12:28:10 +0000 |
|---|---|---|
| committer | Tahuti <pimyn@google.com> | 2025-12-03 09:02:54 +0000 |
| commit | 1cfbf16e320ca9bdadd9c24eb1d2d68b25369ba6 (patch) | |
| tree | be0ce827f327c8a76125307e64047e01fa449d4c /executor | |
| parent | 42a04216dd856c12e723e48930e85d63998e4eda (diff) | |
executor: update flatbuffers
Update flatbuffers to v23.5.26, which matches the compiler version in the new env container.
Diffstat (limited to 'executor')
31 files changed, 1460 insertions, 903 deletions
diff --git a/executor/_include/flatbuffers/LICENSE.txt b/executor/_include/flatbuffers/LICENSE index d64569567..d64569567 100644 --- a/executor/_include/flatbuffers/LICENSE.txt +++ b/executor/_include/flatbuffers/LICENSE diff --git a/executor/_include/flatbuffers/README.md b/executor/_include/flatbuffers/README.md index 7f0d63ef0..fc1c52f27 100644 --- a/executor/_include/flatbuffers/README.md +++ b/executor/_include/flatbuffers/README.md @@ -1,9 +1,9 @@ -This was manually vendored on the version v2.0.8 +This was manually vendored on the version v23.5.26 (which matches the compiler version in the env container) using the following commands: ``` -git clone --branch=v2.0.8 --depth=1 --single-branch https://github.com/google/flatbuffers.git -cp flatbuffers/LICENSE.txt syzkaller/executor/_include/flatbuffers +git clone --branch=v23.5.26 --depth=1 --single-branch https://github.com/google/flatbuffers.git +cp flatbuffers/LICENSE syzkaller/executor/_include/flatbuffers cp flatbuffers/include/flatbuffers/*.h syzkaller/executor/_include/flatbuffers ``` diff --git a/executor/_include/flatbuffers/allocator.h b/executor/_include/flatbuffers/allocator.h index f4ef22db4..30427190b 100644 --- a/executor/_include/flatbuffers/allocator.h +++ b/executor/_include/flatbuffers/allocator.h @@ -65,4 +65,4 @@ class Allocator { } // namespace flatbuffers -#endif // FLATBUFFERS_ALLOCATOR_H_
\ No newline at end of file +#endif // FLATBUFFERS_ALLOCATOR_H_ diff --git a/executor/_include/flatbuffers/array.h b/executor/_include/flatbuffers/array.h index d4b73fc9e..f4bfbf054 100644 --- a/executor/_include/flatbuffers/array.h +++ b/executor/_include/flatbuffers/array.h @@ -17,6 +17,9 @@ #ifndef FLATBUFFERS_ARRAY_H_ #define FLATBUFFERS_ARRAY_H_ +#include <cstdint> +#include <memory> + #include "flatbuffers/base.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/vector.h" @@ -35,7 +38,7 @@ template<typename T, uint16_t length> class Array { public: typedef uint16_t size_type; typedef typename IndirectHelper<IndirectHelperType>::return_type return_type; - typedef VectorIterator<T, return_type> const_iterator; + typedef VectorConstIterator<T, return_type, uoffset_t> const_iterator; typedef VectorReverseIterator<const_iterator> const_reverse_iterator; // If T is a LE-scalar or a struct (!scalar_tag::value). @@ -156,11 +159,13 @@ template<typename T, uint16_t length> class Array { // Specialization for Array[struct] with access using Offset<void> pointer. // This specialization used by idl_gen_text.cpp. -template<typename T, uint16_t length> class Array<Offset<T>, length> { +template<typename T, uint16_t length, template<typename> class OffsetT> +class Array<OffsetT<T>, length> { static_assert(flatbuffers::is_same<T, void>::value, "unexpected type T"); public: typedef const void *return_type; + typedef uint16_t size_type; const uint8_t *Data() const { return data_; } @@ -238,6 +243,14 @@ const Array<E, length> &CastToArrayOfEnum(const T (&arr)[length]) { return *reinterpret_cast<const Array<E, length> *>(arr); } +template<typename T, uint16_t length> +bool operator==(const Array<T, length> &lhs, + const Array<T, length> &rhs) noexcept { + return std::addressof(lhs) == std::addressof(rhs) || + (lhs.size() == rhs.size() && + std::memcmp(lhs.Data(), rhs.Data(), rhs.size() * sizeof(T)) == 0); +} + } // namespace flatbuffers #endif // FLATBUFFERS_ARRAY_H_ diff --git a/executor/_include/flatbuffers/base.h b/executor/_include/flatbuffers/base.h index 870a811c1..5c4cae791 100644 --- a/executor/_include/flatbuffers/base.h +++ b/executor/_include/flatbuffers/base.h @@ -32,7 +32,7 @@ #include <cstdlib> #include <cstring> -#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) +#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) && defined(__AVR__) #include <utility.h> #else #include <utility> @@ -43,6 +43,7 @@ #include <vector> #include <set> #include <algorithm> +#include <limits> #include <iterator> #include <memory> @@ -138,9 +139,9 @@ #endif #endif // !defined(FLATBUFFERS_LITTLEENDIAN) -#define FLATBUFFERS_VERSION_MAJOR 2 -#define FLATBUFFERS_VERSION_MINOR 0 -#define FLATBUFFERS_VERSION_REVISION 8 +#define FLATBUFFERS_VERSION_MAJOR 23 +#define FLATBUFFERS_VERSION_MINOR 5 +#define FLATBUFFERS_VERSION_REVISION 26 #define FLATBUFFERS_STRING_EXPAND(X) #X #define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) namespace flatbuffers { @@ -233,12 +234,17 @@ namespace flatbuffers { } #define FLATBUFFERS_HAS_STRING_VIEW 1 // Check for absl::string_view - #elif __has_include("absl/strings/string_view.h") - #include "absl/strings/string_view.h" - namespace flatbuffers { - typedef absl::string_view string_view; - } - #define FLATBUFFERS_HAS_STRING_VIEW 1 + #elif __has_include("absl/strings/string_view.h") && \ + __has_include("absl/base/config.h") && \ + (__cplusplus >= 201411) + #include "absl/base/config.h" + #if !defined(ABSL_USES_STD_STRING_VIEW) + #include "absl/strings/string_view.h" + namespace flatbuffers { + typedef absl::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + #endif #endif #endif // __has_include #endif // !FLATBUFFERS_HAS_STRING_VIEW @@ -273,14 +279,14 @@ namespace flatbuffers { #endif // !FLATBUFFERS_LOCALE_INDEPENDENT // Suppress Undefined Behavior Sanitizer (recoverable only). Usage: -// - __suppress_ubsan__("undefined") -// - __suppress_ubsan__("signed-integer-overflow") +// - FLATBUFFERS_SUPPRESS_UBSAN("undefined") +// - FLATBUFFERS_SUPPRESS_UBSAN("signed-integer-overflow") #if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7)) - #define __suppress_ubsan__(type) __attribute__((no_sanitize(type))) + #define FLATBUFFERS_SUPPRESS_UBSAN(type) __attribute__((no_sanitize(type))) #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) - #define __suppress_ubsan__(type) __attribute__((no_sanitize_undefined)) + #define FLATBUFFERS_SUPPRESS_UBSAN(type) __attribute__((no_sanitize_undefined)) #else - #define __suppress_ubsan__(type) + #define FLATBUFFERS_SUPPRESS_UBSAN(type) #endif // This is constexpr function used for checking compile-time constants. @@ -318,9 +324,11 @@ namespace flatbuffers { // Also, using a consistent offset type maintains compatibility of serialized // offset values between 32bit and 64bit systems. typedef uint32_t uoffset_t; +typedef uint64_t uoffset64_t; // Signed offsets for references that can go in both directions. typedef int32_t soffset_t; +typedef int64_t soffset64_t; // Offset/index used in v-tables, can be changed to uint8_t in // format forks to save a bit of space if desired. @@ -329,7 +337,8 @@ typedef uint16_t voffset_t; typedef uintmax_t largest_scalar_t; // In 32bits, this evaluates to 2GB - 1 -#define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(::flatbuffers::soffset_t) * 8 - 1)) - 1) +#define FLATBUFFERS_MAX_BUFFER_SIZE std::numeric_limits<::flatbuffers::soffset_t>::max() +#define FLATBUFFERS_MAX_64_BUFFER_SIZE std::numeric_limits<::flatbuffers::soffset64_t>::max() // The minimum size buffer that can be a valid flatbuffer. // Includes the offset to the root table (uoffset_t), the offset to the vtable @@ -413,7 +422,7 @@ template<typename T> T EndianScalar(T t) { template<typename T> // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. -__suppress_ubsan__("alignment") +FLATBUFFERS_SUPPRESS_UBSAN("alignment") T ReadScalar(const void *p) { return EndianScalar(*reinterpret_cast<const T *>(p)); } @@ -427,13 +436,13 @@ T ReadScalar(const void *p) { template<typename T> // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. -__suppress_ubsan__("alignment") +FLATBUFFERS_SUPPRESS_UBSAN("alignment") void WriteScalar(void *p, T t) { *reinterpret_cast<T *>(p) = EndianScalar(t); } template<typename T> struct Offset; -template<typename T> __suppress_ubsan__("alignment") void WriteScalar(void *p, Offset<T> t) { +template<typename T> FLATBUFFERS_SUPPRESS_UBSAN("alignment") void WriteScalar(void *p, Offset<T> t) { *reinterpret_cast<uoffset_t *>(p) = EndianScalar(t.o); } @@ -444,7 +453,7 @@ template<typename T> __suppress_ubsan__("alignment") void WriteScalar(void *p, O // Computes how many bytes you'd have to pad to be able to write an // "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in // memory). -__suppress_ubsan__("unsigned-integer-overflow") +FLATBUFFERS_SUPPRESS_UBSAN("unsigned-integer-overflow") inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { return ((~buf_size) + 1) & (scalar_size - 1); } diff --git a/executor/_include/flatbuffers/bfbs_generator.h b/executor/_include/flatbuffers/bfbs_generator.h deleted file mode 100644 index 08faeb3eb..000000000 --- a/executor/_include/flatbuffers/bfbs_generator.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2021 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. - */ - -#ifndef FLATBUFFERS_BFBS_GENERATOR_H_ -#define FLATBUFFERS_BFBS_GENERATOR_H_ - -#include <cstdint> - -namespace flatbuffers { - -enum GeneratorStatus { - OK, - FAILED, - FAILED_VERIFICATION, -}; - -// A Flatbuffer Code Generator that receives a binary serialized reflection.fbs -// and generates code from it. -class BfbsGenerator { - public: - virtual ~BfbsGenerator() {} - - // Generate code from the provided `buffer` of given `length`. The buffer is - // a serialized reflection.fbs. - virtual GeneratorStatus Generate(const uint8_t *buffer, int64_t length) = 0; -}; - -} // namespace flatbuffers - -#endif // FLATBUFFERS_BFBS_GENERATOR_H_ diff --git a/executor/_include/flatbuffers/buffer.h b/executor/_include/flatbuffers/buffer.h index ca005f715..94d4f7903 100644 --- a/executor/_include/flatbuffers/buffer.h +++ b/executor/_include/flatbuffers/buffer.h @@ -17,20 +17,41 @@ #ifndef FLATBUFFERS_BUFFER_H_ #define FLATBUFFERS_BUFFER_H_ +#include <algorithm> + #include "flatbuffers/base.h" namespace flatbuffers { // Wrapper for uoffset_t to allow safe template specialization. // Value is allowed to be 0 to indicate a null object (see e.g. AddOffset). -template<typename T> struct Offset { - uoffset_t o; +template<typename T = void> struct Offset { + // The type of offset to use. + typedef uoffset_t offset_type; + + offset_type o; Offset() : o(0) {} - Offset(uoffset_t _o) : o(_o) {} - Offset<void> Union() const { return Offset<void>(o); } + Offset(const offset_type _o) : o(_o) {} + Offset<> Union() const { return o; } bool IsNull() const { return !o; } }; +// Wrapper for uoffset64_t Offsets. +template<typename T = void> struct Offset64 { + // The type of offset to use. + typedef uoffset64_t offset_type; + + offset_type o; + Offset64() : o(0) {} + Offset64(const offset_type offset) : o(offset) {} + Offset64<> Union() const { return o; } + bool IsNull() const { return !o; } +}; + +// Litmus check for ensuring the Offsets are the expected size. +static_assert(sizeof(Offset<>) == 4, "Offset has wrong size"); +static_assert(sizeof(Offset64<>) == 8, "Offset64 has wrong size"); + inline void EndianCheck() { int endiantest = 1; // If this fails, see FLATBUFFERS_LITTLEENDIAN above. @@ -73,25 +94,59 @@ template<typename T> struct IndirectHelper { typedef T return_type; typedef T mutable_return_type; static const size_t element_stride = sizeof(T); - static return_type Read(const uint8_t *p, uoffset_t i) { + + static return_type Read(const uint8_t *p, const size_t i) { return EndianScalar((reinterpret_cast<const T *>(p))[i]); } + static mutable_return_type Read(uint8_t *p, const size_t i) { + return reinterpret_cast<mutable_return_type>( + Read(const_cast<const uint8_t *>(p), i)); + } }; -template<typename T> struct IndirectHelper<Offset<T>> { + +// For vector of Offsets. +template<typename T, template<typename> class OffsetT> +struct IndirectHelper<OffsetT<T>> { typedef const T *return_type; typedef T *mutable_return_type; - static const size_t element_stride = sizeof(uoffset_t); - static return_type Read(const uint8_t *p, uoffset_t i) { - p += i * sizeof(uoffset_t); - return reinterpret_cast<return_type>(p + ReadScalar<uoffset_t>(p)); + typedef typename OffsetT<T>::offset_type offset_type; + static const offset_type element_stride = sizeof(offset_type); + + static return_type Read(const uint8_t *const p, const offset_type i) { + // Offsets are relative to themselves, so first update the pointer to + // point to the offset location. + const uint8_t *const offset_location = p + i * element_stride; + + // Then read the scalar value of the offset (which may be 32 or 64-bits) and + // then determine the relative location from the offset location. + return reinterpret_cast<return_type>( + offset_location + ReadScalar<offset_type>(offset_location)); + } + static mutable_return_type Read(uint8_t *const p, const offset_type i) { + // Offsets are relative to themselves, so first update the pointer to + // point to the offset location. + uint8_t *const offset_location = p + i * element_stride; + + // Then read the scalar value of the offset (which may be 32 or 64-bits) and + // then determine the relative location from the offset location. + return reinterpret_cast<mutable_return_type>( + offset_location + ReadScalar<offset_type>(offset_location)); } }; + +// For vector of structs. template<typename T> struct IndirectHelper<const T *> { typedef const T *return_type; typedef T *mutable_return_type; static const size_t element_stride = sizeof(T); - static return_type Read(const uint8_t *p, uoffset_t i) { - return reinterpret_cast<const T *>(p + i * sizeof(T)); + + static return_type Read(const uint8_t *const p, const size_t i) { + // Structs are stored inline, relative to the first struct pointer. + return reinterpret_cast<return_type>(p + i * element_stride); + } + static mutable_return_type Read(uint8_t *const p, const size_t i) { + // Structs are stored inline, relative to the first struct pointer. + return reinterpret_cast<mutable_return_type>(p + i * element_stride); } }; @@ -118,25 +173,27 @@ inline bool BufferHasIdentifier(const void *buf, const char *identifier, /// @cond FLATBUFFERS_INTERNAL // Helpers to get a typed pointer to the root object contained in the buffer. template<typename T> T *GetMutableRoot(void *buf) { + if (!buf) return nullptr; EndianCheck(); return reinterpret_cast<T *>( reinterpret_cast<uint8_t *>(buf) + EndianScalar(*reinterpret_cast<uoffset_t *>(buf))); } -template<typename T> T *GetMutableSizePrefixedRoot(void *buf) { - return GetMutableRoot<T>(reinterpret_cast<uint8_t *>(buf) + - sizeof(uoffset_t)); +template<typename T, typename SizeT = uoffset_t> +T *GetMutableSizePrefixedRoot(void *buf) { + return GetMutableRoot<T>(reinterpret_cast<uint8_t *>(buf) + sizeof(SizeT)); } template<typename T> const T *GetRoot(const void *buf) { return GetMutableRoot<T>(const_cast<void *>(buf)); } -template<typename T> const T *GetSizePrefixedRoot(const void *buf) { - return GetRoot<T>(reinterpret_cast<const uint8_t *>(buf) + sizeof(uoffset_t)); +template<typename T, typename SizeT = uoffset_t> +const T *GetSizePrefixedRoot(const void *buf) { + return GetRoot<T>(reinterpret_cast<const uint8_t *>(buf) + sizeof(SizeT)); } } // namespace flatbuffers -#endif // FLATBUFFERS_BUFFER_H_
\ No newline at end of file +#endif // FLATBUFFERS_BUFFER_H_ diff --git a/executor/_include/flatbuffers/buffer_ref.h b/executor/_include/flatbuffers/buffer_ref.h index ce3020733..f70941fc6 100644 --- a/executor/_include/flatbuffers/buffer_ref.h +++ b/executor/_include/flatbuffers/buffer_ref.h @@ -50,4 +50,4 @@ template<typename T> struct BufferRef : BufferRefBase { } // namespace flatbuffers -#endif // FLATBUFFERS_BUFFER_REF_H_
\ No newline at end of file +#endif // FLATBUFFERS_BUFFER_REF_H_ diff --git a/executor/_include/flatbuffers/code_generator.h b/executor/_include/flatbuffers/code_generator.h new file mode 100644 index 000000000..2971e556e --- /dev/null +++ b/executor/_include/flatbuffers/code_generator.h @@ -0,0 +1,97 @@ +/* + * Copyright 2023 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. + */ + +#ifndef FLATBUFFERS_CODE_GENERATOR_H_ +#define FLATBUFFERS_CODE_GENERATOR_H_ + +#include <string> + +#include "flatbuffers/idl.h" + +namespace flatbuffers { + +struct CodeGenOptions { + std::string output_path; +}; + +// A code generator interface for producing converting flatbuffer schema into +// code. +class CodeGenerator { + public: + virtual ~CodeGenerator() = default; + + enum Status { + OK = 0, + ERROR = 1, + FAILED_VERIFICATION = 2, + NOT_IMPLEMENTED = 3 + }; + + std::string status_detail; + + // Generate code from the provided `parser`. + // + // DEPRECATED: prefer using the other overload of GenerateCode for bfbs. + virtual Status GenerateCode(const Parser &parser, const std::string &path, + const std::string &filename) = 0; + + // Generate code from the provided `parser` and place it in the output. + virtual Status GenerateCodeString(const Parser &parser, + const std::string &filename, + std::string &output) { + (void)parser; + (void)filename; + (void)output; + return Status::NOT_IMPLEMENTED; + } + + // Generate code from the provided `buffer` of given `length`. The buffer is a + // serialized reflection.fbs. + virtual Status GenerateCode(const uint8_t *buffer, int64_t length, + const CodeGenOptions &options) = 0; + + virtual Status GenerateMakeRule(const Parser &parser, const std::string &path, + const std::string &filename, + std::string &output) = 0; + + virtual Status GenerateGrpcCode(const Parser &parser, const std::string &path, + const std::string &filename) = 0; + + virtual Status GenerateRootFile(const Parser &parser, + const std::string &path) = 0; + + virtual bool IsSchemaOnly() const = 0; + + virtual bool SupportsBfbsGeneration() const = 0; + + virtual bool SupportsRootFileGeneration() const = 0; + + virtual IDLOptions::Language Language() const = 0; + + virtual std::string LanguageName() const = 0; + + protected: + CodeGenerator() = default; + + private: + // Copying is not supported. + CodeGenerator(const CodeGenerator &) = delete; + CodeGenerator &operator=(const CodeGenerator &) = delete; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_CODE_GENERATOR_H_ diff --git a/executor/_include/flatbuffers/code_generators.h b/executor/_include/flatbuffers/code_generators.h index 727552118..fc030d439 100644 --- a/executor/_include/flatbuffers/code_generators.h +++ b/executor/_include/flatbuffers/code_generators.h @@ -229,6 +229,10 @@ class TypedFloatConstantGenerator : public FloatConstantGenerator { const std::string neg_inf_number_; }; +std::string JavaCSharpMakeRule(const bool java, const Parser &parser, + const std::string &path, + const std::string &file_name); + } // namespace flatbuffers #endif // FLATBUFFERS_CODE_GENERATORS_H_ diff --git a/executor/_include/flatbuffers/default_allocator.h b/executor/_include/flatbuffers/default_allocator.h index 8b173af11..d4724122c 100644 --- a/executor/_include/flatbuffers/default_allocator.h +++ b/executor/_include/flatbuffers/default_allocator.h @@ -61,4 +61,4 @@ inline uint8_t *ReallocateDownward(Allocator *allocator, uint8_t *old_p, } // namespace flatbuffers -#endif // FLATBUFFERS_DEFAULT_ALLOCATOR_H_
\ No newline at end of file +#endif // FLATBUFFERS_DEFAULT_ALLOCATOR_H_ diff --git a/executor/_include/flatbuffers/detached_buffer.h b/executor/_include/flatbuffers/detached_buffer.h index 760a08845..5e900baeb 100644 --- a/executor/_include/flatbuffers/detached_buffer.h +++ b/executor/_include/flatbuffers/detached_buffer.h @@ -45,7 +45,7 @@ class DetachedBuffer { cur_(cur), size_(sz) {} - DetachedBuffer(DetachedBuffer &&other) + DetachedBuffer(DetachedBuffer &&other) noexcept : allocator_(other.allocator_), own_allocator_(other.own_allocator_), buf_(other.buf_), @@ -55,7 +55,7 @@ class DetachedBuffer { other.reset(); } - DetachedBuffer &operator=(DetachedBuffer &&other) { + DetachedBuffer &operator=(DetachedBuffer &&other) noexcept { if (this == &other) return *this; destroy(); diff --git a/executor/_include/flatbuffers/file_manager.h b/executor/_include/flatbuffers/file_manager.h new file mode 100644 index 000000000..069df5b88 --- /dev/null +++ b/executor/_include/flatbuffers/file_manager.h @@ -0,0 +1,48 @@ +/* + * Copyright 2023 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. + */ + +#ifndef FLATBUFFERS_FILE_MANAGER_H_ +#define FLATBUFFERS_FILE_MANAGER_H_ + +#include <set> +#include <string> + +#include "flatbuffers/util.h" + +namespace flatbuffers { + +// A File interface to write data to file by default or +// save only file names +class FileManager { + public: + FileManager() = default; + virtual ~FileManager() = default; + + virtual bool SaveFile(const std::string &absolute_file_name, + const std::string &content) = 0; + + virtual bool LoadFile(const std::string &absolute_file_name, + std::string *buf) = 0; + + private: + // Copying is not supported. + FileManager(const FileManager &) = delete; + FileManager &operator=(const FileManager &) = delete; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_FILE_MANAGER_H_ diff --git a/executor/_include/flatbuffers/flatbuffer_builder.h b/executor/_include/flatbuffers/flatbuffer_builder.h index f9432338f..0a38b4ac3 100644 --- a/executor/_include/flatbuffers/flatbuffer_builder.h +++ b/executor/_include/flatbuffers/flatbuffer_builder.h @@ -17,12 +17,16 @@ #ifndef FLATBUFFERS_FLATBUFFER_BUILDER_H_ #define FLATBUFFERS_FLATBUFFER_BUILDER_H_ +#include <algorithm> +#include <cstdint> #include <functional> #include <initializer_list> +#include <type_traits> #include "flatbuffers/allocator.h" #include "flatbuffers/array.h" #include "flatbuffers/base.h" +#include "flatbuffers/buffer.h" #include "flatbuffers/buffer_ref.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" @@ -39,8 +43,9 @@ namespace flatbuffers { // Converts a Field ID to a virtual table offset. inline voffset_t FieldIndexToOffset(voffset_t field_id) { // Should correspond to what EndTable() below builds up. - const int fixed_fields = 2; // Vtable size and Object Size. - return static_cast<voffset_t>((field_id + fixed_fields) * sizeof(voffset_t)); + const voffset_t fixed_fields = + 2 * sizeof(voffset_t); // Vtable size and Object Size. + return fixed_fields + field_id * sizeof(voffset_t); } template<typename T, typename Alloc = std::allocator<T>> @@ -67,8 +72,13 @@ T *data(std::vector<T, Alloc> &v) { /// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/ /// `CreateVector` functions. Do this is depth-first order to build up a tree to /// the root. `Finish()` wraps up the buffer ready for transport. -class FlatBufferBuilder { +template<bool Is64Aware = false> class FlatBufferBuilderImpl { public: + // This switches the size type of the builder, based on if its 64-bit aware + // (uoffset64_t) or not (uoffset_t). + typedef + typename std::conditional<Is64Aware, uoffset64_t, uoffset_t>::type SizeT; + /// @brief Default constructor for FlatBufferBuilder. /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults /// to `1024`. @@ -80,13 +90,16 @@ class FlatBufferBuilder { /// minimum alignment upon reallocation. Only needed if you intend to store /// types with custom alignment AND you wish to read the buffer in-place /// directly after creation. - explicit FlatBufferBuilder( + explicit FlatBufferBuilderImpl( size_t initial_size = 1024, Allocator *allocator = nullptr, bool own_allocator = false, size_t buffer_minalign = AlignOf<largest_scalar_t>()) - : buf_(initial_size, allocator, own_allocator, buffer_minalign), + : buf_(initial_size, allocator, own_allocator, buffer_minalign, + static_cast<SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE + : FLATBUFFERS_MAX_BUFFER_SIZE)), num_field_loc(0), max_voffset_(0), + length_of_64_bit_region_(0), nested(false), finished(false), minalign_(1), @@ -97,10 +110,13 @@ class FlatBufferBuilder { } /// @brief Move constructor for FlatBufferBuilder. - FlatBufferBuilder(FlatBufferBuilder &&other) - : buf_(1024, nullptr, false, AlignOf<largest_scalar_t>()), + FlatBufferBuilderImpl(FlatBufferBuilderImpl &&other) noexcept + : buf_(1024, nullptr, false, AlignOf<largest_scalar_t>(), + static_cast<SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE + : FLATBUFFERS_MAX_BUFFER_SIZE)), num_field_loc(0), max_voffset_(0), + length_of_64_bit_region_(0), nested(false), finished(false), minalign_(1), @@ -115,18 +131,19 @@ class FlatBufferBuilder { } /// @brief Move assignment operator for FlatBufferBuilder. - FlatBufferBuilder &operator=(FlatBufferBuilder &&other) { + FlatBufferBuilderImpl &operator=(FlatBufferBuilderImpl &&other) noexcept { // Move construct a temporary and swap idiom - FlatBufferBuilder temp(std::move(other)); + FlatBufferBuilderImpl temp(std::move(other)); Swap(temp); return *this; } - void Swap(FlatBufferBuilder &other) { + void Swap(FlatBufferBuilderImpl &other) { using std::swap; buf_.swap(other.buf_); swap(num_field_loc, other.num_field_loc); swap(max_voffset_, other.max_voffset_); + swap(length_of_64_bit_region_, other.length_of_64_bit_region_); swap(nested, other.nested); swap(finished, other.finished); swap(minalign_, other.minalign_); @@ -135,7 +152,7 @@ class FlatBufferBuilder { swap(string_pool, other.string_pool); } - ~FlatBufferBuilder() { + ~FlatBufferBuilderImpl() { if (string_pool) delete string_pool; } @@ -152,12 +169,36 @@ class FlatBufferBuilder { nested = false; finished = false; minalign_ = 1; + length_of_64_bit_region_ = 0; if (string_pool) string_pool->clear(); } /// @brief The current size of the serialized buffer, counting from the end. + /// @return Returns an `SizeT` with the current size of the buffer. + SizeT GetSize() const { return buf_.size(); } + + /// @brief The current size of the serialized buffer relative to the end of + /// the 32-bit region. /// @return Returns an `uoffset_t` with the current size of the buffer. - uoffset_t GetSize() const { return buf_.size(); } + template<bool is_64 = Is64Aware> + // Only enable this method for the 64-bit builder, as only that builder is + // concerned with the 32/64-bit boundary, and should be the one to bare any + // run time costs. + typename std::enable_if<is_64, uoffset_t>::type GetSizeRelative32BitRegion() + const { + //[32-bit region][64-bit region] + // [XXXXXXXXXXXXXXXXXXX] GetSize() + // [YYYYYYYYYYYYY] length_of_64_bit_region_ + // [ZZZZ] return size + return static_cast<uoffset_t>(GetSize() - length_of_64_bit_region_); + } + + template<bool is_64 = Is64Aware> + // Only enable this method for the 32-bit builder. + typename std::enable_if<!is_64, uoffset_t>::type GetSizeRelative32BitRegion() + const { + return static_cast<uoffset_t>(GetSize()); + } /// @brief Get the serialized buffer (after you call `Finish()`). /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the @@ -269,14 +310,16 @@ class FlatBufferBuilder { } // Write a single aligned scalar to the buffer - template<typename T> uoffset_t PushElement(T element) { + template<typename T, typename ReturnT = uoffset_t> + ReturnT PushElement(T element) { AssertScalarT<T>(); Align(sizeof(T)); buf_.push_small(EndianScalar(element)); - return GetSize(); + return CalculateOffset<ReturnT>(); } - template<typename T> uoffset_t PushElement(Offset<T> off) { + template<typename T, template<typename> class OffsetT = Offset> + uoffset_t PushElement(OffsetT<T> off) { // Special case for offsets: see ReferTo below. return PushElement(ReferTo(off.o)); } @@ -306,11 +349,16 @@ class FlatBufferBuilder { AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0)); } + template<typename T> void AddOffset(voffset_t field, Offset64<T> off) { + if (off.IsNull()) return; // Don't store. + AddElement(field, ReferTo(off.o), static_cast<uoffset64_t>(0)); + } + template<typename T> void AddStruct(voffset_t field, const T *structptr) { if (!structptr) return; // Default, don't store. Align(AlignOf<T>()); buf_.push_small(*structptr); - TrackField(field, GetSize()); + TrackField(field, CalculateOffset<uoffset_t>()); } void AddStructOffset(voffset_t field, uoffset_t off) { @@ -321,12 +369,29 @@ class FlatBufferBuilder { // This function converts them to be relative to the current location // in the buffer (when stored here), pointing upwards. uoffset_t ReferTo(uoffset_t off) { - // Align to ensure GetSize() below is correct. + // Align to ensure GetSizeRelative32BitRegion() below is correct. Align(sizeof(uoffset_t)); - // Offset must refer to something already in buffer. - const uoffset_t size = GetSize(); + // 32-bit offsets are relative to the tail of the 32-bit region of the + // buffer. For most cases (without 64-bit entities) this is equivalent to + // size of the whole buffer (e.g. GetSize()) + return ReferTo(off, GetSizeRelative32BitRegion()); + } + + uoffset64_t ReferTo(uoffset64_t off) { + // Align to ensure GetSize() below is correct. + Align(sizeof(uoffset64_t)); + // 64-bit offsets are relative to tail of the whole buffer + return ReferTo(off, GetSize()); + } + + template<typename T, typename T2> T ReferTo(const T off, const T2 size) { + FLATBUFFERS_ASSERT(off && off <= size); + return size - off + static_cast<T>(sizeof(T)); + } + + template<typename T> T ReferTo(const T off, const T size) { FLATBUFFERS_ASSERT(off && off <= size); - return size - off + static_cast<uoffset_t>(sizeof(uoffset_t)); + return size - off + static_cast<T>(sizeof(T)); } void NotNested() { @@ -348,7 +413,7 @@ class FlatBufferBuilder { uoffset_t StartTable() { NotNested(); nested = true; - return GetSize(); + return GetSizeRelative32BitRegion(); } // This finishes one serialized object by generating the vtable if it's a @@ -359,7 +424,9 @@ class FlatBufferBuilder { FLATBUFFERS_ASSERT(nested); // Write the vtable offset, which is the start of any Table. // We fill its value later. - auto vtableoffsetloc = PushElement<soffset_t>(0); + // This is relative to the end of the 32-bit region. + const uoffset_t vtable_offset_loc = + static_cast<uoffset_t>(PushElement<soffset_t>(0)); // Write a vtable, which consists entirely of voffset_t elements. // It starts with the number of offsets, followed by a type id, followed // by the offsets themselves. In reverse: @@ -369,7 +436,7 @@ class FlatBufferBuilder { (std::max)(static_cast<voffset_t>(max_voffset_ + sizeof(voffset_t)), FieldIndexToOffset(0)); buf_.fill_big(max_voffset_); - auto table_object_size = vtableoffsetloc - start; + const uoffset_t table_object_size = vtable_offset_loc - start; // Vtable use 16bit offsets. FLATBUFFERS_ASSERT(table_object_size < 0x10000); WriteScalar<voffset_t>(buf_.data() + sizeof(voffset_t), @@ -379,7 +446,8 @@ class FlatBufferBuilder { for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc); it < buf_.scratch_end(); it += sizeof(FieldLoc)) { auto field_location = reinterpret_cast<FieldLoc *>(it); - auto pos = static_cast<voffset_t>(vtableoffsetloc - field_location->off); + const voffset_t pos = + static_cast<voffset_t>(vtable_offset_loc - field_location->off); // If this asserts, it means you've set a field twice. FLATBUFFERS_ASSERT( !ReadScalar<voffset_t>(buf_.data() + field_location->id)); @@ -388,7 +456,7 @@ class FlatBufferBuilder { ClearOffsets(); auto vt1 = reinterpret_cast<voffset_t *>(buf_.data()); auto vt1_size = ReadScalar<voffset_t>(vt1); - auto vt_use = GetSize(); + auto vt_use = GetSizeRelative32BitRegion(); // See if we already have generated a vtable with this exact same // layout before. If so, make it point to the old one, remove this one. if (dedup_vtables_) { @@ -399,23 +467,24 @@ class FlatBufferBuilder { auto vt2_size = ReadScalar<voffset_t>(vt2); if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue; vt_use = *vt_offset_ptr; - buf_.pop(GetSize() - vtableoffsetloc); + buf_.pop(GetSizeRelative32BitRegion() - vtable_offset_loc); break; } } // If this is a new vtable, remember it. - if (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); } + if (vt_use == GetSizeRelative32BitRegion()) { + buf_.scratch_push_small(vt_use); + } // Fill the vtable offset we created above. - // The offset points from the beginning of the object to where the - // vtable is stored. + // The offset points from the beginning of the object to where the vtable is + // stored. // Offsets default direction is downward in memory for future format // flexibility (storing all vtables at the start of the file). - WriteScalar(buf_.data_at(vtableoffsetloc), + WriteScalar(buf_.data_at(vtable_offset_loc + length_of_64_bit_region_), static_cast<soffset_t>(vt_use) - - static_cast<soffset_t>(vtableoffsetloc)); - + static_cast<soffset_t>(vtable_offset_loc)); nested = false; - return vtableoffsetloc; + return vtable_offset_loc; } FLATBUFFERS_ATTRIBUTE([[deprecated("call the version above instead")]]) @@ -425,14 +494,20 @@ class FlatBufferBuilder { // This checks a required field has been set in a given table that has // just been constructed. - template<typename T> void Required(Offset<T> table, voffset_t field); + template<typename T> void Required(Offset<T> table, voffset_t field) { + auto table_ptr = reinterpret_cast<const Table *>(buf_.data_at(table.o)); + bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; + // If this fails, the caller will show what field needs to be set. + FLATBUFFERS_ASSERT(ok); + (void)ok; + } uoffset_t StartStruct(size_t alignment) { Align(alignment); - return GetSize(); + return GetSizeRelative32BitRegion(); } - uoffset_t EndStruct() { return GetSize(); } + uoffset_t EndStruct() { return GetSizeRelative32BitRegion(); } void ClearOffsets() { buf_.scratch_pop(num_field_loc * sizeof(FieldLoc)); @@ -441,15 +516,18 @@ class FlatBufferBuilder { } // Aligns such that when "len" bytes are written, an object can be written - // after it with "alignment" without padding. + // after it (forward in the buffer) with "alignment" without padding. void PreAlign(size_t len, size_t alignment) { if (len == 0) return; TrackMinAlign(alignment); buf_.fill(PaddingBytes(GetSize() + len, alignment)); } - template<typename T> void PreAlign(size_t len) { - AssertScalarT<T>(); - PreAlign(len, sizeof(T)); + + // Aligns such than when "len" bytes are written, an object of type `AlignT` + // can be written after it (forward in the buffer) without padding. + template<typename AlignT> void PreAlign(size_t len) { + AssertScalarT<AlignT>(); + PreAlign(len, AlignOf<AlignT>()); } /// @endcond @@ -457,34 +535,35 @@ class FlatBufferBuilder { /// @param[in] str A const char pointer to the data to be stored as a string. /// @param[in] len The number of bytes that should be stored from `str`. /// @return Returns the offset in the buffer where the string starts. - Offset<String> CreateString(const char *str, size_t len) { - NotNested(); - PreAlign<uoffset_t>(len + 1); // Always 0-terminated. - buf_.fill(1); - PushBytes(reinterpret_cast<const uint8_t *>(str), len); - PushElement(static_cast<uoffset_t>(len)); - return Offset<String>(GetSize()); + template<template<typename> class OffsetT = Offset> + OffsetT<String> CreateString(const char *str, size_t len) { + CreateStringImpl(str, len); + return OffsetT<String>( + CalculateOffset<typename OffsetT<String>::offset_type>()); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A const char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. - Offset<String> CreateString(const char *str) { - return CreateString(str, strlen(str)); + template<template<typename> class OffsetT = Offset> + OffsetT<String> CreateString(const char *str) { + return CreateString<OffsetT>(str, strlen(str)); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. - Offset<String> CreateString(char *str) { - return CreateString(str, strlen(str)); + template<template<typename> class OffsetT = Offset> + OffsetT<String> CreateString(char *str) { + return CreateString<OffsetT>(str, strlen(str)); } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string to store in the buffer. /// @return Returns the offset in the buffer where the string starts. - Offset<String> CreateString(const std::string &str) { - return CreateString(str.c_str(), str.length()); + template<template<typename> class OffsetT = Offset> + OffsetT<String> CreateString(const std::string &str) { + return CreateString<OffsetT>(str.c_str(), str.length()); } // clang-format off @@ -492,8 +571,9 @@ class FlatBufferBuilder { /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const string_view to copy in to the buffer. /// @return Returns the offset in the buffer where the string starts. - Offset<String> CreateString(flatbuffers::string_view str) { - return CreateString(str.data(), str.size()); + template<template <typename> class OffsetT = Offset> + OffsetT<String>CreateString(flatbuffers::string_view str) { + return CreateString<OffsetT>(str.data(), str.size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on @@ -501,16 +581,21 @@ class FlatBufferBuilder { /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const pointer to a `String` struct to add to the buffer. /// @return Returns the offset in the buffer where the string starts - Offset<String> CreateString(const String *str) { - return str ? CreateString(str->c_str(), str->size()) : 0; + template<template<typename> class OffsetT = Offset> + OffsetT<String> CreateString(const String *str) { + return str ? CreateString<OffsetT>(str->c_str(), str->size()) : 0; } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string like type with support /// of T::c_str() and T::length() to store in the buffer. /// @return Returns the offset in the buffer where the string starts. - template<typename T> Offset<String> CreateString(const T &str) { - return CreateString(str.c_str(), str.length()); + template<template<typename> class OffsetT = Offset, + // No need to explicitly declare the T type, let the compiler deduce + // it. + int &...ExplicitArgumentBarrier, typename T> + OffsetT<String> CreateString(const T &str) { + return CreateString<OffsetT>(str.c_str(), str.length()); } /// @brief Store a string in the buffer, which can contain any binary data. @@ -522,12 +607,14 @@ class FlatBufferBuilder { /// @return Returns the offset in the buffer where the string starts. Offset<String> CreateSharedString(const char *str, size_t len) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); - if (!string_pool) + if (!string_pool) { string_pool = new StringOffsetMap(StringOffsetCompare(buf_)); - auto size_before_string = buf_.size(); + } + + const size_t size_before_string = buf_.size(); // Must first serialize the string, since the set is all offsets into // buffer. - auto off = CreateString(str, len); + const Offset<String> off = CreateString<Offset>(str, len); auto it = string_pool->find(off); // If it exists we reuse existing serialized data! if (it != string_pool->end()) { @@ -583,17 +670,27 @@ class FlatBufferBuilder { } /// @cond FLATBUFFERS_INTERNAL - uoffset_t EndVector(size_t len) { + template<typename LenT = uoffset_t, typename ReturnT = uoffset_t> + ReturnT EndVector(size_t len) { FLATBUFFERS_ASSERT(nested); // Hit if no corresponding StartVector. nested = false; - return PushElement(static_cast<uoffset_t>(len)); + return PushElement<LenT, ReturnT>(static_cast<LenT>(len)); } - void StartVector(size_t len, size_t elemsize) { + template<template<typename> class OffsetT = Offset, typename LenT = uint32_t> + void StartVector(size_t len, size_t elemsize, size_t alignment) { NotNested(); nested = true; - PreAlign<uoffset_t>(len * elemsize); - PreAlign(len * elemsize, elemsize); // Just in case elemsize > uoffset_t. + // Align to the Length type of the vector (either 32-bit or 64-bit), so + // that the length of the buffer can be added without padding. + PreAlign<LenT>(len * elemsize); + PreAlign(len * elemsize, alignment); // Just in case elemsize > uoffset_t. + } + + template<typename T, template<typename> class OffsetT = Offset, + typename LenT = uint32_t> + void StartVector(size_t len) { + return StartVector<OffsetT, LenT>(len, sizeof(T), AlignOf<T>()); } // Call this right before StartVector/CreateVector if you want to force the @@ -618,31 +715,39 @@ class FlatBufferBuilder { /// @brief Serialize an array into a FlatBuffer `vector`. /// @tparam T The data type of the array elements. + /// @tparam OffsetT the type of offset to return + /// @tparam VectorT the type of vector to cast to. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. - /// @return Returns a typed `Offset` into the serialized data indicating + /// @return Returns a typed `TOffset` into the serialized data indicating /// where the vector is stored. - template<typename T> Offset<Vector<T>> CreateVector(const T *v, size_t len) { + template<typename T, template<typename...> class OffsetT = Offset, + template<typename...> class VectorT = Vector> + OffsetT<VectorT<T>> CreateVector(const T *v, size_t len) { + // The type of the length field in the vector. + typedef typename VectorT<T>::size_type LenT; + typedef typename OffsetT<VectorT<T>>::offset_type offset_type; // If this assert hits, you're specifying a template argument that is // causing the wrong overload to be selected, remove it. AssertScalarT<T>(); - StartVector(len, sizeof(T)); - if (len == 0) { return Offset<Vector<T>>(EndVector(len)); } - // clang-format off - #if FLATBUFFERS_LITTLEENDIAN - PushBytes(reinterpret_cast<const uint8_t *>(v), len * sizeof(T)); - #else - if (sizeof(T) == 1) { - PushBytes(reinterpret_cast<const uint8_t *>(v), len); - } else { - for (auto i = len; i > 0; ) { - PushElement(v[--i]); + StartVector<T, OffsetT, LenT>(len); + if (len > 0) { + // clang-format off + #if FLATBUFFERS_LITTLEENDIAN + PushBytes(reinterpret_cast<const uint8_t *>(v), len * sizeof(T)); + #else + if (sizeof(T) == 1) { + PushBytes(reinterpret_cast<const uint8_t *>(v), len); + } else { + for (auto i = len; i > 0; ) { + PushElement(v[--i]); + } } - } - #endif - // clang-format on - return Offset<Vector<T>>(EndVector(len)); + #endif + // clang-format on + } + return OffsetT<VectorT<T>>(EndVector<LenT, offset_type>(len)); } /// @brief Serialize an array like object into a FlatBuffer `vector`. @@ -668,7 +773,7 @@ class FlatBufferBuilder { template<typename T> Offset<Vector<Offset<T>>> CreateVector(const Offset<T> *v, size_t len) { - StartVector(len, sizeof(Offset<T>)); + StartVector<Offset<T>>(len); for (auto i = len; i > 0;) { PushElement(v[--i]); } return Offset<Vector<Offset<T>>>(EndVector(len)); } @@ -684,11 +789,17 @@ class FlatBufferBuilder { return CreateVector(data(v), v.size()); } + template<template<typename...> class VectorT = Vector64, + int &...ExplicitArgumentBarrier, typename T> + Offset64<VectorT<T>> CreateVector64(const std::vector<T> &v) { + return CreateVector<T, Offset64, VectorT>(data(v), v.size()); + } + // vector<bool> may be implemented using a bit-set, so we can't access it as // an array. Instead, read elements manually. // Background: https://isocpp.org/blog/2012/11/on-vectorbool Offset<Vector<uint8_t>> CreateVector(const std::vector<bool> &v) { - StartVector(v.size(), sizeof(uint8_t)); + StartVector<uint8_t>(v.size()); for (auto i = v.size(); i > 0;) { PushElement(static_cast<uint8_t>(v[--i])); } @@ -762,7 +873,7 @@ class FlatBufferBuilder { for (auto it = begin; it != end; ++it) { buf_.scratch_push_small(CreateString(*it)); } - StartVector(size, sizeof(Offset<String>)); + StartVector<Offset<String>>(size); for (auto i = 1; i <= size; i++) { // Note we re-evaluate the buf location each iteration to account for any // underlying buffer resizing that may occur. @@ -780,47 +891,19 @@ class FlatBufferBuilder { /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. - template<typename T> - Offset<Vector<const T *>> CreateVectorOfStructs(const T *v, size_t len) { - StartVector(len * sizeof(T) / AlignOf<T>(), AlignOf<T>()); + template<typename T, template<typename...> class OffsetT = Offset, + template<typename...> class VectorT = Vector> + OffsetT<VectorT<const T *>> CreateVectorOfStructs(const T *v, size_t len) { + // The type of the length field in the vector. + typedef typename VectorT<T>::size_type LenT; + typedef typename OffsetT<VectorT<const T *>>::offset_type offset_type; + + StartVector<OffsetT, LenT>(len * sizeof(T) / AlignOf<T>(), sizeof(T), + AlignOf<T>()); if (len > 0) { PushBytes(reinterpret_cast<const uint8_t *>(v), sizeof(T) * len); } - return Offset<Vector<const T *>>(EndVector(len)); - } - - /// @brief Serialize an array of native structs into a FlatBuffer `vector`. - /// @tparam T The data type of the struct array elements. - /// @tparam S The data type of the native struct array elements. - /// @param[in] v A pointer to the array of type `S` to serialize into the - /// buffer as a `vector`. - /// @param[in] len The number of elements to serialize. - /// @param[in] pack_func Pointer to a function to convert the native struct - /// to the FlatBuffer struct. - /// @return Returns a typed `Offset` into the serialized data indicating - /// where the vector is stored. - template<typename T, typename S> - Offset<Vector<const T *>> CreateVectorOfNativeStructs( - const S *v, size_t len, T (*const pack_func)(const S &)) { - FLATBUFFERS_ASSERT(pack_func); - auto structs = StartVectorOfStructs<T>(len); - for (size_t i = 0; i < len; i++) { structs[i] = pack_func(v[i]); } - return EndVectorOfStructs<T>(len); - } - - /// @brief Serialize an array of native structs into a FlatBuffer `vector`. - /// @tparam T The data type of the struct array elements. - /// @tparam S The data type of the native struct array elements. - /// @param[in] v A pointer to the array of type `S` to serialize into the - /// buffer as a `vector`. - /// @param[in] len The number of elements to serialize. - /// @return Returns a typed `Offset` into the serialized data indicating - /// where the vector is stored. - template<typename T, typename S> - Offset<Vector<const T *>> CreateVectorOfNativeStructs(const S *v, - size_t len) { - extern T Pack(const S &); - return CreateVectorOfNativeStructs(v, len, Pack); + return OffsetT<VectorT<const T *>>(EndVector<LenT, offset_type>(len)); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. @@ -868,10 +951,52 @@ class FlatBufferBuilder { /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. - template<typename T, typename Alloc = std::allocator<T>> - Offset<Vector<const T *>> CreateVectorOfStructs( + template<typename T, template<typename...> class OffsetT = Offset, + template<typename...> class VectorT = Vector, + typename Alloc = std::allocator<T>> + OffsetT<VectorT<const T *>> CreateVectorOfStructs( const std::vector<T, Alloc> &v) { - return CreateVectorOfStructs(data(v), v.size()); + return CreateVectorOfStructs<T, OffsetT, VectorT>(data(v), v.size()); + } + + template<template<typename...> class VectorT = Vector64, int &..., typename T> + Offset64<VectorT<const T *>> CreateVectorOfStructs64( + const std::vector<T> &v) { + return CreateVectorOfStructs<T, Offset64, VectorT>(data(v), v.size()); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @param[in] pack_func Pointer to a function to convert the native struct + /// to the FlatBuffer struct. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template<typename T, typename S> + Offset<Vector<const T *>> CreateVectorOfNativeStructs( + const S *v, size_t len, T (*const pack_func)(const S &)) { + FLATBUFFERS_ASSERT(pack_func); + auto structs = StartVectorOfStructs<T>(len); + for (size_t i = 0; i < len; i++) { structs[i] = pack_func(v[i]); } + return EndVectorOfStructs<T>(len); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template<typename T, typename S> + Offset<Vector<const T *>> CreateVectorOfNativeStructs(const S *v, + size_t len) { + extern T Pack(const S &); + return CreateVectorOfNativeStructs(v, len, Pack); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer @@ -974,14 +1099,14 @@ class FlatBufferBuilder { /// @cond FLATBUFFERS_INTERNAL template<typename T> struct TableKeyComparator { - TableKeyComparator(vector_downward &buf) : buf_(buf) {} + explicit TableKeyComparator(vector_downward<SizeT> &buf) : buf_(buf) {} TableKeyComparator(const TableKeyComparator &other) : buf_(other.buf_) {} bool operator()(const Offset<T> &a, const Offset<T> &b) const { auto table_a = reinterpret_cast<T *>(buf_.data_at(a.o)); auto table_b = reinterpret_cast<T *>(buf_.data_at(b.o)); return table_a->KeyCompareLessThan(table_b); } - vector_downward &buf_; + vector_downward<SizeT> &buf_; private: FLATBUFFERS_DELETE_FUNC( @@ -1025,16 +1150,22 @@ class FlatBufferBuilder { /// written to at a later time to serialize the data into a `vector` /// in the buffer. uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, - uint8_t **buf) { + size_t alignment, uint8_t **buf) { NotNested(); - StartVector(len, elemsize); + StartVector(len, elemsize, alignment); buf_.make_space(len * elemsize); - auto vec_start = GetSize(); + const uoffset_t vec_start = GetSizeRelative32BitRegion(); auto vec_end = EndVector(len); *buf = buf_.data_at(vec_start); return vec_end; } + FLATBUFFERS_ATTRIBUTE([[deprecated("call the version above instead")]]) + uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, + uint8_t **buf) { + return CreateUninitializedVector(len, elemsize, elemsize, buf); + } + /// @brief Specialized version of `CreateVector` for non-copying use cases. /// Write the data any time later to the returned buffer pointer `buf`. /// @tparam T The data type of the data that will be stored in the buffer @@ -1046,14 +1177,14 @@ class FlatBufferBuilder { template<typename T> Offset<Vector<T>> CreateUninitializedVector(size_t len, T **buf) { AssertScalarT<T>(); - return CreateUninitializedVector(len, sizeof(T), + return CreateUninitializedVector(len, sizeof(T), AlignOf<T>(), reinterpret_cast<uint8_t **>(buf)); } template<typename T> Offset<Vector<const T *>> CreateUninitializedVectorOfStructs(size_t len, T **buf) { - return CreateUninitializedVector(len, sizeof(T), + return CreateUninitializedVector(len, sizeof(T), AlignOf<T>(), reinterpret_cast<uint8_t **>(buf)); } @@ -1064,7 +1195,7 @@ class FlatBufferBuilder { Offset<Vector<T>> CreateVectorScalarCast(const U *v, size_t len) { AssertScalarT<T>(); AssertScalarT<U>(); - StartVector(len, sizeof(T)); + StartVector<T>(len); for (auto i = len; i > 0;) { PushElement(static_cast<T>(v[--i])); } return Offset<Vector<T>>(EndVector(len)); } @@ -1074,7 +1205,8 @@ class FlatBufferBuilder { NotNested(); Align(AlignOf<T>()); buf_.push_small(structobj); - return Offset<const T *>(GetSize()); + return Offset<const T *>( + CalculateOffset<typename Offset<const T *>::offset_type>()); } /// @brief Finish serializing a buffer by writing the root offset. @@ -1098,7 +1230,7 @@ class FlatBufferBuilder { Finish(root.o, file_identifier, true); } - void SwapBufAllocator(FlatBufferBuilder &other) { + void SwapBufAllocator(FlatBufferBuilderImpl &other) { buf_.swap_allocator(other.buf_); } @@ -1108,16 +1240,23 @@ class FlatBufferBuilder { protected: // You shouldn't really be copying instances of this class. - FlatBufferBuilder(const FlatBufferBuilder &); - FlatBufferBuilder &operator=(const FlatBufferBuilder &); + FlatBufferBuilderImpl(const FlatBufferBuilderImpl &); + FlatBufferBuilderImpl &operator=(const FlatBufferBuilderImpl &); void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) { NotNested(); buf_.clear_scratch(); + + const size_t prefix_size = size_prefix ? sizeof(SizeT) : 0; + // Make sure we track the alignment of the size prefix. + TrackMinAlign(prefix_size); + + const size_t root_offset_size = sizeof(uoffset_t); + const size_t file_id_size = file_identifier ? kFileIdentifierLength : 0; + // This will cause the whole buffer to be aligned. - PreAlign((size_prefix ? sizeof(uoffset_t) : 0) + sizeof(uoffset_t) + - (file_identifier ? kFileIdentifierLength : 0), - minalign_); + PreAlign(prefix_size + root_offset_size + file_id_size, minalign_); + if (file_identifier) { FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength); PushBytes(reinterpret_cast<const uint8_t *>(file_identifier), @@ -1133,7 +1272,7 @@ class FlatBufferBuilder { voffset_t id; }; - vector_downward buf_; + vector_downward<SizeT> buf_; // Accumulating offsets of table members while it is being built. // We store these in the scratch pad of buf_, after the vtable offsets. @@ -1142,6 +1281,26 @@ class FlatBufferBuilder { // possible vtable. voffset_t max_voffset_; + // This is the length of the 64-bit region of the buffer. The buffer supports + // 64-bit offsets by forcing serialization of those elements in the "tail" + // region of the buffer (i.e. "64-bit region"). To properly keep track of + // offsets that are referenced from the tail of the buffer to not overflow + // their size (e.g. Offset is a uint32_t type), the boundary of the 32-/64-bit + // regions must be tracked. + // + // [ Complete FlatBuffer ] + // [32-bit region][64-bit region] + // ^ ^ + // | Tail of the buffer. + // | + // Tail of the 32-bit region of the buffer. + // + // This keeps track of the size of the 64-bit region so that the tail of the + // 32-bit region can be calculated as `GetSize() - length_of_64_bit_region_`. + // + // This will remain 0 if no 64-bit offset types are added to the buffer. + size_t length_of_64_bit_region_; + // Ensure objects are not nested. bool nested; @@ -1155,14 +1314,15 @@ class FlatBufferBuilder { bool dedup_vtables_; struct StringOffsetCompare { - StringOffsetCompare(const vector_downward &buf) : buf_(&buf) {} + explicit StringOffsetCompare(const vector_downward<SizeT> &buf) + : buf_(&buf) {} bool operator()(const Offset<String> &a, const Offset<String> &b) const { auto stra = reinterpret_cast<const String *>(buf_->data_at(a.o)); auto strb = reinterpret_cast<const String *>(buf_->data_at(b.o)); return StringLessThan(stra->data(), stra->size(), strb->data(), strb->size()); } - const vector_downward *buf_; + const vector_downward<SizeT> *buf_; }; // For use with CreateSharedString. Instantiated on first use only. @@ -1170,22 +1330,122 @@ class FlatBufferBuilder { StringOffsetMap *string_pool; private: + void CanAddOffset64() { + // If you hit this assertion, you are attempting to add a 64-bit offset to + // a 32-bit only builder. This is because the builder has overloads that + // differ only on the offset size returned: e.g.: + // + // FlatBufferBuilder builder; + // Offset64<String> string_offset = builder.CreateString<Offset64>(); + // + // Either use a 64-bit aware builder, or don't try to create an Offset64 + // return type. + // + // TODO(derekbailey): we can probably do more enable_if to avoid this + // looking like its possible to the user. + static_assert(Is64Aware, "cannot add 64-bit offset to a 32-bit builder"); + + // If you hit this assertion, you are attempting to add an 64-bit offset + // item after already serializing a 32-bit item. All 64-bit offsets have to + // added to the tail of the buffer before any 32-bit items can be added. + // Otherwise some items might not be addressable due to the maximum range of + // the 32-bit offset. + FLATBUFFERS_ASSERT(GetSize() == length_of_64_bit_region_); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const char pointer to the data to be stored as a string. + /// @param[in] len The number of bytes that should be stored from `str`. + /// @return Returns the offset in the buffer where the string starts. + void CreateStringImpl(const char *str, size_t len) { + NotNested(); + PreAlign<uoffset_t>(len + 1); // Always 0-terminated. + buf_.fill(1); + PushBytes(reinterpret_cast<const uint8_t *>(str), len); + PushElement(static_cast<uoffset_t>(len)); + } + // Allocates space for a vector of structures. // Must be completed with EndVectorOfStructs(). - template<typename T> T *StartVectorOfStructs(size_t vector_size) { - StartVector(vector_size * sizeof(T) / AlignOf<T>(), AlignOf<T>()); + template<typename T, template<typename> class OffsetT = Offset> + T *StartVectorOfStructs(size_t vector_size) { + StartVector<OffsetT>(vector_size * sizeof(T) / AlignOf<T>(), sizeof(T), + AlignOf<T>()); return reinterpret_cast<T *>(buf_.make_space(vector_size * sizeof(T))); } // End the vector of structures in the flatbuffers. // Vector should have previously be started with StartVectorOfStructs(). + template<typename T, template<typename> class OffsetT = Offset> + OffsetT<Vector<const T *>> EndVectorOfStructs(size_t vector_size) { + return OffsetT<Vector<const T *>>( + EndVector<typename Vector<const T *>::size_type, + typename OffsetT<Vector<const T *>>::offset_type>( + vector_size)); + } + template<typename T> - Offset<Vector<const T *>> EndVectorOfStructs(size_t vector_size) { - return Offset<Vector<const T *>>(EndVector(vector_size)); + typename std::enable_if<std::is_same<T, uoffset_t>::value, T>::type + CalculateOffset() { + // Default to the end of the 32-bit region. This may or may not be the end + // of the buffer, depending on if any 64-bit offsets have been added. + return GetSizeRelative32BitRegion(); + } + + // Specializations to handle the 64-bit CalculateOffset, which is relative to + // end of the buffer. + template<typename T> + typename std::enable_if<std::is_same<T, uoffset64_t>::value, T>::type + CalculateOffset() { + // This should never be compiled in when not using a 64-bit builder. + static_assert(Is64Aware, "invalid 64-bit offset in 32-bit builder"); + + // Store how big the 64-bit region of the buffer is, so we can determine + // where the 32/64 bit boundary is. + length_of_64_bit_region_ = GetSize(); + + return length_of_64_bit_region_; } }; /// @} +// Hack to `FlatBufferBuilder` mean `FlatBufferBuilder<false>` or +// `FlatBufferBuilder<>`, where the template < > syntax is required. +using FlatBufferBuilder = FlatBufferBuilderImpl<false>; +using FlatBufferBuilder64 = FlatBufferBuilderImpl<true>; + +// These are external due to GCC not allowing them in the class. +// See: https://stackoverflow.com/q/8061456/868247 +template<> +template<> +inline Offset64<String> FlatBufferBuilder64::CreateString(const char *str, + size_t len) { + CanAddOffset64(); + CreateStringImpl(str, len); + return Offset64<String>( + CalculateOffset<typename Offset64<String>::offset_type>()); +} + +// Used to distinguish from real Offsets. +template<typename T = void> struct EmptyOffset {}; + +// TODO(derekbailey): it would be nice to combine these two methods. +template<> +template<> +inline void FlatBufferBuilder64::StartVector<Offset64, uint32_t>( + size_t len, size_t elemsize, size_t alignment) { + CanAddOffset64(); + StartVector<EmptyOffset, uint32_t>(len, elemsize, alignment); +} + +template<> +template<> +inline void FlatBufferBuilder64::StartVector<Offset64, uint64_t>( + size_t len, size_t elemsize, size_t alignment) { + CanAddOffset64(); + StartVector<EmptyOffset, uint64_t>(len, elemsize, alignment); +} + /// Helpers to get a typed pointer to objects that are currently being built. /// @warning Creating new objects will lead to reallocations and invalidates /// the pointer! @@ -1200,15 +1460,6 @@ const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset<T> offset) { return GetMutableTemporaryPointer<T>(fbb, offset); } -template<typename T> -void FlatBufferBuilder::Required(Offset<T> table, voffset_t field) { - auto table_ptr = reinterpret_cast<const Table *>(buf_.data_at(table.o)); - bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; - // If this fails, the caller will show what field needs to be set. - FLATBUFFERS_ASSERT(ok); - (void)ok; -} - } // namespace flatbuffers -#endif // FLATBUFFERS_VECTOR_DOWNWARD_H_ +#endif // FLATBUFFERS_FLATBUFFER_BUILDER_H_ diff --git a/executor/_include/flatbuffers/flatbuffers.h b/executor/_include/flatbuffers/flatbuffers.h index 642178897..bc828a313 100644 --- a/executor/_include/flatbuffers/flatbuffers.h +++ b/executor/_include/flatbuffers/flatbuffers.h @@ -17,6 +17,8 @@ #ifndef FLATBUFFERS_H_ #define FLATBUFFERS_H_ +#include <algorithm> + // TODO: These includes are for mitigating the pains of users editing their // source because they relied on flatbuffers.h to include everything for them. #include "flatbuffers/array.h" @@ -74,8 +76,20 @@ inline const uint8_t *GetBufferStartFromRootPointer(const void *root) { } /// @brief This return the prefixed size of a FlatBuffer. -inline uoffset_t GetPrefixedSize(const uint8_t *buf) { - return ReadScalar<uoffset_t>(buf); +template<typename SizeT = uoffset_t> +inline SizeT GetPrefixedSize(const uint8_t *buf) { + return ReadScalar<SizeT>(buf); +} + +// Gets the total length of the buffer given a sized prefixed FlatBuffer. +// +// This includes the size of the prefix as well as the buffer: +// +// [size prefix][flatbuffer] +// |---------length--------| +template<typename SizeT = uoffset_t> +inline SizeT GetSizePrefixedBufferLength(const uint8_t *const buf) { + return ReadScalar<SizeT>(buf) + sizeof(SizeT); } // Base class for native objects (FlatBuffer data de-serialized into native diff --git a/executor/_include/flatbuffers/flatc.h b/executor/_include/flatbuffers/flatc.h index af4ccae70..e98eb80d7 100644 --- a/executor/_include/flatbuffers/flatc.h +++ b/executor/_include/flatbuffers/flatc.h @@ -19,9 +19,11 @@ #include <functional> #include <limits> +#include <list> +#include <memory> #include <string> -#include "flatbuffers/bfbs_generator.h" +#include "flatbuffers/code_generator.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/idl.h" #include "flatbuffers/util.h" @@ -31,6 +33,34 @@ namespace flatbuffers { extern void LogCompilerWarn(const std::string &warn); extern void LogCompilerError(const std::string &err); +struct FlatCOptions { + IDLOptions opts; + + std::string program_name; + + std::string output_path; + + std::vector<std::string> filenames; + + std::list<std::string> include_directories_storage; + std::vector<const char *> include_directories; + std::vector<const char *> conform_include_directories; + std::vector<bool> generator_enabled; + size_t binary_files_from = std::numeric_limits<size_t>::max(); + std::string conform_to_schema; + std::string annotate_schema; + bool annotate_include_vector_contents = true; + bool any_generator = false; + bool print_make_rules = false; + bool raw_binary = false; + bool schema_binary = false; + bool grpc_enabled = false; + bool requires_bfbs = false; + bool file_names_only = false; + + std::vector<std::shared_ptr<CodeGenerator>> generators; +}; + struct FlatCOption { std::string short_opt; std::string long_opt; @@ -40,29 +70,6 @@ struct FlatCOption { class FlatCompiler { public: - // Output generator for the various programming languages and formats we - // support. - struct Generator { - typedef bool (*GenerateFn)(const flatbuffers::Parser &parser, - const std::string &path, - const std::string &file_name); - typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser, - const std::string &path, - const std::string &file_name); - typedef bool (*ParsingCompletedFn)(const flatbuffers::Parser &parser, - const std::string &output_path); - - GenerateFn generate; - const char *lang_name; - bool schema_only; - GenerateFn generateGRPC; - flatbuffers::IDLOptions::Language lang; - FlatCOption option; - MakeRuleFn make_rule; - BfbsGenerator *bfbs_generator; - ParsingCompletedFn parsing_completed; - }; - typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn, bool show_exe_name); @@ -71,29 +78,29 @@ class FlatCompiler { // Parameters required to initialize the FlatCompiler. struct InitParams { - InitParams() - : generators(nullptr), - num_generators(0), - warn_fn(nullptr), - error_fn(nullptr) {} - - const Generator *generators; - size_t num_generators; + InitParams() : warn_fn(nullptr), error_fn(nullptr) {} + WarnFn warn_fn; ErrorFn error_fn; }; explicit FlatCompiler(const InitParams ¶ms) : params_(params) {} - int Compile(int argc, const char **argv); + bool RegisterCodeGenerator(const FlatCOption &option, + std::shared_ptr<CodeGenerator> code_generator); + + int Compile(const FlatCOptions &options); + + std::string GetShortUsageString(const std::string &program_name) const; + std::string GetUsageString(const std::string &program_name) const; - std::string GetShortUsageString(const char *program_name) const; - std::string GetUsageString(const char *program_name) const; + // Parse the FlatC options from command line arguments. + FlatCOptions ParseFromCommandLineArguments(int argc, const char **argv); private: void ParseFile(flatbuffers::Parser &parser, const std::string &filename, const std::string &contents, - std::vector<const char *> &include_directories) const; + const std::vector<const char *> &include_directories) const; void LoadBinarySchema(Parser &parser, const std::string &filename, const std::string &contents); @@ -105,8 +112,16 @@ class FlatCompiler { void AnnotateBinaries(const uint8_t *binary_schema, uint64_t binary_schema_size, - const std::string & schema_filename, - const std::vector<std::string> &binary_files); + const FlatCOptions &options); + + void ValidateOptions(const FlatCOptions &options); + + Parser GetConformParser(const FlatCOptions &options); + + std::unique_ptr<Parser> GenerateCode(const FlatCOptions &options, + Parser &conform_parser); + + std::map<std::string, std::shared_ptr<CodeGenerator>> code_generators_; InitParams params_; }; diff --git a/executor/_include/flatbuffers/flexbuffers.h b/executor/_include/flatbuffers/flexbuffers.h index 7bf84302e..8e8cac144 100644 --- a/executor/_include/flatbuffers/flexbuffers.h +++ b/executor/_include/flatbuffers/flexbuffers.h @@ -17,6 +17,7 @@ #ifndef FLATBUFFERS_FLEXBUFFERS_H_ #define FLATBUFFERS_FLEXBUFFERS_H_ +#include <algorithm> #include <map> // Used to select STL variant. #include "flatbuffers/base.h" @@ -382,10 +383,10 @@ class Reference { type_(type) {} Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) - : data_(data), parent_width_(parent_width) { - byte_width_ = 1U << static_cast<BitWidth>(packed_type & 3); - type_ = static_cast<Type>(packed_type >> 2); - } + : data_(data), + parent_width_(parent_width), + byte_width_(static_cast<uint8_t>(1 << (packed_type & 3))), + type_(static_cast<Type>(packed_type >> 2)) {} Type GetType() const { return type_; } @@ -1423,12 +1424,10 @@ class Builder FLATBUFFERS_FINAL_CLASS { template<typename T> static Type GetScalarType() { static_assert(flatbuffers::is_scalar<T>::value, "Unrelated types"); - return flatbuffers::is_floating_point<T>::value - ? FBT_FLOAT - : flatbuffers::is_same<T, bool>::value - ? FBT_BOOL - : (flatbuffers::is_unsigned<T>::value ? FBT_UINT - : FBT_INT); + return flatbuffers::is_floating_point<T>::value ? FBT_FLOAT + : flatbuffers::is_same<T, bool>::value + ? FBT_BOOL + : (flatbuffers::is_unsigned<T>::value ? FBT_UINT : FBT_INT); } public: @@ -1844,7 +1843,7 @@ class Verifier FLATBUFFERS_FINAL_CLASS { uint8_t len = 0; auto vtype = ToFixedTypedVectorElementType(r.type_, &len); if (!VerifyType(vtype)) return false; - return VerifyFromPointer(p, r.byte_width_ * len); + return VerifyFromPointer(p, static_cast<size_t>(r.byte_width_) * len); } default: return false; } diff --git a/executor/_include/flatbuffers/grpc.h b/executor/_include/flatbuffers/grpc.h index 5d15bc51c..7472c31d4 100644 --- a/executor/_include/flatbuffers/grpc.h +++ b/executor/_include/flatbuffers/grpc.h @@ -20,7 +20,6 @@ // Helper functionality to glue FlatBuffers and GRPC. #include "flatbuffers/flatbuffers.h" -#include "grpc/byte_buffer_reader.h" #include "grpcpp/support/byte_buffer.h" #include "grpcpp/support/slice.h" diff --git a/executor/_include/flatbuffers/idl.h b/executor/_include/flatbuffers/idl.h index 4cfd7ebfb..ad45d3115 100644 --- a/executor/_include/flatbuffers/idl.h +++ b/executor/_include/flatbuffers/idl.h @@ -17,6 +17,7 @@ #ifndef FLATBUFFERS_IDL_H_ #define FLATBUFFERS_IDL_H_ +#include <algorithm> #include <functional> #include <map> #include <memory> @@ -44,26 +45,27 @@ namespace flatbuffers { // of type tokens. // clang-format off #define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ - TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ - TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) /* begin scalar/int */ \ - TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool, Boolean, Bool) \ - TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8, Byte, Int8) \ - TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ - TD(SHORT, "short", int16_t, short, int16, short, int16, i16, Short, Int16) \ - TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16, UShort, UInt16) \ - TD(INT, "int", int32_t, int, int32, int, int32, i32, Int, Int32) \ - TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32, UInt, UInt32) \ - TD(LONG, "long", int64_t, long, int64, long, int64, i64, Long, Int64) \ - TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64, ULong, UInt64) /* end int */ \ - TD(FLOAT, "float", float, float, float32, float, float32, f32, Float, Float32) /* begin float */ \ - TD(DOUBLE, "double", double, double, float64, double, float64, f64, Double, Double) /* end float/scalar */ + TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8, 0) \ + TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8, 1) /* begin scalar/int */ \ + TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool, Boolean, Bool, 2) \ + TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8, Byte, Int8, 3) \ + TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8, 4) \ + TD(SHORT, "short", int16_t, short, int16, short, int16, i16, Short, Int16, 5) \ + TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16, UShort, UInt16, 6) \ + TD(INT, "int", int32_t, int, int32, int, int32, i32, Int, Int32, 7) \ + TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32, UInt, UInt32, 8) \ + TD(LONG, "long", int64_t, long, int64, long, int64, i64, Long, Int64, 9) \ + TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64, ULong, UInt64, 10) /* end int */ \ + TD(FLOAT, "float", float, float, float32, float, float32, f32, Float, Float32, 11) /* begin float */ \ + TD(DOUBLE, "double", double, double, float64, double, float64, f64, Double, Double, 12) /* end float/scalar */ #define FLATBUFFERS_GEN_TYPES_POINTER(TD) \ - TD(STRING, "string", Offset<void>, int, int, StringOffset, int, unused, Int, Offset<String>) \ - TD(VECTOR, "", Offset<void>, int, int, VectorOffset, int, unused, Int, Offset<UOffset>) \ - TD(STRUCT, "", Offset<void>, int, int, int, int, unused, Int, Offset<UOffset>) \ - TD(UNION, "", Offset<void>, int, int, int, int, unused, Int, Offset<UOffset>) + TD(STRING, "string", Offset<void>, int, int, StringOffset, int, unused, Int, Offset<String>, 13) \ + TD(VECTOR, "", Offset<void>, int, int, VectorOffset, int, unused, Int, Offset<UOffset>, 14) \ + TD(VECTOR64, "", Offset64<void>, int, int, VectorOffset, int, unused, Int, Offset<UOffset>, 18) \ + TD(STRUCT, "", Offset<void>, int, int, int, int, unused, Int, Offset<UOffset>, 15) \ + TD(UNION, "", Offset<void>, int, int, int, int, unused, Int, Offset<UOffset>, 16) #define FLATBUFFERS_GEN_TYPE_ARRAY(TD) \ - TD(ARRAY, "", int, int, int, int, int, unused, Int, Offset<UOffset>) + TD(ARRAY, "", int, int, int, int, int, unused, Int, Offset<UOffset>, 17) // The fields are: // - enum // - FlatBuffers schema type. @@ -74,13 +76,15 @@ namespace flatbuffers { // - Python type. // - Kotlin type. // - Rust type. +// - Swift type. +// - enum value (matches the reflected values) // using these macros, we can now write code dealing with types just once, e.g. /* switch (type) { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ - RTYPE, KTYPE) \ + RTYPE, KTYPE, STYPE, ...) \ case BASE_TYPE_ ## ENUM: \ // do something specific to CTYPE here FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) @@ -112,8 +116,9 @@ switch (type) { __extension__ // Stop GCC complaining about trailing comma with -Wpendantic. #endif enum BaseType { - #define FLATBUFFERS_TD(ENUM, ...) \ - BASE_TYPE_ ## ENUM, + #define FLATBUFFERS_TD(ENUM, IDLTYPE, \ + CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, RTYPE, KTYPE, STYPE, ENUM_VALUE) \ + BASE_TYPE_ ## ENUM = ENUM_VALUE, FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD }; @@ -135,6 +140,8 @@ inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } inline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_UCHAR; } +inline bool IsVector (BaseType t) { return t == BASE_TYPE_VECTOR || + t == BASE_TYPE_VECTOR64; } inline bool IsUnsigned(BaseType t) { return (t == BASE_TYPE_UTYPE) || (t == BASE_TYPE_UCHAR) || @@ -142,12 +149,40 @@ inline bool IsUnsigned(BaseType t) { (t == BASE_TYPE_ULONG); } -// clang-format on +inline size_t SizeOf(const BaseType t) { + switch (t) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ + case BASE_TYPE_##ENUM: return sizeof(CTYPE); + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD + default: FLATBUFFERS_ASSERT(0); + } + return 0; +} -extern const char *const kTypeNames[]; -extern const char kTypeSizes[]; +inline const char* TypeName(const BaseType t) { + switch (t) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, ...) \ + case BASE_TYPE_##ENUM: return IDLTYPE; + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD + default: FLATBUFFERS_ASSERT(0); + } + return nullptr; +} -inline size_t SizeOf(BaseType t) { return kTypeSizes[t]; } +inline const char* StringOf(const BaseType t) { + switch (t) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ + case BASE_TYPE_##ENUM: return #CTYPE; + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD + default: FLATBUFFERS_ASSERT(0); + } + return ""; +} + +// clang-format on struct StructDef; struct EnumDef; @@ -178,7 +213,8 @@ struct Type { bool Deserialize(const Parser &parser, const reflection::Type *type); BaseType base_type; - BaseType element; // only set if t == BASE_TYPE_VECTOR + BaseType element; // only set if t == BASE_TYPE_VECTOR or + // BASE_TYPE_VECTOR64 StructDef *struct_def; // only set if t or element == BASE_TYPE_STRUCT EnumDef *enum_def; // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE, // or for an integral type derived from an enum. @@ -294,9 +330,11 @@ struct FieldDef : public Definition { shared(false), native_inline(false), flexbuffer(false), + offset64(false), presence(kDefault), nested_flatbuffer(nullptr), - padding(0) {} + padding(0), + sibling_union_field(nullptr) {} Offset<reflection::Field> Serialize(FlatBufferBuilder *builder, uint16_t id, const Parser &parser) const; @@ -319,6 +357,7 @@ struct FieldDef : public Definition { bool native_inline; // Field will be defined inline (instead of as a pointer) // for native tables if field is a struct. bool flexbuffer; // This field contains FlexBuffer data. + bool offset64; // If the field uses 64-bit offsets. enum Presence { // Field must always be present. @@ -341,6 +380,12 @@ struct FieldDef : public Definition { StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. size_t padding; // Bytes to always pad after this field. + + // sibling_union_field is always set to nullptr. The only exception is + // when FieldDef is a union field or an union type field. Therefore, + // sibling_union_field on a union field points to the union type field + // and vice-versa. + FieldDef *sibling_union_field; }; struct StructDef : public Definition { @@ -373,6 +418,7 @@ struct StructDef : public Definition { size_t bytesize; // Size if fixed. flatbuffers::unique_ptr<std::string> original_location; + std::vector<voffset_t> reserved_ids; }; struct EnumDef; @@ -382,7 +428,14 @@ struct EnumVal { Offset<reflection::EnumVal> Serialize(FlatBufferBuilder *builder, const Parser &parser) const; - bool Deserialize(const Parser &parser, const reflection::EnumVal *val); + bool Deserialize(Parser &parser, const reflection::EnumVal *val); + + flatbuffers::Offset< + flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> + SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const; + + bool DeserializeAttributes(Parser &parser, + const Vector<Offset<reflection::KeyValue>> *attrs); uint64_t GetAsUInt64() const { return static_cast<uint64_t>(value); } int64_t GetAsInt64() const { return value; } @@ -392,6 +445,7 @@ struct EnumVal { std::string name; std::vector<std::string> doc_comment; Type union_type; + SymbolTable<Value> attributes; private: friend EnumDef; @@ -464,6 +518,10 @@ inline bool IsStruct(const Type &type) { return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed; } +inline bool IsIncompleteStruct(const Type &type) { + return type.base_type == BASE_TYPE_STRUCT && type.struct_def->predecl; +} + inline bool IsTable(const Type &type) { return type.base_type == BASE_TYPE_STRUCT && !type.struct_def->fixed; } @@ -476,15 +534,13 @@ inline bool IsUnionType(const Type &type) { return IsUnion(type) && IsInteger(type.base_type); } -inline bool IsVector(const Type &type) { - return type.base_type == BASE_TYPE_VECTOR; -} +inline bool IsVector(const Type &type) { return IsVector(type.base_type); } -inline bool IsVectorOfStruct(const Type& type) { +inline bool IsVectorOfStruct(const Type &type) { return IsVector(type) && IsStruct(type.VectorType()); } -inline bool IsVectorOfTable(const Type& type) { +inline bool IsVectorOfTable(const Type &type) { return IsVector(type) && IsTable(type.VectorType()); } @@ -528,8 +584,11 @@ inline bool operator!=(const EnumVal &lhs, const EnumVal &rhs) { inline bool EqualByName(const Type &a, const Type &b) { return a.base_type == b.base_type && a.element == b.element && (a.struct_def == b.struct_def || - a.struct_def->name == b.struct_def->name) && - (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name); + (a.struct_def != nullptr && b.struct_def != nullptr && + a.struct_def->name == b.struct_def->name)) && + (a.enum_def == b.enum_def || + (a.enum_def != nullptr && b.enum_def != nullptr && + a.enum_def->name == b.enum_def->name)); } struct RPCCall : public Definition { @@ -571,16 +630,18 @@ inline bool operator<(const IncludedFile &a, const IncludedFile &b) { struct IDLOptions { // field case style options for C++ enum CaseStyle { CaseStyle_Unchanged = 0, CaseStyle_Upper, CaseStyle_Lower }; - + enum class ProtoIdGapAction { NO_OP, WARNING, ERROR }; bool gen_jvmstatic; // Use flexbuffers instead for binary and text generation bool use_flexbuffers; bool strict_json; bool output_default_scalars_in_json; int indent_step; + bool cpp_minify_enums; bool output_enum_identifiers; bool prefixed_enums; bool scoped_enums; + bool emit_min_max_enum_values; bool swift_implementation_only; bool include_dependence_headers; bool mutable_buffer; @@ -598,6 +659,7 @@ struct IDLOptions { CaseStyle cpp_object_api_field_case_style; bool cpp_direct_copy; bool gen_nullable; + std::string java_package_prefix; bool java_checkerframework; bool gen_generated; bool gen_json_coders; @@ -613,6 +675,7 @@ struct IDLOptions { bool binary_schema_gen_embed; std::string go_import; std::string go_namespace; + std::string go_module_name; bool protobuf_ascii_alike; bool size_prefixed; std::string root_type; @@ -632,8 +695,15 @@ struct IDLOptions { bool json_nested_flatbuffers; bool json_nested_flexbuffers; bool json_nested_legacy_flatbuffers; - bool ts_flat_file; + bool ts_flat_files; + bool ts_entry_points; + bool ts_no_import_ext; bool no_leak_private_annotations; + bool require_json_eof; + bool keep_proto_id; + bool python_no_type_prefix_suffix; + bool python_typing; + ProtoIdGapAction proto_id_gap_action; // Possible options for the more general generator below. enum Language { @@ -653,6 +723,8 @@ struct IDLOptions { kRust = 1 << 14, kKotlin = 1 << 15, kSwift = 1 << 16, + kNim = 1 << 17, + kProto = 1 << 18, kMAX }; @@ -687,9 +759,11 @@ struct IDLOptions { strict_json(false), output_default_scalars_in_json(false), indent_step(2), + cpp_minify_enums(false), output_enum_identifiers(true), prefixed_enums(true), scoped_enums(false), + emit_min_max_enum_values(true), swift_implementation_only(false), include_dependence_headers(true), mutable_buffer(false), @@ -732,8 +806,15 @@ struct IDLOptions { json_nested_flatbuffers(true), json_nested_flexbuffers(true), json_nested_legacy_flatbuffers(false), - ts_flat_file(false), + ts_flat_files(false), + ts_entry_points(false), + ts_no_import_ext(false), no_leak_private_annotations(false), + require_json_eof(true), + keep_proto_id(false), + python_no_type_prefix_suffix(false), + python_typing(false), + proto_id_gap_action(ProtoIdGapAction::WARNING), mini_reflect(IDLOptions::kNone), require_explicit_ids(false), rust_serialize(false), @@ -746,7 +827,8 @@ struct IDLOptions { // This encapsulates where the parser is in the current source file. struct ParserState { ParserState() - : cursor_(nullptr), + : prev_cursor_(nullptr), + cursor_(nullptr), line_start_(nullptr), line_(0), token_(-1), @@ -754,6 +836,7 @@ struct ParserState { protected: void ResetState(const char *source) { + prev_cursor_ = source; cursor_ = source; line_ = 0; MarkNewLine(); @@ -769,6 +852,7 @@ struct ParserState { return static_cast<int64_t>(cursor_ - line_start_); } + const char *prev_cursor_; const char *cursor_; const char *line_start_; int line_; // the current line being parsed @@ -872,8 +956,22 @@ class Parser : public ParserState { known_attributes_["native_default"] = true; known_attributes_["flexbuffer"] = true; known_attributes_["private"] = true; + + // An attribute added to a field to indicate that is uses 64-bit addressing. + known_attributes_["offset64"] = true; + + // An attribute added to a vector field to indicate that it uses 64-bit + // addressing and it has a 64-bit length. + known_attributes_["vector64"] = true; } + // Copying is not allowed + Parser(const Parser &) = delete; + Parser &operator=(const Parser &) = delete; + + Parser(Parser &&) = default; + Parser &operator=(Parser &&) = default; + ~Parser() { for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) { delete *it; @@ -896,6 +994,9 @@ class Parser : public ParserState { bool ParseJson(const char *json, const char *json_filename = nullptr); + // Returns the number of characters were consumed when parsing a JSON string. + std::ptrdiff_t BytesConsumed() const; + // Set the root type. May override the one set in the schema. bool SetRootType(const char *name); @@ -972,7 +1073,7 @@ class Parser : public ParserState { FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, size_t parent_fieldn, const StructDef *parent_struct_def, - uoffset_t count, + size_t count, bool inside_vector = false); template<typename F> FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, @@ -984,7 +1085,7 @@ class Parser : public ParserState { void SerializeStruct(FlatBufferBuilder &builder, const StructDef &struct_def, const Value &val); template<typename F> - FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(uoffset_t &count, F body); + FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(size_t &count, F body); FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue, FieldDef *field, size_t fieldn); FLATBUFFERS_CHECKED_ERROR ParseArray(Value &array); @@ -1016,6 +1117,7 @@ class Parser : public ParserState { FLATBUFFERS_CHECKED_ERROR ParseService(const char *filename); FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def, bool isextend, bool inside_oneof); + FLATBUFFERS_CHECKED_ERROR ParseProtoMapField(StructDef *struct_def); FLATBUFFERS_CHECKED_ERROR ParseProtoOption(); FLATBUFFERS_CHECKED_ERROR ParseProtoKey(); FLATBUFFERS_CHECKED_ERROR ParseProtoDecl(); @@ -1048,6 +1150,8 @@ class Parser : public ParserState { bool SupportsAdvancedArrayFeatures() const; bool SupportsOptionalScalars() const; bool SupportsDefaultVectorsAndStrings() const; + bool Supports64BitOffsets() const; + bool SupportsUnionUnderlyingType() const; Namespace *UniqueNamespace(Namespace *ns); FLATBUFFERS_CHECKED_ERROR RecurseError(); @@ -1107,136 +1211,17 @@ class Parser : public ParserState { // if it is less than 0, no linefeeds will be generated either. // See idl_gen_text.cpp. // strict_json adds "quotes" around field names if true. -// If the flatbuffer cannot be encoded in JSON (e.g., it contains non-UTF-8 -// byte arrays in String values), returns false. -extern bool GenerateTextFromTable(const Parser &parser, const void *table, - const std::string &tablename, - std::string *text); -extern bool GenerateText(const Parser &parser, const void *flatbuffer, - std::string *text); -extern bool GenerateTextFile(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Json schema to string -// See idl_gen_json_schema.cpp. -extern bool GenerateJsonSchema(const Parser &parser, std::string *json); - -// Generate binary files from a given FlatBuffer, and a given Parser -// object that has been populated with the corresponding schema. -// See code_generators.cpp. -extern bool GenerateBinary(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a C++ header from the definitions in the Parser object. -// See idl_gen_cpp. -extern bool GenerateCPP(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate C# files from the definitions in the Parser object. -// See idl_gen_csharp.cpp. -extern bool GenerateCSharp(const Parser &parser, const std::string &path, - const std::string &file_name); - -extern bool GenerateDart(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Java files from the definitions in the Parser object. -// See idl_gen_java.cpp. -extern bool GenerateJava(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate JavaScript or TypeScript code from the definitions in the Parser -// object. See idl_gen_js. -extern bool GenerateTS(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Go files from the definitions in the Parser object. -// See idl_gen_go.cpp. -extern bool GenerateGo(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Php code from the definitions in the Parser object. -// See idl_gen_php. -extern bool GeneratePhp(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Python files from the definitions in the Parser object. -// See idl_gen_python.cpp. -extern bool GeneratePython(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Lobster files from the definitions in the Parser object. -// See idl_gen_lobster.cpp. -extern bool GenerateLobster(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Lua files from the definitions in the Parser object. -// See idl_gen_lua.cpp. -extern bool GenerateLua(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Rust files from the definitions in the Parser object. -// See idl_gen_rust.cpp. -extern bool GenerateRust(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Json schema file -// See idl_gen_json_schema.cpp. -extern bool GenerateJsonSchema(const Parser &parser, const std::string &path, +// These functions return nullptr on success, or an error string, +// which may happen if the flatbuffer cannot be encoded in JSON (e.g., +// it contains non-UTF-8 byte arrays in String values). +extern const char *GenTextFromTable(const Parser &parser, const void *table, + const std::string &tablename, + std::string *text); +extern const char *GenText(const Parser &parser, const void *flatbuffer, + std::string *text); +extern const char *GenTextFile(const Parser &parser, const std::string &path, const std::string &file_name); -extern bool GenerateKotlin(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate Swift classes. -// See idl_gen_swift.cpp -extern bool GenerateSwift(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a schema file from the internal representation, useful after -// parsing a .proto schema. -extern std::string GenerateFBS(const Parser &parser, - const std::string &file_name); -extern bool GenerateFBS(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for the generated TypeScript code. -// See idl_gen_ts.cpp. -extern std::string TSMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for the generated C++ header. -// See idl_gen_cpp.cpp. -extern std::string CPPMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for the generated Dart code -// see idl_gen_dart.cpp -extern std::string DartMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for the generated Rust code. -// See idl_gen_rust.cpp. -extern std::string RustMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for generated Java or C# files. -// See code_generators.cpp. -extern std::string CSharpMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); -extern std::string JavaMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - -// Generate a make rule for the generated text (JSON) files. -// See idl_gen_text.cpp. -extern std::string TextMakeRule(const Parser &parser, const std::string &path, - const std::string &file_names); - -// Generate a make rule for the generated binary files. -// See code_generators.cpp. -extern std::string BinaryMakeRule(const Parser &parser, const std::string &path, - const std::string &file_name); - // Generate GRPC Cpp interfaces. // See idl_gen_grpc.cpp. bool GenerateCppGRPC(const Parser &parser, const std::string &path, @@ -1264,9 +1249,6 @@ extern bool GenerateSwiftGRPC(const Parser &parser, const std::string &path, extern bool GenerateTSGRPC(const Parser &parser, const std::string &path, const std::string &file_name); - -extern bool GenerateRustModuleRootFile(const Parser &parser, - const std::string &path); } // namespace flatbuffers #endif // FLATBUFFERS_IDL_H_ diff --git a/executor/_include/flatbuffers/minireflect.h b/executor/_include/flatbuffers/minireflect.h index 26fd86c96..1e04bfff0 100644 --- a/executor/_include/flatbuffers/minireflect.h +++ b/executor/_include/flatbuffers/minireflect.h @@ -407,8 +407,9 @@ struct ToStringVisitor : public IterationVisitor { inline std::string FlatBufferToString(const uint8_t *buffer, const TypeTable *type_table, bool multi_line = false, - bool vector_delimited = true) { - ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, "", + bool vector_delimited = true, + const std::string &indent = "") { + ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, indent, vector_delimited); IterateFlatBuffer(buffer, type_table, &tostring_visitor); return tostring_visitor.s; diff --git a/executor/_include/flatbuffers/reflection.h b/executor/_include/flatbuffers/reflection.h index e445d792e..faf647c3b 100644 --- a/executor/_include/flatbuffers/reflection.h +++ b/executor/_include/flatbuffers/reflection.h @@ -66,6 +66,7 @@ inline size_t GetTypeSize(reflection::BaseType base_type) { 4, // Union 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds // errors. + 8, // Vector64 0 // MaxBaseType. This must be kept the last entry in this array. }; diff --git a/executor/_include/flatbuffers/reflection_generated.h b/executor/_include/flatbuffers/reflection_generated.h index 78674db5d..96e9315ac 100644 --- a/executor/_include/flatbuffers/reflection_generated.h +++ b/executor/_include/flatbuffers/reflection_generated.h @@ -8,9 +8,9 @@ // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. -static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && - FLATBUFFERS_VERSION_MINOR == 0 && - FLATBUFFERS_VERSION_REVISION == 8, +static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && + FLATBUFFERS_VERSION_MINOR == 5 && + FLATBUFFERS_VERSION_REVISION == 26, "Non-compatible flatbuffers version included"); namespace reflection { @@ -64,10 +64,11 @@ enum BaseType { Obj = 15, Union = 16, Array = 17, - MaxBaseType = 18 + Vector64 = 18, + MaxBaseType = 19 }; -inline const BaseType (&EnumValuesBaseType())[19] { +inline const BaseType (&EnumValuesBaseType())[20] { static const BaseType values[] = { None, UType, @@ -87,13 +88,14 @@ inline const BaseType (&EnumValuesBaseType())[19] { Obj, Union, Array, + Vector64, MaxBaseType }; return values; } inline const char * const *EnumNamesBaseType() { - static const char * const names[20] = { + static const char * const names[21] = { "None", "UType", "Bool", @@ -112,6 +114,7 @@ inline const char * const *EnumNamesBaseType() { "Obj", "Union", "Array", + "Vector64", "MaxBaseType", nullptr }; @@ -119,7 +122,7 @@ inline const char * const *EnumNamesBaseType() { } inline const char *EnumNameBaseType(BaseType e) { - if (flatbuffers::IsOutRange(e, None, MaxBaseType)) return ""; + if (::flatbuffers::IsOutRange(e, None, MaxBaseType)) return ""; const size_t index = static_cast<size_t>(e); return EnumNamesBaseType()[index]; } @@ -158,12 +161,12 @@ inline const char * const *EnumNamesAdvancedFeatures() { } inline const char *EnumNameAdvancedFeatures(AdvancedFeatures e) { - if (flatbuffers::IsOutRange(e, AdvancedArrayFeatures, DefaultVectorsAndStrings)) return ""; + if (::flatbuffers::IsOutRange(e, AdvancedArrayFeatures, DefaultVectorsAndStrings)) return ""; const size_t index = static_cast<size_t>(e) - static_cast<size_t>(AdvancedArrayFeatures); return EnumNamesAdvancedFeatures()[index]; } -struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Type FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef TypeBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BASE_TYPE = 4, @@ -193,7 +196,7 @@ struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { uint32_t element_size() const { return GetField<uint32_t>(VT_ELEMENT_SIZE, 0); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField<int8_t>(verifier, VT_BASE_TYPE, 1) && VerifyField<int8_t>(verifier, VT_ELEMENT, 1) && @@ -207,8 +210,8 @@ struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct TypeBuilder { typedef Type Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; void add_base_type(reflection::BaseType base_type) { fbb_.AddElement<int8_t>(Type::VT_BASE_TYPE, static_cast<int8_t>(base_type), 0); } @@ -227,19 +230,19 @@ struct TypeBuilder { void add_element_size(uint32_t element_size) { fbb_.AddElement<uint32_t>(Type::VT_ELEMENT_SIZE, element_size, 0); } - explicit TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit TypeBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Type> Finish() { + ::flatbuffers::Offset<Type> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Type>(end); + auto o = ::flatbuffers::Offset<Type>(end); return o; } }; -inline flatbuffers::Offset<Type> CreateType( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<Type> CreateType( + ::flatbuffers::FlatBufferBuilder &_fbb, reflection::BaseType base_type = reflection::None, reflection::BaseType element = reflection::None, int32_t index = -1, @@ -256,25 +259,25 @@ inline flatbuffers::Offset<Type> CreateType( return builder_.Finish(); } -struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct KeyValue FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef KeyValueBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_KEY = 4, VT_VALUE = 6 }; - const flatbuffers::String *key() const { - return GetPointer<const flatbuffers::String *>(VT_KEY); + const ::flatbuffers::String *key() const { + return GetPointer<const ::flatbuffers::String *>(VT_KEY); } - bool KeyCompareLessThan(const KeyValue *o) const { + bool KeyCompareLessThan(const KeyValue * const o) const { return *key() < *o->key(); } int KeyCompareWithValue(const char *_key) const { return strcmp(key()->c_str(), _key); } - const flatbuffers::String *value() const { - return GetPointer<const flatbuffers::String *>(VT_VALUE); + const ::flatbuffers::String *value() const { + return GetPointer<const ::flatbuffers::String *>(VT_VALUE); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_KEY) && verifier.VerifyString(key()) && @@ -286,38 +289,38 @@ struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct KeyValueBuilder { typedef KeyValue Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_key(flatbuffers::Offset<flatbuffers::String> key) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_key(::flatbuffers::Offset<::flatbuffers::String> key) { fbb_.AddOffset(KeyValue::VT_KEY, key); } - void add_value(flatbuffers::Offset<flatbuffers::String> value) { + void add_value(::flatbuffers::Offset<::flatbuffers::String> value) { fbb_.AddOffset(KeyValue::VT_VALUE, value); } - explicit KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit KeyValueBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<KeyValue> Finish() { + ::flatbuffers::Offset<KeyValue> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<KeyValue>(end); + auto o = ::flatbuffers::Offset<KeyValue>(end); fbb_.Required(o, KeyValue::VT_KEY); return o; } }; -inline flatbuffers::Offset<KeyValue> CreateKeyValue( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> key = 0, - flatbuffers::Offset<flatbuffers::String> value = 0) { +inline ::flatbuffers::Offset<KeyValue> CreateKeyValue( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> key = 0, + ::flatbuffers::Offset<::flatbuffers::String> value = 0) { KeyValueBuilder builder_(_fbb); builder_.add_value(value); builder_.add_key(key); return builder_.Finish(); } -inline flatbuffers::Offset<KeyValue> CreateKeyValueDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<KeyValue> CreateKeyValueDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *key = nullptr, const char *value = nullptr) { auto key__ = key ? _fbb.CreateString(key) : 0; @@ -328,21 +331,22 @@ inline flatbuffers::Offset<KeyValue> CreateKeyValueDirect( value__); } -struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct EnumVal FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef EnumValBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUE = 6, VT_UNION_TYPE = 10, - VT_DOCUMENTATION = 12 + VT_DOCUMENTATION = 12, + VT_ATTRIBUTES = 14 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } int64_t value() const { return GetField<int64_t>(VT_VALUE, 0); } - bool KeyCompareLessThan(const EnumVal *o) const { + bool KeyCompareLessThan(const EnumVal * const o) const { return value() < o->value(); } int KeyCompareWithValue(int64_t _value) const { @@ -351,10 +355,13 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const reflection::Type *union_type() const { return GetPointer<const reflection::Type *>(VT_UNION_TYPE); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); + } + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -364,69 +371,80 @@ struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && verifier.EndTable(); } }; struct EnumValBuilder { typedef EnumVal Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(EnumVal::VT_NAME, name); } void add_value(int64_t value) { fbb_.AddElement<int64_t>(EnumVal::VT_VALUE, value, 0); } - void add_union_type(flatbuffers::Offset<reflection::Type> union_type) { + void add_union_type(::flatbuffers::Offset<reflection::Type> union_type) { fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation); } - explicit EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { + fbb_.AddOffset(EnumVal::VT_ATTRIBUTES, attributes); + } + explicit EnumValBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<EnumVal> Finish() { + ::flatbuffers::Offset<EnumVal> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<EnumVal>(end); + auto o = ::flatbuffers::Offset<EnumVal>(end); fbb_.Required(o, EnumVal::VT_NAME); return o; } }; -inline flatbuffers::Offset<EnumVal> CreateEnumVal( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, +inline ::flatbuffers::Offset<EnumVal> CreateEnumVal( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, int64_t value = 0, - flatbuffers::Offset<reflection::Type> union_type = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0) { + ::flatbuffers::Offset<reflection::Type> union_type = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0) { EnumValBuilder builder_(_fbb); builder_.add_value(value); + builder_.add_attributes(attributes); builder_.add_documentation(documentation); builder_.add_union_type(union_type); builder_.add_name(name); return builder_.Finish(); } -inline flatbuffers::Offset<EnumVal> CreateEnumValDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<EnumVal> CreateEnumValDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, int64_t value = 0, - flatbuffers::Offset<reflection::Type> union_type = 0, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr) { + ::flatbuffers::Offset<reflection::Type> union_type = 0, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; return reflection::CreateEnumVal( _fbb, name__, value, union_type, - documentation__); + documentation__, + attributes__); } -struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Enum FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef EnumBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, @@ -437,17 +455,17 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_DOCUMENTATION = 14, VT_DECLARATION_FILE = 16 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } - bool KeyCompareLessThan(const Enum *o) const { + bool KeyCompareLessThan(const Enum * const o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::EnumVal>> *values() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::EnumVal>> *>(VT_VALUES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>> *values() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>> *>(VT_VALUES); } bool is_union() const { return GetField<uint8_t>(VT_IS_UNION, 0) != 0; @@ -455,17 +473,17 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const reflection::Type *underlying_type() const { return GetPointer<const reflection::Type *>(VT_UNDERLYING_TYPE); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *attributes() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); } /// File that this Enum is declared in. - const flatbuffers::String *declaration_file() const { - return GetPointer<const flatbuffers::String *>(VT_DECLARATION_FILE); + const ::flatbuffers::String *declaration_file() const { + return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -489,36 +507,36 @@ struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct EnumBuilder { typedef Enum Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(Enum::VT_NAME, name); } - void add_values(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::EnumVal>>> values) { + void add_values(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>>> values) { fbb_.AddOffset(Enum::VT_VALUES, values); } void add_is_union(bool is_union) { fbb_.AddElement<uint8_t>(Enum::VT_IS_UNION, static_cast<uint8_t>(is_union), 0); } - void add_underlying_type(flatbuffers::Offset<reflection::Type> underlying_type) { + void add_underlying_type(::flatbuffers::Offset<reflection::Type> underlying_type) { fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); } - void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes) { + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation); } - void add_declaration_file(flatbuffers::Offset<flatbuffers::String> declaration_file) { + void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) { fbb_.AddOffset(Enum::VT_DECLARATION_FILE, declaration_file); } - explicit EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit EnumBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Enum> Finish() { + ::flatbuffers::Offset<Enum> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Enum>(end); + auto o = ::flatbuffers::Offset<Enum>(end); fbb_.Required(o, Enum::VT_NAME); fbb_.Required(o, Enum::VT_VALUES); fbb_.Required(o, Enum::VT_UNDERLYING_TYPE); @@ -526,15 +544,15 @@ struct EnumBuilder { } }; -inline flatbuffers::Offset<Enum> CreateEnum( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::EnumVal>>> values = 0, +inline ::flatbuffers::Offset<Enum> CreateEnum( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::EnumVal>>> values = 0, bool is_union = false, - flatbuffers::Offset<reflection::Type> underlying_type = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0, - flatbuffers::Offset<flatbuffers::String> declaration_file = 0) { + ::flatbuffers::Offset<reflection::Type> underlying_type = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0, + ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) { EnumBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); @@ -546,19 +564,19 @@ inline flatbuffers::Offset<Enum> CreateEnum( return builder_.Finish(); } -inline flatbuffers::Offset<Enum> CreateEnumDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<Enum> CreateEnumDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, - std::vector<flatbuffers::Offset<reflection::EnumVal>> *values = nullptr, + std::vector<::flatbuffers::Offset<reflection::EnumVal>> *values = nullptr, bool is_union = false, - flatbuffers::Offset<reflection::Type> underlying_type = 0, - std::vector<flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr, + ::flatbuffers::Offset<reflection::Type> underlying_type = 0, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto values__ = values ? _fbb.CreateVectorOfSortedTables<reflection::EnumVal>(values) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateEnum( _fbb, @@ -571,7 +589,7 @@ inline flatbuffers::Offset<Enum> CreateEnumDirect( declaration_file__); } -struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Field FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef FieldBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, @@ -586,12 +604,13 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_ATTRIBUTES = 22, VT_DOCUMENTATION = 24, VT_OPTIONAL = 26, - VT_PADDING = 28 + VT_PADDING = 28, + VT_OFFSET64 = 30 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } - bool KeyCompareLessThan(const Field *o) const { + bool KeyCompareLessThan(const Field * const o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { @@ -621,11 +640,11 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { bool key() const { return GetField<uint8_t>(VT_KEY, 0) != 0; } - const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *attributes() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); } bool optional() const { return GetField<uint8_t>(VT_OPTIONAL, 0) != 0; @@ -634,7 +653,11 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { uint16_t padding() const { return GetField<uint16_t>(VT_PADDING, 0); } - bool Verify(flatbuffers::Verifier &verifier) const { + /// If the field uses 64-bit offsets. + bool offset64() const { + return GetField<uint8_t>(VT_OFFSET64, 0) != 0; + } + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -655,18 +678,19 @@ struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { verifier.VerifyVectorOfStrings(documentation()) && VerifyField<uint8_t>(verifier, VT_OPTIONAL, 1) && VerifyField<uint16_t>(verifier, VT_PADDING, 2) && + VerifyField<uint8_t>(verifier, VT_OFFSET64, 1) && verifier.EndTable(); } }; struct FieldBuilder { typedef Field Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(Field::VT_NAME, name); } - void add_type(flatbuffers::Offset<reflection::Type> type) { + void add_type(::flatbuffers::Offset<reflection::Type> type) { fbb_.AddOffset(Field::VT_TYPE, type); } void add_id(uint16_t id) { @@ -690,10 +714,10 @@ struct FieldBuilder { void add_key(bool key) { fbb_.AddElement<uint8_t>(Field::VT_KEY, static_cast<uint8_t>(key), 0); } - void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes) { + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation); } void add_optional(bool optional) { @@ -702,23 +726,26 @@ struct FieldBuilder { void add_padding(uint16_t padding) { fbb_.AddElement<uint16_t>(Field::VT_PADDING, padding, 0); } - explicit FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) + void add_offset64(bool offset64) { + fbb_.AddElement<uint8_t>(Field::VT_OFFSET64, static_cast<uint8_t>(offset64), 0); + } + explicit FieldBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Field> Finish() { + ::flatbuffers::Offset<Field> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Field>(end); + auto o = ::flatbuffers::Offset<Field>(end); fbb_.Required(o, Field::VT_NAME); fbb_.Required(o, Field::VT_TYPE); return o; } }; -inline flatbuffers::Offset<Field> CreateField( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, - flatbuffers::Offset<reflection::Type> type = 0, +inline ::flatbuffers::Offset<Field> CreateField( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, + ::flatbuffers::Offset<reflection::Type> type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, @@ -726,10 +753,11 @@ inline flatbuffers::Offset<Field> CreateField( bool deprecated = false, bool required = false, bool key = false, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0, bool optional = false, - uint16_t padding = 0) { + uint16_t padding = 0, + bool offset64 = false) { FieldBuilder builder_(_fbb); builder_.add_default_real(default_real); builder_.add_default_integer(default_integer); @@ -740,6 +768,7 @@ inline flatbuffers::Offset<Field> CreateField( builder_.add_padding(padding); builder_.add_offset(offset); builder_.add_id(id); + builder_.add_offset64(offset64); builder_.add_optional(optional); builder_.add_key(key); builder_.add_required(required); @@ -747,10 +776,10 @@ inline flatbuffers::Offset<Field> CreateField( return builder_.Finish(); } -inline flatbuffers::Offset<Field> CreateFieldDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<Field> CreateFieldDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, - flatbuffers::Offset<reflection::Type> type = 0, + ::flatbuffers::Offset<reflection::Type> type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, @@ -758,13 +787,14 @@ inline flatbuffers::Offset<Field> CreateFieldDirect( bool deprecated = false, bool required = false, bool key = false, - std::vector<flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr, bool optional = false, - uint16_t padding = 0) { + uint16_t padding = 0, + bool offset64 = false) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; return reflection::CreateField( _fbb, name__, @@ -779,10 +809,11 @@ inline flatbuffers::Offset<Field> CreateFieldDirect( attributes__, documentation__, optional, - padding); + padding, + offset64); } -struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Object FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef ObjectBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, @@ -794,17 +825,17 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_DOCUMENTATION = 16, VT_DECLARATION_FILE = 18 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } - bool KeyCompareLessThan(const Object *o) const { + bool KeyCompareLessThan(const Object * const o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::Field>> *fields() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::Field>> *>(VT_FIELDS); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>> *fields() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>> *>(VT_FIELDS); } bool is_struct() const { return GetField<uint8_t>(VT_IS_STRUCT, 0) != 0; @@ -815,17 +846,17 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { int32_t bytesize() const { return GetField<int32_t>(VT_BYTESIZE, 0); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *attributes() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); } /// File that this Object is declared in. - const flatbuffers::String *declaration_file() const { - return GetPointer<const flatbuffers::String *>(VT_DECLARATION_FILE); + const ::flatbuffers::String *declaration_file() const { + return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -849,12 +880,12 @@ struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct ObjectBuilder { typedef Object Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(Object::VT_NAME, name); } - void add_fields(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Field>>> fields) { + void add_fields(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>>> fields) { fbb_.AddOffset(Object::VT_FIELDS, fields); } void add_is_struct(bool is_struct) { @@ -866,38 +897,38 @@ struct ObjectBuilder { void add_bytesize(int32_t bytesize) { fbb_.AddElement<int32_t>(Object::VT_BYTESIZE, bytesize, 0); } - void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes) { + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation); } - void add_declaration_file(flatbuffers::Offset<flatbuffers::String> declaration_file) { + void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) { fbb_.AddOffset(Object::VT_DECLARATION_FILE, declaration_file); } - explicit ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit ObjectBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Object> Finish() { + ::flatbuffers::Offset<Object> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Object>(end); + auto o = ::flatbuffers::Offset<Object>(end); fbb_.Required(o, Object::VT_NAME); fbb_.Required(o, Object::VT_FIELDS); return o; } }; -inline flatbuffers::Offset<Object> CreateObject( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Field>>> fields = 0, +inline ::flatbuffers::Offset<Object> CreateObject( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Field>>> fields = 0, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0, - flatbuffers::Offset<flatbuffers::String> declaration_file = 0) { + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0, + ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) { ObjectBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); @@ -910,20 +941,20 @@ inline flatbuffers::Offset<Object> CreateObject( return builder_.Finish(); } -inline flatbuffers::Offset<Object> CreateObjectDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<Object> CreateObjectDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, - std::vector<flatbuffers::Offset<reflection::Field>> *fields = nullptr, + std::vector<::flatbuffers::Offset<reflection::Field>> *fields = nullptr, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, - std::vector<flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto fields__ = fields ? _fbb.CreateVectorOfSortedTables<reflection::Field>(fields) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateObject( _fbb, @@ -937,7 +968,7 @@ inline flatbuffers::Offset<Object> CreateObjectDirect( declaration_file__); } -struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct RPCCall FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef RPCCallBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, @@ -946,10 +977,10 @@ struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_ATTRIBUTES = 10, VT_DOCUMENTATION = 12 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } - bool KeyCompareLessThan(const RPCCall *o) const { + bool KeyCompareLessThan(const RPCCall * const o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { @@ -961,13 +992,13 @@ struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const reflection::Object *response() const { return GetPointer<const reflection::Object *>(VT_RESPONSE); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *attributes() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -987,30 +1018,30 @@ struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct RPCCallBuilder { typedef RPCCall Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(RPCCall::VT_NAME, name); } - void add_request(flatbuffers::Offset<reflection::Object> request) { + void add_request(::flatbuffers::Offset<reflection::Object> request) { fbb_.AddOffset(RPCCall::VT_REQUEST, request); } - void add_response(flatbuffers::Offset<reflection::Object> response) { + void add_response(::flatbuffers::Offset<reflection::Object> response) { fbb_.AddOffset(RPCCall::VT_RESPONSE, response); } - void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes) { + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation); } - explicit RPCCallBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit RPCCallBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<RPCCall> Finish() { + ::flatbuffers::Offset<RPCCall> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<RPCCall>(end); + auto o = ::flatbuffers::Offset<RPCCall>(end); fbb_.Required(o, RPCCall::VT_NAME); fbb_.Required(o, RPCCall::VT_REQUEST); fbb_.Required(o, RPCCall::VT_RESPONSE); @@ -1018,13 +1049,13 @@ struct RPCCallBuilder { } }; -inline flatbuffers::Offset<RPCCall> CreateRPCCall( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, - flatbuffers::Offset<reflection::Object> request = 0, - flatbuffers::Offset<reflection::Object> response = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0) { +inline ::flatbuffers::Offset<RPCCall> CreateRPCCall( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, + ::flatbuffers::Offset<reflection::Object> request = 0, + ::flatbuffers::Offset<reflection::Object> response = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0) { RPCCallBuilder builder_(_fbb); builder_.add_documentation(documentation); builder_.add_attributes(attributes); @@ -1034,16 +1065,16 @@ inline flatbuffers::Offset<RPCCall> CreateRPCCall( return builder_.Finish(); } -inline flatbuffers::Offset<RPCCall> CreateRPCCallDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<RPCCall> CreateRPCCallDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, - flatbuffers::Offset<reflection::Object> request = 0, - flatbuffers::Offset<reflection::Object> response = 0, - std::vector<flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr) { + ::flatbuffers::Offset<reflection::Object> request = 0, + ::flatbuffers::Offset<reflection::Object> response = 0, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; return reflection::CreateRPCCall( _fbb, name__, @@ -1053,7 +1084,7 @@ inline flatbuffers::Offset<RPCCall> CreateRPCCallDirect( documentation__); } -struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Service FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef ServiceBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, @@ -1062,29 +1093,29 @@ struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_DOCUMENTATION = 10, VT_DECLARATION_FILE = 12 }; - const flatbuffers::String *name() const { - return GetPointer<const flatbuffers::String *>(VT_NAME); + const ::flatbuffers::String *name() const { + return GetPointer<const ::flatbuffers::String *>(VT_NAME); } - bool KeyCompareLessThan(const Service *o) const { + bool KeyCompareLessThan(const Service * const o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::RPCCall>> *calls() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::RPCCall>> *>(VT_CALLS); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>> *calls() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>> *>(VT_CALLS); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *attributes() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>> *>(VT_ATTRIBUTES); } - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *documentation() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_DOCUMENTATION); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_DOCUMENTATION); } /// File that this Service is declared in. - const flatbuffers::String *declaration_file() const { - return GetPointer<const flatbuffers::String *>(VT_DECLARATION_FILE); + const ::flatbuffers::String *declaration_file() const { + return GetPointer<const ::flatbuffers::String *>(VT_DECLARATION_FILE); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && @@ -1105,42 +1136,42 @@ struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct ServiceBuilder { typedef Service Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset<flatbuffers::String> name) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_name(::flatbuffers::Offset<::flatbuffers::String> name) { fbb_.AddOffset(Service::VT_NAME, name); } - void add_calls(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::RPCCall>>> calls) { + void add_calls(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>>> calls) { fbb_.AddOffset(Service::VT_CALLS, calls); } - void add_attributes(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes) { + void add_attributes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes) { fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes); } - void add_documentation(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation) { + void add_documentation(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation) { fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation); } - void add_declaration_file(flatbuffers::Offset<flatbuffers::String> declaration_file) { + void add_declaration_file(::flatbuffers::Offset<::flatbuffers::String> declaration_file) { fbb_.AddOffset(Service::VT_DECLARATION_FILE, declaration_file); } - explicit ServiceBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit ServiceBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Service> Finish() { + ::flatbuffers::Offset<Service> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Service>(end); + auto o = ::flatbuffers::Offset<Service>(end); fbb_.Required(o, Service::VT_NAME); return o; } }; -inline flatbuffers::Offset<Service> CreateService( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> name = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::RPCCall>>> calls = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> documentation = 0, - flatbuffers::Offset<flatbuffers::String> declaration_file = 0) { +inline ::flatbuffers::Offset<Service> CreateService( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> name = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::RPCCall>>> calls = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::KeyValue>>> attributes = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> documentation = 0, + ::flatbuffers::Offset<::flatbuffers::String> declaration_file = 0) { ServiceBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); @@ -1150,17 +1181,17 @@ inline flatbuffers::Offset<Service> CreateService( return builder_.Finish(); } -inline flatbuffers::Offset<Service> CreateServiceDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<Service> CreateServiceDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, - std::vector<flatbuffers::Offset<reflection::RPCCall>> *calls = nullptr, - std::vector<flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *documentation = nullptr, + std::vector<::flatbuffers::Offset<reflection::RPCCall>> *calls = nullptr, + std::vector<::flatbuffers::Offset<reflection::KeyValue>> *attributes = nullptr, + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto calls__ = calls ? _fbb.CreateVectorOfSortedTables<reflection::RPCCall>(calls) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables<reflection::KeyValue>(attributes) : 0; - auto documentation__ = documentation ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*documentation) : 0; + auto documentation__ = documentation ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateService( _fbb, @@ -1174,27 +1205,27 @@ inline flatbuffers::Offset<Service> CreateServiceDirect( /// File specific information. /// Symbols declared within a file may be recovered by iterating over all /// symbols and examining the `declaration_file` field. -struct SchemaFile FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct SchemaFile FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef SchemaFileBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_FILENAME = 4, VT_INCLUDED_FILENAMES = 6 }; /// Filename, relative to project root. - const flatbuffers::String *filename() const { - return GetPointer<const flatbuffers::String *>(VT_FILENAME); + const ::flatbuffers::String *filename() const { + return GetPointer<const ::flatbuffers::String *>(VT_FILENAME); } - bool KeyCompareLessThan(const SchemaFile *o) const { + bool KeyCompareLessThan(const SchemaFile * const o) const { return *filename() < *o->filename(); } int KeyCompareWithValue(const char *_filename) const { return strcmp(filename()->c_str(), _filename); } /// Names of included files, relative to project root. - const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *included_filenames() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_INCLUDED_FILENAMES); + const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *included_filenames() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>> *>(VT_INCLUDED_FILENAMES); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_FILENAME) && verifier.VerifyString(filename()) && @@ -1207,49 +1238,49 @@ struct SchemaFile FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct SchemaFileBuilder { typedef SchemaFile Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_filename(flatbuffers::Offset<flatbuffers::String> filename) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_filename(::flatbuffers::Offset<::flatbuffers::String> filename) { fbb_.AddOffset(SchemaFile::VT_FILENAME, filename); } - void add_included_filenames(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> included_filenames) { + void add_included_filenames(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> included_filenames) { fbb_.AddOffset(SchemaFile::VT_INCLUDED_FILENAMES, included_filenames); } - explicit SchemaFileBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit SchemaFileBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<SchemaFile> Finish() { + ::flatbuffers::Offset<SchemaFile> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<SchemaFile>(end); + auto o = ::flatbuffers::Offset<SchemaFile>(end); fbb_.Required(o, SchemaFile::VT_FILENAME); return o; } }; -inline flatbuffers::Offset<SchemaFile> CreateSchemaFile( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::String> filename = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> included_filenames = 0) { +inline ::flatbuffers::Offset<SchemaFile> CreateSchemaFile( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> filename = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> included_filenames = 0) { SchemaFileBuilder builder_(_fbb); builder_.add_included_filenames(included_filenames); builder_.add_filename(filename); return builder_.Finish(); } -inline flatbuffers::Offset<SchemaFile> CreateSchemaFileDirect( - flatbuffers::FlatBufferBuilder &_fbb, +inline ::flatbuffers::Offset<SchemaFile> CreateSchemaFileDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, const char *filename = nullptr, - const std::vector<flatbuffers::Offset<flatbuffers::String>> *included_filenames = nullptr) { + const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *included_filenames = nullptr) { auto filename__ = filename ? _fbb.CreateString(filename) : 0; - auto included_filenames__ = included_filenames ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*included_filenames) : 0; + auto included_filenames__ = included_filenames ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*included_filenames) : 0; return reflection::CreateSchemaFile( _fbb, filename__, included_filenames__); } -struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { +struct Schema FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef SchemaBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_OBJECTS = 4, @@ -1261,33 +1292,33 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_ADVANCED_FEATURES = 16, VT_FBS_FILES = 18 }; - const flatbuffers::Vector<flatbuffers::Offset<reflection::Object>> *objects() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::Object>> *>(VT_OBJECTS); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>> *objects() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>> *>(VT_OBJECTS); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::Enum>> *enums() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::Enum>> *>(VT_ENUMS); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>> *enums() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>> *>(VT_ENUMS); } - const flatbuffers::String *file_ident() const { - return GetPointer<const flatbuffers::String *>(VT_FILE_IDENT); + const ::flatbuffers::String *file_ident() const { + return GetPointer<const ::flatbuffers::String *>(VT_FILE_IDENT); } - const flatbuffers::String *file_ext() const { - return GetPointer<const flatbuffers::String *>(VT_FILE_EXT); + const ::flatbuffers::String *file_ext() const { + return GetPointer<const ::flatbuffers::String *>(VT_FILE_EXT); } const reflection::Object *root_table() const { return GetPointer<const reflection::Object *>(VT_ROOT_TABLE); } - const flatbuffers::Vector<flatbuffers::Offset<reflection::Service>> *services() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::Service>> *>(VT_SERVICES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>> *services() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>> *>(VT_SERVICES); } reflection::AdvancedFeatures advanced_features() const { return static_cast<reflection::AdvancedFeatures>(GetField<uint64_t>(VT_ADVANCED_FEATURES, 0)); } /// All the files used in this compilation. Files are relative to where /// flatc was invoked. - const flatbuffers::Vector<flatbuffers::Offset<reflection::SchemaFile>> *fbs_files() const { - return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<reflection::SchemaFile>> *>(VT_FBS_FILES); + const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *fbs_files() const { + return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>> *>(VT_FBS_FILES); } - bool Verify(flatbuffers::Verifier &verifier) const { + bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_OBJECTS) && verifier.VerifyVector(objects()) && @@ -1314,55 +1345,55 @@ struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { struct SchemaBuilder { typedef Schema Table; - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_objects(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Object>>> objects) { + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_objects(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>>> objects) { fbb_.AddOffset(Schema::VT_OBJECTS, objects); } - void add_enums(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Enum>>> enums) { + void add_enums(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>>> enums) { fbb_.AddOffset(Schema::VT_ENUMS, enums); } - void add_file_ident(flatbuffers::Offset<flatbuffers::String> file_ident) { + void add_file_ident(::flatbuffers::Offset<::flatbuffers::String> file_ident) { fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); } - void add_file_ext(flatbuffers::Offset<flatbuffers::String> file_ext) { + void add_file_ext(::flatbuffers::Offset<::flatbuffers::String> file_ext) { fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); } - void add_root_table(flatbuffers::Offset<reflection::Object> root_table) { + void add_root_table(::flatbuffers::Offset<reflection::Object> root_table) { fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); } - void add_services(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Service>>> services) { + void add_services(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>>> services) { fbb_.AddOffset(Schema::VT_SERVICES, services); } void add_advanced_features(reflection::AdvancedFeatures advanced_features) { fbb_.AddElement<uint64_t>(Schema::VT_ADVANCED_FEATURES, static_cast<uint64_t>(advanced_features), 0); } - void add_fbs_files(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::SchemaFile>>> fbs_files) { + void add_fbs_files(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>>> fbs_files) { fbb_.AddOffset(Schema::VT_FBS_FILES, fbs_files); } - explicit SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) + explicit SchemaBuilder(::flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } - flatbuffers::Offset<Schema> Finish() { + ::flatbuffers::Offset<Schema> Finish() { const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset<Schema>(end); + auto o = ::flatbuffers::Offset<Schema>(end); fbb_.Required(o, Schema::VT_OBJECTS); fbb_.Required(o, Schema::VT_ENUMS); return o; } }; -inline flatbuffers::Offset<Schema> CreateSchema( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Object>>> objects = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Enum>>> enums = 0, - flatbuffers::Offset<flatbuffers::String> file_ident = 0, - flatbuffers::Offset<flatbuffers::String> file_ext = 0, - flatbuffers::Offset<reflection::Object> root_table = 0, - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::Service>>> services = 0, +inline ::flatbuffers::Offset<Schema> CreateSchema( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Object>>> objects = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Enum>>> enums = 0, + ::flatbuffers::Offset<::flatbuffers::String> file_ident = 0, + ::flatbuffers::Offset<::flatbuffers::String> file_ext = 0, + ::flatbuffers::Offset<reflection::Object> root_table = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::Service>>> services = 0, reflection::AdvancedFeatures advanced_features = static_cast<reflection::AdvancedFeatures>(0), - flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<reflection::SchemaFile>>> fbs_files = 0) { + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<reflection::SchemaFile>>> fbs_files = 0) { SchemaBuilder builder_(_fbb); builder_.add_advanced_features(advanced_features); builder_.add_fbs_files(fbs_files); @@ -1375,16 +1406,16 @@ inline flatbuffers::Offset<Schema> CreateSchema( return builder_.Finish(); } -inline flatbuffers::Offset<Schema> CreateSchemaDirect( - flatbuffers::FlatBufferBuilder &_fbb, - std::vector<flatbuffers::Offset<reflection::Object>> *objects = nullptr, - std::vector<flatbuffers::Offset<reflection::Enum>> *enums = nullptr, +inline ::flatbuffers::Offset<Schema> CreateSchemaDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + std::vector<::flatbuffers::Offset<reflection::Object>> *objects = nullptr, + std::vector<::flatbuffers::Offset<reflection::Enum>> *enums = nullptr, const char *file_ident = nullptr, const char *file_ext = nullptr, - flatbuffers::Offset<reflection::Object> root_table = 0, - std::vector<flatbuffers::Offset<reflection::Service>> *services = nullptr, + ::flatbuffers::Offset<reflection::Object> root_table = 0, + std::vector<::flatbuffers::Offset<reflection::Service>> *services = nullptr, reflection::AdvancedFeatures advanced_features = static_cast<reflection::AdvancedFeatures>(0), - std::vector<flatbuffers::Offset<reflection::SchemaFile>> *fbs_files = nullptr) { + std::vector<::flatbuffers::Offset<reflection::SchemaFile>> *fbs_files = nullptr) { auto objects__ = objects ? _fbb.CreateVectorOfSortedTables<reflection::Object>(objects) : 0; auto enums__ = enums ? _fbb.CreateVectorOfSortedTables<reflection::Enum>(enums) : 0; auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0; @@ -1404,11 +1435,11 @@ inline flatbuffers::Offset<Schema> CreateSchemaDirect( } inline const reflection::Schema *GetSchema(const void *buf) { - return flatbuffers::GetRoot<reflection::Schema>(buf); + return ::flatbuffers::GetRoot<reflection::Schema>(buf); } inline const reflection::Schema *GetSizePrefixedSchema(const void *buf) { - return flatbuffers::GetSizePrefixedRoot<reflection::Schema>(buf); + return ::flatbuffers::GetSizePrefixedRoot<reflection::Schema>(buf); } inline const char *SchemaIdentifier() { @@ -1416,22 +1447,22 @@ inline const char *SchemaIdentifier() { } inline bool SchemaBufferHasIdentifier(const void *buf) { - return flatbuffers::BufferHasIdentifier( + return ::flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier()); } inline bool SizePrefixedSchemaBufferHasIdentifier(const void *buf) { - return flatbuffers::BufferHasIdentifier( + return ::flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier(), true); } inline bool VerifySchemaBuffer( - flatbuffers::Verifier &verifier) { + ::flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer<reflection::Schema>(SchemaIdentifier()); } inline bool VerifySizePrefixedSchemaBuffer( - flatbuffers::Verifier &verifier) { + ::flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer<reflection::Schema>(SchemaIdentifier()); } @@ -1440,14 +1471,14 @@ inline const char *SchemaExtension() { } inline void FinishSchemaBuffer( - flatbuffers::FlatBufferBuilder &fbb, - flatbuffers::Offset<reflection::Schema> root) { + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset<reflection::Schema> root) { fbb.Finish(root, SchemaIdentifier()); } inline void FinishSizePrefixedSchemaBuffer( - flatbuffers::FlatBufferBuilder &fbb, - flatbuffers::Offset<reflection::Schema> root) { + ::flatbuffers::FlatBufferBuilder &fbb, + ::flatbuffers::Offset<reflection::Schema> root) { fbb.FinishSizePrefixed(root, SchemaIdentifier()); } diff --git a/executor/_include/flatbuffers/registry.h b/executor/_include/flatbuffers/registry.h index e8bb8f5e3..f59aa647d 100644 --- a/executor/_include/flatbuffers/registry.h +++ b/executor/_include/flatbuffers/registry.h @@ -52,8 +52,10 @@ class Registry { Parser parser; if (!LoadSchema(ident, &parser)) return false; // Now we're ready to generate text. - if (!GenerateText(parser, flatbuf, dest)) { - lasterror_ = "unable to generate text for FlatBuffer binary"; + auto err = GenText(parser, flatbuf, dest); + if (err) { + lasterror_ = + "unable to generate text for FlatBuffer binary: " + std::string(err); return false; } return true; diff --git a/executor/_include/flatbuffers/stl_emulation.h b/executor/_include/flatbuffers/stl_emulation.h index 452ddb832..fd3a8cda7 100644 --- a/executor/_include/flatbuffers/stl_emulation.h +++ b/executor/_include/flatbuffers/stl_emulation.h @@ -41,15 +41,18 @@ #include <optional> #endif -// The __cpp_lib_span is the predefined feature macro. -#if defined(FLATBUFFERS_USE_STD_SPAN) - #include <span> -#elif defined(__cpp_lib_span) && defined(__has_include) - #if __has_include(<span>) - #include <array> - #include <span> - #define FLATBUFFERS_USE_STD_SPAN +#ifndef FLATBUFFERS_USE_STD_SPAN + // Testing __cpp_lib_span requires including either <version> or <span>, + // both of which were added in C++20. + // See: https://en.cppreference.com/w/cpp/utility/feature_test + #if defined(__cplusplus) && __cplusplus >= 202002L + #define FLATBUFFERS_USE_STD_SPAN 1 #endif +#endif // FLATBUFFERS_USE_STD_SPAN + +#if defined(FLATBUFFERS_USE_STD_SPAN) + #include <array> + #include <span> #else // Disable non-trivial ctors if FLATBUFFERS_SPAN_MINIMAL defined. #if !defined(FLATBUFFERS_TEMPLATES_ALIASES) diff --git a/executor/_include/flatbuffers/string.h b/executor/_include/flatbuffers/string.h index 3db95fce1..97e399fd6 100644 --- a/executor/_include/flatbuffers/string.h +++ b/executor/_include/flatbuffers/string.h @@ -61,4 +61,4 @@ static inline flatbuffers::string_view GetStringView(const String *str) { } // namespace flatbuffers -#endif // FLATBUFFERS_STRING_H_
\ No newline at end of file +#endif // FLATBUFFERS_STRING_H_ diff --git a/executor/_include/flatbuffers/struct.h b/executor/_include/flatbuffers/struct.h index d8753c84f..abacc8a9a 100644 --- a/executor/_include/flatbuffers/struct.h +++ b/executor/_include/flatbuffers/struct.h @@ -50,4 +50,4 @@ class Struct FLATBUFFERS_FINAL_CLASS { } // namespace flatbuffers -#endif // FLATBUFFERS_STRUCT_H_
\ No newline at end of file +#endif // FLATBUFFERS_STRUCT_H_ diff --git a/executor/_include/flatbuffers/table.h b/executor/_include/flatbuffers/table.h index 11b292476..e92d8ae8e 100644 --- a/executor/_include/flatbuffers/table.h +++ b/executor/_include/flatbuffers/table.h @@ -47,14 +47,24 @@ class Table { return field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval; } - template<typename P> P GetPointer(voffset_t field) { + template<typename P, typename OffsetSize = uoffset_t> + P GetPointer(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; - return field_offset ? reinterpret_cast<P>(p + ReadScalar<uoffset_t>(p)) + return field_offset ? reinterpret_cast<P>(p + ReadScalar<OffsetSize>(p)) : nullptr; } - template<typename P> P GetPointer(voffset_t field) const { - return const_cast<Table *>(this)->GetPointer<P>(field); + template<typename P, typename OffsetSize = uoffset_t> + P GetPointer(voffset_t field) const { + return const_cast<Table *>(this)->GetPointer<P, OffsetSize>(field); + } + + template<typename P> P GetPointer64(voffset_t field) { + return GetPointer<P, uoffset64_t>(field); + } + + template<typename P> P GetPointer64(voffset_t field) const { + return GetPointer<P, uoffset64_t>(field); } template<typename P> P GetStruct(voffset_t field) const { @@ -131,15 +141,25 @@ class Table { } // Versions for offsets. + template<typename OffsetT = uoffset_t> bool VerifyOffset(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); - return !field_offset || verifier.VerifyOffset(data_, field_offset); + return !field_offset || verifier.VerifyOffset<OffsetT>(data_, field_offset); } + template<typename OffsetT = uoffset_t> bool VerifyOffsetRequired(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); return verifier.Check(field_offset != 0) && - verifier.VerifyOffset(data_, field_offset); + verifier.VerifyOffset<OffsetT>(data_, field_offset); + } + + bool VerifyOffset64(const Verifier &verifier, voffset_t field) const { + return VerifyOffset<uoffset64_t>(verifier, field); + } + + bool VerifyOffset64Required(const Verifier &verifier, voffset_t field) const { + return VerifyOffsetRequired<uoffset64_t>(verifier, field); } private: diff --git a/executor/_include/flatbuffers/util.h b/executor/_include/flatbuffers/util.h index dcc5065f9..1ccf3517d 100644 --- a/executor/_include/flatbuffers/util.h +++ b/executor/_include/flatbuffers/util.h @@ -31,6 +31,8 @@ # include <stdio.h> #endif // FLATBUFFERS_PREFER_PRINTF +#include <cmath> +#include <limits> #include <string> namespace flatbuffers { @@ -255,7 +257,7 @@ inline void strtoval_impl(double *val, const char *str, char **endptr) { } // UBSAN: double to float is safe if numeric_limits<float>::is_iec559 is true. -__suppress_ubsan__("float-cast-overflow") +FLATBUFFERS_SUPPRESS_UBSAN("float-cast-overflow") inline void strtoval_impl(float *val, const char *str, char **endptr) { *val = __strtof_impl(str, endptr); } @@ -312,6 +314,7 @@ inline bool StringToFloatImpl(T *val, const char *const str) { strtoval_impl(val, str, const_cast<char **>(&end)); auto done = (end != str) && (*end == '\0'); if (!done) *val = 0; // erase partial result + if (done && std::isnan(*val)) { *val = std::numeric_limits<T>::quiet_NaN(); } return done; } @@ -392,6 +395,18 @@ inline uint64_t StringToUInt(const char *s, int base = 10) { return StringToIntegerImpl(&val, s, base) ? val : 0; } +inline bool StringIsFlatbufferNan(const std::string &s) { + return s == "nan" || s == "+nan" || s == "-nan"; +} + +inline bool StringIsFlatbufferPositiveInfinity(const std::string &s) { + return s == "inf" || s == "+inf" || s == "infinity" || s == "+infinity"; +} + +inline bool StringIsFlatbufferNegativeInfinity(const std::string &s) { + return s == "-inf" || s == "-infinity"; +} + typedef bool (*LoadFileFunction)(const char *filename, bool binary, std::string *dest); typedef bool (*FileExistsFunction)(const char *filename); @@ -608,7 +623,7 @@ inline bool EscapeString(const char *s, size_t length, std::string *_text, // we previously checked for non-UTF-8, so we shouldn't reach // here. // - // 2) We reached here by someone calling GenerateText() + // 2) We reached here by someone calling GenText() // on a previously-serialized flatbuffer. The data might have // non-UTF-8 Strings, or might be corrupt. // @@ -685,9 +700,6 @@ bool SetGlobalTestLocale(const char *locale_name, bool ReadEnvironmentVariable(const char *var_name, std::string *_value = nullptr); -// MSVC specific: Send all assert reports to STDOUT to prevent CI hangs. -void SetupDefaultCRTReportMode(); - enum class Case { kUnknown = 0, // TheQuickBrownFox @@ -710,9 +722,10 @@ enum class Case { kSnake2 = 9, }; -// Convert the `input` string of case `input_case` to the specified `output_case`. +// Convert the `input` string of case `input_case` to the specified +// `output_case`. std::string ConvertCase(const std::string &input, Case output_case, - Case input_case = Case::kSnake); + Case input_case = Case::kSnake); } // namespace flatbuffers diff --git a/executor/_include/flatbuffers/vector.h b/executor/_include/flatbuffers/vector.h index 6bcdfe263..ae52b9382 100644 --- a/executor/_include/flatbuffers/vector.h +++ b/executor/_include/flatbuffers/vector.h @@ -27,15 +27,18 @@ struct String; // An STL compatible iterator implementation for Vector below, effectively // calling Get() for every element. -template<typename T, typename IT> struct VectorIterator { +template<typename T, typename IT, typename Data = uint8_t *, + typename SizeT = uoffset_t> +struct VectorIterator { typedef std::random_access_iterator_tag iterator_category; typedef IT value_type; typedef ptrdiff_t difference_type; typedef IT *pointer; typedef IT &reference; - VectorIterator(const uint8_t *data, uoffset_t i) - : data_(data + IndirectHelper<T>::element_stride * i) {} + static const SizeT element_stride = IndirectHelper<T>::element_stride; + + VectorIterator(Data data, SizeT i) : data_(data + element_stride * i) {} VectorIterator(const VectorIterator &other) : data_(other.data_) {} VectorIterator() : data_(nullptr) {} @@ -62,7 +65,7 @@ template<typename T, typename IT> struct VectorIterator { } difference_type operator-(const VectorIterator &other) const { - return (data_ - other.data_) / IndirectHelper<T>::element_stride; + return (data_ - other.data_) / element_stride; } // Note: return type is incompatible with the standard @@ -74,51 +77,52 @@ template<typename T, typename IT> struct VectorIterator { IT operator->() const { return IndirectHelper<T>::Read(data_, 0); } VectorIterator &operator++() { - data_ += IndirectHelper<T>::element_stride; + data_ += element_stride; return *this; } VectorIterator operator++(int) { VectorIterator temp(data_, 0); - data_ += IndirectHelper<T>::element_stride; + data_ += element_stride; return temp; } - VectorIterator operator+(const uoffset_t &offset) const { - return VectorIterator(data_ + offset * IndirectHelper<T>::element_stride, - 0); + VectorIterator operator+(const SizeT &offset) const { + return VectorIterator(data_ + offset * element_stride, 0); } - VectorIterator &operator+=(const uoffset_t &offset) { - data_ += offset * IndirectHelper<T>::element_stride; + VectorIterator &operator+=(const SizeT &offset) { + data_ += offset * element_stride; return *this; } VectorIterator &operator--() { - data_ -= IndirectHelper<T>::element_stride; + data_ -= element_stride; return *this; } VectorIterator operator--(int) { VectorIterator temp(data_, 0); - data_ -= IndirectHelper<T>::element_stride; + data_ -= element_stride; return temp; } - VectorIterator operator-(const uoffset_t &offset) const { - return VectorIterator(data_ - offset * IndirectHelper<T>::element_stride, - 0); + VectorIterator operator-(const SizeT &offset) const { + return VectorIterator(data_ - offset * element_stride, 0); } - VectorIterator &operator-=(const uoffset_t &offset) { - data_ -= offset * IndirectHelper<T>::element_stride; + VectorIterator &operator-=(const SizeT &offset) { + data_ -= offset * element_stride; return *this; } private: - const uint8_t *data_; + Data data_; }; +template<typename T, typename IT, typename SizeT = uoffset_t> +using VectorConstIterator = VectorIterator<T, IT, const uint8_t *, SizeT>; + template<typename Iterator> struct VectorReverseIterator : public std::reverse_iterator<Iterator> { explicit VectorReverseIterator(Iterator iter) @@ -141,11 +145,12 @@ struct VectorReverseIterator : public std::reverse_iterator<Iterator> { // This is used as a helper type for accessing vectors. // Vector::data() assumes the vector elements start after the length field. -template<typename T> class Vector { +template<typename T, typename SizeT = uoffset_t> class Vector { public: - typedef VectorIterator<T, typename IndirectHelper<T>::mutable_return_type> + typedef VectorIterator<T, typename IndirectHelper<T>::mutable_return_type, + uint8_t *, SizeT> iterator; - typedef VectorIterator<T, typename IndirectHelper<T>::return_type> + typedef VectorConstIterator<T, typename IndirectHelper<T>::return_type, SizeT> const_iterator; typedef VectorReverseIterator<iterator> reverse_iterator; typedef VectorReverseIterator<const_iterator> const_reverse_iterator; @@ -156,39 +161,40 @@ template<typename T> class Vector { static FLATBUFFERS_CONSTEXPR bool is_span_observable = scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1); - uoffset_t size() const { return EndianScalar(length_); } + SizeT size() const { return EndianScalar(length_); } // Deprecated: use size(). Here for backwards compatibility. FLATBUFFERS_ATTRIBUTE([[deprecated("use size() instead")]]) - uoffset_t Length() const { return size(); } + SizeT Length() const { return size(); } + typedef SizeT size_type; typedef typename IndirectHelper<T>::return_type return_type; typedef typename IndirectHelper<T>::mutable_return_type mutable_return_type; typedef return_type value_type; - return_type Get(uoffset_t i) const { + return_type Get(SizeT i) const { FLATBUFFERS_ASSERT(i < size()); return IndirectHelper<T>::Read(Data(), i); } - return_type operator[](uoffset_t i) const { return Get(i); } + return_type operator[](SizeT i) const { return Get(i); } // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. - template<typename E> E GetEnum(uoffset_t i) const { + template<typename E> E GetEnum(SizeT i) const { return static_cast<E>(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is the right type! - template<typename U> const U *GetAs(uoffset_t i) const { + template<typename U> const U *GetAs(SizeT i) const { return reinterpret_cast<const U *>(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is actually a string! - const String *GetAsString(uoffset_t i) const { + const String *GetAsString(SizeT i) const { return reinterpret_cast<const String *>(Get(i)); } @@ -222,7 +228,7 @@ template<typename T> class Vector { // Change elements if you have a non-const pointer to this object. // Scalars only. See reflection.h, and the documentation. - void Mutate(uoffset_t i, const T &val) { + void Mutate(SizeT i, const T &val) { FLATBUFFERS_ASSERT(i < size()); WriteScalar(data() + i, val); } @@ -230,15 +236,15 @@ template<typename T> class Vector { // Change an element of a vector of tables (or strings). // "val" points to the new table/string, as you can obtain from // e.g. reflection::AddFlatBuffer(). - void MutateOffset(uoffset_t i, const uint8_t *val) { + void MutateOffset(SizeT i, const uint8_t *val) { FLATBUFFERS_ASSERT(i < size()); - static_assert(sizeof(T) == sizeof(uoffset_t), "Unrelated types"); + static_assert(sizeof(T) == sizeof(SizeT), "Unrelated types"); WriteScalar(data() + i, - static_cast<uoffset_t>(val - (Data() + i * sizeof(uoffset_t)))); + static_cast<SizeT>(val - (Data() + i * sizeof(SizeT)))); } // Get a mutable pointer to tables/strings inside this vector. - mutable_return_type GetMutableObject(uoffset_t i) const { + mutable_return_type GetMutableObject(SizeT i) const { FLATBUFFERS_ASSERT(i < size()); return const_cast<mutable_return_type>(IndirectHelper<T>::Read(Data(), i)); } @@ -276,7 +282,7 @@ template<typename T> class Vector { // try to construct these manually. Vector(); - uoffset_t length_; + SizeT length_; private: // This class is a pointer. Copying will therefore create an invalid object. @@ -295,6 +301,8 @@ template<typename T> class Vector { } }; +template<typename T> using Vector64 = Vector<T, uoffset64_t>; + template<class U> FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_span(Vector<U> &vec) FLATBUFFERS_NOEXCEPT { diff --git a/executor/_include/flatbuffers/vector_downward.h b/executor/_include/flatbuffers/vector_downward.h index d25e54497..2b5a92cf1 100644 --- a/executor/_include/flatbuffers/vector_downward.h +++ b/executor/_include/flatbuffers/vector_downward.h @@ -17,6 +17,9 @@ #ifndef FLATBUFFERS_VECTOR_DOWNWARD_H_ #define FLATBUFFERS_VECTOR_DOWNWARD_H_ +#include <algorithm> +#include <cstdint> + #include "flatbuffers/base.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" @@ -29,13 +32,15 @@ namespace flatbuffers { // Since this vector leaves the lower part unused, we support a "scratch-pad" // that can be stored there for temporary data, to share the allocated space. // Essentially, this supports 2 std::vectors in a single buffer. -class vector_downward { +template<typename SizeT = uoffset_t> class vector_downward { public: explicit vector_downward(size_t initial_size, Allocator *allocator, - bool own_allocator, size_t buffer_minalign) + bool own_allocator, size_t buffer_minalign, + const SizeT max_size = FLATBUFFERS_MAX_BUFFER_SIZE) : allocator_(allocator), own_allocator_(own_allocator), initial_size_(initial_size), + max_size_(max_size), buffer_minalign_(buffer_minalign), reserved_(0), size_(0), @@ -43,11 +48,12 @@ class vector_downward { cur_(nullptr), scratch_(nullptr) {} - vector_downward(vector_downward &&other) + vector_downward(vector_downward &&other) noexcept // clang-format on : allocator_(other.allocator_), own_allocator_(other.own_allocator_), initial_size_(other.initial_size_), + max_size_(other.max_size_), buffer_minalign_(other.buffer_minalign_), reserved_(other.reserved_), size_(other.size_), @@ -64,7 +70,7 @@ class vector_downward { other.scratch_ = nullptr; } - vector_downward &operator=(vector_downward &&other) { + vector_downward &operator=(vector_downward &&other) noexcept { // Move construct a temporary and swap idiom vector_downward temp(std::move(other)); swap(temp); @@ -109,7 +115,7 @@ class vector_downward { uint8_t *release_raw(size_t &allocated_bytes, size_t &offset) { auto *buf = buf_; allocated_bytes = reserved_; - offset = static_cast<size_t>(cur_ - buf_); + offset = vector_downward::offset(); // release_raw only relinquishes the buffer ownership. // Does not deallocate or reset the allocator. Destructor will do that. @@ -134,10 +140,10 @@ class vector_downward { size_t ensure_space(size_t len) { FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_); - if (len > static_cast<size_t>(cur_ - scratch_)) { reallocate(len); } - // Beyond this, signed offsets may not have enough range: - // (FlatBuffers > 2GB not supported). - FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE); + // If the length is larger than the unused part of the buffer, we need to + // grow. + if (len > unused_buffer_size()) { reallocate(len); } + FLATBUFFERS_ASSERT(size() < max_size_); return len; } @@ -145,7 +151,7 @@ class vector_downward { if (len) { ensure_space(len); cur_ -= len; - size_ += static_cast<uoffset_t>(len); + size_ += static_cast<SizeT>(len); } return cur_; } @@ -153,12 +159,20 @@ class vector_downward { // Returns nullptr if using the DefaultAllocator. Allocator *get_custom_allocator() { return allocator_; } - inline uoffset_t size() const { return size_; } + // The current offset into the buffer. + size_t offset() const { return cur_ - buf_; } + + // The total size of the vector (both the buffer and scratch parts). + inline SizeT size() const { return size_; } - uoffset_t scratch_size() const { - return static_cast<uoffset_t>(scratch_ - buf_); + // The size of the buffer part of the vector that is currently unused. + SizeT unused_buffer_size() const { + return static_cast<SizeT>(cur_ - scratch_); } + // The size of the scratch part of the vector. + SizeT scratch_size() const { return static_cast<SizeT>(scratch_ - buf_); } + size_t capacity() const { return reserved_; } uint8_t *data() const { @@ -209,7 +223,7 @@ class vector_downward { void pop(size_t bytes_to_remove) { cur_ += bytes_to_remove; - size_ -= static_cast<uoffset_t>(bytes_to_remove); + size_ -= static_cast<SizeT>(bytes_to_remove); } void scratch_pop(size_t bytes_to_remove) { scratch_ -= bytes_to_remove; } @@ -222,6 +236,7 @@ class vector_downward { swap(buffer_minalign_, other.buffer_minalign_); swap(reserved_, other.reserved_); swap(size_, other.size_); + swap(max_size_, other.max_size_); swap(buf_, other.buf_); swap(cur_, other.cur_); swap(scratch_, other.scratch_); @@ -241,9 +256,12 @@ class vector_downward { Allocator *allocator_; bool own_allocator_; size_t initial_size_; + + // The maximum size the vector can be. + SizeT max_size_; size_t buffer_minalign_; size_t reserved_; - uoffset_t size_; + SizeT size_; uint8_t *buf_; uint8_t *cur_; // Points at location between empty (below) and used (above). uint8_t *scratch_; // Points to the end of the scratchpad in use. diff --git a/executor/_include/flatbuffers/verifier.h b/executor/_include/flatbuffers/verifier.h index 87d3f54a5..de1146be9 100644 --- a/executor/_include/flatbuffers/verifier.h +++ b/executor/_include/flatbuffers/verifier.h @@ -34,12 +34,16 @@ class Verifier FLATBUFFERS_FINAL_CLASS { bool check_alignment = true; // If true, run verifier on nested flatbuffers bool check_nested_flatbuffers = true; + // The maximum size of a buffer. + size_t max_size = FLATBUFFERS_MAX_BUFFER_SIZE; + // Use assertions to check for errors. + bool assert = false; }; explicit Verifier(const uint8_t *const buf, const size_t buf_len, const Options &opts) : buf_(buf), size_(buf_len), opts_(opts) { - FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); + FLATBUFFERS_ASSERT(size_ < opts.max_size); } // Deprecated API, please construct with Verifier::Options. @@ -58,7 +62,7 @@ class Verifier FLATBUFFERS_FINAL_CLASS { bool Check(const bool ok) const { // clang-format off #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE - FLATBUFFERS_ASSERT(ok); + if (opts_.assert) { FLATBUFFERS_ASSERT(ok); } #endif #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE if (!ok) @@ -113,41 +117,43 @@ class Verifier FLATBUFFERS_FINAL_CLASS { } // Verify a pointer (may be NULL) of any vector type. - template<typename T> bool VerifyVector(const Vector<T> *const vec) const { - return !vec || VerifyVectorOrString(reinterpret_cast<const uint8_t *>(vec), - sizeof(T)); + template<int &..., typename T, typename LenT> + bool VerifyVector(const Vector<T, LenT> *const vec) const { + return !vec || VerifyVectorOrString<LenT>( + reinterpret_cast<const uint8_t *>(vec), sizeof(T)); } // Verify a pointer (may be NULL) of a vector to struct. - template<typename T> - bool VerifyVector(const Vector<const T *> *const vec) const { - return VerifyVector(reinterpret_cast<const Vector<T> *>(vec)); + template<int &..., typename T, typename LenT> + bool VerifyVector(const Vector<const T *, LenT> *const vec) const { + return VerifyVector(reinterpret_cast<const Vector<T, LenT> *>(vec)); } // Verify a pointer (may be NULL) to string. bool VerifyString(const String *const str) const { size_t end; - return !str || (VerifyVectorOrString(reinterpret_cast<const uint8_t *>(str), - 1, &end) && + return !str || (VerifyVectorOrString<uoffset_t>( + reinterpret_cast<const uint8_t *>(str), 1, &end) && Verify(end, 1) && // Must have terminator Check(buf_[end] == '\0')); // Terminating byte must be 0. } // Common code between vectors and strings. + template<typename LenT = uoffset_t> bool VerifyVectorOrString(const uint8_t *const vec, const size_t elem_size, size_t *const end = nullptr) const { - const auto veco = static_cast<size_t>(vec - buf_); + const auto vec_offset = static_cast<size_t>(vec - buf_); // Check we can read the size field. - if (!Verify<uoffset_t>(veco)) return false; + if (!Verify<LenT>(vec_offset)) return false; // Check the whole array. If this is a string, the byte past the array must // be 0. - const auto size = ReadScalar<uoffset_t>(vec); - const auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size; + const LenT size = ReadScalar<LenT>(vec); + const auto max_elems = opts_.max_size / elem_size; if (!Check(size < max_elems)) return false; // Protect against byte_size overflowing. - const auto byte_size = sizeof(size) + elem_size * size; - if (end) *end = veco + byte_size; - return Verify(veco, byte_size); + const auto byte_size = sizeof(LenT) + elem_size * size; + if (end) *end = vec_offset + byte_size; + return Verify(vec_offset, byte_size); } // Special case for string contents, after the above has been called. @@ -171,8 +177,8 @@ class Verifier FLATBUFFERS_FINAL_CLASS { return true; } - __suppress_ubsan__("unsigned-integer-overflow") bool VerifyTableStart( - const uint8_t *const table) { + FLATBUFFERS_SUPPRESS_UBSAN("unsigned-integer-overflow") + bool VerifyTableStart(const uint8_t *const table) { // Check the vtable offset. const auto tableo = static_cast<size_t>(table - buf_); if (!Verify<soffset_t>(tableo)) return false; @@ -203,7 +209,7 @@ class Verifier FLATBUFFERS_FINAL_CLASS { } // Call T::Verify, which must be in the generated code for this type. - const auto o = VerifyOffset(start); + const auto o = VerifyOffset<uoffset_t>(start); return Check(o != 0) && reinterpret_cast<const T *>(buf_ + start + o)->Verify(*this) // clang-format off @@ -214,8 +220,8 @@ class Verifier FLATBUFFERS_FINAL_CLASS { // clang-format on } - template<typename T> - bool VerifyNestedFlatBuffer(const Vector<uint8_t> *const buf, + template<typename T, int &..., typename SizeT> + bool VerifyNestedFlatBuffer(const Vector<uint8_t, SizeT> *const buf, const char *const identifier) { // Caller opted out of this. if (!opts_.check_nested_flatbuffers) return true; @@ -226,7 +232,7 @@ class Verifier FLATBUFFERS_FINAL_CLASS { // If there is a nested buffer, it must be greater than the min size. if (!Check(buf->size() >= FLATBUFFERS_MIN_BUFFER_SIZE)) return false; - Verifier nested_verifier(buf->data(), buf->size()); + Verifier nested_verifier(buf->data(), buf->size(), opts_); return nested_verifier.VerifyBuffer<T>(identifier); } @@ -237,29 +243,32 @@ class Verifier FLATBUFFERS_FINAL_CLASS { return VerifyBufferFromStart<T>(identifier, 0); } - template<typename T> + template<typename T, typename SizeT = uoffset_t> bool VerifySizePrefixedBuffer(const char *const identifier) { - return Verify<uoffset_t>(0U) && - Check(ReadScalar<uoffset_t>(buf_) == size_ - sizeof(uoffset_t)) && - VerifyBufferFromStart<T>(identifier, sizeof(uoffset_t)); + return Verify<SizeT>(0U) && + // Ensure the prefixed size is within the bounds of the provided + // length. + Check(ReadScalar<SizeT>(buf_) + sizeof(SizeT) <= size_) && + VerifyBufferFromStart<T>(identifier, sizeof(SizeT)); } - uoffset_t VerifyOffset(const size_t start) const { - if (!Verify<uoffset_t>(start)) return 0; - const auto o = ReadScalar<uoffset_t>(buf_ + start); + template<typename OffsetT = uoffset_t, typename SOffsetT = soffset_t> + size_t VerifyOffset(const size_t start) const { + if (!Verify<OffsetT>(start)) return 0; + const auto o = ReadScalar<OffsetT>(buf_ + start); // May not point to itself. if (!Check(o != 0)) return 0; - // Can't wrap around / buffers are max 2GB. - if (!Check(static_cast<soffset_t>(o) >= 0)) return 0; + // Can't wrap around larger than the max size. + if (!Check(static_cast<SOffsetT>(o) >= 0)) return 0; // Must be inside the buffer to create a pointer from it (pointer outside // buffer is UB). if (!Verify(start + o, 1)) return 0; return o; } - uoffset_t VerifyOffset(const uint8_t *const base, - const voffset_t start) const { - return VerifyOffset(static_cast<size_t>(base - buf_) + start); + template<typename OffsetT = uoffset_t> + size_t VerifyOffset(const uint8_t *const base, const voffset_t start) const { + return VerifyOffset<OffsetT>(static_cast<size_t>(base - buf_) + start); } // Called at the start of a table to increase counters measuring data @@ -312,6 +321,12 @@ class Verifier FLATBUFFERS_FINAL_CLASS { std::vector<uint8_t> *flex_reuse_tracker_ = nullptr; }; +// Specialization for 64-bit offsets. +template<> +inline size_t Verifier::VerifyOffset<uoffset64_t>(const size_t start) const { + return VerifyOffset<uoffset64_t, soffset64_t>(start); +} + } // namespace flatbuffers #endif // FLATBUFFERS_VERIFIER_H_ |
