Made all C++ files clang-formatted.

Also added missing generated files.

Change-Id: Ifd22a643a08e3f2edfce92812ed57b87fc0e1875
This commit is contained in:
Wouter van Oortmerssen
2017-12-21 10:54:28 -08:00
parent 5d9930aa0d
commit 89711c9c47
43 changed files with 5850 additions and 5992 deletions

View File

@@ -1,7 +1,13 @@
--- ---
Language: Cpp Language: Cpp
BasedOnStyle: Google BasedOnStyle: Google
DerivePointerAlignment: false DerivePointerAlignment: false
PointerAlignment: Right PointerAlignment: Right
IndentPPDirectives: AfterHash
Cpp11BracedListStyle: false
AlwaysBreakTemplateDeclarations: false
AllowShortCaseLabelsOnASingleLine: true
SpaceAfterTemplateKeyword: false
AllowShortBlocksOnASingleLine: true
... ...

View File

@@ -40,8 +40,8 @@
#include <vector> #include <vector>
#ifndef GRPC_CUSTOM_STRING #ifndef GRPC_CUSTOM_STRING
#include <string> # include <string>
#define GRPC_CUSTOM_STRING std::string # define GRPC_CUSTOM_STRING std::string
#endif #endif
namespace grpc { namespace grpc {

View File

@@ -18,46 +18,48 @@
#include <grpc++/grpc++.h> #include <grpc++/grpc++.h>
#include "monster_test_generated.h"
#include "monster_test.grpc.fb.h" #include "monster_test.grpc.fb.h"
#include "monster_test_generated.h"
using namespace MyGame::Example; using namespace MyGame::Example;
// The callback implementation of our server, that derives from the generated // The callback implementation of our server, that derives from the generated
// code. It implements all rpcs specified in the FlatBuffers schema. // code. It implements all rpcs specified in the FlatBuffers schema.
class ServiceImpl final : public MyGame::Example::MonsterStorage::Service { class ServiceImpl final : public MyGame::Example::MonsterStorage::Service {
virtual ::grpc::Status Store(::grpc::ServerContext* context, virtual ::grpc::Status Store(
const flatbuffers::grpc::Message<Monster> *request, ::grpc::ServerContext *context,
flatbuffers::grpc::Message<Stat> *response) const flatbuffers::grpc::Message<Monster> *request,
override { flatbuffers::grpc::Message<Stat> *response) override {
// Create a response from the incoming request name. // Create a response from the incoming request name.
fbb_.Clear(); fbb_.Clear();
auto stat_offset = CreateStat(fbb_, fbb_.CreateString("Hello, " + auto stat_offset = CreateStat(
request->GetRoot()->name()->str())); fbb_, fbb_.CreateString("Hello, " + request->GetRoot()->name()->str()));
fbb_.Finish(stat_offset); fbb_.Finish(stat_offset);
// Transfer ownership of the message to gRPC // Transfer ownership of the message to gRPC
*response = fbb_.ReleaseMessage<Stat>(); *response = fbb_.ReleaseMessage<Stat>();
return grpc::Status::OK; return grpc::Status::OK;
} }
virtual ::grpc::Status Retrieve(::grpc::ServerContext *context, virtual ::grpc::Status Retrieve(
const flatbuffers::grpc::Message<Stat> *request, ::grpc::ServerContext *context,
::grpc::ServerWriter< flatbuffers::grpc::Message<Monster>>* writer) const flatbuffers::grpc::Message<Stat> *request,
override { ::grpc::ServerWriter<flatbuffers::grpc::Message<Monster>> *writer)
override {
for (int i = 0; i < 10; i++) {
fbb_.Clear();
// Create 10 monsters for resposne.
auto monster_offset =
CreateMonster(fbb_, 0, 0, 0,
fbb_.CreateString(request->GetRoot()->id()->str() +
" No." + std::to_string(i)));
fbb_.Finish(monster_offset);
for (int i=0; i<10; i++) { flatbuffers::grpc::Message<Monster> monster =
fbb_.Clear(); fbb_.ReleaseMessage<Monster>();
// Create 10 monsters for resposne.
auto monster_offset =
CreateMonster(fbb_, 0, 0, 0, fbb_.CreateString(
request->GetRoot()->id()->str() + " No." + std::to_string(i)));
fbb_.Finish(monster_offset);
flatbuffers::grpc::Message<Monster> monster = fbb_.ReleaseMessage<Monster>(); // Send monster to client using streaming.
writer->Write(monster);
// Send monster to client using streaming. }
writer->Write(monster); return grpc::Status::OK;
}
return grpc::Status::OK;
} }
private: private:
@@ -90,7 +92,7 @@ void RunServer() {
server_instance->Wait(); server_instance->Wait();
} }
int main(int /*argc*/, const char * /*argv*/[]) { int main(int /*argc*/, const char * /*argv*/ []) {
// Launch server. // Launch server.
std::thread server_thread(RunServer); std::thread server_thread(RunServer);
@@ -103,7 +105,6 @@ int main(int /*argc*/, const char * /*argv*/[]) {
grpc::InsecureChannelCredentials()); grpc::InsecureChannelCredentials());
auto stub = MyGame::Example::MonsterStorage::NewStub(channel); auto stub = MyGame::Example::MonsterStorage::NewStub(channel);
flatbuffers::grpc::MessageBuilder fbb; flatbuffers::grpc::MessageBuilder fbb;
{ {
grpc::ClientContext context; grpc::ClientContext context;
@@ -138,7 +139,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
} }
} }
#if !FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION #if !FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION
{ {
// Test that an invalid request errors out correctly // Test that an invalid request errors out correctly
grpc::ClientContext context; grpc::ClientContext context;
@@ -149,9 +150,10 @@ int main(int /*argc*/, const char * /*argv*/[]) {
// matches the protobuf gRPC status code for an unparseable message. // matches the protobuf gRPC status code for an unparseable message.
assert(!status.ok()); assert(!status.ok());
assert(status.error_code() == ::grpc::StatusCode::INTERNAL); assert(status.error_code() == ::grpc::StatusCode::INTERNAL);
assert(strcmp(status.error_message().c_str(), "Message verification failed") == 0); assert(strcmp(status.error_message().c_str(),
"Message verification failed") == 0);
} }
#endif #endif
server_instance->Shutdown(); server_instance->Shutdown();

View File

@@ -1,6 +1,7 @@
#ifndef FLATBUFFERS_BASE_H_ #ifndef FLATBUFFERS_BASE_H_
#define FLATBUFFERS_BASE_H_ #define FLATBUFFERS_BASE_H_
// clang-format off
#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \
defined(_MSC_VER) && defined(_DEBUG) defined(_MSC_VER) && defined(_DEBUG)
#define _CRTDBG_MAP_ALLOC #define _CRTDBG_MAP_ALLOC

View File

@@ -49,7 +49,7 @@ class CodeWriter {
// Associates a key with a value. All subsequent calls to operator+=, where // Associates a key with a value. All subsequent calls to operator+=, where
// the specified key is contained in {{ and }} delimiters will be replaced by // the specified key is contained in {{ and }} delimiters will be replaced by
// the given value. // the given value.
void SetValue(const std::string& key, const std::string& value) { void SetValue(const std::string &key, const std::string &value) {
value_map_[key] = value; value_map_[key] = value;
} }
@@ -71,8 +71,7 @@ class BaseGenerator {
public: public:
virtual bool generate() = 0; virtual bool generate() = 0;
static std::string NamespaceDir(const Parser &parser, static std::string NamespaceDir(const Parser &parser, const std::string &path,
const std::string &path,
const Namespace &ns); const Namespace &ns);
protected: protected:
@@ -128,8 +127,7 @@ struct CommentConfig {
}; };
extern void GenComment(const std::vector<std::string> &dc, extern void GenComment(const std::vector<std::string> &dc,
std::string *code_ptr, std::string *code_ptr, const CommentConfig *config,
const CommentConfig *config,
const char *prefix = ""); const char *prefix = "");
} // namespace flatbuffers } // namespace flatbuffers

File diff suppressed because it is too large Load Diff

View File

@@ -14,15 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h"
#include "flatbuffers/util.h"
#include <functional> #include <functional>
#include <limits> #include <limits>
#include <string> #include <string>
#include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h"
#include "flatbuffers/util.h"
#ifndef FLATC_H_ #ifndef FLATC_H_
#define FLATC_H_ # define FLATC_H_
namespace flatbuffers { namespace flatbuffers {
@@ -49,12 +49,10 @@ class FlatCompiler {
MakeRuleFn make_rule; MakeRuleFn make_rule;
}; };
typedef void (*WarnFn)(const FlatCompiler *flatc, typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn,
const std::string &warn,
bool show_exe_name); bool show_exe_name);
typedef void (*ErrorFn)(const FlatCompiler *flatc, typedef void (*ErrorFn)(const FlatCompiler *flatc, const std::string &err,
const std::string &err,
bool usage, bool show_exe_name); bool usage, bool show_exe_name);
// Parameters required to initialize the FlatCompiler. // Parameters required to initialize the FlatCompiler.
@@ -65,21 +63,20 @@ class FlatCompiler {
warn_fn(nullptr), warn_fn(nullptr),
error_fn(nullptr) {} error_fn(nullptr) {}
const Generator* generators; const Generator *generators;
size_t num_generators; size_t num_generators;
WarnFn warn_fn; WarnFn warn_fn;
ErrorFn error_fn; ErrorFn error_fn;
}; };
explicit FlatCompiler(const InitParams& params) : params_(params) {} explicit FlatCompiler(const InitParams &params) : params_(params) {}
int Compile(int argc, const char** argv); int Compile(int argc, const char **argv);
std::string GetUsageString(const char* program_name) const; std::string GetUsageString(const char *program_name) const;
private: private:
void ParseFile(flatbuffers::Parser &parser, void ParseFile(flatbuffers::Parser &parser, const std::string &filename,
const std::string &filename,
const std::string &contents, const std::string &contents,
std::vector<const char *> &include_directories) const; std::vector<const char *> &include_directories) const;
@@ -91,7 +88,6 @@ class FlatCompiler {
InitParams params_; InitParams params_;
}; };
} // namespace flatbuffers } // namespace flatbuffers
#endif // FLATC_H_ #endif // FLATC_H_

View File

@@ -24,12 +24,12 @@
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#ifdef _MSC_VER #ifdef _MSC_VER
#include <intrin.h> # include <intrin.h>
#endif #endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(push) # pragma warning(push)
#pragma warning(disable: 4127) // C4127: conditional expression is constant # pragma warning(disable : 4127) // C4127: conditional expression is constant
#endif #endif
namespace flexbuffers { namespace flexbuffers {
@@ -60,24 +60,25 @@ enum Type {
TYPE_INDIRECT_UINT = 7, TYPE_INDIRECT_UINT = 7,
TYPE_INDIRECT_FLOAT = 8, TYPE_INDIRECT_FLOAT = 8,
TYPE_MAP = 9, TYPE_MAP = 9,
TYPE_VECTOR = 10, // Untyped. TYPE_VECTOR = 10, // Untyped.
TYPE_VECTOR_INT = 11, // Typed any size (stores no type table). TYPE_VECTOR_INT = 11, // Typed any size (stores no type table).
TYPE_VECTOR_UINT = 12, TYPE_VECTOR_UINT = 12,
TYPE_VECTOR_FLOAT = 13, TYPE_VECTOR_FLOAT = 13,
TYPE_VECTOR_KEY = 14, TYPE_VECTOR_KEY = 14,
TYPE_VECTOR_STRING = 15, TYPE_VECTOR_STRING = 15,
TYPE_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field). TYPE_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field).
TYPE_VECTOR_UINT2 = 17, TYPE_VECTOR_UINT2 = 17,
TYPE_VECTOR_FLOAT2 = 18, TYPE_VECTOR_FLOAT2 = 18,
TYPE_VECTOR_INT3 = 19, // Typed triple (no type table, no size field). TYPE_VECTOR_INT3 = 19, // Typed triple (no type table, no size field).
TYPE_VECTOR_UINT3 = 20, TYPE_VECTOR_UINT3 = 20,
TYPE_VECTOR_FLOAT3 = 21, TYPE_VECTOR_FLOAT3 = 21,
TYPE_VECTOR_INT4 = 22, // Typed quad (no type table, no size field). TYPE_VECTOR_INT4 = 22, // Typed quad (no type table, no size field).
TYPE_VECTOR_UINT4 = 23, TYPE_VECTOR_UINT4 = 23,
TYPE_VECTOR_FLOAT4 = 24, TYPE_VECTOR_FLOAT4 = 24,
TYPE_BLOB = 25, TYPE_BLOB = 25,
TYPE_BOOL = 26, TYPE_BOOL = 26,
TYPE_VECTOR_BOOL = 36, // To Allow the same type of conversion of type to vector type TYPE_VECTOR_BOOL =
36, // To Allow the same type of conversion of type to vector type
}; };
inline bool IsInline(Type t) { return t <= TYPE_FLOAT || t == TYPE_BOOL; } inline bool IsInline(Type t) { return t <= TYPE_FLOAT || t == TYPE_BOOL; }
@@ -87,7 +88,8 @@ inline bool IsTypedVectorElementType(Type t) {
} }
inline bool IsTypedVector(Type t) { inline bool IsTypedVector(Type t) {
return (t >= TYPE_VECTOR_INT && t <= TYPE_VECTOR_STRING) || t == TYPE_VECTOR_BOOL; return (t >= TYPE_VECTOR_INT && t <= TYPE_VECTOR_STRING) ||
t == TYPE_VECTOR_BOOL;
} }
inline bool IsFixedTypedVector(Type t) { inline bool IsFixedTypedVector(Type t) {
@@ -113,7 +115,8 @@ inline Type ToTypedVectorElementType(Type t) {
inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) { inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) {
assert(IsFixedTypedVector(t)); assert(IsFixedTypedVector(t));
auto fixed_type = t - TYPE_VECTOR_INT2; auto fixed_type = t - TYPE_VECTOR_INT2;
*len = static_cast<uint8_t>(fixed_type / 3 + 2); // 3 types each, starting from length 2. *len = static_cast<uint8_t>(fixed_type / 3 +
2); // 3 types each, starting from length 2.
return static_cast<Type>(fixed_type % 3 + TYPE_INT); return static_cast<Type>(fixed_type % 3 + TYPE_INT);
} }
@@ -127,19 +130,20 @@ typedef int8_t quarter;
// decently quick, but it is the most frequently executed function. // decently quick, but it is the most frequently executed function.
// We could do an (unaligned) 64-bit read if we ifdef out the platforms for // We could do an (unaligned) 64-bit read if we ifdef out the platforms for
// which that doesn't work (or where we'd read into un-owned memory). // which that doesn't work (or where we'd read into un-owned memory).
template <typename R, typename T1, typename T2, typename T4, typename T8> template<typename R, typename T1, typename T2, typename T4, typename T8>
R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) { R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) {
return byte_width < 4 return byte_width < 4
? (byte_width < 2 ? static_cast<R>(flatbuffers::ReadScalar<T1>(data)) ? (byte_width < 2
: static_cast<R>(flatbuffers::ReadScalar<T2>(data))) ? static_cast<R>(flatbuffers::ReadScalar<T1>(data))
: (byte_width < 8 ? static_cast<R>(flatbuffers::ReadScalar<T4>(data)) : static_cast<R>(flatbuffers::ReadScalar<T2>(data)))
: static_cast<R>(flatbuffers::ReadScalar<T8>(data))); : (byte_width < 8
? static_cast<R>(flatbuffers::ReadScalar<T4>(data))
: static_cast<R>(flatbuffers::ReadScalar<T8>(data)));
} }
inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) { inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) {
return ReadSizedScalar<int64_t, int8_t, int16_t, int32_t, int64_t>(data, return ReadSizedScalar<int64_t, int8_t, int16_t, int32_t, int64_t>(
byte_width); data, byte_width);
} }
inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) { inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) {
@@ -148,6 +152,7 @@ inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) {
// TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a
// constant, which here it isn't. Test if memcpy is still faster than // constant, which here it isn't. Test if memcpy is still faster than
// the conditionals in ReadSizedScalar. Can also use inline asm. // the conditionals in ReadSizedScalar. Can also use inline asm.
// clang-format off
#ifdef _MSC_VER #ifdef _MSC_VER
uint64_t u = 0; uint64_t u = 0;
__movsb(reinterpret_cast<uint8_t *>(&u), __movsb(reinterpret_cast<uint8_t *>(&u),
@@ -157,11 +162,12 @@ inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) {
return ReadSizedScalar<uint64_t, uint8_t, uint16_t, uint32_t, uint64_t>( return ReadSizedScalar<uint64_t, uint8_t, uint16_t, uint32_t, uint64_t>(
data, byte_width); data, byte_width);
#endif #endif
// clang-format on
} }
inline double ReadDouble(const uint8_t *data, uint8_t byte_width) { inline double ReadDouble(const uint8_t *data, uint8_t byte_width) {
return ReadSizedScalar<double, quarter, half, float, double>(data, return ReadSizedScalar<double, quarter, half, float, double>(data,
byte_width); byte_width);
} }
inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) { inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) {
@@ -173,13 +179,14 @@ template<typename T> const uint8_t *Indirect(const uint8_t *offset) {
} }
inline BitWidth WidthU(uint64_t u) { inline BitWidth WidthU(uint64_t u) {
#define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) { \ #define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) \
{ \
if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \ if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \
} }
FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8);
FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16);
FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32);
#undef FLATBUFFERS_GET_FIELD_BIT_WIDTH #undef FLATBUFFERS_GET_FIELD_BIT_WIDTH
return BIT_WIDTH_64; return BIT_WIDTH_64;
} }
@@ -198,7 +205,7 @@ inline BitWidth WidthF(double f) {
class Object { class Object {
public: public:
Object(const uint8_t *data, uint8_t byte_width) Object(const uint8_t *data, uint8_t byte_width)
: data_(data), byte_width_(byte_width) {} : data_(data), byte_width_(byte_width) {}
protected: protected:
const uint8_t *data_; const uint8_t *data_;
@@ -216,15 +223,14 @@ class Sized : public Object {
class String : public Sized { class String : public Sized {
public: public:
String(const uint8_t *data, uint8_t byte_width) String(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {}
: Sized(data, byte_width) {}
size_t length() const { return size(); } size_t length() const { return size(); }
const char *c_str() const { return reinterpret_cast<const char *>(data_); } const char *c_str() const { return reinterpret_cast<const char *>(data_); }
std::string str() const { return std::string(c_str(), length()); } std::string str() const { return std::string(c_str(), length()); }
static String EmptyString() { static String EmptyString() {
static const uint8_t empty_string[] = { 0/*len*/, 0/*terminator*/ }; static const uint8_t empty_string[] = { 0 /*len*/, 0 /*terminator*/ };
return String(empty_string + 1, 1); return String(empty_string + 1, 1);
} }
bool IsTheEmptyString() const { return data_ == EmptyString().data_; } bool IsTheEmptyString() const { return data_ == EmptyString().data_; }
@@ -233,10 +239,10 @@ class String : public Sized {
class Blob : public Sized { class Blob : public Sized {
public: public:
Blob(const uint8_t *data_buf, uint8_t byte_width) Blob(const uint8_t *data_buf, uint8_t byte_width)
: Sized(data_buf, byte_width) {} : Sized(data_buf, byte_width) {}
static Blob EmptyBlob() { static Blob EmptyBlob() {
static const uint8_t empty_blob[] = { 0/*len*/ }; static const uint8_t empty_blob[] = { 0 /*len*/ };
return Blob(empty_blob + 1, 1); return Blob(empty_blob + 1, 1);
} }
bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; } bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; }
@@ -245,13 +251,12 @@ class Blob : public Sized {
class Vector : public Sized { class Vector : public Sized {
public: public:
Vector(const uint8_t *data, uint8_t byte_width) Vector(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {}
: Sized(data, byte_width) {}
Reference operator[](size_t i) const; Reference operator[](size_t i) const;
static Vector EmptyVector() { static Vector EmptyVector() {
static const uint8_t empty_vector[] = { 0/*len*/ }; static const uint8_t empty_vector[] = { 0 /*len*/ };
return Vector(empty_vector + 1, 1); return Vector(empty_vector + 1, 1);
} }
bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; } bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; }
@@ -260,12 +265,12 @@ class Vector : public Sized {
class TypedVector : public Sized { class TypedVector : public Sized {
public: public:
TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type) TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type)
: Sized(data, byte_width), type_(element_type) {} : Sized(data, byte_width), type_(element_type) {}
Reference operator[](size_t i) const; Reference operator[](size_t i) const;
static TypedVector EmptyTypedVector() { static TypedVector EmptyTypedVector() {
static const uint8_t empty_typed_vector[] = { 0/*len*/ }; static const uint8_t empty_typed_vector[] = { 0 /*len*/ };
return TypedVector(empty_typed_vector + 1, 1, TYPE_INT); return TypedVector(empty_typed_vector + 1, 1, TYPE_INT);
} }
bool IsTheEmptyVector() const { bool IsTheEmptyVector() const {
@@ -284,12 +289,12 @@ class FixedTypedVector : public Object {
public: public:
FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type, FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type,
uint8_t len) uint8_t len)
: Object(data, byte_width), type_(element_type), len_(len) {} : Object(data, byte_width), type_(element_type), len_(len) {}
Reference operator[](size_t i) const; Reference operator[](size_t i) const;
static FixedTypedVector EmptyFixedTypedVector() { static FixedTypedVector EmptyFixedTypedVector() {
static const uint8_t fixed_empty_vector[] = { 0/* unused */ }; static const uint8_t fixed_empty_vector[] = { 0 /* unused */ };
return FixedTypedVector(fixed_empty_vector, 1, TYPE_INT, 0); return FixedTypedVector(fixed_empty_vector, 1, TYPE_INT, 0);
} }
bool IsTheEmptyFixedTypedVector() const { bool IsTheEmptyFixedTypedVector() const {
@@ -306,8 +311,7 @@ class FixedTypedVector : public Object {
class Map : public Vector { class Map : public Vector {
public: public:
Map(const uint8_t *data, uint8_t byte_width) Map(const uint8_t *data, uint8_t byte_width) : Vector(data, byte_width) {}
: Vector(data, byte_width) {}
Reference operator[](const char *key) const; Reference operator[](const char *key) const;
Reference operator[](const std::string &key) const; Reference operator[](const std::string &key) const;
@@ -319,31 +323,31 @@ class Map : public Vector {
auto keys_offset = data_ - byte_width_ * num_prefixed_fields; auto keys_offset = data_ - byte_width_ * num_prefixed_fields;
return TypedVector(Indirect(keys_offset, byte_width_), return TypedVector(Indirect(keys_offset, byte_width_),
static_cast<uint8_t>( static_cast<uint8_t>(
ReadUInt64(keys_offset + byte_width_, byte_width_)), ReadUInt64(keys_offset + byte_width_, byte_width_)),
TYPE_KEY); TYPE_KEY);
} }
static Map EmptyMap() { static Map EmptyMap() {
static const uint8_t empty_map[] = { static const uint8_t empty_map[] = {
0/*keys_len*/, 0/*keys_offset*/, 1/*keys_width*/, 0/*len*/ 0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/
}; };
return Map(empty_map + 4, 1); return Map(empty_map + 4, 1);
} }
bool IsTheEmptyMap() const { bool IsTheEmptyMap() const { return data_ == EmptyMap().data_; }
return data_ == EmptyMap().data_;
}
}; };
class Reference { class Reference {
public: public:
Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width, Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width,
Type type) Type type)
: data_(data), parent_width_(parent_width), byte_width_(byte_width), : data_(data),
type_(type) {} parent_width_(parent_width),
byte_width_(byte_width),
type_(type) {}
Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type)
: data_(data), parent_width_(parent_width) { : data_(data), parent_width_(parent_width) {
byte_width_ = 1U << static_cast<BitWidth>(packed_type & 3); byte_width_ = 1U << static_cast<BitWidth>(packed_type & 3);
type_ = static_cast<Type>(packed_type >> 2); type_ = static_cast<Type>(packed_type >> 2);
} }
@@ -352,13 +356,14 @@ class Reference {
bool IsNull() const { return type_ == TYPE_NULL; } bool IsNull() const { return type_ == TYPE_NULL; }
bool IsBool() const { return type_ == TYPE_BOOL; } bool IsBool() const { return type_ == TYPE_BOOL; }
bool IsInt() const { return type_ == TYPE_INT || bool IsInt() const { return type_ == TYPE_INT || type_ == TYPE_INDIRECT_INT; }
type_ == TYPE_INDIRECT_INT; } bool IsUInt() const {
bool IsUInt() const { return type_ == TYPE_UINT|| return type_ == TYPE_UINT || type_ == TYPE_INDIRECT_UINT;
type_ == TYPE_INDIRECT_UINT;; } }
bool IsIntOrUint() const { return IsInt() || IsUInt(); } bool IsIntOrUint() const { return IsInt() || IsUInt(); }
bool IsFloat() const { return type_ == TYPE_FLOAT || bool IsFloat() const {
type_ == TYPE_INDIRECT_FLOAT; } return type_ == TYPE_FLOAT || type_ == TYPE_INDIRECT_FLOAT;
}
bool IsNumeric() const { return IsIntOrUint() || IsFloat(); } bool IsNumeric() const { return IsIntOrUint() || IsFloat(); }
bool IsString() const { return type_ == TYPE_STRING; } bool IsString() const { return type_ == TYPE_STRING; }
bool IsKey() const { return type_ == TYPE_KEY; } bool IsKey() const { return type_ == TYPE_KEY; }
@@ -367,7 +372,8 @@ class Reference {
bool IsBlob() const { return type_ == TYPE_BLOB; } bool IsBlob() const { return type_ == TYPE_BLOB; }
bool AsBool() const { bool AsBool() const {
return (type_ == TYPE_BOOL ? ReadUInt64(data_, parent_width_) : AsUInt64()) != 0; return (type_ == TYPE_BOOL ? ReadUInt64(data_, parent_width_)
: AsUInt64()) != 0;
} }
// Reads any type as a int64_t. Never fails, does most sensible conversion. // Reads any type as a int64_t. Never fails, does most sensible conversion.
@@ -377,79 +383,82 @@ class Reference {
if (type_ == TYPE_INT) { if (type_ == TYPE_INT) {
// A fast path for the common case. // A fast path for the common case.
return ReadInt64(data_, parent_width_); return ReadInt64(data_, parent_width_);
} else switch (type_) { } else
case TYPE_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); switch (type_) {
case TYPE_UINT: return ReadUInt64(data_, parent_width_); case TYPE_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_);
case TYPE_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); case TYPE_UINT: return ReadUInt64(data_, parent_width_);
case TYPE_FLOAT: return static_cast<int64_t>( case TYPE_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_);
ReadDouble(data_, parent_width_)); case TYPE_FLOAT:
case TYPE_INDIRECT_FLOAT: return static_cast<int64_t>( return static_cast<int64_t>(ReadDouble(data_, parent_width_));
ReadDouble(Indirect(), byte_width_)); case TYPE_INDIRECT_FLOAT:
case TYPE_NULL: return 0; return static_cast<int64_t>(ReadDouble(Indirect(), byte_width_));
case TYPE_STRING: return flatbuffers::StringToInt(AsString().c_str()); case TYPE_NULL: return 0;
case TYPE_VECTOR: return static_cast<int64_t>(AsVector().size()); case TYPE_STRING: return flatbuffers::StringToInt(AsString().c_str());
case TYPE_BOOL: return ReadInt64(data_, parent_width_); case TYPE_VECTOR: return static_cast<int64_t>(AsVector().size());
default: case TYPE_BOOL: return ReadInt64(data_, parent_width_);
// Convert other things to int. default:
return 0; // Convert other things to int.
} return 0;
}
} }
// TODO: could specialize these to not use AsInt64() if that saves // TODO: could specialize these to not use AsInt64() if that saves
// extension ops in generated code, and use a faster op than ReadInt64. // extension ops in generated code, and use a faster op than ReadInt64.
int32_t AsInt32() const { return static_cast<int32_t>(AsInt64()); } int32_t AsInt32() const { return static_cast<int32_t>(AsInt64()); }
int16_t AsInt16() const { return static_cast<int16_t>(AsInt64()); } int16_t AsInt16() const { return static_cast<int16_t>(AsInt64()); }
int8_t AsInt8() const { return static_cast<int8_t> (AsInt64()); } int8_t AsInt8() const { return static_cast<int8_t>(AsInt64()); }
uint64_t AsUInt64() const { uint64_t AsUInt64() const {
if (type_ == TYPE_UINT) { if (type_ == TYPE_UINT) {
// A fast path for the common case. // A fast path for the common case.
return ReadUInt64(data_, parent_width_); return ReadUInt64(data_, parent_width_);
} else switch (type_) { } else
case TYPE_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); switch (type_) {
case TYPE_INT: return ReadInt64(data_, parent_width_); case TYPE_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_);
case TYPE_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); case TYPE_INT: return ReadInt64(data_, parent_width_);
case TYPE_FLOAT: return static_cast<uint64_t>( case TYPE_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_);
ReadDouble(data_, parent_width_)); case TYPE_FLOAT:
case TYPE_INDIRECT_FLOAT: return static_cast<uint64_t>( return static_cast<uint64_t>(ReadDouble(data_, parent_width_));
ReadDouble(Indirect(), byte_width_)); case TYPE_INDIRECT_FLOAT:
case TYPE_NULL: return 0; return static_cast<uint64_t>(ReadDouble(Indirect(), byte_width_));
case TYPE_STRING: return flatbuffers::StringToUInt(AsString().c_str()); case TYPE_NULL: return 0;
case TYPE_VECTOR: return static_cast<uint64_t>(AsVector().size()); case TYPE_STRING: return flatbuffers::StringToUInt(AsString().c_str());
case TYPE_BOOL: return ReadUInt64(data_, parent_width_); case TYPE_VECTOR: return static_cast<uint64_t>(AsVector().size());
default: case TYPE_BOOL: return ReadUInt64(data_, parent_width_);
// Convert other things to uint. default:
return 0; // Convert other things to uint.
} return 0;
}
} }
uint32_t AsUInt32() const { return static_cast<uint32_t>(AsUInt64()); } uint32_t AsUInt32() const { return static_cast<uint32_t>(AsUInt64()); }
uint16_t AsUInt16() const { return static_cast<uint16_t>(AsUInt64()); } uint16_t AsUInt16() const { return static_cast<uint16_t>(AsUInt64()); }
uint8_t AsUInt8() const { return static_cast<uint8_t> (AsUInt64()); } uint8_t AsUInt8() const { return static_cast<uint8_t>(AsUInt64()); }
double AsDouble() const { double AsDouble() const {
if (type_ == TYPE_FLOAT) { if (type_ == TYPE_FLOAT) {
// A fast path for the common case. // A fast path for the common case.
return ReadDouble(data_, parent_width_); return ReadDouble(data_, parent_width_);
} else switch (type_) { } else
case TYPE_INDIRECT_FLOAT: return ReadDouble(Indirect(), byte_width_); switch (type_) {
case TYPE_INT: return static_cast<double>( case TYPE_INDIRECT_FLOAT: return ReadDouble(Indirect(), byte_width_);
ReadInt64(data_, parent_width_)); case TYPE_INT:
case TYPE_UINT: return static_cast<double>( return static_cast<double>(ReadInt64(data_, parent_width_));
ReadUInt64(data_, parent_width_)); case TYPE_UINT:
case TYPE_INDIRECT_INT: return static_cast<double>( return static_cast<double>(ReadUInt64(data_, parent_width_));
ReadInt64(Indirect(), byte_width_)); case TYPE_INDIRECT_INT:
case TYPE_INDIRECT_UINT: return static_cast<double>( return static_cast<double>(ReadInt64(Indirect(), byte_width_));
ReadUInt64(Indirect(), byte_width_)); case TYPE_INDIRECT_UINT:
case TYPE_NULL: return 0.0; return static_cast<double>(ReadUInt64(Indirect(), byte_width_));
case TYPE_STRING: return strtod(AsString().c_str(), nullptr); case TYPE_NULL: return 0.0;
case TYPE_VECTOR: return static_cast<double>(AsVector().size()); case TYPE_STRING: return strtod(AsString().c_str(), nullptr);
case TYPE_BOOL: return static_cast<double>( case TYPE_VECTOR: return static_cast<double>(AsVector().size());
ReadUInt64(data_, parent_width_)); case TYPE_BOOL:
default: return static_cast<double>(ReadUInt64(data_, parent_width_));
// Convert strings and other things to float. default:
return 0; // Convert strings and other things to float.
} return 0;
}
} }
float AsFloat() const { return static_cast<float>(AsDouble()); } float AsFloat() const { return static_cast<float>(AsDouble()); }
@@ -652,9 +661,7 @@ class Reference {
memcpy(const_cast<char *>(s.c_str()), str, len); memcpy(const_cast<char *>(s.c_str()), str, len);
return true; return true;
} }
bool MutateString(const char *str) { bool MutateString(const char *str) { return MutateString(str, strlen(str)); }
return MutateString(str, strlen(str));
}
bool MutateString(const std::string &str) { bool MutateString(const std::string &str) {
return MutateString(str.data(), str.length()); return MutateString(str.data(), str.length());
} }
@@ -664,9 +671,11 @@ class Reference {
return flexbuffers::Indirect(data_, parent_width_); return flexbuffers::Indirect(data_, parent_width_);
} }
template<typename T> bool Mutate(const uint8_t *dest, T t, size_t byte_width, template<typename T>
BitWidth value_width) { bool Mutate(const uint8_t *dest, T t, size_t byte_width,
auto fits = static_cast<size_t>(static_cast<size_t>(1U) << value_width) <= byte_width; BitWidth value_width) {
auto fits = static_cast<size_t>(static_cast<size_t>(1U) << value_width) <=
byte_width;
if (fits) { if (fits) {
t = flatbuffers::EndianScalar(t); t = flatbuffers::EndianScalar(t);
memcpy(const_cast<uint8_t *>(dest), &t, byte_width); memcpy(const_cast<uint8_t *>(dest), &t, byte_width);
@@ -674,8 +683,9 @@ class Reference {
return fits; return fits;
} }
template<typename T> bool MutateF(const uint8_t *dest, T t, size_t byte_width, template<typename T>
BitWidth value_width) { bool MutateF(const uint8_t *dest, T t, size_t byte_width,
BitWidth value_width) {
if (byte_width == sizeof(double)) if (byte_width == sizeof(double))
return Mutate(dest, static_cast<double>(t), byte_width, value_width); return Mutate(dest, static_cast<double>(t), byte_width, value_width);
if (byte_width == sizeof(float)) if (byte_width == sizeof(float))
@@ -707,21 +717,25 @@ template<> inline double Reference::As<double>() { return AsDouble(); }
template<> inline float Reference::As<float>() { return AsFloat(); } template<> inline float Reference::As<float>() { return AsFloat(); }
template<> inline String Reference::As<String>() { return AsString(); } template<> inline String Reference::As<String>() { return AsString(); }
template<> inline std::string Reference::As<std::string>() { return AsString().str(); } template<> inline std::string Reference::As<std::string>() {
return AsString().str();
}
template<> inline Blob Reference::As<Blob>() { return AsBlob(); } template<> inline Blob Reference::As<Blob>() { return AsBlob(); }
template<> inline Vector Reference::As<Vector>() { return AsVector(); } template<> inline Vector Reference::As<Vector>() { return AsVector(); }
template<> inline TypedVector Reference::As<TypedVector>() { return AsTypedVector(); } template<> inline TypedVector Reference::As<TypedVector>() {
template<> inline FixedTypedVector Reference::As<FixedTypedVector>() { return AsFixedTypedVector(); } return AsTypedVector();
}
template<> inline FixedTypedVector Reference::As<FixedTypedVector>() {
return AsFixedTypedVector();
}
template<> inline Map Reference::As<Map>() { return AsMap(); } template<> inline Map Reference::As<Map>() { return AsMap(); }
inline uint8_t PackedType(BitWidth bit_width, Type type) { inline uint8_t PackedType(BitWidth bit_width, Type type) {
return static_cast<uint8_t>(bit_width | (type << 2)); return static_cast<uint8_t>(bit_width | (type << 2));
} }
inline uint8_t NullPackedType() { inline uint8_t NullPackedType() { return PackedType(BIT_WIDTH_8, TYPE_NULL); }
return PackedType(BIT_WIDTH_8, TYPE_NULL);
}
// Vector accessors. // Vector accessors.
// Note: if you try to access outside of bounds, you get a Null value back // Note: if you try to access outside of bounds, you get a Null value back
@@ -730,7 +744,7 @@ inline uint8_t NullPackedType() {
// wanted 3d). // wanted 3d).
// The Null converts seamlessly into a default value for any other type. // The Null converts seamlessly into a default value for any other type.
// TODO(wvo): Could introduce an #ifdef that makes this into an assert? // TODO(wvo): Could introduce an #ifdef that makes this into an assert?
inline Reference Vector::operator[](size_t i) const { inline Reference Vector::operator[](size_t i) const {
auto len = size(); auto len = size();
if (i >= len) return Reference(nullptr, 1, NullPackedType()); if (i >= len) return Reference(nullptr, 1, NullPackedType());
auto packed_type = (data_ + len * byte_width_)[i]; auto packed_type = (data_ + len * byte_width_)[i];
@@ -738,14 +752,14 @@ inline Reference Vector::operator[](size_t i) const {
return Reference(elem, byte_width_, packed_type); return Reference(elem, byte_width_, packed_type);
} }
inline Reference TypedVector::operator[](size_t i) const { inline Reference TypedVector::operator[](size_t i) const {
auto len = size(); auto len = size();
if (i >= len) return Reference(nullptr, 1, NullPackedType()); if (i >= len) return Reference(nullptr, 1, NullPackedType());
auto elem = data_ + i * byte_width_; auto elem = data_ + i * byte_width_;
return Reference(elem, byte_width_, 1, type_); return Reference(elem, byte_width_, 1, type_);
} }
inline Reference FixedTypedVector::operator[](size_t i) const { inline Reference FixedTypedVector::operator[](size_t i) const {
if (i >= len_) return Reference(nullptr, 1, NullPackedType()); if (i >= len_) return Reference(nullptr, 1, NullPackedType());
auto elem = data_ + i * byte_width_; auto elem = data_ + i * byte_width_;
return Reference(elem, byte_width_, 1, type_); return Reference(elem, byte_width_, 1, type_);
@@ -753,7 +767,7 @@ inline Reference FixedTypedVector::operator[](size_t i) const {
template<typename T> int KeyCompare(const void *key, const void *elem) { template<typename T> int KeyCompare(const void *key, const void *elem) {
auto str_elem = reinterpret_cast<const char *>( auto str_elem = reinterpret_cast<const char *>(
Indirect<T>(reinterpret_cast<const uint8_t *>(elem))); Indirect<T>(reinterpret_cast<const uint8_t *>(elem)));
auto skey = reinterpret_cast<const char *>(key); auto skey = reinterpret_cast<const char *>(key);
return strcmp(skey, str_elem); return strcmp(skey, str_elem);
} }
@@ -770,8 +784,7 @@ inline Reference Map::operator[](const char *key) const {
case 8: comp = KeyCompare<uint64_t>; break; case 8: comp = KeyCompare<uint64_t>; break;
} }
auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp); auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp);
if (!res) if (!res) return Reference(nullptr, 1, NullPackedType());
return Reference(nullptr, 1, NullPackedType());
auto i = (reinterpret_cast<uint8_t *>(res) - keys.data_) / keys.byte_width_; auto i = (reinterpret_cast<uint8_t *>(res) - keys.data_) / keys.byte_width_;
return (*static_cast<const Vector *>(this))[i]; return (*static_cast<const Vector *>(this))[i];
} }
@@ -817,8 +830,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
public: public:
Builder(size_t initial_size = 256, Builder(size_t initial_size = 256,
BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS) BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS)
: buf_(initial_size), finished_(false), flags_(flags), : buf_(initial_size),
force_min_bit_width_(BIT_WIDTH_8), key_pool(KeyOffsetCompare(buf_)), finished_(false),
flags_(flags),
force_min_bit_width_(BIT_WIDTH_8),
key_pool(KeyOffsetCompare(buf_)),
string_pool(StringOffsetCompare(buf_)) { string_pool(StringOffsetCompare(buf_)) {
buf_.clear(); buf_.clear();
} }
@@ -831,9 +847,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
} }
// Size of the buffer. Does not include unfinished values. // Size of the buffer. Does not include unfinished values.
size_t GetSize() const { size_t GetSize() const { return buf_.size(); }
return buf_.size();
}
// Reset all state so we can re-use the buffer. // Reset all state so we can re-use the buffer.
void Clear() { void Clear() {
@@ -851,26 +865,42 @@ class Builder FLATBUFFERS_FINAL_CLASS {
// vectors and elsewhere). // vectors and elsewhere).
void Null() { stack_.push_back(Value()); } void Null() { stack_.push_back(Value()); }
void Null(const char *key) { Key(key); Null(); } void Null(const char *key) {
Key(key);
Null();
}
void Int(int64_t i) { stack_.push_back(Value(i, TYPE_INT, WidthI(i))); } void Int(int64_t i) { stack_.push_back(Value(i, TYPE_INT, WidthI(i))); }
void Int(const char *key, int64_t i) { Key(key); Int(i); } void Int(const char *key, int64_t i) {
Key(key);
Int(i);
}
void UInt(uint64_t u) { stack_.push_back(Value(u, TYPE_UINT, WidthU(u))); } void UInt(uint64_t u) { stack_.push_back(Value(u, TYPE_UINT, WidthU(u))); }
void UInt(const char *key, uint64_t u) { Key(key); Int(u); } void UInt(const char *key, uint64_t u) {
Key(key);
Int(u);
}
void Float(float f) { stack_.push_back(Value(f)); } void Float(float f) { stack_.push_back(Value(f)); }
void Float(const char *key, float f) { Key(key); Float(f); } void Float(const char *key, float f) {
Key(key);
Float(f);
}
void Double(double f) { stack_.push_back(Value(f)); } void Double(double f) { stack_.push_back(Value(f)); }
void Double(const char *key, double d) { Key(key); Double(d); } void Double(const char *key, double d) {
Key(key);
Double(d);
}
void Bool(bool b) { stack_.push_back(Value(b)); } void Bool(bool b) { stack_.push_back(Value(b)); }
void Bool(const char *key, bool b) { Key(key); Bool(b); } void Bool(const char *key, bool b) {
Key(key);
void IndirectInt(int64_t i) { Bool(b);
PushIndirect(i, TYPE_INDIRECT_INT, WidthI(i));
} }
void IndirectInt(int64_t i) { PushIndirect(i, TYPE_INDIRECT_INT, WidthI(i)); }
void IndirectInt(const char *key, int64_t i) { void IndirectInt(const char *key, int64_t i) {
Key(key); Key(key);
IndirectInt(i); IndirectInt(i);
@@ -939,9 +969,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
} }
return sloc; return sloc;
} }
size_t String(const char *str) { size_t String(const char *str) { return String(str, strlen(str)); }
return String(str, strlen(str));
}
size_t String(const std::string &str) { size_t String(const std::string &str) {
return String(str.c_str(), str.size()); return String(str.c_str(), str.size());
} }
@@ -974,9 +1002,15 @@ class Builder FLATBUFFERS_FINAL_CLASS {
// Also some FlatBuffers types? // Also some FlatBuffers types?
size_t StartVector() { return stack_.size(); } size_t StartVector() { return stack_.size(); }
size_t StartVector(const char *key) { Key(key); return stack_.size(); } size_t StartVector(const char *key) {
Key(key);
return stack_.size();
}
size_t StartMap() { return stack_.size(); } size_t StartMap() { return stack_.size(); }
size_t StartMap(const char *key) { Key(key); return stack_.size(); } size_t StartMap(const char *key) {
Key(key);
return stack_.size();
}
// TODO(wvo): allow this to specify an aligment greater than the natural // TODO(wvo): allow this to specify an aligment greater than the natural
// alignment. // alignment.
@@ -1000,7 +1034,10 @@ class Builder FLATBUFFERS_FINAL_CLASS {
} }
// Now sort values, so later we can do a binary seach lookup. // Now sort values, so later we can do a binary seach lookup.
// We want to sort 2 array elements at a time. // We want to sort 2 array elements at a time.
struct TwoValue { Value key; Value val; }; struct TwoValue {
Value key;
Value val;
};
// TODO(wvo): strict aliasing? // TODO(wvo): strict aliasing?
// TODO(wvo): allow the caller to indicate the data is already sorted // TODO(wvo): allow the caller to indicate the data is already sorted
// for maximum efficiency? With an assert to check sortedness to make sure // for maximum efficiency? With an assert to check sortedness to make sure
@@ -1011,22 +1048,22 @@ class Builder FLATBUFFERS_FINAL_CLASS {
// sorted fashion. // sorted fashion.
// std::sort is typically already a lot faster on sorted data though. // std::sort is typically already a lot faster on sorted data though.
auto dict = auto dict =
reinterpret_cast<TwoValue *>(flatbuffers::vector_data(stack_) + reinterpret_cast<TwoValue *>(flatbuffers::vector_data(stack_) + start);
start);
std::sort(dict, dict + len, std::sort(dict, dict + len,
[&](const TwoValue &a, const TwoValue &b) -> bool { [&](const TwoValue &a, const TwoValue &b) -> bool {
auto as = reinterpret_cast<const char *>( auto as = reinterpret_cast<const char *>(
flatbuffers::vector_data(buf_) + a.key.u_); flatbuffers::vector_data(buf_) + a.key.u_);
auto bs = reinterpret_cast<const char *>( auto bs = reinterpret_cast<const char *>(
flatbuffers::vector_data(buf_) + b.key.u_); flatbuffers::vector_data(buf_) + b.key.u_);
auto comp = strcmp(as, bs); auto comp = strcmp(as, bs);
// If this assertion hits, you've added two keys with the same value to // If this assertion hits, you've added two keys with the same
// this map. // value to this map.
// TODO: Have to check for pointer equality, as some sort implementation // TODO: Have to check for pointer equality, as some sort
// apparently call this function with the same element?? Why? // implementation apparently call this function with the same
assert(comp || &a == &b); // element?? Why?
return comp < 0; assert(comp || &a == &b);
}); return comp < 0;
});
// First create a vector out of all keys. // First create a vector out of all keys.
// TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share
// the first vector. // the first vector.
@@ -1043,7 +1080,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndVector(start, false, false); return EndVector(start, false, false);
} }
template <typename F, typename T> size_t Vector(F f, T &state) { template<typename F, typename T> size_t Vector(F f, T &state) {
auto start = StartVector(); auto start = StartVector();
f(state); f(state);
return EndVector(start, false, false); return EndVector(start, false, false);
@@ -1053,8 +1090,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndVector(start, false, false); return EndVector(start, false, false);
} }
template <typename F, typename T> size_t Vector(const char *key, F f, template<typename F, typename T>
T &state) { size_t Vector(const char *key, F f, T &state) {
auto start = StartVector(key); auto start = StartVector(key);
f(state); f(state);
return EndVector(start, false, false); return EndVector(start, false, false);
@@ -1070,8 +1107,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
EndVector(start, false, false); EndVector(start, false, false);
} }
} }
template<typename T> void Vector(const char *key, const T *elems, template<typename T>
size_t len) { void Vector(const char *key, const T *elems, size_t len) {
Key(key); Key(key);
Vector(elems, len); Vector(elems, len);
} }
@@ -1084,7 +1121,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndVector(start, true, false); return EndVector(start, true, false);
} }
template <typename F, typename T> size_t TypedVector(F f, T &state) { template<typename F, typename T> size_t TypedVector(F f, T &state) {
auto start = StartVector(); auto start = StartVector();
f(state); f(state);
return EndVector(start, true, false); return EndVector(start, true, false);
@@ -1094,8 +1131,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndVector(start, true, false); return EndVector(start, true, false);
} }
template <typename F, typename T> size_t TypedVector(const char *key, F f, template<typename F, typename T>
T &state) { size_t TypedVector(const char *key, F f, T &state) {
auto start = StartVector(key); auto start = StartVector(key);
f(state); f(state);
return EndVector(start, true, false); return EndVector(start, true, false);
@@ -1110,8 +1147,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
return ScalarVector(elems, len, true); return ScalarVector(elems, len, true);
} }
template<typename T> size_t FixedTypedVector(const char *key, const T *elems, template<typename T>
size_t len) { size_t FixedTypedVector(const char *key, const T *elems, size_t len) {
Key(key); Key(key);
return FixedTypedVector(elems, len); return FixedTypedVector(elems, len);
} }
@@ -1121,7 +1158,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndMap(start); return EndMap(start);
} }
template <typename F, typename T> size_t Map(F f, T &state) { template<typename F, typename T> size_t Map(F f, T &state) {
auto start = StartMap(); auto start = StartMap();
f(state); f(state);
return EndMap(start); return EndMap(start);
@@ -1131,8 +1168,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
f(); f();
return EndMap(start); return EndMap(start);
} }
template <typename F, typename T> size_t Map(const char *key, F f, template<typename F, typename T> size_t Map(const char *key, F f, T &state) {
T &state) {
auto start = StartMap(key); auto start = StartMap(key);
f(state); f(state);
return EndMap(start); return EndMap(start);
@@ -1160,9 +1196,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
void Add(const std::string &str) { String(str); } void Add(const std::string &str) { String(str); }
void Add(const flexbuffers::String &str) { String(str); } void Add(const flexbuffers::String &str) { String(str); }
template<typename T> void Add(const std::vector<T> &vec) { template<typename T> void Add(const std::vector<T> &vec) { Vector(vec); }
Vector(vec);
}
template<typename T> void Add(const char *key, const T &t) { template<typename T> void Add(const char *key, const T &t) {
Key(key); Key(key);
@@ -1173,9 +1207,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
Map(map); Map(map);
} }
template<typename T> void operator+=(const T &t) { template<typename T> void operator+=(const T &t) { Add(t); }
Add(t);
}
// This function is useful in combination with the Mutate* functions above. // This function is useful in combination with the Mutate* functions above.
// It forces elements of vectors and maps to have a minimum size, such that // It forces elements of vectors and maps to have a minimum size, such that
@@ -1220,8 +1252,7 @@ class Builder FLATBUFFERS_FINAL_CLASS {
} }
void WriteBytes(const void *val, size_t size) { void WriteBytes(const void *val, size_t size) {
buf_.insert(buf_.end(), buf_.insert(buf_.end(), reinterpret_cast<const uint8_t *>(val),
reinterpret_cast<const uint8_t *>(val),
reinterpret_cast<const uint8_t *>(val) + size); reinterpret_cast<const uint8_t *>(val) + size);
} }
@@ -1235,8 +1266,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
switch (byte_width) { switch (byte_width) {
case 8: Write(f, byte_width); break; case 8: Write(f, byte_width); break;
case 4: Write(static_cast<float>(f), byte_width); break; case 4: Write(static_cast<float>(f), byte_width); break;
//case 2: Write(static_cast<half>(f), byte_width); break; // case 2: Write(static_cast<half>(f), byte_width); break;
//case 1: Write(static_cast<quarter>(f), byte_width); break; // case 1: Write(static_cast<quarter>(f), byte_width); break;
default: assert(0); default: assert(0);
} }
} }
@@ -1267,9 +1298,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
template<typename T> static Type GetScalarType() { template<typename T> static Type GetScalarType() {
assert(flatbuffers::is_scalar<T>::value); assert(flatbuffers::is_scalar<T>::value);
return flatbuffers::is_floating_point<T>::value return flatbuffers::is_floating_point<T>::value
? TYPE_FLOAT ? TYPE_FLOAT
: flatbuffers::is_same<T, bool>::value ? TYPE_BOOL : flatbuffers::is_same<T, bool>::value
: (flatbuffers::is_unsigned<T>::value ? TYPE_UINT : TYPE_INT); ? TYPE_BOOL
: (flatbuffers::is_unsigned<T>::value ? TYPE_UINT
: TYPE_INT);
} }
struct Value { struct Value {
@@ -1286,19 +1319,20 @@ class Builder FLATBUFFERS_FINAL_CLASS {
Value() : i_(0), type_(TYPE_NULL), min_bit_width_(BIT_WIDTH_8) {} Value() : i_(0), type_(TYPE_NULL), min_bit_width_(BIT_WIDTH_8) {}
Value(bool b) : u_(static_cast<uint64_t>(b)), type_(TYPE_BOOL), min_bit_width_(BIT_WIDTH_8) {} Value(bool b)
: u_(static_cast<uint64_t>(b)),
type_(TYPE_BOOL),
min_bit_width_(BIT_WIDTH_8) {}
Value(int64_t i, Type t, BitWidth bw) Value(int64_t i, Type t, BitWidth bw)
: i_(i), type_(t), min_bit_width_(bw) {} : i_(i), type_(t), min_bit_width_(bw) {}
Value(uint64_t u, Type t, BitWidth bw) Value(uint64_t u, Type t, BitWidth bw)
: u_(u), type_(t), min_bit_width_(bw) {} : u_(u), type_(t), min_bit_width_(bw) {}
Value(float f) Value(float f) : f_(f), type_(TYPE_FLOAT), min_bit_width_(BIT_WIDTH_32) {}
: f_(f), type_(TYPE_FLOAT), min_bit_width_(BIT_WIDTH_32) {} Value(double f) : f_(f), type_(TYPE_FLOAT), min_bit_width_(WidthF(f)) {}
Value(double f)
: f_(f), type_(TYPE_FLOAT), min_bit_width_(WidthF(f)) {}
uint8_t StoredPackedType(BitWidth parent_bit_width_= BIT_WIDTH_8) const { uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const {
return PackedType(StoredWidth(parent_bit_width_), type_); return PackedType(StoredWidth(parent_bit_width_), type_);
} }
@@ -1315,15 +1349,15 @@ class Builder FLATBUFFERS_FINAL_CLASS {
byte_width <= sizeof(flatbuffers::largest_scalar_t); byte_width <= sizeof(flatbuffers::largest_scalar_t);
byte_width *= 2) { byte_width *= 2) {
// Where are we going to write this offset? // Where are we going to write this offset?
auto offset_loc = auto offset_loc = buf_size +
buf_size + flatbuffers::PaddingBytes(buf_size, byte_width) +
flatbuffers::PaddingBytes(buf_size, byte_width) + elem_index * byte_width;
elem_index * byte_width;
// Compute relative offset. // Compute relative offset.
auto offset = offset_loc - u_; auto offset = offset_loc - u_;
// Does it fit? // Does it fit?
auto bit_width = WidthU(offset); auto bit_width = WidthU(offset);
if (static_cast<size_t>(static_cast<size_t>(1U) << bit_width) == byte_width) if (static_cast<size_t>(static_cast<size_t>(1U) << bit_width) ==
byte_width)
return bit_width; return bit_width;
} }
assert(false); // Must match one of the sizes above. assert(false); // Must match one of the sizes above.
@@ -1333,9 +1367,9 @@ class Builder FLATBUFFERS_FINAL_CLASS {
BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const {
if (IsInline(type_)) { if (IsInline(type_)) {
return (std::max)(min_bit_width_, parent_bit_width_); return (std::max)(min_bit_width_, parent_bit_width_);
} else { } else {
return min_bit_width_; return min_bit_width_;
} }
} }
}; };
@@ -1343,19 +1377,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
void WriteAny(const Value &val, uint8_t byte_width) { void WriteAny(const Value &val, uint8_t byte_width) {
switch (val.type_) { switch (val.type_) {
case TYPE_NULL: case TYPE_NULL:
case TYPE_INT: case TYPE_INT: Write(val.i_, byte_width); break;
Write(val.i_, byte_width);
break;
case TYPE_BOOL: case TYPE_BOOL:
case TYPE_UINT: case TYPE_UINT: Write(val.u_, byte_width); break;
Write(val.u_, byte_width); case TYPE_FLOAT: WriteDouble(val.f_, byte_width); break;
break; default: WriteOffset(val.u_, byte_width); break;
case TYPE_FLOAT:
WriteDouble(val.f_, byte_width);
break;
default:
WriteOffset(val.u_, byte_width);
break;
} }
} }
@@ -1369,8 +1395,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
return sloc; return sloc;
} }
template<typename T> size_t ScalarVector(const T *elems, size_t len, template<typename T>
bool fixed) { size_t ScalarVector(const T *elems, size_t len, bool fixed) {
auto vector_type = GetScalarType<T>(); auto vector_type = GetScalarType<T>();
auto byte_width = sizeof(T); auto byte_width = sizeof(T);
auto bit_width = WidthB(byte_width); auto bit_width = WidthB(byte_width);
@@ -1436,12 +1462,11 @@ class Builder FLATBUFFERS_FINAL_CLASS {
buf_.push_back(stack_[i].StoredPackedType(bit_width)); buf_.push_back(stack_[i].StoredPackedType(bit_width));
} }
} }
return Value(static_cast<uint64_t>(vloc), keys return Value(static_cast<uint64_t>(vloc),
? TYPE_MAP keys ? TYPE_MAP
: (typed : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0)
? ToTypedVector(vector_type, fixed ? vec_len : 0) : TYPE_VECTOR),
: TYPE_VECTOR), bit_width);
bit_width);
} }
// You shouldn't really be copying instances of this class. // You shouldn't really be copying instances of this class.
@@ -1473,10 +1498,10 @@ class Builder FLATBUFFERS_FINAL_CLASS {
struct StringOffsetCompare { struct StringOffsetCompare {
StringOffsetCompare(const std::vector<uint8_t> &buf) : buf_(&buf) {} StringOffsetCompare(const std::vector<uint8_t> &buf) : buf_(&buf) {}
bool operator()(const StringOffset &a, const StringOffset &b) const { bool operator()(const StringOffset &a, const StringOffset &b) const {
auto stra = reinterpret_cast<const char *>(flatbuffers::vector_data(*buf_) + auto stra = reinterpret_cast<const char *>(
a.first); flatbuffers::vector_data(*buf_) + a.first);
auto strb = reinterpret_cast<const char *>(flatbuffers::vector_data(*buf_) + auto strb = reinterpret_cast<const char *>(
b.first); flatbuffers::vector_data(*buf_) + b.first);
return strncmp(stra, strb, (std::min)(a.second, b.second) + 1) < 0; return strncmp(stra, strb, (std::min)(a.second, b.second) + 1) < 0;
} }
const std::vector<uint8_t> *buf_; const std::vector<uint8_t> *buf_;
@@ -1491,8 +1516,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
} // namespace flexbuffers } // namespace flexbuffers
#if defined(_MSC_VER) # if defined(_MSC_VER)
#pragma warning(pop) # pragma warning(pop)
#endif # endif
#endif // FLATBUFFERS_FLEXBUFFERS_H_ #endif // FLATBUFFERS_FLEXBUFFERS_H_

View File

@@ -30,13 +30,12 @@ namespace grpc {
// `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify` // `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify`
// and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer // and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer
// is refcounted and ownership is be managed automatically. // is refcounted and ownership is be managed automatically.
template <class T> template<class T> class Message {
class Message {
public: public:
Message() : slice_(grpc_empty_slice()) {} Message() : slice_(grpc_empty_slice()) {}
Message(grpc_slice slice, bool add_ref) Message(grpc_slice slice, bool add_ref)
: slice_(add_ref ? grpc_slice_ref(slice) : slice) {} : slice_(add_ref ? grpc_slice_ref(slice) : slice) {}
Message &operator=(const Message &other) = delete; Message &operator=(const Message &other) = delete;
@@ -137,7 +136,7 @@ namespace detail {
struct SliceAllocatorMember { struct SliceAllocatorMember {
SliceAllocator slice_allocator_; SliceAllocator slice_allocator_;
}; };
} } // namespace detail
// MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator // MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator
// to allocate gRPC buffers. // to allocate gRPC buffers.
@@ -145,7 +144,7 @@ class MessageBuilder : private detail::SliceAllocatorMember,
public FlatBufferBuilder { public FlatBufferBuilder {
public: public:
explicit MessageBuilder(uoffset_t initial_size = 1024) explicit MessageBuilder(uoffset_t initial_size = 1024)
: FlatBufferBuilder(initial_size, &slice_allocator_, false) {} : FlatBufferBuilder(initial_size, &slice_allocator_, false) {}
MessageBuilder(const MessageBuilder &other) = delete; MessageBuilder(const MessageBuilder &other) = delete;
MessageBuilder &operator=(const MessageBuilder &other) = delete; MessageBuilder &operator=(const MessageBuilder &other) = delete;
@@ -155,8 +154,7 @@ class MessageBuilder : private detail::SliceAllocatorMember,
// GetMessage extracts the subslice of the buffer corresponding to the // GetMessage extracts the subslice of the buffer corresponding to the
// flatbuffers-encoded region and wraps it in a `Message<T>` to handle buffer // flatbuffers-encoded region and wraps it in a `Message<T>` to handle buffer
// ownership. // ownership.
template <class T> template<class T> Message<T> GetMessage() {
Message<T> GetMessage() {
auto buf_data = buf_.buf(); // pointer to memory auto buf_data = buf_.buf(); // pointer to memory
auto buf_size = buf_.capacity(); // size of memory auto buf_size = buf_.capacity(); // size of memory
auto msg_data = buf_.data(); // pointer to msg auto msg_data = buf_.data(); // pointer to msg
@@ -178,8 +176,7 @@ class MessageBuilder : private detail::SliceAllocatorMember,
return msg; return msg;
} }
template <class T> template<class T> Message<T> ReleaseMessage() {
Message<T> ReleaseMessage() {
Message<T> msg = GetMessage<T>(); Message<T> msg = GetMessage<T>();
Reset(); Reset();
return msg; return msg;
@@ -194,8 +191,7 @@ class MessageBuilder : private detail::SliceAllocatorMember,
namespace grpc { namespace grpc {
template <class T> template<class T> class SerializationTraits<flatbuffers::grpc::Message<T>> {
class SerializationTraits<flatbuffers::grpc::Message<T>> {
public: public:
static grpc::Status Serialize(const flatbuffers::grpc::Message<T> &msg, static grpc::Status Serialize(const flatbuffers::grpc::Message<T> &msg,
grpc_byte_buffer **buffer, bool *own_buffer) { grpc_byte_buffer **buffer, bool *own_buffer) {
@@ -237,19 +233,19 @@ class SerializationTraits<flatbuffers::grpc::Message<T>> {
*msg = flatbuffers::grpc::Message<T>(slice, false); *msg = flatbuffers::grpc::Message<T>(slice, false);
} }
grpc_byte_buffer_destroy(buffer); grpc_byte_buffer_destroy(buffer);
#if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION #if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION
return ::grpc::Status::OK; return ::grpc::Status::OK;
#else #else
if (msg->Verify()) { if (msg->Verify()) {
return ::grpc::Status::OK; return ::grpc::Status::OK;
} else { } else {
return ::grpc::Status(::grpc::StatusCode::INTERNAL, return ::grpc::Status(::grpc::StatusCode::INTERNAL,
"Message verification failed"); "Message verification failed");
} }
#endif #endif
} }
}; };
} // namespace grpc; } // namespace grpc
#endif // FLATBUFFERS_GRPC_H_ #endif // FLATBUFFERS_GRPC_H_

View File

@@ -24,26 +24,22 @@
namespace flatbuffers { namespace flatbuffers {
template <typename T> template<typename T> struct FnvTraits {
struct FnvTraits {
static const T kFnvPrime; static const T kFnvPrime;
static const T kOffsetBasis; static const T kOffsetBasis;
}; };
template <> template<> struct FnvTraits<uint32_t> {
struct FnvTraits<uint32_t> {
static const uint32_t kFnvPrime = 0x01000193; static const uint32_t kFnvPrime = 0x01000193;
static const uint32_t kOffsetBasis = 0x811C9DC5; static const uint32_t kOffsetBasis = 0x811C9DC5;
}; };
template <> template<> struct FnvTraits<uint64_t> {
struct FnvTraits<uint64_t> {
static const uint64_t kFnvPrime = 0x00000100000001b3ULL; static const uint64_t kFnvPrime = 0x00000100000001b3ULL;
static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL; static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL;
}; };
template <typename T> template<typename T> T HashFnv1(const char *input) {
T HashFnv1(const char *input) {
T hash = FnvTraits<T>::kOffsetBasis; T hash = FnvTraits<T>::kOffsetBasis;
for (const char *c = input; *c; ++c) { for (const char *c = input; *c; ++c) {
hash *= FnvTraits<T>::kFnvPrime; hash *= FnvTraits<T>::kFnvPrime;
@@ -52,8 +48,7 @@ T HashFnv1(const char *input) {
return hash; return hash;
} }
template <typename T> template<typename T> T HashFnv1a(const char *input) {
T HashFnv1a(const char *input) {
T hash = FnvTraits<T>::kOffsetBasis; T hash = FnvTraits<T>::kOffsetBasis;
for (const char *c = input; *c; ++c) { for (const char *c = input; *c; ++c) {
hash ^= static_cast<unsigned char>(*c); hash ^= static_cast<unsigned char>(*c);
@@ -62,21 +57,20 @@ T HashFnv1a(const char *input) {
return hash; return hash;
} }
template <typename T> template<typename T> struct NamedHashFunction {
struct NamedHashFunction {
const char *name; const char *name;
typedef T (*HashFunction)(const char*); typedef T (*HashFunction)(const char *);
HashFunction function; HashFunction function;
}; };
const NamedHashFunction<uint32_t> kHashFunctions32[] = { const NamedHashFunction<uint32_t> kHashFunctions32[] = {
{ "fnv1_32", HashFnv1<uint32_t> }, { "fnv1_32", HashFnv1<uint32_t> },
{ "fnv1a_32", HashFnv1a<uint32_t> }, { "fnv1a_32", HashFnv1a<uint32_t> },
}; };
const NamedHashFunction<uint64_t> kHashFunctions64[] = { const NamedHashFunction<uint64_t> kHashFunctions64[] = {
{ "fnv1_64", HashFnv1<uint64_t> }, { "fnv1_64", HashFnv1<uint64_t> },
{ "fnv1a_64", HashFnv1a<uint64_t> }, { "fnv1a_64", HashFnv1a<uint64_t> },
}; };

View File

@@ -18,17 +18,17 @@
#define FLATBUFFERS_IDL_H_ #define FLATBUFFERS_IDL_H_
#include <map> #include <map>
#include <stack>
#include <memory> #include <memory>
#include <stack>
#include "flatbuffers/base.h" #include "flatbuffers/base.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/flexbuffers.h"
#include "flatbuffers/hash.h" #include "flatbuffers/hash.h"
#include "flatbuffers/reflection.h" #include "flatbuffers/reflection.h"
#include "flatbuffers/flexbuffers.h"
#if !defined(FLATBUFFERS_CPP98_STL) #if !defined(FLATBUFFERS_CPP98_STL)
#include <functional> # include <functional>
#endif // !defined(FLATBUFFERS_CPP98_STL) #endif // !defined(FLATBUFFERS_CPP98_STL)
// This file defines the data types representing a parsed IDL (Interface // This file defines the data types representing a parsed IDL (Interface
@@ -39,6 +39,7 @@ namespace flatbuffers {
// The order of these matters for Is*() functions below. // The order of these matters for Is*() functions below.
// Additionally, Parser::ParseType assumes bool..string is a contiguous range // Additionally, Parser::ParseType assumes bool..string is a contiguous range
// of type tokens. // of type tokens.
// clang-format off
#define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ #define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \
TD(NONE, "", uint8_t, byte, byte, byte, uint8) \ TD(NONE, "", uint8_t, byte, byte, byte, uint8) \
TD(UTYPE, "", uint8_t, byte, byte, byte, uint8) /* begin scalar/int */ \ TD(UTYPE, "", uint8_t, byte, byte, byte, uint8) /* begin scalar/int */ \
@@ -110,13 +111,12 @@ inline bool IsFloat (BaseType t) { return t == BASE_TYPE_FLOAT ||
inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG ||
t == BASE_TYPE_ULONG; } t == BASE_TYPE_ULONG; }
inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; }
// clang-format on
extern const char *const kTypeNames[]; extern const char *const kTypeNames[];
extern const char kTypeSizes[]; extern const char kTypeSizes[];
inline size_t SizeOf(BaseType t) { inline size_t SizeOf(BaseType t) { return kTypeSizes[t]; }
return kTypeSizes[t];
}
struct StructDef; struct StructDef;
struct EnumDef; struct EnumDef;
@@ -125,13 +125,12 @@ class Parser;
// Represents any type in the IDL, which is a combination of the BaseType // Represents any type in the IDL, which is a combination of the BaseType
// and additional information for vectors/structs_. // and additional information for vectors/structs_.
struct Type { struct Type {
explicit Type(BaseType _base_type = BASE_TYPE_NONE, explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef *_sd = nullptr,
StructDef *_sd = nullptr, EnumDef *_ed = nullptr) EnumDef *_ed = nullptr)
: base_type(_base_type), : base_type(_base_type),
element(BASE_TYPE_NONE), element(BASE_TYPE_NONE),
struct_def(_sd), struct_def(_sd),
enum_def(_ed) enum_def(_ed) {}
{}
bool operator==(const Type &o) { bool operator==(const Type &o) {
return base_type == o.base_type && element == o.element && return base_type == o.base_type && element == o.element &&
@@ -151,8 +150,9 @@ struct Type {
// Represents a parsed scalar value, it's type, and field offset. // Represents a parsed scalar value, it's type, and field offset.
struct Value { struct Value {
Value() : constant("0"), offset(static_cast<voffset_t>( Value()
~(static_cast<voffset_t>(0U)))) {} : constant("0"),
offset(static_cast<voffset_t>(~(static_cast<voffset_t>(0U)))) {}
Type type; Type type;
std::string constant; std::string constant;
voffset_t offset; voffset_t offset;
@@ -163,9 +163,7 @@ struct Value {
template<typename T> class SymbolTable { template<typename T> class SymbolTable {
public: public:
~SymbolTable() { ~SymbolTable() {
for (auto it = vec.begin(); it != vec.end(); ++it) { for (auto it = vec.begin(); it != vec.end(); ++it) { delete *it; }
delete *it;
}
} }
bool Add(const std::string &name, T *e) { bool Add(const std::string &name, T *e) {
@@ -193,15 +191,14 @@ template<typename T> class SymbolTable {
} }
public: public:
std::map<std::string, T *> dict; // quick lookup std::map<std::string, T *> dict; // quick lookup
std::vector<T *> vec; // Used to iterate in order of insertion std::vector<T *> vec; // Used to iterate in order of insertion
}; };
// A name space, as set in the schema. // A name space, as set in the schema.
struct Namespace { struct Namespace {
Namespace() : from_table(0) {} Namespace() : from_table(0) {}
// Given a (potentally unqualified) name, return the "fully qualified" name // Given a (potentally unqualified) name, return the "fully qualified" name
// which has a full namespaced descriptor. // which has a full namespaced descriptor.
// With max_components you can request less than the number of components // With max_components you can request less than the number of components
@@ -215,13 +212,16 @@ struct Namespace {
// Base class for all definition types (fields, structs_, enums_). // Base class for all definition types (fields, structs_, enums_).
struct Definition { struct Definition {
Definition() : generated(false), defined_namespace(nullptr), Definition()
serialized_location(0), index(-1), refcount(1) {} : generated(false),
defined_namespace(nullptr),
serialized_location(0),
index(-1),
refcount(1) {}
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset< flatbuffers::Offset<
reflection::KeyValue>>> flatbuffers::Vector<flatbuffers::Offset<reflection::KeyValue>>>
SerializeAttributes(FlatBufferBuilder *builder, SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const;
const Parser &parser) const;
std::string name; std::string name;
std::string file; std::string file;
@@ -237,34 +237,38 @@ struct Definition {
}; };
struct FieldDef : public Definition { struct FieldDef : public Definition {
FieldDef() : deprecated(false), required(false), key(false), FieldDef()
native_inline(false), flexbuffer(false), nested_flatbuffer(NULL), : deprecated(false),
padding(0) {} required(false),
key(false),
native_inline(false),
flexbuffer(false),
nested_flatbuffer(NULL),
padding(0) {}
Offset<reflection::Field> Serialize(FlatBufferBuilder *builder, uint16_t id, Offset<reflection::Field> Serialize(FlatBufferBuilder *builder, uint16_t id,
const Parser &parser) const; const Parser &parser) const;
Value value; Value value;
bool deprecated; // Field is allowed to be present in old data, but can't be. bool deprecated; // Field is allowed to be present in old data, but can't be.
// written in new data nor accessed in new code. // written in new data nor accessed in new code.
bool required; // Field must always be present. bool required; // Field must always be present.
bool key; // Field functions as a key for creating sorted vectors. bool key; // Field functions as a key for creating sorted vectors.
bool native_inline; // Field will be defined inline (instead of as a pointer) bool native_inline; // Field will be defined inline (instead of as a pointer)
// for native tables if field is a struct. // for native tables if field is a struct.
bool flexbuffer; // This field contains FlexBuffer data. bool flexbuffer; // This field contains FlexBuffer data.
StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data.
size_t padding; // Bytes to always pad after this field. size_t padding; // Bytes to always pad after this field.
}; };
struct StructDef : public Definition { struct StructDef : public Definition {
StructDef() StructDef()
: fixed(false), : fixed(false),
predecl(true), predecl(true),
sortbysize(true), sortbysize(true),
has_key(false), has_key(false),
minalign(1), minalign(1),
bytesize(0) bytesize(0) {}
{}
void PadLastField(size_t min_align) { void PadLastField(size_t min_align) {
auto padding = PaddingBytes(bytesize, min_align); auto padding = PaddingBytes(bytesize, min_align);
@@ -300,8 +304,7 @@ inline size_t InlineAlignment(const Type &type) {
} }
struct EnumVal { struct EnumVal {
EnumVal(const std::string &_name, int64_t _val) EnumVal(const std::string &_name, int64_t _val) : name(_name), value(_val) {}
: name(_name), value(_val) {}
Offset<reflection::EnumVal> Serialize(FlatBufferBuilder *builder) const; Offset<reflection::EnumVal> Serialize(FlatBufferBuilder *builder) const;
@@ -315,12 +318,10 @@ struct EnumDef : public Definition {
EnumDef() : is_union(false), uses_type_aliases(false) {} EnumDef() : is_union(false), uses_type_aliases(false) {}
EnumVal *ReverseLookup(int enum_idx, bool skip_union_default = true) { EnumVal *ReverseLookup(int enum_idx, bool skip_union_default = true) {
for (auto it = vals.vec.begin() + static_cast<int>(is_union && for (auto it = vals.vec.begin() +
skip_union_default); static_cast<int>(is_union && skip_union_default);
it != vals.vec.end(); ++it) { it != vals.vec.end(); ++it) {
if ((*it)->value == enum_idx) { if ((*it)->value == enum_idx) { return *it; }
return *it;
}
} }
return nullptr; return nullptr;
} }
@@ -338,8 +339,7 @@ inline bool EqualByName(const Type &a, const Type &b) {
return a.base_type == b.base_type && a.element == b.element && return a.base_type == b.base_type && a.element == b.element &&
(a.struct_def == b.struct_def || (a.struct_def == b.struct_def ||
a.struct_def->name == b.struct_def->name) && a.struct_def->name == b.struct_def->name) &&
(a.enum_def == b.enum_def || (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name);
a.enum_def->name == b.enum_def->name);
} }
struct RPCCall { struct RPCCall {
@@ -389,16 +389,16 @@ struct IDLOptions {
// Possible options for the more general generator below. // Possible options for the more general generator below.
enum Language { enum Language {
kJava = 1 << 0, kJava = 1 << 0,
kCSharp = 1 << 1, kCSharp = 1 << 1,
kGo = 1 << 2, kGo = 1 << 2,
kCpp = 1 << 3, kCpp = 1 << 3,
kJs = 1 << 4, kJs = 1 << 4,
kPython = 1 << 5, kPython = 1 << 5,
kPhp = 1 << 6, kPhp = 1 << 6,
kJson = 1 << 7, kJson = 1 << 7,
kBinary = 1 << 8, kBinary = 1 << 8,
kTs = 1 << 9, kTs = 1 << 9,
kJsonSchema = 1 << 10, kJsonSchema = 1 << 10,
kMAX kMAX
}; };
@@ -414,33 +414,35 @@ struct IDLOptions {
unsigned long lang_to_generate; unsigned long lang_to_generate;
IDLOptions() IDLOptions()
: strict_json(false), : strict_json(false),
skip_js_exports(false), skip_js_exports(false),
use_goog_js_export_format(false), use_goog_js_export_format(false),
output_default_scalars_in_json(false), output_default_scalars_in_json(false),
indent_step(2), indent_step(2),
output_enum_identifiers(true), prefixed_enums(true), scoped_enums(false), output_enum_identifiers(true),
include_dependence_headers(true), prefixed_enums(true),
mutable_buffer(false), scoped_enums(false),
one_file(false), include_dependence_headers(true),
proto_mode(false), mutable_buffer(false),
generate_all(false), one_file(false),
skip_unexpected_fields_in_json(false), proto_mode(false),
generate_name_strings(false), generate_all(false),
generate_object_based_api(false), skip_unexpected_fields_in_json(false),
cpp_object_api_pointer_type("std::unique_ptr"), generate_name_strings(false),
gen_nullable(false), generate_object_based_api(false),
object_suffix("T"), cpp_object_api_pointer_type("std::unique_ptr"),
union_value_namespacing(true), gen_nullable(false),
allow_non_utf8(false), object_suffix("T"),
keep_include_path(false), union_value_namespacing(true),
binary_schema_comments(false), allow_non_utf8(false),
skip_flatbuffers_import(false), keep_include_path(false),
reexport_ts_modules(true), binary_schema_comments(false),
protobuf_ascii_alike(false), skip_flatbuffers_import(false),
lang(IDLOptions::kJava), reexport_ts_modules(true),
mini_reflect(IDLOptions::kNone), protobuf_ascii_alike(false),
lang_to_generate(0) {} lang(IDLOptions::kJava),
mini_reflect(IDLOptions::kNone),
lang_to_generate(0) {}
}; };
// This encapsulates where the parser is in the current source file. // This encapsulates where the parser is in the current source file.
@@ -466,7 +468,7 @@ struct ParserState {
class CheckedError { class CheckedError {
public: public:
explicit CheckedError(bool error) explicit CheckedError(bool error)
: is_error_(error), has_been_checked_(false) {} : is_error_(error), has_been_checked_(false) {}
CheckedError &operator=(const CheckedError &other) { CheckedError &operator=(const CheckedError &other) {
is_error_ = other.is_error_; is_error_ = other.is_error_;
@@ -481,7 +483,10 @@ class CheckedError {
~CheckedError() { assert(has_been_checked_); } ~CheckedError() { assert(has_been_checked_); }
bool Check() { has_been_checked_ = true; return is_error_; } bool Check() {
has_been_checked_ = true;
return is_error_;
}
private: private:
bool is_error_; bool is_error_;
@@ -490,23 +495,25 @@ class CheckedError {
// Additionally, in GCC we can get these errors statically, for additional // Additionally, in GCC we can get these errors statically, for additional
// assurance: // assurance:
// clang-format off
#ifdef __GNUC__ #ifdef __GNUC__
#define FLATBUFFERS_CHECKED_ERROR CheckedError \ #define FLATBUFFERS_CHECKED_ERROR CheckedError \
__attribute__((warn_unused_result)) __attribute__((warn_unused_result))
#else #else
#define FLATBUFFERS_CHECKED_ERROR CheckedError #define FLATBUFFERS_CHECKED_ERROR CheckedError
#endif #endif
// clang-format on
class Parser : public ParserState { class Parser : public ParserState {
public: public:
explicit Parser(const IDLOptions &options = IDLOptions()) explicit Parser(const IDLOptions &options = IDLOptions())
: current_namespace_(nullptr), : current_namespace_(nullptr),
empty_namespace_(nullptr), empty_namespace_(nullptr),
root_struct_def_(nullptr), root_struct_def_(nullptr),
opts(options), opts(options),
uses_flexbuffers_(false), uses_flexbuffers_(false),
source_(nullptr), source_(nullptr),
anonymous_counter(0) { anonymous_counter(0) {
// Start out with the empty namespace being current. // Start out with the empty namespace being current.
empty_namespace_ = new Namespace(); empty_namespace_ = new Namespace();
namespaces_.push_back(empty_namespace_); namespaces_.push_back(empty_namespace_);
@@ -581,7 +588,7 @@ class Parser : public ParserState {
StructDef *LookupStruct(const std::string &id) const; StructDef *LookupStruct(const std::string &id) const;
private: private:
void Message(const std::string &msg); void Message(const std::string &msg);
void Warning(const std::string &msg); void Warning(const std::string &msg);
FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg); FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg);
@@ -606,6 +613,7 @@ private:
FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field,
size_t parent_fieldn, size_t parent_fieldn,
const StructDef *parent_struct_def); const StructDef *parent_struct_def);
// clang-format off
#if defined(FLATBUFFERS_CPP98_STL) #if defined(FLATBUFFERS_CPP98_STL)
typedef CheckedError (*ParseTableDelimitersBody)( typedef CheckedError (*ParseTableDelimitersBody)(
const std::string &name, size_t &fieldn, const StructDef *struct_def, const std::string &name, size_t &fieldn, const StructDef *struct_def,
@@ -615,6 +623,7 @@ private:
const StructDef*, void*)> const StructDef*, void*)>
ParseTableDelimitersBody; ParseTableDelimitersBody;
#endif // defined(FLATBUFFERS_CPP98_STL) #endif // defined(FLATBUFFERS_CPP98_STL)
// clang-format on
FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn,
const StructDef *struct_def, const StructDef *struct_def,
ParseTableDelimitersBody body, ParseTableDelimitersBody body,
@@ -623,6 +632,7 @@ private:
std::string *value, uoffset_t *ovalue); std::string *value, uoffset_t *ovalue);
void SerializeStruct(const StructDef &struct_def, const Value &val); void SerializeStruct(const StructDef &struct_def, const Value &val);
void AddVector(bool sortbysize, int count); void AddVector(bool sortbysize, int count);
// clang-format off
#if defined(FLATBUFFERS_CPP98_STL) #if defined(FLATBUFFERS_CPP98_STL)
typedef CheckedError (*ParseVectorDelimitersBody)(size_t &count, typedef CheckedError (*ParseVectorDelimitersBody)(size_t &count,
void *state); void *state);
@@ -630,6 +640,7 @@ private:
typedef std::function<CheckedError(size_t&, void*)> typedef std::function<CheckedError(size_t&, void*)>
ParseVectorDelimitersBody; ParseVectorDelimitersBody;
#endif // defined(FLATBUFFERS_CPP98_STL) #endif // defined(FLATBUFFERS_CPP98_STL)
// clang-format on
FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters( FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(
size_t &count, ParseVectorDelimitersBody body, void *state); size_t &count, ParseVectorDelimitersBody body, void *state);
FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue); FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue);

View File

@@ -65,8 +65,7 @@ struct IterationVisitor {
virtual void EndVector() {} virtual void EndVector() {}
virtual void Element(size_t /*i*/, ElementaryType /*type*/, virtual void Element(size_t /*i*/, ElementaryType /*type*/,
const TypeTable * /*type_table*/, const TypeTable * /*type_table*/,
const uint8_t * /*val*/) const uint8_t * /*val*/) {}
{}
virtual ~IterationVisitor() {} virtual ~IterationVisitor() {}
}; };
@@ -75,34 +74,24 @@ inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) {
case ET_UTYPE: case ET_UTYPE:
case ET_BOOL: case ET_BOOL:
case ET_CHAR: case ET_CHAR:
case ET_UCHAR: case ET_UCHAR: return 1;
return 1;
case ET_SHORT: case ET_SHORT:
case ET_USHORT: case ET_USHORT: return 2;
return 2;
case ET_INT: case ET_INT:
case ET_UINT: case ET_UINT:
case ET_FLOAT: case ET_FLOAT:
case ET_STRING: case ET_STRING: return 4;
return 4;
case ET_LONG: case ET_LONG:
case ET_ULONG: case ET_ULONG:
case ET_DOUBLE: case ET_DOUBLE: return 8;
return 8;
case ET_SEQUENCE: case ET_SEQUENCE:
switch (type_table->st) { switch (type_table->st) {
case ST_TABLE: case ST_TABLE:
case ST_UNION: case ST_UNION: return 4;
return 4; case ST_STRUCT: return type_table->values[type_table->num_elems];
case ST_STRUCT: default: assert(false); return 1;
return type_table->values[type_table->num_elems];
default:
assert(false);
return 1;
} }
default: default: assert(false); return 1;
assert(false);
return 1;
} }
} }
@@ -118,7 +107,7 @@ inline int32_t LookupEnum(int32_t enum_val, const int32_t *values,
template<typename T> const char *EnumName(T tval, const TypeTable *type_table) { template<typename T> const char *EnumName(T tval, const TypeTable *type_table) {
if (!type_table || !type_table->names) return nullptr; if (!type_table || !type_table->names) return nullptr;
auto i = LookupEnum(static_cast<int32_t>(tval), type_table->values, auto i = LookupEnum(static_cast<int32_t>(tval), type_table->values,
type_table->num_elems); type_table->num_elems);
if (i >= 0 && i < static_cast<int32_t>(type_table->num_elems)) { if (i >= 0 && i < static_cast<int32_t>(type_table->num_elems)) {
return type_table->names[i]; return type_table->names[i];
} }
@@ -126,13 +115,11 @@ template<typename T> const char *EnumName(T tval, const TypeTable *type_table) {
} }
void IterateObject(const uint8_t *obj, const TypeTable *type_table, void IterateObject(const uint8_t *obj, const TypeTable *type_table,
IterationVisitor *visitor); IterationVisitor *visitor);
inline void IterateValue(ElementaryType type, const uint8_t *val, inline void IterateValue(ElementaryType type, const uint8_t *val,
const TypeTable *type_table, const TypeTable *type_table, const uint8_t *prev_val,
const uint8_t *prev_val, soffset_t vector_index, IterationVisitor *visitor) {
soffset_t vector_index,
IterationVisitor *visitor) {
switch (type) { switch (type) {
case ET_UTYPE: { case ET_UTYPE: {
auto tval = *reinterpret_cast<const uint8_t *>(val); auto tval = *reinterpret_cast<const uint8_t *>(val);
@@ -200,9 +187,7 @@ inline void IterateValue(ElementaryType type, const uint8_t *val,
val += ReadScalar<uoffset_t>(val); val += ReadScalar<uoffset_t>(val);
IterateObject(val, type_table, visitor); IterateObject(val, type_table, visitor);
break; break;
case ST_STRUCT: case ST_STRUCT: IterateObject(val, type_table, visitor); break;
IterateObject(val, type_table, visitor);
break;
case ST_UNION: { case ST_UNION: {
val += ReadScalar<uoffset_t>(val); val += ReadScalar<uoffset_t>(val);
assert(prev_val); assert(prev_val);
@@ -211,10 +196,10 @@ inline void IterateValue(ElementaryType type, const uint8_t *val,
auto type_vec = reinterpret_cast<const Vector<uint8_t> *>(prev_val); auto type_vec = reinterpret_cast<const Vector<uint8_t> *>(prev_val);
union_type = type_vec->Get(static_cast<uoffset_t>(vector_index)); union_type = type_vec->Get(static_cast<uoffset_t>(vector_index));
} }
auto type_code_idx = LookupEnum(union_type, type_table->values, auto type_code_idx =
type_table->num_elems); LookupEnum(union_type, type_table->values, type_table->num_elems);
if (type_code_idx >= 0 && type_code_idx < if (type_code_idx >= 0 &&
static_cast<int32_t>(type_table->num_elems)) { type_code_idx < static_cast<int32_t>(type_table->num_elems)) {
auto type_code = type_table->type_codes[type_code_idx]; auto type_code = type_table->type_codes[type_code_idx];
switch (type_code.base_type) { switch (type_code.base_type) {
case ET_SEQUENCE: { case ET_SEQUENCE: {
@@ -225,17 +210,14 @@ inline void IterateValue(ElementaryType type, const uint8_t *val,
case ET_STRING: case ET_STRING:
visitor->String(reinterpret_cast<const String *>(val)); visitor->String(reinterpret_cast<const String *>(val));
break; break;
default: default: visitor->Unknown(val);
visitor->Unknown(val);
} }
} else { } else {
visitor->Unknown(val); visitor->Unknown(val);
} }
break; break;
} }
case ST_ENUM: case ST_ENUM: assert(false); break;
assert(false);
break;
} }
break; break;
} }
@@ -257,14 +239,12 @@ inline void IterateObject(const uint8_t *obj, const TypeTable *type_table,
auto is_vector = type_code.is_vector != 0; auto is_vector = type_code.is_vector != 0;
auto ref_idx = type_code.sequence_ref; auto ref_idx = type_code.sequence_ref;
const TypeTable *ref = nullptr; const TypeTable *ref = nullptr;
if (ref_idx >= 0) { if (ref_idx >= 0) { ref = type_table->type_refs[ref_idx](); }
ref = type_table->type_refs[ref_idx]();
}
auto name = type_table->names ? type_table->names[i] : nullptr; auto name = type_table->names ? type_table->names[i] : nullptr;
const uint8_t *val = nullptr; const uint8_t *val = nullptr;
if (type_table->st == ST_TABLE) { if (type_table->st == ST_TABLE) {
val = reinterpret_cast<const Table *>(obj)->GetAddressOf( val = reinterpret_cast<const Table *>(obj)->GetAddressOf(
FieldIndexToOffset(static_cast<voffset_t>(i))); FieldIndexToOffset(static_cast<voffset_t>(i)));
} else { } else {
val = obj + type_table->values[i]; val = obj + type_table->values[i];
} }
@@ -310,24 +290,29 @@ struct ToStringVisitor : public IterationVisitor {
const char *name, const uint8_t *val) { const char *name, const uint8_t *val) {
if (!val) return; if (!val) return;
if (set_idx) s += ", "; if (set_idx) s += ", ";
if (name) { s += name; s += ": "; } if (name) {
s += name;
s += ": ";
}
} }
template<typename T> void Named(T x, const char *name) { template<typename T> void Named(T x, const char *name) {
if (name) s+= name; if (name)
else s+= NumToString(x); s += name;
else
s += NumToString(x);
} }
void UType(uint8_t x, const char *name) { Named(x, name); } void UType(uint8_t x, const char *name) { Named(x, name); }
void Bool(bool x) { s+= x ? "true" : "false"; } void Bool(bool x) { s += x ? "true" : "false"; }
void Char(int8_t x, const char *name) { Named(x, name); } void Char(int8_t x, const char *name) { Named(x, name); }
void UChar(uint8_t x, const char *name) { Named(x, name); } void UChar(uint8_t x, const char *name) { Named(x, name); }
void Short(int16_t x, const char *name) { Named(x, name); } void Short(int16_t x, const char *name) { Named(x, name); }
void UShort(uint16_t x, const char *name) { Named(x, name); } void UShort(uint16_t x, const char *name) { Named(x, name); }
void Int(int32_t x, const char *name) { Named(x, name); } void Int(int32_t x, const char *name) { Named(x, name); }
void UInt(uint32_t x, const char *name) { Named(x, name); } void UInt(uint32_t x, const char *name) { Named(x, name); }
void Long(int64_t x) { s+= NumToString(x); } void Long(int64_t x) { s += NumToString(x); }
void ULong(uint64_t x) { s+= NumToString(x); } void ULong(uint64_t x) { s += NumToString(x); }
void Float(float x) { s+= NumToString(x); } void Float(float x) { s += NumToString(x); }
void Double(double x) { s+= NumToString(x); } void Double(double x) { s += NumToString(x); }
void String(const struct String *str) { void String(const struct String *str) {
EscapeString(str->c_str(), str->size(), &s, true); EscapeString(str->c_str(), str->size(), &s, true);
} }

View File

@@ -30,14 +30,18 @@ namespace flatbuffers {
// ------------------------- GETTERS ------------------------- // ------------------------- GETTERS -------------------------
inline bool IsScalar (reflection::BaseType t) { return t >= reflection::UType && inline bool IsScalar(reflection::BaseType t) {
t <= reflection::Double; } return t >= reflection::UType && t <= reflection::Double;
inline bool IsInteger(reflection::BaseType t) { return t >= reflection::UType && }
t <= reflection::ULong; } inline bool IsInteger(reflection::BaseType t) {
inline bool IsFloat (reflection::BaseType t) { return t == reflection::Float || return t >= reflection::UType && t <= reflection::ULong;
t == reflection::Double; } }
inline bool IsLong (reflection::BaseType t) { return t == reflection::Long || inline bool IsFloat(reflection::BaseType t) {
t == reflection::ULong; } return t == reflection::Float || t == reflection::Double;
}
inline bool IsLong(reflection::BaseType t) {
return t == reflection::Long || t == reflection::ULong;
}
// Size of a basic type, don't use with structs. // Size of a basic type, don't use with structs.
inline size_t GetTypeSize(reflection::BaseType base_type) { inline size_t GetTypeSize(reflection::BaseType base_type) {
@@ -48,8 +52,7 @@ inline size_t GetTypeSize(reflection::BaseType base_type) {
// Same as above, but now correctly returns the size of a struct if // Same as above, but now correctly returns the size of a struct if
// the field (or vector element) is a struct. // the field (or vector element) is a struct.
inline size_t GetTypeSizeInline(reflection::BaseType base_type, inline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index,
int type_index,
const reflection::Schema &schema) { const reflection::Schema &schema) {
if (base_type == reflection::Obj && if (base_type == reflection::Obj &&
schema.objects()->Get(type_index)->is_struct()) { schema.objects()->Get(type_index)->is_struct()) {
@@ -80,16 +83,16 @@ template<typename T> T GetFieldDefaultF(const reflection::Field &field) {
} }
// Get a field, if you know it's an integer, and its exact type. // Get a field, if you know it's an integer, and its exact type.
template<typename T> T GetFieldI(const Table &table, template<typename T>
const reflection::Field &field) { T GetFieldI(const Table &table, const reflection::Field &field) {
assert(sizeof(T) == GetTypeSize(field.type()->base_type())); assert(sizeof(T) == GetTypeSize(field.type()->base_type()));
return table.GetField<T>(field.offset(), return table.GetField<T>(field.offset(),
static_cast<T>(field.default_integer())); static_cast<T>(field.default_integer()));
} }
// Get a field, if you know it's floating point and its exact type. // Get a field, if you know it's floating point and its exact type.
template<typename T> T GetFieldF(const Table &table, template<typename T>
const reflection::Field &field) { T GetFieldF(const Table &table, const reflection::Field &field) {
assert(sizeof(T) == GetTypeSize(field.type()->base_type())); assert(sizeof(T) == GetTypeSize(field.type()->base_type()));
return table.GetField<T>(field.offset(), return table.GetField<T>(field.offset(),
static_cast<T>(field.default_real())); static_cast<T>(field.default_real()));
@@ -103,8 +106,8 @@ inline const String *GetFieldS(const Table &table,
} }
// Get a field, if you know it's a vector. // Get a field, if you know it's a vector.
template<typename T> Vector<T> *GetFieldV(const Table &table, template<typename T>
const reflection::Field &field) { Vector<T> *GetFieldV(const Table &table, const reflection::Field &field) {
assert(field.type()->base_type() == reflection::Vector && assert(field.type()->base_type() == reflection::Vector &&
sizeof(T) == GetTypeSize(field.type()->element())); sizeof(T) == GetTypeSize(field.type()->element()));
return table.GetPointer<Vector<T> *>(field.offset()); return table.GetPointer<Vector<T> *>(field.offset());
@@ -119,8 +122,7 @@ inline VectorOfAny *GetFieldAnyV(const Table &table,
} }
// Get a field, if you know it's a table. // Get a field, if you know it's a table.
inline Table *GetFieldT(const Table &table, inline Table *GetFieldT(const Table &table, const reflection::Field &field) {
const reflection::Field &field) {
assert(field.type()->base_type() == reflection::Obj || assert(field.type()->base_type() == reflection::Obj ||
field.type()->base_type() == reflection::Union); field.type()->base_type() == reflection::Union);
return table.GetPointer<Table *>(field.offset()); return table.GetPointer<Table *>(field.offset());
@@ -153,8 +155,7 @@ double GetAnyValueF(reflection::BaseType type, const uint8_t *data);
// All scalars converted using stringstream, strings as-is, and all other // All scalars converted using stringstream, strings as-is, and all other
// data types provide some level of debug-pretty-printing. // data types provide some level of debug-pretty-printing.
std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data, std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data,
const reflection::Schema *schema, const reflection::Schema *schema, int type_index);
int type_index);
// Get any table field as a 64bit int, regardless of what type it is. // Get any table field as a 64bit int, regardless of what type it is.
inline int64_t GetAnyFieldI(const Table &table, inline int64_t GetAnyFieldI(const Table &table,
@@ -165,14 +166,12 @@ inline int64_t GetAnyFieldI(const Table &table,
} }
// Get any table field as a double, regardless of what type it is. // Get any table field as a double, regardless of what type it is.
inline double GetAnyFieldF(const Table &table, inline double GetAnyFieldF(const Table &table, const reflection::Field &field) {
const reflection::Field &field) {
auto field_ptr = table.GetAddressOf(field.offset()); auto field_ptr = table.GetAddressOf(field.offset());
return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr) return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr)
: field.default_real(); : field.default_real();
} }
// Get any table field as a string, regardless of what type it is. // Get any table field as a string, regardless of what type it is.
// You may pass nullptr for the schema if you don't care to have fields that // You may pass nullptr for the schema if you don't care to have fields that
// are of table type pretty-printed. // are of table type pretty-printed.
@@ -186,15 +185,13 @@ inline std::string GetAnyFieldS(const Table &table,
} }
// Get any struct field as a 64bit int, regardless of what type it is. // Get any struct field as a 64bit int, regardless of what type it is.
inline int64_t GetAnyFieldI(const Struct &st, inline int64_t GetAnyFieldI(const Struct &st, const reflection::Field &field) {
const reflection::Field &field) {
return GetAnyValueI(field.type()->base_type(), return GetAnyValueI(field.type()->base_type(),
st.GetAddressOf(field.offset())); st.GetAddressOf(field.offset()));
} }
// Get any struct field as a double, regardless of what type it is. // Get any struct field as a double, regardless of what type it is.
inline double GetAnyFieldF(const Struct &st, inline double GetAnyFieldF(const Struct &st, const reflection::Field &field) {
const reflection::Field &field) {
return GetAnyValueF(field.type()->base_type(), return GetAnyValueF(field.type()->base_type(),
st.GetAddressOf(field.offset())); st.GetAddressOf(field.offset()));
} }
@@ -228,8 +225,8 @@ inline std::string GetAnyVectorElemS(const VectorOfAny *vec,
// Get a vector element that's a table/string/vector from a generic vector. // Get a vector element that's a table/string/vector from a generic vector.
// Pass Table/String/VectorOfAny as template parameter. // Pass Table/String/VectorOfAny as template parameter.
// Warning: does no typechecking. // Warning: does no typechecking.
template<typename T> T *GetAnyVectorElemPointer(const VectorOfAny *vec, template<typename T>
size_t i) { T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) {
auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i;
return (T *)(elem_ptr + ReadScalar<uoffset_t>(elem_ptr)); return (T *)(elem_ptr + ReadScalar<uoffset_t>(elem_ptr));
} }
@@ -239,34 +236,32 @@ template<typename T> T *GetAnyVectorElemPointer(const VectorOfAny *vec,
// Get elem_size from GetTypeSizeInline(). // Get elem_size from GetTypeSizeInline().
// Note: little-endian data on all platforms, use EndianScalar() instead of // Note: little-endian data on all platforms, use EndianScalar() instead of
// raw pointer access with scalars). // raw pointer access with scalars).
template<typename T> T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, template<typename T>
size_t i, T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i,
size_t elem_size) { size_t elem_size) {
// C-cast to allow const conversion. // C-cast to allow const conversion.
return (T *)(vec->Data() + elem_size * i); return (T *)(vec->Data() + elem_size * i);
} }
// Similarly, for elements of tables. // Similarly, for elements of tables.
template<typename T> T *GetAnyFieldAddressOf(const Table &table, template<typename T>
const reflection::Field &field) { T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) {
return (T *)table.GetAddressOf(field.offset()); return (T *)table.GetAddressOf(field.offset());
} }
// Similarly, for elements of structs. // Similarly, for elements of structs.
template<typename T> T *GetAnyFieldAddressOf(const Struct &st, template<typename T>
const reflection::Field &field) { T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) {
return (T *)st.GetAddressOf(field.offset()); return (T *)st.GetAddressOf(field.offset());
} }
// ------------------------- SETTERS ------------------------- // ------------------------- SETTERS -------------------------
// Set any scalar field, if you know its exact type. // Set any scalar field, if you know its exact type.
template<typename T> bool SetField(Table *table, const reflection::Field &field, template<typename T>
T val) { bool SetField(Table *table, const reflection::Field &field, T val) {
reflection::BaseType type = field.type()->base_type(); reflection::BaseType type = field.type()->base_type();
if (!IsScalar(type)) { if (!IsScalar(type)) { return false; }
return false;
}
assert(sizeof(T) == GetTypeSize(type)); assert(sizeof(T) == GetTypeSize(type));
T def; T def;
if (IsInteger(type)) { if (IsInteger(type)) {
@@ -306,7 +301,7 @@ inline bool SetAnyFieldF(Table *table, const reflection::Field &field,
// Set any table field as a string, regardless of what type it is. // Set any table field as a string, regardless of what type it is.
inline bool SetAnyFieldS(Table *table, const reflection::Field &field, inline bool SetAnyFieldS(Table *table, const reflection::Field &field,
const char *val) { const char *val) {
auto field_ptr = table->GetAddressOf(field.offset()); auto field_ptr = table->GetAddressOf(field.offset());
if (!field_ptr) return false; if (!field_ptr) return false;
SetAnyValueS(field.type()->base_type(), field_ptr, val); SetAnyValueS(field.type()->base_type(), field_ptr, val);
@@ -352,7 +347,6 @@ inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type,
SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val);
} }
// ------------------------- RESIZING SETTERS ------------------------- // ------------------------- RESIZING SETTERS -------------------------
// "smart" pointer for use with resizing vectors: turns a pointer inside // "smart" pointer for use with resizing vectors: turns a pointer inside
@@ -360,27 +354,25 @@ inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type,
template<typename T, typename U> class pointer_inside_vector { template<typename T, typename U> class pointer_inside_vector {
public: public:
pointer_inside_vector(T *ptr, std::vector<U> &vec) pointer_inside_vector(T *ptr, std::vector<U> &vec)
: offset_(reinterpret_cast<uint8_t *>(ptr) - : offset_(reinterpret_cast<uint8_t *>(ptr) -
reinterpret_cast<uint8_t *>(flatbuffers::vector_data(vec))), reinterpret_cast<uint8_t *>(flatbuffers::vector_data(vec))),
vec_(vec) {} vec_(vec) {}
T *operator*() const { T *operator*() const {
return reinterpret_cast<T *>( return reinterpret_cast<T *>(
reinterpret_cast<uint8_t *>( reinterpret_cast<uint8_t *>(flatbuffers::vector_data(vec_)) + offset_);
flatbuffers::vector_data(vec_)) + offset_);
}
T *operator->() const {
return operator*();
} }
T *operator->() const { return operator*(); }
void operator=(const pointer_inside_vector &piv); void operator=(const pointer_inside_vector &piv);
private: private:
size_t offset_; size_t offset_;
std::vector<U> &vec_; std::vector<U> &vec_;
}; };
// Helper to create the above easily without specifying template args. // Helper to create the above easily without specifying template args.
template<typename T, typename U> pointer_inside_vector<T, U> piv(T *ptr, template<typename T, typename U>
std::vector<U> &vec) { pointer_inside_vector<T, U> piv(T *ptr, std::vector<U> &vec) {
return pointer_inside_vector<T, U>(ptr, vec); return pointer_inside_vector<T, U>(ptr, vec);
} }
@@ -393,7 +385,7 @@ inline const reflection::Object &GetUnionType(
auto enumdef = schema.enums()->Get(unionfield.type()->index()); auto enumdef = schema.enums()->Get(unionfield.type()->index());
// TODO: this is clumsy and slow, but no other way to find it? // TODO: this is clumsy and slow, but no other way to find it?
auto type_field = parent.fields()->LookupByKey( auto type_field = parent.fields()->LookupByKey(
(unionfield.name()->str() + UnionTypeFieldSuffix()).c_str()); (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str());
assert(type_field); assert(type_field);
auto union_type = GetFieldI<uint8_t>(table, *type_field); auto union_type = GetFieldI<uint8_t>(table, *type_field);
auto enumval = enumdef->values()->LookupByKey(union_type); auto enumval = enumdef->values()->LookupByKey(union_type);
@@ -419,16 +411,14 @@ uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize,
uoffset_t elem_size, std::vector<uint8_t> *flatbuf, uoffset_t elem_size, std::vector<uint8_t> *flatbuf,
const reflection::Object *root_table = nullptr); const reflection::Object *root_table = nullptr);
template <typename T> template<typename T>
void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val,
const Vector<T> *vec, std::vector<uint8_t> *flatbuf, const Vector<T> *vec, std::vector<uint8_t> *flatbuf,
const reflection::Object *root_table = nullptr) { const reflection::Object *root_table = nullptr) {
auto delta_elem = static_cast<int>(newsize) - static_cast<int>(vec->size()); auto delta_elem = static_cast<int>(newsize) - static_cast<int>(vec->size());
auto newelems = ResizeAnyVector(schema, newsize, auto newelems = ResizeAnyVector(
reinterpret_cast<const VectorOfAny *>(vec), schema, newsize, reinterpret_cast<const VectorOfAny *>(vec), vec->size(),
vec->size(), static_cast<uoffset_t>(sizeof(T)), flatbuf, root_table);
static_cast<uoffset_t>(sizeof(T)), flatbuf,
root_table);
// Set new elements to "val". // Set new elements to "val".
for (int i = 0; i < delta_elem; i++) { for (int i = 0; i < delta_elem; i++) {
auto loc = newelems + i * sizeof(T); auto loc = newelems + i * sizeof(T);
@@ -479,10 +469,8 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
// root should point to the root type for this flatbuffer. // root should point to the root type for this flatbuffer.
// buf should point to the start of flatbuffer data. // buf should point to the start of flatbuffer data.
// length specifies the size of the flatbuffer data. // length specifies the size of the flatbuffer data.
bool Verify(const reflection::Schema &schema, bool Verify(const reflection::Schema &schema, const reflection::Object &root,
const reflection::Object &root, const uint8_t *buf, size_t length);
const uint8_t *buf,
size_t length);
} // namespace flatbuffers } // namespace flatbuffers

View File

@@ -37,18 +37,16 @@ class Registry {
// Generate text from an arbitrary FlatBuffer by looking up its // Generate text from an arbitrary FlatBuffer by looking up its
// file_identifier in the registry. // file_identifier in the registry.
bool FlatBufferToText(const uint8_t *flatbuf, size_t len, bool FlatBufferToText(const uint8_t *flatbuf, size_t len, std::string *dest) {
std::string *dest) {
// Get the identifier out of the buffer. // Get the identifier out of the buffer.
// If the buffer is truncated, exit. // If the buffer is truncated, exit.
if (len < sizeof(uoffset_t) + if (len < sizeof(uoffset_t) + FlatBufferBuilder::kFileIdentifierLength) {
FlatBufferBuilder::kFileIdentifierLength) {
lasterror_ = "buffer truncated"; lasterror_ = "buffer truncated";
return false; return false;
} }
std::string ident(reinterpret_cast<const char *>(flatbuf) + std::string ident(
sizeof(uoffset_t), reinterpret_cast<const char *>(flatbuf) + sizeof(uoffset_t),
FlatBufferBuilder::kFileIdentifierLength); FlatBufferBuilder::kFileIdentifierLength);
// Load and parse the schema. // Load and parse the schema.
Parser parser; Parser parser;
if (!LoadSchema(ident, &parser)) return false; if (!LoadSchema(ident, &parser)) return false;
@@ -82,38 +80,36 @@ class Registry {
// If schemas used contain include statements, call this function for every // If schemas used contain include statements, call this function for every
// directory the parser should search them for. // directory the parser should search them for.
void AddIncludeDirectory(const char *path) { void AddIncludeDirectory(const char *path) { include_paths_.push_back(path); }
include_paths_.push_back(path);
}
// Returns a human readable error if any of the above functions fail. // Returns a human readable error if any of the above functions fail.
const std::string &GetLastError() { return lasterror_; } const std::string &GetLastError() { return lasterror_; }
private: private:
bool LoadSchema(const std::string &ident, Parser *parser) { bool LoadSchema(const std::string &ident, Parser *parser) {
// Find the schema, if not, exit. // Find the schema, if not, exit.
auto it = schemas_.find(ident); auto it = schemas_.find(ident);
if (it == schemas_.end()) { if (it == schemas_.end()) {
// Don't attach the identifier, since it may not be human readable. // Don't attach the identifier, since it may not be human readable.
lasterror_ = "identifier for this buffer not in the registry"; lasterror_ = "identifier for this buffer not in the registry";
return false; return false;
} }
auto &schema = it->second; auto &schema = it->second;
// Load the schema from disk. If not, exit. // Load the schema from disk. If not, exit.
std::string schematext; std::string schematext;
if (!LoadFile(schema.path_.c_str(), false, &schematext)) { if (!LoadFile(schema.path_.c_str(), false, &schematext)) {
lasterror_ = "could not load schema: " + schema.path_; lasterror_ = "could not load schema: " + schema.path_;
return false; return false;
} }
// Parse schema. // Parse schema.
parser->opts = opts_; parser->opts = opts_;
if (!parser->Parse(schematext.c_str(), vector_data(include_paths_), if (!parser->Parse(schematext.c_str(), vector_data(include_paths_),
schema.path_.c_str())) { schema.path_.c_str())) {
lasterror_ = parser->error_; lasterror_ = parser->error_;
return false; return false;
} }
return true; return true;
} }
struct Schema { struct Schema {
std::string path_; std::string path_;

View File

@@ -17,6 +17,8 @@
#ifndef FLATBUFFERS_STL_EMULATION_H_ #ifndef FLATBUFFERS_STL_EMULATION_H_
#define FLATBUFFERS_STL_EMULATION_H_ #define FLATBUFFERS_STL_EMULATION_H_
// clang-format off
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>

View File

@@ -17,32 +17,31 @@
#ifndef FLATBUFFERS_UTIL_H_ #ifndef FLATBUFFERS_UTIL_H_
#define FLATBUFFERS_UTIL_H_ #define FLATBUFFERS_UTIL_H_
#include <fstream> #include <assert.h>
#include <iomanip>
#include <string>
#include <sstream>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
#ifdef _WIN32 #ifdef _WIN32
#ifndef WIN32_LEAN_AND_MEAN # ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN
#endif # endif
#ifndef NOMINMAX # ifndef NOMINMAX
#define NOMINMAX # define NOMINMAX
#endif # endif
#include <windows.h> # include <direct.h>
#include <winbase.h> # include <winbase.h>
#include <direct.h> # include <windows.h>
#else #else
#include <limits.h> # include <limits.h>
#endif #endif
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h>
#include "flatbuffers/base.h" #include "flatbuffers/base.h"
namespace flatbuffers { namespace flatbuffers {
// Convert an integer or floating point value to a string. // Convert an integer or floating point value to a string.
@@ -61,18 +60,18 @@ template<> inline std::string NumToString<unsigned char>(unsigned char t) {
return NumToString(static_cast<int>(t)); return NumToString(static_cast<int>(t));
} }
#if defined(FLATBUFFERS_CPP98_STL) #if defined(FLATBUFFERS_CPP98_STL)
template <> inline std::string NumToString<long long>(long long t) { template<> inline std::string NumToString<long long>(long long t) {
char buf[21]; // (log((1 << 63) - 1) / log(10)) + 2 char buf[21]; // (log((1 << 63) - 1) / log(10)) + 2
snprintf(buf, sizeof(buf), "%lld", t); snprintf(buf, sizeof(buf), "%lld", t);
return std::string(buf); return std::string(buf);
} }
template <> inline std::string NumToString<unsigned long long>( template<>
unsigned long long t) { inline std::string NumToString<unsigned long long>(unsigned long long t) {
char buf[22]; // (log((1 << 63) - 1) / log(10)) + 1 char buf[22]; // (log((1 << 63) - 1) / log(10)) + 1
snprintf(buf, sizeof(buf), "%llu", t); snprintf(buf, sizeof(buf), "%llu", t);
return std::string(buf); return std::string(buf);
} }
#endif // defined(FLATBUFFERS_CPP98_STL) #endif // defined(FLATBUFFERS_CPP98_STL)
// Special versions for floats/doubles. // Special versions for floats/doubles.
@@ -100,10 +99,7 @@ template<> inline std::string NumToString<float>(float t) {
// For example, IntToStringHex(0x23, 8) returns the string "00000023". // For example, IntToStringHex(0x23, 8) returns the string "00000023".
inline std::string IntToStringHex(int i, int xdigits) { inline std::string IntToStringHex(int i, int xdigits) {
std::stringstream ss; std::stringstream ss;
ss << std::setw(xdigits) ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase
<< std::setfill('0')
<< std::hex
<< std::uppercase
<< i; << i;
return ss.str(); return ss.str();
} }
@@ -111,21 +107,25 @@ inline std::string IntToStringHex(int i, int xdigits) {
// Portable implementation of strtoll(). // Portable implementation of strtoll().
inline int64_t StringToInt(const char *str, char **endptr = nullptr, inline int64_t StringToInt(const char *str, char **endptr = nullptr,
int base = 10) { int base = 10) {
// clang-format off
#ifdef _MSC_VER #ifdef _MSC_VER
return _strtoi64(str, endptr, base); return _strtoi64(str, endptr, base);
#else #else
return strtoll(str, endptr, base); return strtoll(str, endptr, base);
#endif #endif
// clang-format on
} }
// Portable implementation of strtoull(). // Portable implementation of strtoull().
inline uint64_t StringToUInt(const char *str, char **endptr = nullptr, inline uint64_t StringToUInt(const char *str, char **endptr = nullptr,
int base = 10) { int base = 10) {
// clang-format off
#ifdef _MSC_VER #ifdef _MSC_VER
return _strtoui64(str, endptr, base); return _strtoui64(str, endptr, base);
#else #else
return strtoull(str, endptr, base); return strtoull(str, endptr, base);
#endif #endif
// clang-format on
} }
typedef bool (*LoadFileFunction)(const char *filename, bool binary, typedef bool (*LoadFileFunction)(const char *filename, bool binary,
@@ -134,9 +134,8 @@ typedef bool (*FileExistsFunction)(const char *filename);
LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function); LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function);
FileExistsFunction SetFileExistsFunction(FileExistsFunction FileExistsFunction SetFileExistsFunction(
file_exists_function); FileExistsFunction file_exists_function);
// Check if file "name" exists. // Check if file "name" exists.
bool FileExists(const char *name); bool FileExists(const char *name);
@@ -239,16 +238,19 @@ inline std::string PosixPath(const char *path) {
inline void EnsureDirExists(const std::string &filepath) { inline void EnsureDirExists(const std::string &filepath) {
auto parent = StripFileName(filepath); auto parent = StripFileName(filepath);
if (parent.length()) EnsureDirExists(parent); if (parent.length()) EnsureDirExists(parent);
// clang-format off
#ifdef _WIN32 #ifdef _WIN32
(void)_mkdir(filepath.c_str()); (void)_mkdir(filepath.c_str());
#else #else
mkdir(filepath.c_str(), S_IRWXU|S_IRGRP|S_IXGRP); mkdir(filepath.c_str(), S_IRWXU|S_IRGRP|S_IXGRP);
#endif #endif
// clang-format on
} }
// Obtains the absolute path from any other path. // Obtains the absolute path from any other path.
// Returns the input path if the absolute path couldn't be resolved. // Returns the input path if the absolute path couldn't be resolved.
inline std::string AbsolutePath(const std::string &filepath) { inline std::string AbsolutePath(const std::string &filepath) {
// clang-format off
#ifdef FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION #ifdef FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
return filepath; return filepath;
#else #else
@@ -262,6 +264,7 @@ inline std::string AbsolutePath(const std::string &filepath) {
? abs_path ? abs_path
: filepath; : filepath;
#endif // FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION #endif // FLATBUFFERS_NO_ABSOLUTE_PATH_RESOLUTION
// clang-format on
} }
// To and from UTF-8 unicode conversion functions // To and from UTF-8 unicode conversion functions
@@ -279,7 +282,7 @@ inline int ToUTF8(uint32_t ucc, std::string *out) {
uint32_t remain_bits = i * 6; uint32_t remain_bits = i * 6;
// Store first byte: // Store first byte:
(*out) += static_cast<char>((0xFE << (max_bits - remain_bits)) | (*out) += static_cast<char>((0xFE << (max_bits - remain_bits)) |
(ucc >> remain_bits)); (ucc >> remain_bits));
// Store remaining bytes: // Store remaining bytes:
for (int j = i - 1; j >= 0; j--) { for (int j = i - 1; j >= 0; j--) {
(*out) += static_cast<char>(((ucc >> (j * 6)) & 0x3F) | 0x80); (*out) += static_cast<char>(((ucc >> (j * 6)) & 0x3F) | 0x80);
@@ -309,9 +312,7 @@ inline int FromUTF8(const char **in) {
if ((**in << len) & 0x80) return -1; // Bit after leading 1's must be 0. if ((**in << len) & 0x80) return -1; // Bit after leading 1's must be 0.
if (!len) return *(*in)++; if (!len) return *(*in)++;
// UTF-8 encoded values with a length are between 2 and 4 bytes. // UTF-8 encoded values with a length are between 2 and 4 bytes.
if (len < 2 || len > 4) { if (len < 2 || len > 4) { return -1; }
return -1;
}
// Grab initial bits of the code. // Grab initial bits of the code.
int ucc = *(*in)++ & ((1 << (7 - len)) - 1); int ucc = *(*in)++ & ((1 << (7 - len)) - 1);
for (int i = 0; i < len - 1; i++) { for (int i = 0; i < len - 1; i++) {
@@ -321,28 +322,20 @@ inline int FromUTF8(const char **in) {
} }
// UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for
// UTF-16 surrogate pairs). // UTF-16 surrogate pairs).
if (ucc >= 0xD800 && ucc <= 0xDFFF) { if (ucc >= 0xD800 && ucc <= 0xDFFF) { return -1; }
return -1;
}
// UTF-8 must represent code points in their shortest possible encoding. // UTF-8 must represent code points in their shortest possible encoding.
switch (len) { switch (len) {
case 2: case 2:
// Two bytes of UTF-8 can represent code points from U+0080 to U+07FF. // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF.
if (ucc < 0x0080 || ucc > 0x07FF) { if (ucc < 0x0080 || ucc > 0x07FF) { return -1; }
return -1;
}
break; break;
case 3: case 3:
// Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF. // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF.
if (ucc < 0x0800 || ucc > 0xFFFF) { if (ucc < 0x0800 || ucc > 0xFFFF) { return -1; }
return -1;
}
break; break;
case 4: case 4:
// Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF. // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF.
if (ucc < 0x10000 || ucc > 0x10FFFF) { if (ucc < 0x10000 || ucc > 0x10FFFF) { return -1; }
return -1;
}
break; break;
} }
return ucc; return ucc;
@@ -421,7 +414,8 @@ inline bool EscapeString(const char *s, size_t length, std::string *_text,
text += "\\u"; text += "\\u";
text += IntToStringHex(ucc, 4); text += IntToStringHex(ucc, 4);
} else if (ucc <= 0x10FFFF) { } else if (ucc <= 0x10FFFF) {
// Encode Unicode SMP values to a surrogate pair using two \u escapes. // Encode Unicode SMP values to a surrogate pair using two \u
// escapes.
uint32_t base = ucc - 0x10000; uint32_t base = ucc - 0x10000;
auto high_surrogate = (base >> 10) + 0xD800; auto high_surrogate = (base >> 10) + 0xD800;
auto low_surrogate = (base & 0x03FF) + 0xDC00; auto low_surrogate = (base & 0x03FF) + 0xDC00;

View File

@@ -14,13 +14,13 @@
* limitations under the License. * limitations under the License.
*/ */
#include "monster_generated.h" // Already includes "flatbuffers/flatbuffers.h". #include "monster_generated.h" // Already includes "flatbuffers/flatbuffers.h".
using namespace MyGame::Sample; using namespace MyGame::Sample;
// Example how to use FlatBuffers to create and read binary buffers. // Example how to use FlatBuffers to create and read binary buffers.
int main(int /*argc*/, const char * /*argv*/[]) { int main(int /*argc*/, const char * /*argv*/ []) {
// Build up a serialized buffer algorithmically: // Build up a serialized buffer algorithmically:
flatbuffers::FlatBufferBuilder builder; flatbuffers::FlatBufferBuilder builder;
@@ -53,7 +53,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
auto orc = CreateMonster(builder, &position, 150, 80, name, inventory, auto orc = CreateMonster(builder, &position, 150, 80, name, inventory,
Color_Red, weapons, Equipment_Weapon, axe.Union()); Color_Red, weapons, Equipment_Weapon, axe.Union());
builder.Finish(orc); // Serialize the root of the object. builder.Finish(orc); // Serialize the root of the object.
// We now have a FlatBuffer we can store on disk or send over a network. // We now have a FlatBuffer we can store on disk or send over a network.
@@ -83,8 +83,8 @@ int main(int /*argc*/, const char * /*argv*/[]) {
(void)inv; (void)inv;
// Get and test the `weapons` FlatBuffers's `vector`. // Get and test the `weapons` FlatBuffers's `vector`.
std::string expected_weapon_names[] = {"Sword", "Axe"}; std::string expected_weapon_names[] = { "Sword", "Axe" };
short expected_weapon_damages[] = {3, 5}; short expected_weapon_damages[] = { 3, 5 };
auto weps = monster->weapons(); auto weps = monster->weapons();
for (unsigned int i = 0; i < weps->size(); i++) { for (unsigned int i = 0; i < weps->size(); i++) {
assert(weps->Get(i)->name()->str() == expected_weapon_names[i]); assert(weps->Get(i)->name()->str() == expected_weapon_names[i]);
@@ -95,11 +95,10 @@ int main(int /*argc*/, const char * /*argv*/[]) {
// Get and test the `Equipment` union (`equipped` field). // Get and test the `Equipment` union (`equipped` field).
assert(monster->equipped_type() == Equipment_Weapon); assert(monster->equipped_type() == Equipment_Weapon);
auto equipped = static_cast<const Weapon*>(monster->equipped()); auto equipped = static_cast<const Weapon *>(monster->equipped());
assert(equipped->name()->str() == "Axe"); assert(equipped->name()->str() == "Axe");
assert(equipped->damage() == 5); assert(equipped->damage() == 5);
(void)equipped; (void)equipped;
printf("The FlatBuffer was successfully created and verified!\n"); printf("The FlatBuffer was successfully created and verified!\n");
} }

View File

@@ -17,13 +17,13 @@
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "monster_generated.h" // Already includes "flatbuffers/flatbuffers.h". #include "monster_generated.h" // Already includes "flatbuffers/flatbuffers.h".
using namespace MyGame::Sample; using namespace MyGame::Sample;
// This is an example of parsing text straight into a buffer and then // This is an example of parsing text straight into a buffer and then
// generating flatbuffer (JSON) text from the buffer. // generating flatbuffer (JSON) text from the buffer.
int main(int /*argc*/, const char * /*argv*/[]) { int main(int /*argc*/, const char * /*argv*/ []) {
// load FlatBuffer schema (.fbs) and JSON from disk // load FlatBuffer schema (.fbs) and JSON from disk
std::string schemafile; std::string schemafile;
std::string jsonfile; std::string jsonfile;

2
src/clang-format.sh Normal file
View File

@@ -0,0 +1,2 @@
clang-format -i -style=file include/flatbuffers/* src/*.cpp tests/test.cpp samples/*.cpp grpc/src/compiler/schema_interface.h grpc/tests/*.cpp
git checkout include/flatbuffers/reflection_generated.h

View File

@@ -20,24 +20,19 @@
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(push) # pragma warning(push)
#pragma warning(disable: 4127) // C4127: conditional expression is constant # pragma warning(disable : 4127) // C4127: conditional expression is constant
#endif #endif
namespace flatbuffers { namespace flatbuffers {
void CodeWriter::operator+=(std::string text) { void CodeWriter::operator+=(std::string text) {
while (true) { while (true) {
auto begin = text.find("{{"); auto begin = text.find("{{");
if (begin == std::string::npos) { if (begin == std::string::npos) { break; }
break;
}
auto end = text.find("}}"); auto end = text.find("}}");
if (end == std::string::npos || end < begin) { if (end == std::string::npos || end < begin) { break; }
break;
}
// Write all the text before the first {{ into the stream. // Write all the text before the first {{ into the stream.
stream_.write(text.c_str(), begin); stream_.write(text.c_str(), begin);
@@ -119,7 +114,6 @@ std::string BaseGenerator::WrapInNameSpace(const Namespace *ns,
return qualified_name + name; return qualified_name + name;
} }
std::string BaseGenerator::WrapInNameSpace(const Definition &def) const { std::string BaseGenerator::WrapInNameSpace(const Definition &def) const {
return WrapInNameSpace(def.defined_namespace, def.name); return WrapInNameSpace(def.defined_namespace, def.name);
} }
@@ -150,12 +144,12 @@ void GenComment(const std::vector<std::string> &dc, std::string *code_ptr,
if (config != nullptr && config->first_line != nullptr) { if (config != nullptr && config->first_line != nullptr) {
code += std::string(prefix) + std::string(config->first_line) + "\n"; code += std::string(prefix) + std::string(config->first_line) + "\n";
} }
std::string line_prefix = std::string(prefix) + std::string line_prefix =
((config != nullptr && config->content_line_prefix != nullptr) ? std::string(prefix) +
config->content_line_prefix : "///"); ((config != nullptr && config->content_line_prefix != nullptr)
for (auto it = dc.begin(); ? config->content_line_prefix
it != dc.end(); : "///");
++it) { for (auto it = dc.begin(); it != dc.end(); ++it) {
code += line_prefix + *it + "\n"; code += line_prefix + *it + "\n";
} }
if (config != nullptr && config->last_line != nullptr) { if (config != nullptr && config->last_line != nullptr) {
@@ -166,5 +160,5 @@ void GenComment(const std::vector<std::string> &dc, std::string *code_ptr,
} // namespace flatbuffers } // namespace flatbuffers
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(pop) # pragma warning(pop)
#endif #endif

View File

@@ -20,12 +20,10 @@
#define FLATC_VERSION "1.8.0 (" __DATE__ " " __TIME__ ")" #define FLATC_VERSION "1.8.0 (" __DATE__ " " __TIME__ ")"
namespace flatbuffers { namespace flatbuffers {
void FlatCompiler::ParseFile( void FlatCompiler::ParseFile(
flatbuffers::Parser &parser, flatbuffers::Parser &parser, const std::string &filename,
const std::string &filename,
const std::string &contents, const std::string &contents,
std::vector<const char *> &include_directories) const { std::vector<const char *> &include_directories) const {
auto local_include_directory = flatbuffers::StripFileName(filename); auto local_include_directory = flatbuffers::StripFileName(filename);
@@ -47,11 +45,11 @@ void FlatCompiler::Error(const std::string &err, bool usage,
params_.error_fn(this, err, usage, show_exe_name); params_.error_fn(this, err, usage, show_exe_name);
} }
std::string FlatCompiler::GetUsageString(const char* program_name) const { std::string FlatCompiler::GetUsageString(const char *program_name) const {
std::stringstream ss; std::stringstream ss;
ss << "Usage: " << program_name << " [OPTION]... FILE... [-- FILE...]\n"; ss << "Usage: " << program_name << " [OPTION]... FILE... [-- FILE...]\n";
for (size_t i = 0; i < params_.num_generators; ++i) { for (size_t i = 0; i < params_.num_generators; ++i) {
const Generator& g = params_.generators[i]; const Generator &g = params_.generators[i];
std::stringstream full_name; std::stringstream full_name;
full_name << std::setw(12) << std::left << g.generator_opt_long; full_name << std::setw(12) << std::left << g.generator_opt_long;
@@ -60,71 +58,73 @@ std::string FlatCompiler::GetUsageString(const char* program_name) const {
ss << " " << full_name.str() << " " << name << " " << help << ".\n"; ss << " " << full_name.str() << " " << name << " " << help << ".\n";
} }
// clang-format off
ss << ss <<
" -o PATH Prefix PATH to all generated files.\n" " -o PATH Prefix PATH to all generated files.\n"
" -I PATH Search for includes in the specified path.\n" " -I PATH Search for includes in the specified path.\n"
" -M Print make rules for generated files.\n" " -M Print make rules for generated files.\n"
" --version Print the version number of flatc and exit.\n" " --version Print the version number of flatc and exit.\n"
" --strict-json Strict JSON: field names must be / will be quoted,\n" " --strict-json Strict JSON: field names must be / will be quoted,\n"
" no trailing commas in tables/vectors.\n" " no trailing commas in tables/vectors.\n"
" --allow-non-utf8 Pass non-UTF-8 input through parser and emit nonstandard\n" " --allow-non-utf8 Pass non-UTF-8 input through parser and emit nonstandard\n"
" \\x escapes in JSON. (Default is to raise parse error on\n" " \\x escapes in JSON. (Default is to raise parse error on\n"
" non-UTF-8 input.)\n" " non-UTF-8 input.)\n"
" --defaults-json Output fields whose value is the default when\n" " --defaults-json Output fields whose value is the default when\n"
" writing JSON\n" " writing JSON\n"
" --unknown-json Allow fields in JSON that are not defined in the\n" " --unknown-json Allow fields in JSON that are not defined in the\n"
" schema. These fields will be discared when generating\n" " schema. These fields will be discared when generating\n"
" binaries.\n" " binaries.\n"
" --no-prefix Don\'t prefix enum values with the enum type in C++.\n" " --no-prefix Don\'t prefix enum values with the enum type in C++.\n"
" --scoped-enums Use C++11 style scoped and strongly typed enums.\n" " --scoped-enums Use C++11 style scoped and strongly typed enums.\n"
" also implies --no-prefix.\n" " also implies --no-prefix.\n"
" --gen-includes (deprecated), this is the default behavior.\n" " --gen-includes (deprecated), this is the default behavior.\n"
" If the original behavior is required (no include\n" " If the original behavior is required (no include\n"
" statements) use --no-includes.\n" " statements) use --no-includes.\n"
" --no-includes Don\'t generate include statements for included\n" " --no-includes Don\'t generate include statements for included\n"
" schemas the generated file depends on (C++).\n" " schemas the generated file depends on (C++).\n"
" --gen-mutable Generate accessors that can mutate buffers in-place.\n" " --gen-mutable Generate accessors that can mutate buffers in-place.\n"
" --gen-onefile Generate single output file for C# and Go.\n" " --gen-onefile Generate single output file for C# and Go.\n"
" --gen-name-strings Generate type name functions for C++.\n" " --gen-name-strings Generate type name functions for C++.\n"
" --gen-object-api Generate an additional object-based API.\n" " --gen-object-api Generate an additional object-based API.\n"
" --cpp-ptr-type T Set object API pointer type (default std::unique_ptr)\n" " --cpp-ptr-type T Set object API pointer type (default std::unique_ptr)\n"
" --cpp-str-type T Set object API string type (default std::string)\n" " --cpp-str-type T Set object API string type (default std::string)\n"
" T::c_str() and T::length() must be supported\n" " T::c_str() and T::length() must be supported\n"
" --gen-nullable Add Clang _Nullable for C++ pointer. or @Nullable for Java\n" " --gen-nullable Add Clang _Nullable for C++ pointer. or @Nullable for Java\n"
" --object-prefix Customise class prefix for C++ object-based API.\n" " --object-prefix Customise class prefix for C++ object-based API.\n"
" --object-suffix Customise class suffix for C++ object-based API.\n" " --object-suffix Customise class suffix for C++ object-based API.\n"
" Default value is \"T\"\n" " Default value is \"T\"\n"
" --no-js-exports Removes Node.js style export lines in JS.\n" " --no-js-exports Removes Node.js style export lines in JS.\n"
" --goog-js-export Uses goog.exports* for closure compiler exporting in JS.\n" " --goog-js-export Uses goog.exports* for closure compiler exporting in JS.\n"
" --go-namespace Generate the overrided namespace in Golang.\n" " --go-namespace Generate the overrided namespace in Golang.\n"
" --go-import Generate the overrided import for flatbuffers in Golang.\n" " --go-import Generate the overrided import for flatbuffers in Golang.\n"
" (default is \"github.com/google/flatbuffers/go\")\n" " (default is \"github.com/google/flatbuffers/go\")\n"
" --raw-binary Allow binaries without file_indentifier to be read.\n" " --raw-binary Allow binaries without file_indentifier to be read.\n"
" This may crash flatc given a mismatched schema.\n" " This may crash flatc given a mismatched schema.\n"
" --proto Input is a .proto, translate to .fbs.\n" " --proto Input is a .proto, translate to .fbs.\n"
" --grpc Generate GRPC interfaces for the specified languages\n" " --grpc Generate GRPC interfaces for the specified languages\n"
" --schema Serialize schemas instead of JSON (use with -b)\n" " --schema Serialize schemas instead of JSON (use with -b)\n"
" --bfbs-comments Add doc comments to the binary schema files.\n" " --bfbs-comments Add doc comments to the binary schema files.\n"
" --conform FILE Specify a schema the following schemas should be\n" " --conform FILE Specify a schema the following schemas should be\n"
" an evolution of. Gives errors if not.\n" " an evolution of. Gives errors if not.\n"
" --conform-includes Include path for the schema given with --conform\n" " --conform-includes Include path for the schema given with --conform\n"
" PATH \n" " PATH \n"
" --include-prefix Prefix this path to any generated include statements.\n" " --include-prefix Prefix this path to any generated include statements.\n"
" PATH\n" " PATH\n"
" --keep-prefix Keep original prefix of schema include statement.\n" " --keep-prefix Keep original prefix of schema include statement.\n"
" --no-fb-import Don't include flatbuffers import statement for TypeScript.\n" " --no-fb-import Don't include flatbuffers import statement for TypeScript.\n"
" --no-ts-reexport Don't re-export imported dependencies for TypeScript.\n" " --no-ts-reexport Don't re-export imported dependencies for TypeScript.\n"
" --reflect-types Add minimal type reflection to code generation.\n" " --reflect-types Add minimal type reflection to code generation.\n"
" --reflect-names Add minimal type/name reflection.\n" " --reflect-names Add minimal type/name reflection.\n"
"FILEs may be schemas (must end in .fbs), or JSON files (conforming to preceding\n" "FILEs may be schemas (must end in .fbs), or JSON files (conforming to preceding\n"
"schema). FILEs after the -- must be binary flatbuffer format files.\n" "schema). FILEs after the -- must be binary flatbuffer format files.\n"
"Output files are named using the base file name of the input,\n" "Output files are named using the base file name of the input,\n"
"and written to the current directory or the path given by -o.\n" "and written to the current directory or the path given by -o.\n"
"example: " << program_name << " -c -b schema1.fbs schema2.fbs data.json\n"; "example: " << program_name << " -c -b schema1.fbs schema2.fbs data.json\n";
// clang-format on
return ss.str(); return ss.str();
} }
int FlatCompiler::Compile(int argc, const char** argv) { int FlatCompiler::Compile(int argc, const char **argv) {
if (params_.generators == nullptr || params_.num_generators == 0) { if (params_.generators == nullptr || params_.num_generators == 0) {
return 0; return 0;
} }
@@ -153,58 +153,58 @@ int FlatCompiler::Compile(int argc, const char** argv) {
if (arg == "-o") { if (arg == "-o") {
if (++argi >= argc) Error("missing path following: " + arg, true); if (++argi >= argc) Error("missing path following: " + arg, true);
output_path = flatbuffers::ConCatPathFileName( output_path = flatbuffers::ConCatPathFileName(
flatbuffers::PosixPath(argv[argi]), ""); flatbuffers::PosixPath(argv[argi]), "");
} else if(arg == "-I") { } else if (arg == "-I") {
if (++argi >= argc) Error("missing path following" + arg, true); if (++argi >= argc) Error("missing path following" + arg, true);
include_directories_storage.push_back( include_directories_storage.push_back(
flatbuffers::PosixPath(argv[argi])); flatbuffers::PosixPath(argv[argi]));
include_directories.push_back( include_directories.push_back(
include_directories_storage.back().c_str()); include_directories_storage.back().c_str());
} else if(arg == "--conform") { } else if (arg == "--conform") {
if (++argi >= argc) Error("missing path following" + arg, true); if (++argi >= argc) Error("missing path following" + arg, true);
conform_to_schema = flatbuffers::PosixPath(argv[argi]); conform_to_schema = flatbuffers::PosixPath(argv[argi]);
} else if (arg == "--conform-includes") { } else if (arg == "--conform-includes") {
if (++argi >= argc) Error("missing path following" + arg, true); if (++argi >= argc) Error("missing path following" + arg, true);
include_directories_storage.push_back( include_directories_storage.push_back(
flatbuffers::PosixPath(argv[argi])); flatbuffers::PosixPath(argv[argi]));
conform_include_directories.push_back( conform_include_directories.push_back(
include_directories_storage.back().c_str()); include_directories_storage.back().c_str());
} else if (arg == "--include-prefix") { } else if (arg == "--include-prefix") {
if (++argi >= argc) Error("missing path following" + arg, true); if (++argi >= argc) Error("missing path following" + arg, true);
opts.include_prefix = flatbuffers::ConCatPathFileName( opts.include_prefix = flatbuffers::ConCatPathFileName(
flatbuffers::PosixPath(argv[argi]), ""); flatbuffers::PosixPath(argv[argi]), "");
} else if(arg == "--keep-prefix") { } else if (arg == "--keep-prefix") {
opts.keep_include_path = true; opts.keep_include_path = true;
} else if(arg == "--strict-json") { } else if (arg == "--strict-json") {
opts.strict_json = true; opts.strict_json = true;
} else if(arg == "--allow-non-utf8") { } else if (arg == "--allow-non-utf8") {
opts.allow_non_utf8 = true; opts.allow_non_utf8 = true;
} else if(arg == "--no-js-exports") { } else if (arg == "--no-js-exports") {
opts.skip_js_exports = true; opts.skip_js_exports = true;
} else if(arg == "--goog-js-export") { } else if (arg == "--goog-js-export") {
opts.use_goog_js_export_format = true; opts.use_goog_js_export_format = true;
} else if(arg == "--go-namespace") { } else if (arg == "--go-namespace") {
if (++argi >= argc) Error("missing golang namespace" + arg, true); if (++argi >= argc) Error("missing golang namespace" + arg, true);
opts.go_namespace = argv[argi]; opts.go_namespace = argv[argi];
} else if(arg == "--go-import") { } else if (arg == "--go-import") {
if (++argi >= argc) Error("missing golang import" + arg, true); if (++argi >= argc) Error("missing golang import" + arg, true);
opts.go_import = argv[argi]; opts.go_import = argv[argi];
} else if(arg == "--defaults-json") { } else if (arg == "--defaults-json") {
opts.output_default_scalars_in_json = true; opts.output_default_scalars_in_json = true;
} else if (arg == "--unknown-json") { } else if (arg == "--unknown-json") {
opts.skip_unexpected_fields_in_json = true; opts.skip_unexpected_fields_in_json = true;
} else if(arg == "--no-prefix") { } else if (arg == "--no-prefix") {
opts.prefixed_enums = false; opts.prefixed_enums = false;
} else if(arg == "--scoped-enums") { } else if (arg == "--scoped-enums") {
opts.prefixed_enums = false; opts.prefixed_enums = false;
opts.scoped_enums = true; opts.scoped_enums = true;
} else if (arg == "--no-union-value-namespacing") { } else if (arg == "--no-union-value-namespacing") {
opts.union_value_namespacing = false; opts.union_value_namespacing = false;
} else if(arg == "--gen-mutable") { } else if (arg == "--gen-mutable") {
opts.mutable_buffer = true; opts.mutable_buffer = true;
} else if(arg == "--gen-name-strings") { } else if (arg == "--gen-name-strings") {
opts.generate_name_strings = true; opts.generate_name_strings = true;
} else if(arg == "--gen-object-api") { } else if (arg == "--gen-object-api") {
opts.generate_object_based_api = true; opts.generate_object_based_api = true;
} else if (arg == "--cpp-ptr-type") { } else if (arg == "--cpp-ptr-type") {
if (++argi >= argc) Error("missing type following" + arg, true); if (++argi >= argc) Error("missing type following" + arg, true);
@@ -220,40 +220,40 @@ int FlatCompiler::Compile(int argc, const char** argv) {
} else if (arg == "--object-suffix") { } else if (arg == "--object-suffix") {
if (++argi >= argc) Error("missing suffix following" + arg, true); if (++argi >= argc) Error("missing suffix following" + arg, true);
opts.object_suffix = argv[argi]; opts.object_suffix = argv[argi];
} else if(arg == "--gen-all") { } else if (arg == "--gen-all") {
opts.generate_all = true; opts.generate_all = true;
opts.include_dependence_headers = false; opts.include_dependence_headers = false;
} else if(arg == "--gen-includes") { } else if (arg == "--gen-includes") {
// Deprecated, remove this option some time in the future. // Deprecated, remove this option some time in the future.
printf("warning: --gen-includes is deprecated (it is now default)\n"); printf("warning: --gen-includes is deprecated (it is now default)\n");
} else if(arg == "--no-includes") { } else if (arg == "--no-includes") {
opts.include_dependence_headers = false; opts.include_dependence_headers = false;
} else if (arg == "--gen-onefile") { } else if (arg == "--gen-onefile") {
opts.one_file = true; opts.one_file = true;
} else if (arg == "--raw-binary") { } else if (arg == "--raw-binary") {
raw_binary = true; raw_binary = true;
} else if(arg == "--") { // Separator between text and binary inputs. } else if (arg == "--") { // Separator between text and binary inputs.
binary_files_from = filenames.size(); binary_files_from = filenames.size();
} else if(arg == "--proto") { } else if (arg == "--proto") {
opts.proto_mode = true; opts.proto_mode = true;
} else if(arg == "--schema") { } else if (arg == "--schema") {
schema_binary = true; schema_binary = true;
} else if(arg == "-M") { } else if (arg == "-M") {
print_make_rules = true; print_make_rules = true;
} else if(arg == "--version") { } else if (arg == "--version") {
printf("flatc version %s\n", FLATC_VERSION); printf("flatc version %s\n", FLATC_VERSION);
exit(0); exit(0);
} else if(arg == "--grpc") { } else if (arg == "--grpc") {
grpc_enabled = true; grpc_enabled = true;
} else if(arg == "--bfbs-comments") { } else if (arg == "--bfbs-comments") {
opts.binary_schema_comments = true; opts.binary_schema_comments = true;
} else if(arg == "--no-fb-import") { } else if (arg == "--no-fb-import") {
opts.skip_flatbuffers_import = true; opts.skip_flatbuffers_import = true;
} else if(arg == "--no-ts-reexport") { } else if (arg == "--no-ts-reexport") {
opts.reexport_ts_modules = false; opts.reexport_ts_modules = false;
} else if(arg == "--reflect-types") { } else if (arg == "--reflect-types") {
opts.mini_reflect = IDLOptions::kTypes; opts.mini_reflect = IDLOptions::kTypes;
} else if(arg == "--reflect-names") { } else if (arg == "--reflect-names") {
opts.mini_reflect = IDLOptions::kTypesAndNames; opts.mini_reflect = IDLOptions::kTypesAndNames;
} else { } else {
for (size_t i = 0; i < params_.num_generators; ++i) { for (size_t i = 0; i < params_.num_generators; ++i) {
@@ -267,7 +267,7 @@ int FlatCompiler::Compile(int argc, const char** argv) {
} }
} }
Error("unknown commandline argument: " + arg, true); Error("unknown commandline argument: " + arg, true);
found:; found:;
} }
} else { } else {
filenames.push_back(flatbuffers::PosixPath(argv[argi])); filenames.push_back(flatbuffers::PosixPath(argv[argi]));
@@ -294,23 +294,22 @@ int FlatCompiler::Compile(int argc, const char** argv) {
std::unique_ptr<flatbuffers::Parser> parser(new flatbuffers::Parser(opts)); std::unique_ptr<flatbuffers::Parser> parser(new flatbuffers::Parser(opts));
for (auto file_it = filenames.begin(); for (auto file_it = filenames.begin(); file_it != filenames.end();
file_it != filenames.end(); ++file_it) {
++file_it) {
auto &filename = *file_it; auto &filename = *file_it;
std::string contents; std::string contents;
if (!flatbuffers::LoadFile(filename.c_str(), true, &contents)) if (!flatbuffers::LoadFile(filename.c_str(), true, &contents))
Error("unable to load file: " + filename); Error("unable to load file: " + filename);
bool is_binary = static_cast<size_t>(file_it - filenames.begin()) >= bool is_binary =
binary_files_from; static_cast<size_t>(file_it - filenames.begin()) >= binary_files_from;
auto ext = flatbuffers::GetExtension(filename); auto ext = flatbuffers::GetExtension(filename);
auto is_schema = ext == "fbs" || ext == "proto"; auto is_schema = ext == "fbs" || ext == "proto";
if (is_binary) { if (is_binary) {
parser->builder_.Clear(); parser->builder_.Clear();
parser->builder_.PushFlatBuffer( parser->builder_.PushFlatBuffer(
reinterpret_cast<const uint8_t *>(contents.c_str()), reinterpret_cast<const uint8_t *>(contents.c_str()),
contents.length()); contents.length());
if (!raw_binary) { if (!raw_binary) {
// Generally reading binaries that do not correspond to the schema // Generally reading binaries that do not correspond to the schema
// will crash, and sadly there's no way around that when the binary // will crash, and sadly there's no way around that when the binary
@@ -319,16 +318,15 @@ int FlatCompiler::Compile(int argc, const char** argv) {
// such an identifier, so by default we require them to match. // such an identifier, so by default we require them to match.
if (!parser->file_identifier_.length()) { if (!parser->file_identifier_.length()) {
Error("current schema has no file_identifier: cannot test if \"" + Error("current schema has no file_identifier: cannot test if \"" +
filename + filename +
"\" matches the schema, use --raw-binary to read this file" "\" matches the schema, use --raw-binary to read this file"
" anyway."); " anyway.");
} else if (!flatbuffers::BufferHasIdentifier(contents.c_str(), } else if (!flatbuffers::BufferHasIdentifier(
parser->file_identifier_.c_str())) { contents.c_str(), parser->file_identifier_.c_str())) {
Error("binary \"" + Error("binary \"" + filename +
filename + "\" does not have expected file_identifier \"" +
"\" does not have expected file_identifier \"" + parser->file_identifier_ +
parser->file_identifier_ + "\", use --raw-binary to read this file anyway.");
"\", use --raw-binary to read this file anyway.");
} }
} }
} else { } else {
@@ -346,8 +344,9 @@ int FlatCompiler::Compile(int argc, const char** argv) {
if (!is_schema && !parser->builder_.GetSize()) { if (!is_schema && !parser->builder_.GetSize()) {
// If a file doesn't end in .fbs, it must be json/binary. Ensure we // If a file doesn't end in .fbs, it must be json/binary. Ensure we
// didn't just parse a schema with a different extension. // didn't just parse a schema with a different extension.
Error("input file is neither json nor a .fbs (schema) file: " + Error(
filename, true); "input file is neither json nor a .fbs (schema) file: " + filename,
true);
} }
if (is_schema && !conform_to_schema.empty()) { if (is_schema && !conform_to_schema.empty()) {
auto err = parser->ConformTo(conform_parser); auto err = parser->ConformTo(conform_parser);
@@ -359,8 +358,8 @@ int FlatCompiler::Compile(int argc, const char** argv) {
} }
} }
std::string filebase = flatbuffers::StripPath( std::string filebase =
flatbuffers::StripExtension(filename)); flatbuffers::StripPath(flatbuffers::StripExtension(filename));
for (size_t i = 0; i < params_.num_generators; ++i) { for (size_t i = 0; i < params_.num_generators; ++i) {
parser->opts.lang = params_.generators[i].lang; parser->opts.lang = params_.generators[i].lang;
@@ -368,29 +367,28 @@ int FlatCompiler::Compile(int argc, const char** argv) {
if (!print_make_rules) { if (!print_make_rules) {
flatbuffers::EnsureDirExists(output_path); flatbuffers::EnsureDirExists(output_path);
if ((!params_.generators[i].schema_only || is_schema) && if ((!params_.generators[i].schema_only || is_schema) &&
!params_.generators[i].generate(*parser.get(), output_path, filebase)) { !params_.generators[i].generate(*parser.get(), output_path,
filebase)) {
Error(std::string("Unable to generate ") + Error(std::string("Unable to generate ") +
params_.generators[i].lang_name + params_.generators[i].lang_name + " for " + filebase);
" for " +
filebase);
} }
} else { } else {
std::string make_rule = params_.generators[i].make_rule( std::string make_rule = params_.generators[i].make_rule(
*parser.get(), output_path, filename); *parser.get(), output_path, filename);
if (!make_rule.empty()) if (!make_rule.empty())
printf("%s\n", flatbuffers::WordWrap( printf("%s\n",
make_rule, 80, " ", " \\").c_str()); flatbuffers::WordWrap(make_rule, 80, " ", " \\").c_str());
} }
if (grpc_enabled) { if (grpc_enabled) {
if (params_.generators[i].generateGRPC != nullptr) { if (params_.generators[i].generateGRPC != nullptr) {
if (!params_.generators[i].generateGRPC(*parser.get(), output_path, if (!params_.generators[i].generateGRPC(*parser.get(), output_path,
filebase)) { filebase)) {
Error(std::string("Unable to generate GRPC interface for") + Error(std::string("Unable to generate GRPC interface for") +
params_.generators[i].lang_name); params_.generators[i].lang_name);
} }
} else { } else {
Warn(std::string("GRPC interface generator not implemented for ") Warn(std::string("GRPC interface generator not implemented for ") +
+ params_.generators[i].lang_name); params_.generators[i].lang_name);
} }
} }
} }

View File

@@ -19,26 +19,17 @@
static const char *g_program_name = nullptr; static const char *g_program_name = nullptr;
static void Warn(const flatbuffers::FlatCompiler *flatc, static void Warn(const flatbuffers::FlatCompiler *flatc,
const std::string &warn, const std::string &warn, bool show_exe_name) {
bool show_exe_name) {
(void)flatc; (void)flatc;
if (show_exe_name) { if (show_exe_name) { printf("%s: ", g_program_name); }
printf("%s: ", g_program_name);
}
printf("warning: %s\n", warn.c_str()); printf("warning: %s\n", warn.c_str());
} }
static void Error(const flatbuffers::FlatCompiler *flatc, static void Error(const flatbuffers::FlatCompiler *flatc,
const std::string &err, const std::string &err, bool usage, bool show_exe_name) {
bool usage, if (show_exe_name) { printf("%s: ", g_program_name); }
bool show_exe_name) {
if (show_exe_name) {
printf("%s: ", g_program_name);
}
printf("error: %s\n", err.c_str()); printf("error: %s\n", err.c_str());
if (usage) { if (usage) { printf("%s", flatc->GetUsageString(g_program_name).c_str()); }
printf("%s", flatc->GetUsageString(g_program_name).c_str());
}
exit(1); exit(1);
} }
@@ -46,61 +37,43 @@ int main(int argc, const char *argv[]) {
g_program_name = argv[0]; g_program_name = argv[0];
const flatbuffers::FlatCompiler::Generator generators[] = { const flatbuffers::FlatCompiler::Generator generators[] = {
{ flatbuffers::GenerateBinary, "-b", "--binary", "binary", false, { flatbuffers::GenerateBinary, "-b", "--binary", "binary", false, nullptr,
nullptr,
flatbuffers::IDLOptions::kBinary, flatbuffers::IDLOptions::kBinary,
"Generate wire format binaries for any data definitions", "Generate wire format binaries for any data definitions",
flatbuffers::BinaryMakeRule }, flatbuffers::BinaryMakeRule },
{ flatbuffers::GenerateTextFile, "-t", "--json", "text", false, { flatbuffers::GenerateTextFile, "-t", "--json", "text", false, nullptr,
nullptr,
flatbuffers::IDLOptions::kJson, flatbuffers::IDLOptions::kJson,
"Generate text output for any data definitions", "Generate text output for any data definitions",
flatbuffers::TextMakeRule }, flatbuffers::TextMakeRule },
{ flatbuffers::GenerateCPP, "-c", "--cpp", "C++", true, { flatbuffers::GenerateCPP, "-c", "--cpp", "C++", true,
flatbuffers::GenerateCppGRPC, flatbuffers::GenerateCppGRPC, flatbuffers::IDLOptions::kCpp,
flatbuffers::IDLOptions::kCpp, "Generate C++ headers for tables/structs", flatbuffers::CPPMakeRule },
"Generate C++ headers for tables/structs", { flatbuffers::GenerateGo, "-g", "--go", "Go", true,
flatbuffers::CPPMakeRule }, flatbuffers::GenerateGoGRPC, flatbuffers::IDLOptions::kGo,
{ flatbuffers::GenerateGo, "-g", "--go", "Go", true, "Generate Go files for tables/structs", flatbuffers::GeneralMakeRule },
flatbuffers::GenerateGoGRPC, { flatbuffers::GenerateGeneral, "-j", "--java", "Java", true,
flatbuffers::IDLOptions::kGo, flatbuffers::GenerateJavaGRPC, flatbuffers::IDLOptions::kJava,
"Generate Go files for tables/structs",
flatbuffers::GeneralMakeRule },
{ flatbuffers::GenerateGeneral, "-j", "--java", "Java", true,
flatbuffers::GenerateJavaGRPC,
flatbuffers::IDLOptions::kJava,
"Generate Java classes for tables/structs", "Generate Java classes for tables/structs",
flatbuffers::GeneralMakeRule }, flatbuffers::GeneralMakeRule },
{ flatbuffers::GenerateJS, "-s", "--js", "JavaScript", true, { flatbuffers::GenerateJS, "-s", "--js", "JavaScript", true, nullptr,
nullptr,
flatbuffers::IDLOptions::kJs, flatbuffers::IDLOptions::kJs,
"Generate JavaScript code for tables/structs", "Generate JavaScript code for tables/structs", flatbuffers::JSMakeRule },
flatbuffers::JSMakeRule }, { flatbuffers::GenerateJS, "-T", "--ts", "TypeScript", true, nullptr,
{ flatbuffers::GenerateJS, "-T", "--ts", "TypeScript", true,
nullptr,
flatbuffers::IDLOptions::kTs, flatbuffers::IDLOptions::kTs,
"Generate TypeScript code for tables/structs", "Generate TypeScript code for tables/structs", flatbuffers::JSMakeRule },
flatbuffers::JSMakeRule }, { flatbuffers::GenerateGeneral, "-n", "--csharp", "C#", true, nullptr,
{ flatbuffers::GenerateGeneral, "-n", "--csharp", "C#", true,
nullptr,
flatbuffers::IDLOptions::kCSharp, flatbuffers::IDLOptions::kCSharp,
"Generate C# classes for tables/structs", "Generate C# classes for tables/structs", flatbuffers::GeneralMakeRule },
flatbuffers::GeneralMakeRule }, { flatbuffers::GeneratePython, "-p", "--python", "Python", true, nullptr,
{ flatbuffers::GeneratePython, "-p", "--python", "Python", true,
nullptr,
flatbuffers::IDLOptions::kPython, flatbuffers::IDLOptions::kPython,
"Generate Python files for tables/structs", "Generate Python files for tables/structs",
flatbuffers::GeneralMakeRule }, flatbuffers::GeneralMakeRule },
{ flatbuffers::GeneratePhp, nullptr, "--php", "PHP", true, { flatbuffers::GeneratePhp, nullptr, "--php", "PHP", true, nullptr,
nullptr, flatbuffers::IDLOptions::kPhp, "Generate PHP files for tables/structs",
flatbuffers::IDLOptions::kPhp,
"Generate PHP files for tables/structs",
flatbuffers::GeneralMakeRule },
{ flatbuffers::GenerateJsonSchema, nullptr, "--jsonschema", "JsonSchema", true,
nullptr,
flatbuffers::IDLOptions::kJsonSchema,
"Generate Json schema",
flatbuffers::GeneralMakeRule }, flatbuffers::GeneralMakeRule },
{ flatbuffers::GenerateJsonSchema, nullptr, "--jsonschema", "JsonSchema",
true, nullptr, flatbuffers::IDLOptions::kJsonSchema,
"Generate Json schema", flatbuffers::GeneralMakeRule },
}; };
flatbuffers::FlatCompiler::InitParams params; flatbuffers::FlatCompiler::InitParams params;

View File

@@ -14,20 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
#include <stdio.h>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include "flatbuffers/hash.h" #include "flatbuffers/hash.h"
#include <stdio.h>
enum OutputFormat { enum OutputFormat { kDecimal, kHexadecimal, kHexadecimal0x };
kDecimal,
kHexadecimal,
kHexadecimal0x
};
int main(int argc, char* argv[]) { int main(int argc, char *argv[]) {
const char* name = argv[0]; const char *name = argv[0];
if (argc <= 1) { if (argc <= 1) {
printf("%s HASH [OPTION]... STRING... [-- STRING...]\n", name); printf("%s HASH [OPTION]... STRING... [-- STRING...]\n", name);
printf("Available hashing algorithms:\n 32 bit:\n"); printf("Available hashing algorithms:\n 32 bit:\n");
@@ -50,7 +46,7 @@ int main(int argc, char* argv[]) {
return 0; return 0;
} }
const char* hash_algorithm = argv[1]; const char *hash_algorithm = argv[1];
flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 = flatbuffers::NamedHashFunction<uint32_t>::HashFunction hash_function32 =
flatbuffers::FindHashFunction32(hash_algorithm); flatbuffers::FindHashFunction32(hash_algorithm);
@@ -66,15 +62,21 @@ int main(int argc, char* argv[]) {
bool annotate = false; bool annotate = false;
bool escape_dash = false; bool escape_dash = false;
for (int i = 2; i < argc; i++) { for (int i = 2; i < argc; i++) {
const char* arg = argv[i]; const char *arg = argv[i];
if (!escape_dash && arg[0] == '-') { if (!escape_dash && arg[0] == '-') {
std::string opt = arg; std::string opt = arg;
if (opt == "-d") output_format = kDecimal; if (opt == "-d")
else if (opt == "-x") output_format = kHexadecimal; output_format = kDecimal;
else if (opt == "-0x") output_format = kHexadecimal0x; else if (opt == "-x")
else if (opt == "-c") annotate = true; output_format = kHexadecimal;
else if (opt == "--") escape_dash = true; else if (opt == "-0x")
else printf("Unrecognized argument: \"%s\"\n", arg); output_format = kHexadecimal0x;
else if (opt == "-c")
annotate = true;
else if (opt == "--")
escape_dash = true;
else
printf("Unrecognized argument: \"%s\"\n", arg);
} else { } else {
std::stringstream ss; std::stringstream ss;
if (output_format == kDecimal) { if (output_format == kDecimal) {
@@ -90,8 +92,7 @@ int main(int argc, char* argv[]) {
else if (hash_function64) else if (hash_function64)
ss << hash_function64(arg); ss << hash_function64(arg);
if (annotate) if (annotate) ss << " /* \"" << arg << "\" */";
ss << " /* \"" << arg << "\" */";
ss << "\n"; ss << "\n";
@@ -100,4 +101,3 @@ int main(int argc, char* argv[]) {
} }
return 0; return 0;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -16,10 +16,10 @@
// independent from idl_parser, since this code is not needed for most clients // independent from idl_parser, since this code is not needed for most clients
#include "flatbuffers/code_generators.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "flatbuffers/code_generators.h"
namespace flatbuffers { namespace flatbuffers {
@@ -27,16 +27,15 @@ static std::string GenType(const Type &type, bool underlying = false) {
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_STRUCT: case BASE_TYPE_STRUCT:
return type.struct_def->defined_namespace->GetFullyQualifiedName( return type.struct_def->defined_namespace->GetFullyQualifiedName(
type.struct_def->name); type.struct_def->name);
case BASE_TYPE_VECTOR: case BASE_TYPE_VECTOR: return "[" + GenType(type.VectorType()) + "]";
return "[" + GenType(type.VectorType()) + "]";
default: default:
if (type.enum_def && !underlying) { if (type.enum_def && !underlying) {
return type.enum_def->defined_namespace->GetFullyQualifiedName( return type.enum_def->defined_namespace->GetFullyQualifiedName(
type.enum_def->name); type.enum_def->name);
} else { } else {
return kTypeNames[type.base_type]; return kTypeNames[type.base_type];
} }
} }
} }
@@ -47,7 +46,7 @@ static void GenNameSpace(const Namespace &name_space, std::string *_schema,
auto &schema = *_schema; auto &schema = *_schema;
schema += "namespace "; schema += "namespace ";
for (auto it = name_space.components.begin(); for (auto it = name_space.components.begin();
it != name_space.components.end(); ++it) { it != name_space.components.end(); ++it) {
if (it != name_space.components.begin()) schema += "."; if (it != name_space.components.begin()) schema += ".";
schema += *it; schema += *it;
} }
@@ -69,6 +68,7 @@ std::string GenerateFBS(const Parser &parser, const std::string &file_name) {
std::string schema; std::string schema;
schema += "// Generated from " + file_name + ".proto\n\n"; schema += "// Generated from " + file_name + ".proto\n\n";
if (parser.opts.include_dependence_headers) { if (parser.opts.include_dependence_headers) {
// clang-format off
#ifdef FBS_GEN_INCLUDES // TODO: currently all in one file. #ifdef FBS_GEN_INCLUDES // TODO: currently all in one file.
int num_includes = 0; int num_includes = 0;
for (auto it = parser.included_files_.begin(); for (auto it = parser.included_files_.begin();
@@ -82,18 +82,19 @@ std::string GenerateFBS(const Parser &parser, const std::string &file_name) {
} }
if (num_includes) schema += "\n"; if (num_includes) schema += "\n";
#endif #endif
// clang-format on
} }
// Generate code for all the enum declarations. // Generate code for all the enum declarations.
const Namespace *last_namespace = nullptr; const Namespace *last_namespace = nullptr;
for (auto enum_def_it = parser.enums_.vec.begin(); for (auto enum_def_it = parser.enums_.vec.begin();
enum_def_it != parser.enums_.vec.end(); ++enum_def_it) { enum_def_it != parser.enums_.vec.end(); ++enum_def_it) {
EnumDef &enum_def = **enum_def_it; EnumDef &enum_def = **enum_def_it;
GenNameSpace(*enum_def.defined_namespace, &schema, &last_namespace); GenNameSpace(*enum_def.defined_namespace, &schema, &last_namespace);
GenComment(enum_def.doc_comment, &schema, nullptr); GenComment(enum_def.doc_comment, &schema, nullptr);
schema += "enum " + enum_def.name + " : "; schema += "enum " + enum_def.name + " : ";
schema += GenType(enum_def.underlying_type, true) + " {\n"; schema += GenType(enum_def.underlying_type, true) + " {\n";
for (auto it = enum_def.vals.vec.begin(); for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
it != enum_def.vals.vec.end(); ++it) { ++it) {
auto &ev = **it; auto &ev = **it;
GenComment(ev.doc_comment, &schema, nullptr, " "); GenComment(ev.doc_comment, &schema, nullptr, " ");
schema += " " + ev.name + " = " + NumToString(ev.value) + ",\n"; schema += " " + ev.name + " = " + NumToString(ev.value) + ",\n";
@@ -101,14 +102,14 @@ std::string GenerateFBS(const Parser &parser, const std::string &file_name) {
schema += "}\n\n"; schema += "}\n\n";
} }
// Generate code for all structs/tables. // Generate code for all structs/tables.
for (auto it = parser.structs_.vec.begin(); for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();
it != parser.structs_.vec.end(); ++it) { ++it) {
StructDef &struct_def = **it; StructDef &struct_def = **it;
GenNameSpace(*struct_def.defined_namespace, &schema, &last_namespace); GenNameSpace(*struct_def.defined_namespace, &schema, &last_namespace);
GenComment(struct_def.doc_comment, &schema, nullptr); GenComment(struct_def.doc_comment, &schema, nullptr);
schema += "table " + struct_def.name + " {\n"; schema += "table " + struct_def.name + " {\n";
for (auto field_it = struct_def.fields.vec.begin(); for (auto field_it = struct_def.fields.vec.begin();
field_it != struct_def.fields.vec.end(); ++field_it) { field_it != struct_def.fields.vec.end(); ++field_it) {
auto &field = **field_it; auto &field = **field_it;
if (field.value.type.base_type != BASE_TYPE_UTYPE) { if (field.value.type.base_type != BASE_TYPE_UTYPE) {
GenComment(field.doc_comment, &schema, nullptr, " "); GenComment(field.doc_comment, &schema, nullptr, " ");
@@ -123,12 +124,10 @@ std::string GenerateFBS(const Parser &parser, const std::string &file_name) {
return schema; return schema;
} }
bool GenerateFBS(const Parser &parser, bool GenerateFBS(const Parser &parser, const std::string &path,
const std::string &path,
const std::string &file_name) { const std::string &file_name) {
return SaveFile((path + file_name + ".fbs").c_str(), return SaveFile((path + file_name + ".fbs").c_str(),
GenerateFBS(parser, file_name), false); GenerateFBS(parser, file_name), false);
} }
} // namespace flatbuffers } // namespace flatbuffers

File diff suppressed because it is too large Load Diff

View File

@@ -16,21 +16,21 @@
// independent from idl_parser, since this code is not needed for most clients // independent from idl_parser, since this code is not needed for most clients
#include <string>
#include <sstream> #include <sstream>
#include <string>
#include "flatbuffers/code_generators.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "flatbuffers/code_generators.h"
#ifdef _WIN32 #ifdef _WIN32
#include <direct.h> # include <direct.h>
#define PATH_SEPARATOR "\\" # define PATH_SEPARATOR "\\"
#define mkdir(n, m) _mkdir(n) # define mkdir(n, m) _mkdir(n)
#else #else
#include <sys/stat.h> # include <sys/stat.h>
#define PATH_SEPARATOR "/" # define PATH_SEPARATOR "/"
#endif #endif
namespace flatbuffers { namespace flatbuffers {
@@ -44,9 +44,10 @@ namespace go {
// see https://golang.org/ref/spec#Keywords // see https://golang.org/ref/spec#Keywords
static const char *g_golang_keywords[] = { static const char *g_golang_keywords[] = {
"break", "default", "func", "interface", "select", "case", "defer", "go", "break", "default", "func", "interface", "select", "case", "defer",
"map", "struct", "chan", "else", "goto", "package", "switch", "const", "go", "map", "struct", "chan", "else", "goto", "package",
"fallthrough", "if", "range", "type", "continue", "for", "import", "return", "var", "switch", "const", "fallthrough", "if", "range", "type", "continue",
"for", "import", "return", "var",
}; };
static std::string GenGetter(const Type &type); static std::string GenGetter(const Type &type);
@@ -57,23 +58,20 @@ static void GenReceiver(const StructDef &struct_def, std::string *code_ptr);
static std::string GenTypeBasic(const Type &type); static std::string GenTypeBasic(const Type &type);
static std::string GenTypeGet(const Type &type); static std::string GenTypeGet(const Type &type);
static std::string TypeName(const FieldDef &field); static std::string TypeName(const FieldDef &field);
static std::string GoIdentity(const std::string& name) { static std::string GoIdentity(const std::string &name) {
for (size_t i=0; i<sizeof(g_golang_keywords)/sizeof(g_golang_keywords[0]); i++) { for (size_t i = 0;
if (name == g_golang_keywords[i]) { i < sizeof(g_golang_keywords) / sizeof(g_golang_keywords[0]); i++) {
return MakeCamel(name + "_", false); if (name == g_golang_keywords[i]) { return MakeCamel(name + "_", false); }
}
} }
return MakeCamel(name, false); return MakeCamel(name, false);
} }
// Most field accessors need to retrieve and test the field offset first, // Most field accessors need to retrieve and test the field offset first,
// this is the prefix code for that. // this is the prefix code for that.
std::string OffsetPrefix(const FieldDef &field) { std::string OffsetPrefix(const FieldDef &field) {
return "{\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(" + return "{\n\to := flatbuffers.UOffsetT(rcv._tab.Offset(" +
NumToString(field.value.offset) + NumToString(field.value.offset) + "))\n\tif o != 0 {\n";
"))\n\tif o != 0 {\n";
} }
// Begin a class declaration. // Begin a class declaration.
@@ -169,7 +167,7 @@ static void InitializeExisting(const StructDef &struct_def,
// Implement the table accessor // Implement the table accessor
static void GenTableAccessor(const StructDef &struct_def, static void GenTableAccessor(const StructDef &struct_def,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
@@ -177,16 +175,15 @@ static void GenTableAccessor(const StructDef &struct_def,
code += "{\n"; code += "{\n";
if (struct_def.fixed) { if (struct_def.fixed) {
code += "\treturn rcv._tab.Table\n"; code += "\treturn rcv._tab.Table\n";
} else { } else {
code += "\treturn rcv._tab\n"; code += "\treturn rcv._tab\n";
} }
code += "}\n\n"; code += "}\n\n";
} }
// Get the length of a vector. // Get the length of a vector.
static void GetVectorLen(const StructDef &struct_def, static void GetVectorLen(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
@@ -198,8 +195,7 @@ static void GetVectorLen(const StructDef &struct_def,
} }
// Get a [ubyte] vector as a byte slice. // Get a [ubyte] vector as a byte slice.
static void GetUByteSlice(const StructDef &struct_def, static void GetUByteSlice(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
@@ -219,7 +215,7 @@ static void GetScalarFieldOfStruct(const StructDef &struct_def,
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
code += " " + MakeCamel(field.name); code += " " + MakeCamel(field.name);
code += "() " + TypeName(field) + " {\n"; code += "() " + TypeName(field) + " {\n";
code +="\treturn " + getter; code += "\treturn " + getter;
code += "(rcv._tab.Pos + flatbuffers.UOffsetT("; code += "(rcv._tab.Pos + flatbuffers.UOffsetT(";
code += NumToString(field.value.offset) + "))\n}\n"; code += NumToString(field.value.offset) + "))\n}\n";
} }
@@ -284,12 +280,11 @@ static void GetStructFieldOfTable(const StructDef &struct_def,
} }
// Get the value of a string. // Get the value of a string.
static void GetStringField(const StructDef &struct_def, static void GetStringField(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
code += " " + MakeCamel(field.name); code += " " + MakeCamel(field.name);
code += "() " + TypeName(field) + " "; code += "() " + TypeName(field) + " ";
code += OffsetPrefix(field) + "\t\treturn " + GenGetter(field.value.type); code += OffsetPrefix(field) + "\t\treturn " + GenGetter(field.value.type);
code += "(o + rcv._tab.Pos)\n\t}\n\treturn nil\n"; code += "(o + rcv._tab.Pos)\n\t}\n\treturn nil\n";
@@ -297,8 +292,7 @@ static void GetStringField(const StructDef &struct_def,
} }
// Get the value of a union from an object. // Get the value of a union from an object.
static void GetUnionField(const StructDef &struct_def, static void GetUnionField(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
@@ -365,8 +359,8 @@ static void BeginBuilderArgs(const StructDef &struct_def,
std::string &code = *code_ptr; std::string &code = *code_ptr;
if (code.substr(code.length() - 2) != "\n\n") { if (code.substr(code.length() - 2) != "\n\n") {
// a previous mutate has not put an extra new line // a previous mutate has not put an extra new line
code += "\n"; code += "\n";
} }
code += "func Create" + struct_def.name; code += "func Create" + struct_def.name;
code += "(builder *flatbuffers.Builder"; code += "(builder *flatbuffers.Builder";
@@ -375,22 +369,19 @@ static void BeginBuilderArgs(const StructDef &struct_def,
// Recursively generate arguments for a constructor, to deal with nested // Recursively generate arguments for a constructor, to deal with nested
// structs. // structs.
static void StructBuilderArgs(const StructDef &struct_def, static void StructBuilderArgs(const StructDef &struct_def,
const char *nameprefix, const char *nameprefix, std::string *code_ptr) {
std::string *code_ptr) {
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (IsStruct(field.value.type)) { if (IsStruct(field.value.type)) {
// Generate arguments for a struct inside a struct. To ensure names // Generate arguments for a struct inside a struct. To ensure names
// don't clash, and to make it obvious these arguments are constructing // don't clash, and to make it obvious these arguments are constructing
// a nested struct, prefix the name with the field name. // a nested struct, prefix the name with the field name.
StructBuilderArgs(*field.value.type.struct_def, StructBuilderArgs(*field.value.type.struct_def,
(nameprefix + (field.name + "_")).c_str(), (nameprefix + (field.name + "_")).c_str(), code_ptr);
code_ptr);
} else { } else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string)", " + nameprefix; code += (std::string) ", " + nameprefix;
code += GoIdentity(field.name); code += GoIdentity(field.name);
code += " " + GenTypeBasic(field.value.type); code += " " + GenTypeBasic(field.value.type);
} }
@@ -406,21 +397,18 @@ static void EndBuilderArgs(std::string *code_ptr) {
// Recursively generate struct construction statements and instert manual // Recursively generate struct construction statements and instert manual
// padding. // padding.
static void StructBuilderBody(const StructDef &struct_def, static void StructBuilderBody(const StructDef &struct_def,
const char *nameprefix, const char *nameprefix, std::string *code_ptr) {
std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += "\tbuilder.Prep(" + NumToString(struct_def.minalign) + ", "; code += "\tbuilder.Prep(" + NumToString(struct_def.minalign) + ", ";
code += NumToString(struct_def.bytesize) + ")\n"; code += NumToString(struct_def.bytesize) + ")\n";
for (auto it = struct_def.fields.vec.rbegin(); for (auto it = struct_def.fields.vec.rbegin();
it != struct_def.fields.vec.rend(); it != struct_def.fields.vec.rend(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.padding) if (field.padding)
code += "\tbuilder.Pad(" + NumToString(field.padding) + ")\n"; code += "\tbuilder.Pad(" + NumToString(field.padding) + ")\n";
if (IsStruct(field.value.type)) { if (IsStruct(field.value.type)) {
StructBuilderBody(*field.value.type.struct_def, StructBuilderBody(*field.value.type.struct_def,
(nameprefix + (field.name + "_")).c_str(), (nameprefix + (field.name + "_")).c_str(), code_ptr);
code_ptr);
} else { } else {
code += "\tbuilder.Prepend" + GenMethod(field) + "("; code += "\tbuilder.Prepend" + GenMethod(field) + "(";
code += nameprefix + GoIdentity(field.name) + ")\n"; code += nameprefix + GoIdentity(field.name) + ")\n";
@@ -447,8 +435,7 @@ static void GetStartOfTable(const StructDef &struct_def,
// Set the value of a table's field. // Set the value of a table's field.
static void BuildFieldOfTable(const StructDef &struct_def, static void BuildFieldOfTable(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, const size_t offset,
const size_t offset,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += "func " + struct_def.name + "Add" + MakeCamel(field.name); code += "func " + struct_def.name + "Add" + MakeCamel(field.name);
@@ -476,8 +463,7 @@ static void BuildFieldOfTable(const StructDef &struct_def,
// Set the value of one of the members of a table's vector. // Set the value of one of the members of a table's vector.
static void BuildVectorOfTable(const StructDef &struct_def, static void BuildVectorOfTable(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, std::string *code_ptr) {
std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += "func " + struct_def.name + "Start"; code += "func " + struct_def.name + "Start";
code += MakeCamel(field.name); code += MakeCamel(field.name);
@@ -508,8 +494,7 @@ static void GenReceiver(const StructDef &struct_def, std::string *code_ptr) {
// Generate a struct field getter, conditioned on its child type(s). // Generate a struct field getter, conditioned on its child type(s).
static void GenStructAccessor(const StructDef &struct_def, static void GenStructAccessor(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, std::string *code_ptr) {
std::string *code_ptr) {
GenComment(field.doc_comment, code_ptr, nullptr, ""); GenComment(field.doc_comment, code_ptr, nullptr, "");
if (IsScalar(field.value.type.base_type)) { if (IsScalar(field.value.type.base_type)) {
if (struct_def.fixed) { if (struct_def.fixed) {
@@ -526,9 +511,7 @@ static void GenStructAccessor(const StructDef &struct_def,
GetStructFieldOfTable(struct_def, field, code_ptr); GetStructFieldOfTable(struct_def, field, code_ptr);
} }
break; break;
case BASE_TYPE_STRING: case BASE_TYPE_STRING: GetStringField(struct_def, field, code_ptr); break;
GetStringField(struct_def, field, code_ptr);
break;
case BASE_TYPE_VECTOR: { case BASE_TYPE_VECTOR: {
auto vectortype = field.value.type.VectorType(); auto vectortype = field.value.type.VectorType();
if (vectortype.base_type == BASE_TYPE_STRUCT) { if (vectortype.base_type == BASE_TYPE_STRUCT) {
@@ -538,11 +521,8 @@ static void GenStructAccessor(const StructDef &struct_def,
} }
break; break;
} }
case BASE_TYPE_UNION: case BASE_TYPE_UNION: GetUnionField(struct_def, field, code_ptr); break;
GetUnionField(struct_def, field, code_ptr); default: assert(0);
break;
default:
assert(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (field.value.type.base_type == BASE_TYPE_VECTOR) {
@@ -555,8 +535,8 @@ static void GenStructAccessor(const StructDef &struct_def,
// Mutate the value of a struct's scalar. // Mutate the value of a struct's scalar.
static void MutateScalarFieldOfStruct(const StructDef &struct_def, static void MutateScalarFieldOfStruct(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
std::string type = MakeCamel(GenTypeBasic(field.value.type)); std::string type = MakeCamel(GenTypeBasic(field.value.type));
std::string setter = "rcv._tab.Mutate" + type; std::string setter = "rcv._tab.Mutate" + type;
@@ -569,8 +549,8 @@ static void MutateScalarFieldOfStruct(const StructDef &struct_def,
// Mutate the value of a table's scalar. // Mutate the value of a table's scalar.
static void MutateScalarFieldOfTable(const StructDef &struct_def, static void MutateScalarFieldOfTable(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
std::string type = MakeCamel(GenTypeBasic(field.value.type)); std::string type = MakeCamel(GenTypeBasic(field.value.type));
std::string setter = "rcv._tab.Mutate" + type + "Slot"; std::string setter = "rcv._tab.Mutate" + type + "Slot";
@@ -582,9 +562,8 @@ static void MutateScalarFieldOfTable(const StructDef &struct_def,
} }
// Generate a struct field setter, conditioned on its child type(s). // Generate a struct field setter, conditioned on its child type(s).
static void GenStructMutator(const StructDef &struct_def, static void GenStructMutator(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field, std::string *code_ptr) {
std::string *code_ptr) {
GenComment(field.doc_comment, code_ptr, nullptr, ""); GenComment(field.doc_comment, code_ptr, nullptr, "");
if (IsScalar(field.value.type.base_type)) { if (IsScalar(field.value.type.base_type)) {
if (struct_def.fixed) { if (struct_def.fixed) {
@@ -601,8 +580,7 @@ static void GenTableBuilders(const StructDef &struct_def,
GetStartOfTable(struct_def, code_ptr); GetStartOfTable(struct_def, code_ptr);
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
@@ -617,8 +595,7 @@ static void GenTableBuilders(const StructDef &struct_def,
} }
// Generate struct or table methods. // Generate struct or table methods.
static void GenStruct(const StructDef &struct_def, static void GenStruct(const StructDef &struct_def, std::string *code_ptr) {
std::string *code_ptr) {
if (struct_def.generated) return; if (struct_def.generated) return;
GenComment(struct_def.doc_comment, code_ptr, nullptr); GenComment(struct_def.doc_comment, code_ptr, nullptr);
@@ -636,8 +613,7 @@ static void GenStruct(const StructDef &struct_def,
// Generate struct fields accessors // Generate struct fields accessors
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
@@ -661,8 +637,7 @@ static void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
GenComment(enum_def.doc_comment, code_ptr, nullptr); GenComment(enum_def.doc_comment, code_ptr, nullptr);
BeginEnum(code_ptr); BeginEnum(code_ptr);
for (auto it = enum_def.vals.vec.begin(); for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
it != enum_def.vals.vec.end();
++it) { ++it) {
auto &ev = **it; auto &ev = **it;
GenComment(ev.doc_comment, code_ptr, nullptr, "\t"); GenComment(ev.doc_comment, code_ptr, nullptr, "\t");
@@ -671,8 +646,7 @@ static void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
EndEnum(code_ptr); EndEnum(code_ptr);
BeginEnumNames(enum_def, code_ptr); BeginEnumNames(enum_def, code_ptr);
for (auto it = enum_def.vals.vec.begin(); for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
it != enum_def.vals.vec.end();
++it) { ++it) {
auto &ev = **it; auto &ev = **it;
EnumNameMember(enum_def, ev, code_ptr); EnumNameMember(enum_def, ev, code_ptr);
@@ -686,48 +660,43 @@ static std::string GenGetter(const Type &type) {
case BASE_TYPE_STRING: return "rcv._tab.ByteVector"; case BASE_TYPE_STRING: return "rcv._tab.ByteVector";
case BASE_TYPE_UNION: return "rcv._tab.Union"; case BASE_TYPE_UNION: return "rcv._tab.Union";
case BASE_TYPE_VECTOR: return GenGetter(type.VectorType()); case BASE_TYPE_VECTOR: return GenGetter(type.VectorType());
default: default: return "rcv._tab.Get" + MakeCamel(GenTypeGet(type));
return "rcv._tab.Get" + MakeCamel(GenTypeGet(type));
} }
} }
// Returns the method name for use with add/put calls. // Returns the method name for use with add/put calls.
static std::string GenMethod(const FieldDef &field) { static std::string GenMethod(const FieldDef &field) {
return IsScalar(field.value.type.base_type) return IsScalar(field.value.type.base_type)
? MakeCamel(GenTypeBasic(field.value.type)) ? MakeCamel(GenTypeBasic(field.value.type))
: (IsStruct(field.value.type) ? "Struct" : "UOffsetT"); : (IsStruct(field.value.type) ? "Struct" : "UOffsetT");
} }
static std::string GenTypeBasic(const Type &type) { static std::string GenTypeBasic(const Type &type) {
static const char *ctypename[] = { static const char *ctypename[] = {
// clang-format off
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \ #define FLATBUFFERS_TD(ENUM, IDLTYPE, \
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \ CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
#GTYPE, #GTYPE,
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
#undef FLATBUFFERS_TD #undef FLATBUFFERS_TD
// clang-format on
}; };
return ctypename[type.base_type]; return ctypename[type.base_type];
} }
static std::string GenTypePointer(const Type &type) { static std::string GenTypePointer(const Type &type) {
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_STRING: case BASE_TYPE_STRING: return "[]byte";
return "[]byte"; case BASE_TYPE_VECTOR: return GenTypeGet(type.VectorType());
case BASE_TYPE_VECTOR: case BASE_TYPE_STRUCT: return type.struct_def->name;
return GenTypeGet(type.VectorType());
case BASE_TYPE_STRUCT:
return type.struct_def->name;
case BASE_TYPE_UNION: case BASE_TYPE_UNION:
// fall through // fall through
default: default: return "*flatbuffers.Table";
return "*flatbuffers.Table";
} }
} }
static std::string GenTypeGet(const Type &type) { static std::string GenTypeGet(const Type &type) {
return IsScalar(type.base_type) return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);
? GenTypeBasic(type)
: GenTypePointer(type);
} }
static std::string TypeName(const FieldDef &field) { static std::string TypeName(const FieldDef &field) {
@@ -749,7 +718,8 @@ class GoGenerator : public BaseGenerator {
public: public:
GoGenerator(const Parser &parser, const std::string &path, GoGenerator(const Parser &parser, const std::string &path,
const std::string &file_name, const std::string &go_namespace) const std::string &file_name, const std::string &go_namespace)
: BaseGenerator(parser, path, file_name, "" /* not used*/, "" /* not used */) { : BaseGenerator(parser, path, file_name, "" /* not used*/,
"" /* not used */) {
std::istringstream iss(go_namespace); std::istringstream iss(go_namespace);
std::string component; std::string component;
while (std::getline(iss, component, '.')) { while (std::getline(iss, component, '.')) {
@@ -802,8 +772,8 @@ class GoGenerator : public BaseGenerator {
if (needs_imports) { if (needs_imports) {
code += "import (\n"; code += "import (\n";
if (!parser_.opts.go_import.empty()) { if (!parser_.opts.go_import.empty()) {
code += "\tflatbuffers \"" + parser_.opts.go_import +"\"\n"; code += "\tflatbuffers \"" + parser_.opts.go_import + "\"\n";
} else{ } else {
code += "\tflatbuffers \"github.com/google/flatbuffers/go\"\n"; code += "\tflatbuffers \"github.com/google/flatbuffers/go\"\n";
} }
code += ")\n\n"; code += ")\n\n";
@@ -815,12 +785,12 @@ class GoGenerator : public BaseGenerator {
bool needs_imports) { bool needs_imports) {
if (!classcode.length()) return true; if (!classcode.length()) return true;
Namespace& ns = go_namespace_.components.empty() ? *def.defined_namespace : go_namespace_; Namespace &ns = go_namespace_.components.empty() ? *def.defined_namespace
: go_namespace_;
std::string code = ""; std::string code = "";
BeginFile(LastNamespacePart(ns), needs_imports, &code); BeginFile(LastNamespacePart(ns), needs_imports, &code);
code += classcode; code += classcode;
std::string filename = std::string filename = NamespaceDir(ns) + def.name + ".go";
NamespaceDir(ns) + def.name + ".go";
return SaveFile(filename.c_str(), code, false); return SaveFile(filename.c_str(), code, false);
} }

View File

@@ -16,18 +16,19 @@
// independent from idl_parser, since this code is not needed for most clients // independent from idl_parser, since this code is not needed for most clients
#include "flatbuffers/code_generators.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "flatbuffers/code_generators.h"
#include "src/compiler/cpp_generator.h" #include "src/compiler/cpp_generator.h"
#include "src/compiler/go_generator.h" #include "src/compiler/go_generator.h"
#include "src/compiler/java_generator.h" #include "src/compiler/java_generator.h"
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(push) # pragma warning(push)
#pragma warning(disable: 4512) // C4512: 'class' : assignment operator could not be generated # pragma warning(disable : 4512) // C4512: 'class' : assignment operator could
// not be generated
#endif #endif
namespace flatbuffers { namespace flatbuffers {
@@ -36,8 +37,7 @@ class FlatBufMethod : public grpc_generator::Method {
public: public:
enum Streaming { kNone, kClient, kServer, kBiDi }; enum Streaming { kNone, kClient, kServer, kBiDi };
FlatBufMethod(const RPCCall *method) FlatBufMethod(const RPCCall *method) : method_(method) {
: method_(method) {
streaming_ = kNone; streaming_ = kNone;
auto val = method_->attributes.Lookup("streaming"); auto val = method_->attributes.Lookup("streaming");
if (val) { if (val) {
@@ -47,12 +47,8 @@ class FlatBufMethod : public grpc_generator::Method {
} }
} }
grpc::string GetLeadingComments(const grpc::string) const { grpc::string GetLeadingComments(const grpc::string) const { return ""; }
return ""; grpc::string GetTrailingComments(const grpc::string) const { return ""; }
}
grpc::string GetTrailingComments(const grpc::string) const {
return "";
}
std::vector<grpc::string> GetAllComments() const { std::vector<grpc::string> GetAllComments() const {
return method_->rpc_comment; return method_->rpc_comment;
} }
@@ -63,16 +59,13 @@ class FlatBufMethod : public grpc_generator::Method {
return "flatbuffers::grpc::Message<" + sd.name + ">"; return "flatbuffers::grpc::Message<" + sd.name + ">";
} }
std::string get_input_type_name() const { std::string get_input_type_name() const { return (*method_->request).name; }
return (*method_->request).name; std::string get_output_type_name() const { return (*method_->response).name; }
}
std::string get_output_type_name() const {
return (*method_->response).name;
}
bool get_module_and_message_path_input( bool get_module_and_message_path_input(grpc::string * /*str*/,
grpc::string * /*str*/, grpc::string /*generator_file_name*/, grpc::string /*generator_file_name*/,
bool /*generate_in_pb2_grpc*/, grpc::string /*import_prefix*/) const { bool /*generate_in_pb2_grpc*/,
grpc::string /*import_prefix*/) const {
return true; return true;
} }
@@ -82,13 +75,9 @@ class FlatBufMethod : public grpc_generator::Method {
return true; return true;
} }
std::string input_type_name() const { std::string input_type_name() const { return GRPCType(*method_->request); }
return GRPCType(*method_->request);
}
std::string output_type_name() const { std::string output_type_name() const { return GRPCType(*method_->response); }
return GRPCType(*method_->response);
}
bool NoStreaming() const { return streaming_ == kNone; } bool NoStreaming() const { return streaming_ == kNone; }
bool ClientStreaming() const { return streaming_ == kClient; } bool ClientStreaming() const { return streaming_ == kClient; }
@@ -104,12 +93,8 @@ class FlatBufService : public grpc_generator::Service {
public: public:
FlatBufService(const ServiceDef *service) : service_(service) {} FlatBufService(const ServiceDef *service) : service_(service) {}
grpc::string GetLeadingComments(const grpc::string) const { grpc::string GetLeadingComments(const grpc::string) const { return ""; }
return ""; grpc::string GetTrailingComments(const grpc::string) const { return ""; }
}
grpc::string GetTrailingComments(const grpc::string) const {
return "";
}
std::vector<grpc::string> GetAllComments() const { std::vector<grpc::string> GetAllComments() const {
return service_->doc_comment; return service_->doc_comment;
} }
@@ -122,7 +107,7 @@ class FlatBufService : public grpc_generator::Service {
std::unique_ptr<const grpc_generator::Method> method(int i) const { std::unique_ptr<const grpc_generator::Method> method(int i) const {
return std::unique_ptr<const grpc_generator::Method>( return std::unique_ptr<const grpc_generator::Method>(
new FlatBufMethod(service_->calls.vec[i])); new FlatBufMethod(service_->calls.vec[i]));
}; };
private: private:
@@ -131,8 +116,7 @@ class FlatBufService : public grpc_generator::Service {
class FlatBufPrinter : public grpc_generator::Printer { class FlatBufPrinter : public grpc_generator::Printer {
public: public:
FlatBufPrinter(std::string *str) FlatBufPrinter(std::string *str) : str_(str), escape_char_('$'), indent_(0) {}
: str_(str), escape_char_('$'), indent_(0) {}
void Print(const std::map<std::string, std::string> &vars, void Print(const std::map<std::string, std::string> &vars,
const char *string_template) { const char *string_template) {
@@ -155,15 +139,13 @@ class FlatBufPrinter : public grpc_generator::Printer {
} }
void Print(const char *s) { void Print(const char *s) {
if (s == nullptr || std::strlen(s) == 0) { if (s == nullptr || std::strlen(s) == 0) { return; }
return;
}
// Add this string, but for each part separated by \n, add indentation. // Add this string, but for each part separated by \n, add indentation.
for (;;) { for (;;) {
// Current indentation. // Current indentation.
str_->insert(str_->end(), indent_ * 2, ' '); str_->insert(str_->end(), indent_ * 2, ' ');
// See if this contains more than one line. // See if this contains more than one line.
const char * lf = strchr(s, '\n'); const char *lf = strchr(s, '\n');
if (lf) { if (lf) {
(*str_) += std::string(s, lf + 1); (*str_) += std::string(s, lf + 1);
s = lf + 1; s = lf + 1;
@@ -176,7 +158,10 @@ class FlatBufPrinter : public grpc_generator::Printer {
} }
void Indent() { indent_++; } void Indent() { indent_++; }
void Outdent() { indent_--; assert(indent_ >= 0); } void Outdent() {
indent_--;
assert(indent_ >= 0);
}
private: private:
std::string *str_; std::string *str_;
@@ -186,23 +171,15 @@ class FlatBufPrinter : public grpc_generator::Printer {
class FlatBufFile : public grpc_generator::File { class FlatBufFile : public grpc_generator::File {
public: public:
enum Language { enum Language { kLanguageGo, kLanguageCpp, kLanguageJava };
kLanguageGo,
kLanguageCpp,
kLanguageJava
};
FlatBufFile( FlatBufFile(const Parser &parser, const std::string &file_name,
const Parser &parser, const std::string &file_name, Language language) Language language)
: parser_(parser), file_name_(file_name), language_(language) {} : parser_(parser), file_name_(file_name), language_(language) {}
FlatBufFile &operator=(const FlatBufFile &); FlatBufFile &operator=(const FlatBufFile &);
grpc::string GetLeadingComments(const grpc::string) const { grpc::string GetLeadingComments(const grpc::string) const { return ""; }
return ""; grpc::string GetTrailingComments(const grpc::string) const { return ""; }
}
grpc::string GetTrailingComments(const grpc::string) const {
return "";
}
std::vector<grpc::string> GetAllComments() const { std::vector<grpc::string> GetAllComments() const {
return std::vector<grpc::string>(); return std::vector<grpc::string>();
} }
@@ -243,13 +220,13 @@ class FlatBufFile : public grpc_generator::File {
}; };
std::unique_ptr<const grpc_generator::Service> service(int i) const { std::unique_ptr<const grpc_generator::Service> service(int i) const {
return std::unique_ptr<const grpc_generator::Service> ( return std::unique_ptr<const grpc_generator::Service>(
new FlatBufService(parser_.services_.vec[i])); new FlatBufService(parser_.services_.vec[i]));
} }
std::unique_ptr<grpc_generator::Printer> CreatePrinter(std::string *str) const { std::unique_ptr<grpc_generator::Printer> CreatePrinter(
return std::unique_ptr<grpc_generator::Printer>( std::string *str) const {
new FlatBufPrinter(str)); return std::unique_ptr<grpc_generator::Printer>(new FlatBufPrinter(str));
} }
private: private:
@@ -262,8 +239,10 @@ class GoGRPCGenerator : public flatbuffers::BaseGenerator {
public: public:
GoGRPCGenerator(const Parser &parser, const std::string &path, GoGRPCGenerator(const Parser &parser, const std::string &path,
const std::string &file_name) const std::string &file_name)
: BaseGenerator(parser, path, file_name, "", "" /*Unused*/), : BaseGenerator(parser, path, file_name, "", "" /*Unused*/),
parser_(parser), path_(path), file_name_(file_name) {} parser_(parser),
path_(path),
file_name_(file_name) {}
bool generate() { bool generate() {
FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageGo); FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguageGo);
@@ -273,10 +252,11 @@ class GoGRPCGenerator : public flatbuffers::BaseGenerator {
auto service = file.service(i); auto service = file.service(i);
const Definition *def = parser_.services_.vec[i]; const Definition *def = parser_.services_.vec[i];
p.package_name = LastNamespacePart(*(def->defined_namespace)); p.package_name = LastNamespacePart(*(def->defined_namespace));
std::string output = grpc_go_generator::GenerateServiceSource(&file, service.get(), &p); std::string output =
std::string filename = NamespaceDir(*def->defined_namespace) + def->name + "_grpc.go"; grpc_go_generator::GenerateServiceSource(&file, service.get(), &p);
if (!flatbuffers::SaveFile(filename.c_str(), output, false)) std::string filename =
return false; NamespaceDir(*def->defined_namespace) + def->name + "_grpc.go";
if (!flatbuffers::SaveFile(filename.c_str(), output, false)) return false;
} }
return true; return true;
} }
@@ -286,25 +266,22 @@ class GoGRPCGenerator : public flatbuffers::BaseGenerator {
const std::string &path_, &file_name_; const std::string &path_, &file_name_;
}; };
bool GenerateGoGRPC(const Parser &parser, bool GenerateGoGRPC(const Parser &parser, const std::string &path,
const std::string &path,
const std::string &file_name) { const std::string &file_name) {
int nservices = 0; int nservices = 0;
for (auto it = parser.services_.vec.begin(); for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
it != parser.services_.vec.end(); ++it) { ++it) {
if (!(*it)->generated) nservices++; if (!(*it)->generated) nservices++;
} }
if (!nservices) return true; if (!nservices) return true;
return GoGRPCGenerator(parser, path, file_name).generate(); return GoGRPCGenerator(parser, path, file_name).generate();
} }
bool GenerateCppGRPC(const Parser &parser, bool GenerateCppGRPC(const Parser &parser, const std::string &path,
const std::string &path, const std::string &file_name) {
const std::string &file_name) {
int nservices = 0; int nservices = 0;
for (auto it = parser.services_.vec.begin(); for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
it != parser.services_.vec.end(); ++it) { ++it) {
if (!(*it)->generated) nservices++; if (!(*it)->generated) nservices++;
} }
if (!nservices) return true; if (!nservices) return true;
@@ -335,8 +312,8 @@ bool GenerateCppGRPC(const Parser &parser,
class JavaGRPCGenerator : public flatbuffers::BaseGenerator { class JavaGRPCGenerator : public flatbuffers::BaseGenerator {
public: public:
JavaGRPCGenerator(const Parser& parser, const std::string& path, JavaGRPCGenerator(const Parser &parser, const std::string &path,
const std::string& file_name) const std::string &file_name)
: BaseGenerator(parser, path, file_name, "", "." /*separator*/), : BaseGenerator(parser, path, file_name, "", "." /*separator*/),
parser_(parser), parser_(parser),
path_(path), path_(path),
@@ -347,7 +324,7 @@ class JavaGRPCGenerator : public flatbuffers::BaseGenerator {
grpc_java_generator::Parameters p; grpc_java_generator::Parameters p;
for (int i = 0; i < file.service_count(); i++) { for (int i = 0; i < file.service_count(); i++) {
auto service = file.service(i); auto service = file.service(i);
const Definition* def = parser_.services_.vec[i]; const Definition *def = parser_.services_.vec[i];
p.package_name = p.package_name =
def->defined_namespace->GetFullyQualifiedName(""); // file.package(); def->defined_namespace->GetFullyQualifiedName(""); // file.package();
std::string output = std::string output =
@@ -360,12 +337,12 @@ class JavaGRPCGenerator : public flatbuffers::BaseGenerator {
} }
protected: protected:
const Parser& parser_; const Parser &parser_;
const std::string &path_, &file_name_; const std::string &path_, &file_name_;
}; };
bool GenerateJavaGRPC(const Parser& parser, const std::string& path, bool GenerateJavaGRPC(const Parser &parser, const std::string &path,
const std::string& file_name) { const std::string &file_name) {
int nservices = 0; int nservices = 0;
for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end(); for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
++it) { ++it) {
@@ -378,5 +355,5 @@ bool GenerateJavaGRPC(const Parser& parser, const std::string& path,
} // namespace flatbuffers } // namespace flatbuffers
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(pop) # pragma warning(pop)
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +1,23 @@
/* /*
* Copyright 2014 Google Inc. All rights reserved. * Copyright 2014 Google Inc. All rights reserved.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#include <iostream>
#include "flatbuffers/code_generators.h" #include "flatbuffers/code_generators.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include <iostream>
namespace flatbuffers { namespace flatbuffers {
@@ -30,8 +30,7 @@ namespace jsons {
std::string GenNativeType(BaseType type) { std::string GenNativeType(BaseType type) {
switch (type) { switch (type) {
case BASE_TYPE_BOOL: case BASE_TYPE_BOOL: return "boolean";
return "boolean";
case BASE_TYPE_CHAR: case BASE_TYPE_CHAR:
case BASE_TYPE_UCHAR: case BASE_TYPE_UCHAR:
case BASE_TYPE_SHORT: case BASE_TYPE_SHORT:
@@ -41,16 +40,13 @@ std::string GenNativeType(BaseType type) {
case BASE_TYPE_LONG: case BASE_TYPE_LONG:
case BASE_TYPE_ULONG: case BASE_TYPE_ULONG:
case BASE_TYPE_FLOAT: case BASE_TYPE_FLOAT:
case BASE_TYPE_DOUBLE: case BASE_TYPE_DOUBLE: return "number";
return "number"; case BASE_TYPE_STRING: return "string";
case BASE_TYPE_STRING: default: return "";
return "string";
default:
return "";
} }
} }
template <class T> std::string GenFullName(const T *enum_def) { template<class T> std::string GenFullName(const T *enum_def) {
std::string full_name; std::string full_name;
const auto &name_spaces = enum_def->defined_namespace->components; const auto &name_spaces = enum_def->defined_namespace->components;
for (auto ns = name_spaces.cbegin(); ns != name_spaces.cend(); ++ns) { for (auto ns = name_spaces.cbegin(); ns != name_spaces.cend(); ++ns) {
@@ -60,7 +56,7 @@ template <class T> std::string GenFullName(const T *enum_def) {
return full_name; return full_name;
} }
template <class T> std::string GenTypeRef(const T *enum_def) { template<class T> std::string GenTypeRef(const T *enum_def) {
return "\"$ref\" : \"#/definitions/" + GenFullName(enum_def) + "\""; return "\"$ref\" : \"#/definitions/" + GenFullName(enum_def) + "\"";
} }
@@ -93,11 +89,10 @@ std::string GenType(const Type &type) {
const auto &union_types = type.enum_def->vals.vec; const auto &union_types = type.enum_def->vals.vec;
for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) { for (auto ut = union_types.cbegin(); ut < union_types.cend(); ++ut) {
auto &union_type = *ut; auto &union_type = *ut;
if (union_type->union_type.base_type == BASE_TYPE_NONE) { if (union_type->union_type.base_type == BASE_TYPE_NONE) { continue; }
continue;
}
if (union_type->union_type.base_type == BASE_TYPE_STRUCT) { if (union_type->union_type.base_type == BASE_TYPE_STRUCT) {
union_type_string.append("{ " + GenTypeRef(union_type->union_type.struct_def) + " }"); union_type_string.append(
"{ " + GenTypeRef(union_type->union_type.struct_def) + " }");
} }
if (union_type != *type.enum_def->vals.vec.rbegin()) { if (union_type != *type.enum_def->vals.vec.rbegin()) {
union_type_string.append(","); union_type_string.append(",");
@@ -106,10 +101,8 @@ std::string GenType(const Type &type) {
union_type_string.append("]"); union_type_string.append("]");
return union_type_string; return union_type_string;
} }
case BASE_TYPE_UTYPE: case BASE_TYPE_UTYPE: return GenTypeRef(type.enum_def);
return GenTypeRef(type.enum_def); default: return GenType(GenNativeType(type.base_type));
default:
return GenType(GenNativeType(type.base_type));
} }
} }
@@ -130,35 +123,29 @@ class JsonSchemaGenerator : public BaseGenerator {
code_ += "{"; code_ += "{";
code_ += " \"$schema\": \"http://json-schema.org/draft-04/schema#\","; code_ += " \"$schema\": \"http://json-schema.org/draft-04/schema#\",";
code_ += " \"definitions\": {"; code_ += " \"definitions\": {";
for (auto e = parser_.enums_.vec.cbegin(); for (auto e = parser_.enums_.vec.cbegin(); e != parser_.enums_.vec.cend();
e != parser_.enums_.vec.cend();
++e) { ++e) {
code_ += " \"" + GenFullName(*e) + "\" : {"; code_ += " \"" + GenFullName(*e) + "\" : {";
code_ += " " + GenType("string") + ","; code_ += " " + GenType("string") + ",";
std::string enumdef(" \"enum\": ["); std::string enumdef(" \"enum\": [");
for (auto enum_value = (*e)->vals.vec.begin(); for (auto enum_value = (*e)->vals.vec.begin();
enum_value != (*e)->vals.vec.end(); enum_value != (*e)->vals.vec.end(); ++enum_value) {
++enum_value) {
enumdef.append("\"" + (*enum_value)->name + "\""); enumdef.append("\"" + (*enum_value)->name + "\"");
if (*enum_value != (*e)->vals.vec.back()) { if (*enum_value != (*e)->vals.vec.back()) { enumdef.append(", "); }
enumdef.append(", ");
}
} }
enumdef.append("]"); enumdef.append("]");
code_ += enumdef; code_ += enumdef;
code_ += " },"; // close type code_ += " },"; // close type
} }
for (auto s = parser_.structs_.vec.cbegin(); for (auto s = parser_.structs_.vec.cbegin();
s != parser_.structs_.vec.cend(); s != parser_.structs_.vec.cend(); ++s) {
++s) {
const auto &structure = *s; const auto &structure = *s;
code_ += " \"" + GenFullName(structure) + "\" : {"; code_ += " \"" + GenFullName(structure) + "\" : {";
code_ += " " + GenType("object") + ","; code_ += " " + GenType("object") + ",";
std::string comment; std::string comment;
const auto &comment_lines = structure->doc_comment; const auto &comment_lines = structure->doc_comment;
for (auto comment_line = comment_lines.cbegin(); for (auto comment_line = comment_lines.cbegin();
comment_line != comment_lines.cend(); comment_line != comment_lines.cend(); ++comment_line) {
++comment_line) {
comment.append(*comment_line); comment.append(*comment_line);
} }
if (comment.size() > 0) { if (comment.size() > 0) {
@@ -169,10 +156,9 @@ class JsonSchemaGenerator : public BaseGenerator {
const auto &properties = structure->fields.vec; const auto &properties = structure->fields.vec;
for (auto prop = properties.cbegin(); prop != properties.cend(); ++prop) { for (auto prop = properties.cbegin(); prop != properties.cend(); ++prop) {
const auto &property = *prop; const auto &property = *prop;
std::string typeLine(" \"" + property->name + "\" : { " + GenType(property->value.type) + " }"); std::string typeLine(" \"" + property->name + "\" : { " +
if (property != properties.back()) { GenType(property->value.type) + " }");
typeLine.append(","); if (property != properties.back()) { typeLine.append(","); }
}
code_ += typeLine; code_ += typeLine;
} }
code_ += " },"; // close properties code_ += " },"; // close properties
@@ -184,8 +170,7 @@ class JsonSchemaGenerator : public BaseGenerator {
if (requiredProperties.size() > 0) { if (requiredProperties.size() > 0) {
std::string required_string(" \"required\" : ["); std::string required_string(" \"required\" : [");
for (auto req_prop = requiredProperties.cbegin(); for (auto req_prop = requiredProperties.cbegin();
req_prop != requiredProperties.cend(); req_prop != requiredProperties.cend(); ++req_prop) {
++req_prop) {
required_string.append("\"" + (*req_prop)->name + "\""); required_string.append("\"" + (*req_prop)->name + "\"");
if (*req_prop != requiredProperties.back()) { if (*req_prop != requiredProperties.back()) {
required_string.append(", "); required_string.append(", ");
@@ -196,9 +181,7 @@ class JsonSchemaGenerator : public BaseGenerator {
} }
code_ += " \"additionalProperties\" : false"; code_ += " \"additionalProperties\" : false";
std::string closeType(" }"); std::string closeType(" }");
if (*s != parser_.structs_.vec.back()) { if (*s != parser_.structs_.vec.back()) { closeType.append(","); }
closeType.append(",");
}
code_ += closeType; // close type code_ += closeType; // close type
} }
code_ += " },"; // close definitions code_ += " },"; // close definitions

File diff suppressed because it is too large Load Diff

View File

@@ -18,10 +18,10 @@
#include <string> #include <string>
#include "flatbuffers/code_generators.h"
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "flatbuffers/code_generators.h"
namespace flatbuffers { namespace flatbuffers {
namespace python { namespace python {
@@ -35,7 +35,6 @@ static std::string GenTypeBasic(const Type &type);
static std::string GenTypeGet(const Type &type); static std::string GenTypeGet(const Type &type);
static std::string TypeName(const FieldDef &field); static std::string TypeName(const FieldDef &field);
// Hardcode spaces per indentation. // Hardcode spaces per indentation.
const std::string Indent = " "; const std::string Indent = " ";
@@ -44,9 +43,8 @@ const std::string Indent = " ";
std::string OffsetPrefix(const FieldDef &field) { std::string OffsetPrefix(const FieldDef &field) {
return "\n" + Indent + Indent + return "\n" + Indent + Indent +
"o = flatbuffers.number_types.UOffsetTFlags.py_type" + "o = flatbuffers.number_types.UOffsetTFlags.py_type" +
"(self._tab.Offset(" + "(self._tab.Offset(" + NumToString(field.value.offset) + "))\n" +
NumToString(field.value.offset) + Indent + Indent + "if o != 0:\n";
"))\n" + Indent + Indent + "if o != 0:\n";
} }
// Begin a class declaration. // Begin a class declaration.
@@ -109,8 +107,7 @@ static void InitializeExisting(const StructDef &struct_def,
} }
// Get the length of a vector. // Get the length of a vector.
static void GetVectorLen(const StructDef &struct_def, static void GetVectorLen(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
@@ -188,8 +185,7 @@ static void GetStructFieldOfTable(const StructDef &struct_def,
} }
// Get the value of a string. // Get the value of a string.
static void GetStringField(const StructDef &struct_def, static void GetStringField(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
@@ -202,8 +198,7 @@ static void GetStringField(const StructDef &struct_def,
} }
// Get the value of a union from an object. // Get the value of a union from an object.
static void GetUnionField(const StructDef &struct_def, static void GetUnionField(const StructDef &struct_def, const FieldDef &field,
const FieldDef &field,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
@@ -284,9 +279,7 @@ static void GetVectorOfNonStructAsNumpy(const StructDef &struct_def,
// Currently, we only support accessing as numpy array if // Currently, we only support accessing as numpy array if
// the vector type is a scalar. // the vector type is a scalar.
if (!(IsScalar(vectortype.base_type))) { if (!(IsScalar(vectortype.base_type))) { return; }
return;
}
GenReceiver(struct_def, code_ptr); GenReceiver(struct_def, code_ptr);
code += MakeCamel(field.name) + "AsNumpy(self):"; code += MakeCamel(field.name) + "AsNumpy(self):";
@@ -319,22 +312,19 @@ static void BeginBuilderArgs(const StructDef &struct_def,
// Recursively generate arguments for a constructor, to deal with nested // Recursively generate arguments for a constructor, to deal with nested
// structs. // structs.
static void StructBuilderArgs(const StructDef &struct_def, static void StructBuilderArgs(const StructDef &struct_def,
const char *nameprefix, const char *nameprefix, std::string *code_ptr) {
std::string *code_ptr) {
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (IsStruct(field.value.type)) { if (IsStruct(field.value.type)) {
// Generate arguments for a struct inside a struct. To ensure names // Generate arguments for a struct inside a struct. To ensure names
// don't clash, and to make it obvious these arguments are constructing // don't clash, and to make it obvious these arguments are constructing
// a nested struct, prefix the name with the field name. // a nested struct, prefix the name with the field name.
StructBuilderArgs(*field.value.type.struct_def, StructBuilderArgs(*field.value.type.struct_def,
(nameprefix + (field.name + "_")).c_str(), (nameprefix + (field.name + "_")).c_str(), code_ptr);
code_ptr);
} else { } else {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += (std::string)", " + nameprefix; code += (std::string) ", " + nameprefix;
code += MakeCamel(field.name, false); code += MakeCamel(field.name, false);
} }
} }
@@ -349,21 +339,18 @@ static void EndBuilderArgs(std::string *code_ptr) {
// Recursively generate struct construction statements and instert manual // Recursively generate struct construction statements and instert manual
// padding. // padding.
static void StructBuilderBody(const StructDef &struct_def, static void StructBuilderBody(const StructDef &struct_def,
const char *nameprefix, const char *nameprefix, std::string *code_ptr) {
std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += " builder.Prep(" + NumToString(struct_def.minalign) + ", "; code += " builder.Prep(" + NumToString(struct_def.minalign) + ", ";
code += NumToString(struct_def.bytesize) + ")\n"; code += NumToString(struct_def.bytesize) + ")\n";
for (auto it = struct_def.fields.vec.rbegin(); for (auto it = struct_def.fields.vec.rbegin();
it != struct_def.fields.vec.rend(); it != struct_def.fields.vec.rend(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.padding) if (field.padding)
code += " builder.Pad(" + NumToString(field.padding) + ")\n"; code += " builder.Pad(" + NumToString(field.padding) + ")\n";
if (IsStruct(field.value.type)) { if (IsStruct(field.value.type)) {
StructBuilderBody(*field.value.type.struct_def, StructBuilderBody(*field.value.type.struct_def,
(nameprefix + (field.name + "_")).c_str(), (nameprefix + (field.name + "_")).c_str(), code_ptr);
code_ptr);
} else { } else {
code += " builder.Prepend" + GenMethod(field) + "("; code += " builder.Prepend" + GenMethod(field) + "(";
code += nameprefix + MakeCamel(field.name, false) + ")\n"; code += nameprefix + MakeCamel(field.name, false) + ")\n";
@@ -389,8 +376,7 @@ static void GetStartOfTable(const StructDef &struct_def,
// Set the value of a table's field. // Set the value of a table's field.
static void BuildFieldOfTable(const StructDef &struct_def, static void BuildFieldOfTable(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, const size_t offset,
const size_t offset,
std::string *code_ptr) { std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += "def " + struct_def.name + "Add" + MakeCamel(field.name); code += "def " + struct_def.name + "Add" + MakeCamel(field.name);
@@ -413,8 +399,7 @@ static void BuildFieldOfTable(const StructDef &struct_def,
// Set the value of one of the members of a table's vector. // Set the value of one of the members of a table's vector.
static void BuildVectorOfTable(const StructDef &struct_def, static void BuildVectorOfTable(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, std::string *code_ptr) {
std::string *code_ptr) {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code += "def " + struct_def.name + "Start"; code += "def " + struct_def.name + "Start";
code += MakeCamel(field.name); code += MakeCamel(field.name);
@@ -445,8 +430,7 @@ static void GenReceiver(const StructDef &struct_def, std::string *code_ptr) {
// Generate a struct field, conditioned on its child type(s). // Generate a struct field, conditioned on its child type(s).
static void GenStructAccessor(const StructDef &struct_def, static void GenStructAccessor(const StructDef &struct_def,
const FieldDef &field, const FieldDef &field, std::string *code_ptr) {
std::string *code_ptr) {
GenComment(field.doc_comment, code_ptr, nullptr, "# "); GenComment(field.doc_comment, code_ptr, nullptr, "# ");
if (IsScalar(field.value.type.base_type)) { if (IsScalar(field.value.type.base_type)) {
if (struct_def.fixed) { if (struct_def.fixed) {
@@ -463,9 +447,7 @@ static void GenStructAccessor(const StructDef &struct_def,
GetStructFieldOfTable(struct_def, field, code_ptr); GetStructFieldOfTable(struct_def, field, code_ptr);
} }
break; break;
case BASE_TYPE_STRING: case BASE_TYPE_STRING: GetStringField(struct_def, field, code_ptr); break;
GetStringField(struct_def, field, code_ptr);
break;
case BASE_TYPE_VECTOR: { case BASE_TYPE_VECTOR: {
auto vectortype = field.value.type.VectorType(); auto vectortype = field.value.type.VectorType();
if (vectortype.base_type == BASE_TYPE_STRUCT) { if (vectortype.base_type == BASE_TYPE_STRUCT) {
@@ -476,11 +458,8 @@ static void GenStructAccessor(const StructDef &struct_def,
} }
break; break;
} }
case BASE_TYPE_UNION: case BASE_TYPE_UNION: GetUnionField(struct_def, field, code_ptr); break;
GetUnionField(struct_def, field, code_ptr); default: assert(0);
break;
default:
assert(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (field.value.type.base_type == BASE_TYPE_VECTOR) {
@@ -494,8 +473,7 @@ static void GenTableBuilders(const StructDef &struct_def,
GetStartOfTable(struct_def, code_ptr); GetStartOfTable(struct_def, code_ptr);
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
@@ -510,8 +488,7 @@ static void GenTableBuilders(const StructDef &struct_def,
} }
// Generate struct or table methods. // Generate struct or table methods.
static void GenStruct(const StructDef &struct_def, static void GenStruct(const StructDef &struct_def, std::string *code_ptr) {
std::string *code_ptr) {
if (struct_def.generated) return; if (struct_def.generated) return;
GenComment(struct_def.doc_comment, code_ptr, nullptr, "# "); GenComment(struct_def.doc_comment, code_ptr, nullptr, "# ");
@@ -525,8 +502,7 @@ static void GenStruct(const StructDef &struct_def,
// accessor object. This is to allow object reuse. // accessor object. This is to allow object reuse.
InitializeExisting(struct_def, code_ptr); InitializeExisting(struct_def, code_ptr);
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
@@ -548,8 +524,7 @@ static void GenEnum(const EnumDef &enum_def, std::string *code_ptr) {
GenComment(enum_def.doc_comment, code_ptr, nullptr, "# "); GenComment(enum_def.doc_comment, code_ptr, nullptr, "# ");
BeginEnum(enum_def.name, code_ptr); BeginEnum(enum_def.name, code_ptr);
for (auto it = enum_def.vals.vec.begin(); for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
it != enum_def.vals.vec.end();
++it) { ++it) {
auto &ev = **it; auto &ev = **it;
GenComment(ev.doc_comment, code_ptr, nullptr, "# "); GenComment(ev.doc_comment, code_ptr, nullptr, "# ");
@@ -565,49 +540,44 @@ static std::string GenGetter(const Type &type) {
case BASE_TYPE_UNION: return "self._tab.Union("; case BASE_TYPE_UNION: return "self._tab.Union(";
case BASE_TYPE_VECTOR: return GenGetter(type.VectorType()); case BASE_TYPE_VECTOR: return GenGetter(type.VectorType());
default: default:
return "self._tab.Get(flatbuffers.number_types." + \ return "self._tab.Get(flatbuffers.number_types." +
MakeCamel(GenTypeGet(type)) + \ MakeCamel(GenTypeGet(type)) + "Flags, ";
"Flags, ";
} }
} }
// Returns the method name for use with add/put calls. // Returns the method name for use with add/put calls.
static std::string GenMethod(const FieldDef &field) { static std::string GenMethod(const FieldDef &field) {
return IsScalar(field.value.type.base_type) return IsScalar(field.value.type.base_type)
? MakeCamel(GenTypeBasic(field.value.type)) ? MakeCamel(GenTypeBasic(field.value.type))
: (IsStruct(field.value.type) ? "Struct" : "UOffsetTRelative"); : (IsStruct(field.value.type) ? "Struct" : "UOffsetTRelative");
} }
static std::string GenTypeBasic(const Type &type) { static std::string GenTypeBasic(const Type &type) {
static const char *ctypename[] = { static const char *ctypename[] = {
// clang-format off
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \ #define FLATBUFFERS_TD(ENUM, IDLTYPE, \
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \ CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
#PTYPE, #PTYPE,
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
#undef FLATBUFFERS_TD #undef FLATBUFFERS_TD
// clang-format on
}; };
return ctypename[type.base_type]; return ctypename[type.base_type];
} }
static std::string GenTypePointer(const Type &type) { static std::string GenTypePointer(const Type &type) {
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_STRING: case BASE_TYPE_STRING: return "string";
return "string"; case BASE_TYPE_VECTOR: return GenTypeGet(type.VectorType());
case BASE_TYPE_VECTOR: case BASE_TYPE_STRUCT: return type.struct_def->name;
return GenTypeGet(type.VectorType());
case BASE_TYPE_STRUCT:
return type.struct_def->name;
case BASE_TYPE_UNION: case BASE_TYPE_UNION:
// fall through // fall through
default: default: return "*flatbuffers.Table";
return "*flatbuffers.Table";
} }
} }
static std::string GenTypeGet(const Type &type) { static std::string GenTypeGet(const Type &type) {
return IsScalar(type.base_type) return IsScalar(type.base_type) ? GenTypeBasic(type) : GenTypePointer(type);
? GenTypeBasic(type)
: GenTypePointer(type);
} }
static std::string TypeName(const FieldDef &field) { static std::string TypeName(const FieldDef &field) {
@@ -666,9 +636,7 @@ class PythonGenerator : public BaseGenerator {
std::string &code = *code_ptr; std::string &code = *code_ptr;
code = code + "# " + FlatBuffersGeneratedWarning() + "\n\n"; code = code + "# " + FlatBuffersGeneratedWarning() + "\n\n";
code += "# namespace: " + name_space_name + "\n\n"; code += "# namespace: " + name_space_name + "\n\n";
if (needs_imports) { if (needs_imports) { code += "import flatbuffers\n\n"; }
code += "import flatbuffers\n\n";
}
} }
// Save out the generated code for a Python Table type. // Save out the generated code for a Python Table type.
@@ -688,8 +656,8 @@ class PythonGenerator : public BaseGenerator {
std::string code = ""; std::string code = "";
BeginFile(LastNamespacePart(*def.defined_namespace), needs_imports, &code); BeginFile(LastNamespacePart(*def.defined_namespace), needs_imports, &code);
code += classcode; code += classcode;
std::string filename = NamespaceDir(*def.defined_namespace) + std::string filename =
def.name + ".py"; NamespaceDir(*def.defined_namespace) + def.name + ".py";
return SaveFile(filename.c_str(), code, false); return SaveFile(filename.c_str(), code, false);
} }
}; };

View File

@@ -17,15 +17,14 @@
// independent from idl_parser, since this code is not needed for most clients // independent from idl_parser, since this code is not needed for most clients
#include "flatbuffers/flatbuffers.h" #include "flatbuffers/flatbuffers.h"
#include "flatbuffers/flexbuffers.h"
#include "flatbuffers/idl.h" #include "flatbuffers/idl.h"
#include "flatbuffers/util.h" #include "flatbuffers/util.h"
#include "flatbuffers/flexbuffers.h"
namespace flatbuffers { namespace flatbuffers {
static bool GenStruct(const StructDef &struct_def, const Table *table, static bool GenStruct(const StructDef &struct_def, const Table *table,
int indent, const IDLOptions &opts, int indent, const IDLOptions &opts, std::string *_text);
std::string *_text);
// If indentation is less than 0, that indicates we don't want any newlines // If indentation is less than 0, that indicates we don't want any newlines
// either. // either.
@@ -33,9 +32,7 @@ const char *NewLine(const IDLOptions &opts) {
return opts.indent_step >= 0 ? "\n" : ""; return opts.indent_step >= 0 ? "\n" : "";
} }
int Indent(const IDLOptions &opts) { int Indent(const IDLOptions &opts) { return std::max(opts.indent_step, 0); }
return std::max(opts.indent_step, 0);
}
// Output an identifier with or without quotes depending on strictness. // Output an identifier with or without quotes depending on strictness.
void OutputIdentifier(const std::string &name, const IDLOptions &opts, void OutputIdentifier(const std::string &name, const IDLOptions &opts,
@@ -49,10 +46,9 @@ void OutputIdentifier(const std::string &name, const IDLOptions &opts,
// Print (and its template specialization below for pointers) generate text // Print (and its template specialization below for pointers) generate text
// for a single FlatBuffer value into JSON format. // for a single FlatBuffer value into JSON format.
// The general case for scalars: // The general case for scalars:
template<typename T> bool Print(T val, Type type, int /*indent*/, template<typename T>
Type * /*union_type*/, bool Print(T val, Type type, int /*indent*/, Type * /*union_type*/,
const IDLOptions &opts, const IDLOptions &opts, std::string *_text) {
std::string *_text) {
std::string &text = *_text; std::string &text = *_text;
if (type.enum_def && opts.output_enum_identifiers) { if (type.enum_def && opts.output_enum_identifiers) {
auto enum_val = type.enum_def->ReverseLookup(static_cast<int>(val)); auto enum_val = type.enum_def->ReverseLookup(static_cast<int>(val));
@@ -72,9 +68,9 @@ template<typename T> bool Print(T val, Type type, int /*indent*/,
} }
// Print a vector a sequence of JSON values, comma separated, wrapped in "[]". // Print a vector a sequence of JSON values, comma separated, wrapped in "[]".
template<typename T> bool PrintVector(const Vector<T> &v, Type type, template<typename T>
int indent, const IDLOptions &opts, bool PrintVector(const Vector<T> &v, Type type, int indent,
std::string *_text) { const IDLOptions &opts, std::string *_text) {
std::string &text = *_text; std::string &text = *_text;
text += "["; text += "[";
text += NewLine(opts); text += NewLine(opts);
@@ -90,8 +86,7 @@ template<typename T> bool PrintVector(const Vector<T> &v, Type type,
return false; return false;
} }
} else { } else {
if (!Print(v[i], type, indent + Indent(opts), nullptr, if (!Print(v[i], type, indent + Indent(opts), nullptr, opts, _text)) {
opts, _text)) {
return false; return false;
} }
} }
@@ -103,11 +98,10 @@ template<typename T> bool PrintVector(const Vector<T> &v, Type type,
} }
// Specialization of Print above for pointer types. // Specialization of Print above for pointer types.
template<> bool Print<const void *>(const void *val, template<>
Type type, int indent, bool Print<const void *>(const void *val, Type type, int indent,
Type *union_type, Type *union_type, const IDLOptions &opts,
const IDLOptions &opts, std::string *_text) {
std::string *_text) {
switch (type.base_type) { switch (type.base_type) {
case BASE_TYPE_UNION: case BASE_TYPE_UNION:
// If this assert hits, you have an corrupt buffer, a union type field // If this assert hits, you have an corrupt buffer, a union type field
@@ -116,11 +110,8 @@ template<> bool Print<const void *>(const void *val,
return Print<const void *>(val, *union_type, indent, nullptr, opts, return Print<const void *>(val, *union_type, indent, nullptr, opts,
_text); _text);
case BASE_TYPE_STRUCT: case BASE_TYPE_STRUCT:
if (!GenStruct(*type.struct_def, if (!GenStruct(*type.struct_def, reinterpret_cast<const Table *>(val),
reinterpret_cast<const Table *>(val), indent, opts, _text)) {
indent,
opts,
_text)) {
return false; return false;
} }
break; break;
@@ -135,6 +126,7 @@ template<> bool Print<const void *>(const void *val,
type = type.VectorType(); type = type.VectorType();
// Call PrintVector above specifically for each element type: // Call PrintVector above specifically for each element type:
switch (type.base_type) { switch (type.base_type) {
// clang-format off
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \ #define FLATBUFFERS_TD(ENUM, IDLTYPE, \
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \ CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
case BASE_TYPE_ ## ENUM: \ case BASE_TYPE_ ## ENUM: \
@@ -146,6 +138,7 @@ template<> bool Print<const void *>(const void *val,
break; break;
FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD)
#undef FLATBUFFERS_TD #undef FLATBUFFERS_TD
// clang-format on
} }
break; break;
default: assert(0); default: assert(0);
@@ -154,31 +147,28 @@ template<> bool Print<const void *>(const void *val,
} }
// Generate text for a scalar field. // Generate text for a scalar field.
template<typename T> static bool GenField(const FieldDef &fd, template<typename T>
const Table *table, bool fixed, static bool GenField(const FieldDef &fd, const Table *table, bool fixed,
const IDLOptions &opts, const IDLOptions &opts, int indent, std::string *_text) {
int indent, return Print(fixed ? reinterpret_cast<const Struct *>(table)->GetField<T>(
std::string *_text) { fd.value.offset)
return Print(fixed ? : table->GetField<T>(fd.value.offset, 0),
reinterpret_cast<const Struct *>(table)->GetField<T>(fd.value.offset) : fd.value.type, indent, nullptr, opts, _text);
table->GetField<T>(fd.value.offset, 0), fd.value.type, indent, nullptr,
opts, _text);
} }
static bool GenStruct(const StructDef &struct_def, const Table *table, static bool GenStruct(const StructDef &struct_def, const Table *table,
int indent, const IDLOptions &opts, int indent, const IDLOptions &opts, std::string *_text);
std::string *_text);
// Generate text for non-scalar field. // Generate text for non-scalar field.
static bool GenFieldOffset(const FieldDef &fd, const Table *table, bool fixed, static bool GenFieldOffset(const FieldDef &fd, const Table *table, bool fixed,
int indent, Type *union_type, int indent, Type *union_type, const IDLOptions &opts,
const IDLOptions &opts, std::string *_text) { std::string *_text) {
const void *val = nullptr; const void *val = nullptr;
if (fixed) { if (fixed) {
// The only non-scalar fields in structs are structs. // The only non-scalar fields in structs are structs.
assert(IsStruct(fd.value.type)); assert(IsStruct(fd.value.type));
val = reinterpret_cast<const Struct *>(table)-> val = reinterpret_cast<const Struct *>(table)->GetStruct<const void *>(
GetStruct<const void *>(fd.value.offset); fd.value.offset);
} else if (fd.flexbuffer) { } else if (fd.flexbuffer) {
auto vec = table->GetPointer<const Vector<uint8_t> *>(fd.value.offset); auto vec = table->GetPointer<const Vector<uint8_t> *>(fd.value.offset);
auto root = flexbuffers::GetRoot(vec->data(), vec->size()); auto root = flexbuffers::GetRoot(vec->data(), vec->size());
@@ -190,8 +180,8 @@ static bool GenFieldOffset(const FieldDef &fd, const Table *table, bool fixed,
return GenStruct(*fd.nested_flatbuffer, root, indent, opts, _text); return GenStruct(*fd.nested_flatbuffer, root, indent, opts, _text);
} else { } else {
val = IsStruct(fd.value.type) val = IsStruct(fd.value.type)
? table->GetStruct<const void *>(fd.value.offset) ? table->GetStruct<const void *>(fd.value.offset)
: table->GetPointer<const void *>(fd.value.offset); : table->GetPointer<const void *>(fd.value.offset);
} }
return Print(val, fd.value.type, indent, union_type, opts, _text); return Print(val, fd.value.type, indent, union_type, opts, _text);
} }
@@ -199,20 +189,17 @@ static bool GenFieldOffset(const FieldDef &fd, const Table *table, bool fixed,
// Generate text for a struct or table, values separated by commas, indented, // Generate text for a struct or table, values separated by commas, indented,
// and bracketed by "{}" // and bracketed by "{}"
static bool GenStruct(const StructDef &struct_def, const Table *table, static bool GenStruct(const StructDef &struct_def, const Table *table,
int indent, const IDLOptions &opts, int indent, const IDLOptions &opts, std::string *_text) {
std::string *_text) {
std::string &text = *_text; std::string &text = *_text;
text += "{"; text += "{";
int fieldout = 0; int fieldout = 0;
Type *union_type = nullptr; Type *union_type = nullptr;
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); it != struct_def.fields.vec.end(); ++it) {
++it) {
FieldDef &fd = **it; FieldDef &fd = **it;
auto is_present = struct_def.fixed || table->CheckField(fd.value.offset); auto is_present = struct_def.fixed || table->CheckField(fd.value.offset);
auto output_anyway = opts.output_default_scalars_in_json && auto output_anyway = opts.output_default_scalars_in_json &&
IsScalar(fd.value.type.base_type) && IsScalar(fd.value.type.base_type) && !fd.deprecated;
!fd.deprecated;
if (is_present || output_anyway) { if (is_present || output_anyway) {
if (fieldout++) { if (fieldout++) {
if (!opts.protobuf_ascii_alike) text += ","; if (!opts.protobuf_ascii_alike) text += ",";
@@ -222,18 +209,20 @@ static bool GenStruct(const StructDef &struct_def, const Table *table,
OutputIdentifier(fd.name, opts, _text); OutputIdentifier(fd.name, opts, _text);
if (!opts.protobuf_ascii_alike || if (!opts.protobuf_ascii_alike ||
(fd.value.type.base_type != BASE_TYPE_STRUCT && (fd.value.type.base_type != BASE_TYPE_STRUCT &&
fd.value.type.base_type != BASE_TYPE_VECTOR)) text += ":"; fd.value.type.base_type != BASE_TYPE_VECTOR))
text += ":";
text += " "; text += " ";
if (is_present) { if (is_present) {
switch (fd.value.type.base_type) { switch (fd.value.type.base_type) {
#define FLATBUFFERS_TD(ENUM, IDLTYPE, \ // clang-format off
CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \ #define FLATBUFFERS_TD(ENUM, IDLTYPE, \
case BASE_TYPE_ ## ENUM: \ CTYPE, JTYPE, GTYPE, NTYPE, PTYPE) \
if (!GenField<CTYPE>(fd, table, struct_def.fixed, \ case BASE_TYPE_ ## ENUM: \
opts, indent + Indent(opts), _text)) { \ if (!GenField<CTYPE>(fd, table, struct_def.fixed, \
return false; \ opts, indent + Indent(opts), _text)) { \
} \ return false; \
break; } \
break;
FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD) FLATBUFFERS_GEN_TYPES_SCALAR(FLATBUFFERS_TD)
#undef FLATBUFFERS_TD #undef FLATBUFFERS_TD
// Generate drop-thru case statements for all pointer types: // Generate drop-thru case statements for all pointer types:
@@ -247,16 +236,15 @@ static bool GenStruct(const StructDef &struct_def, const Table *table,
return false; return false;
} }
break; break;
// clang-format on
} }
if (fd.value.type.base_type == BASE_TYPE_UTYPE) { if (fd.value.type.base_type == BASE_TYPE_UTYPE) {
auto enum_val = fd.value.type.enum_def->ReverseLookup( auto enum_val = fd.value.type.enum_def->ReverseLookup(
table->GetField<uint8_t>(fd.value.offset, 0)); table->GetField<uint8_t>(fd.value.offset, 0));
assert(enum_val); assert(enum_val);
union_type = &enum_val->union_type; union_type = &enum_val->union_type;
} }
} } else {
else
{
text += fd.value.constant; text += fd.value.constant;
} }
} }
@@ -272,12 +260,9 @@ bool GenerateText(const Parser &parser, const void *flatbuffer,
std::string *_text) { std::string *_text) {
std::string &text = *_text; std::string &text = *_text;
assert(parser.root_struct_def_); // call SetRootType() assert(parser.root_struct_def_); // call SetRootType()
text.reserve(1024); // Reduce amount of inevitable reallocs. text.reserve(1024); // Reduce amount of inevitable reallocs.
if (!GenStruct(*parser.root_struct_def_, if (!GenStruct(*parser.root_struct_def_, GetRoot<Table>(flatbuffer), 0,
GetRoot<Table>(flatbuffer), parser.opts, _text)) {
0,
parser.opts,
_text)) {
return false; return false;
} }
text += NewLine(parser.opts); text += NewLine(parser.opts);
@@ -289,34 +274,29 @@ std::string TextFileName(const std::string &path,
return path + file_name + ".json"; return path + file_name + ".json";
} }
bool GenerateTextFile(const Parser &parser, bool GenerateTextFile(const Parser &parser, const std::string &path,
const std::string &path,
const std::string &file_name) { const std::string &file_name) {
if (!parser.builder_.GetSize() || !parser.root_struct_def_) return true; if (!parser.builder_.GetSize() || !parser.root_struct_def_) return true;
std::string text; std::string text;
if (!GenerateText(parser, parser.builder_.GetBufferPointer(), &text)) { if (!GenerateText(parser, parser.builder_.GetBufferPointer(), &text)) {
return false; return false;
} }
return flatbuffers::SaveFile(TextFileName(path, file_name).c_str(), return flatbuffers::SaveFile(TextFileName(path, file_name).c_str(), text,
text,
false); false);
} }
std::string TextMakeRule(const Parser &parser, std::string TextMakeRule(const Parser &parser, const std::string &path,
const std::string &path,
const std::string &file_name) { const std::string &file_name) {
if (!parser.builder_.GetSize() || !parser.root_struct_def_) return ""; if (!parser.builder_.GetSize() || !parser.root_struct_def_) return "";
std::string filebase = flatbuffers::StripPath( std::string filebase =
flatbuffers::StripExtension(file_name)); flatbuffers::StripPath(flatbuffers::StripExtension(file_name));
std::string make_rule = TextFileName(path, filebase) + ": " + file_name; std::string make_rule = TextFileName(path, filebase) + ": " + file_name;
auto included_files = parser.GetIncludedFilesRecursive( auto included_files =
parser.root_struct_def_->file); parser.GetIncludedFilesRecursive(parser.root_struct_def_->file);
for (auto it = included_files.begin(); for (auto it = included_files.begin(); it != included_files.end(); ++it) {
it != included_files.end(); ++it) {
make_rule += " " + *it; make_rule += " " + *it;
} }
return make_rule; return make_rule;
} }
} // namespace flatbuffers } // namespace flatbuffers

File diff suppressed because it is too large Load Diff

View File

@@ -22,7 +22,8 @@
namespace flatbuffers { namespace flatbuffers {
int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data) { int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data) {
# define FLATBUFFERS_GET(T) static_cast<int64_t>(ReadScalar<T>(data)) // clang-format off
#define FLATBUFFERS_GET(T) static_cast<int64_t>(ReadScalar<T>(data))
switch (type) { switch (type) {
case reflection::UType: case reflection::UType:
case reflection::Bool: case reflection::Bool:
@@ -43,16 +44,17 @@ int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data) {
} }
default: return 0; // Tables & vectors do not make sense. default: return 0; // Tables & vectors do not make sense.
} }
# undef FLATBUFFERS_GET #undef FLATBUFFERS_GET
// clang-format on
} }
double GetAnyValueF(reflection::BaseType type, const uint8_t *data) { double GetAnyValueF(reflection::BaseType type, const uint8_t *data) {
switch (type) { switch (type) {
case reflection::Float: return static_cast<double>(ReadScalar<float>(data)); case reflection::Float: return static_cast<double>(ReadScalar<float>(data));
case reflection::Double: return ReadScalar<double>(data); case reflection::Double: return ReadScalar<double>(data);
case reflection::String: { case reflection::String: {
auto s = reinterpret_cast<const String *>(ReadScalar<uoffset_t>(data) + auto s =
data); reinterpret_cast<const String *>(ReadScalar<uoffset_t>(data) + data);
return s ? strtod(s->c_str(), nullptr) : 0.0; return s ? strtod(s->c_str(), nullptr) : 0.0;
} }
default: return static_cast<double>(GetAnyValueI(type, data)); default: return static_cast<double>(GetAnyValueI(type, data));
@@ -65,8 +67,8 @@ std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data,
case reflection::Float: case reflection::Float:
case reflection::Double: return NumToString(GetAnyValueF(type, data)); case reflection::Double: return NumToString(GetAnyValueF(type, data));
case reflection::String: { case reflection::String: {
auto s = reinterpret_cast<const String *>(ReadScalar<uoffset_t>(data) + auto s =
data); reinterpret_cast<const String *>(ReadScalar<uoffset_t>(data) + data);
return s ? s->c_str() : ""; return s ? s->c_str() : "";
} }
case reflection::Obj: case reflection::Obj:
@@ -80,7 +82,7 @@ std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data,
s += "(struct)"; // TODO: implement this as well. s += "(struct)"; // TODO: implement this as well.
} else { } else {
auto table_field = reinterpret_cast<const Table *>( auto table_field = reinterpret_cast<const Table *>(
ReadScalar<uoffset_t>(data) + data); ReadScalar<uoffset_t>(data) + data);
s += " { "; s += " { ";
auto fielddefs = objectdef.fields(); auto fielddefs = objectdef.fields();
for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) { for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {
@@ -104,15 +106,15 @@ std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data,
return "(table)"; return "(table)";
} }
case reflection::Vector: case reflection::Vector:
return "[(elements)]"; // TODO: implement this as well. return "[(elements)]"; // TODO: implement this as well.
case reflection::Union: case reflection::Union: return "(union)"; // TODO: implement this as well.
return "(union)"; // TODO: implement this as well.
default: return NumToString(GetAnyValueI(type, data)); default: return NumToString(GetAnyValueI(type, data));
} }
} }
void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val) { void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val) {
# define FLATBUFFERS_SET(T) WriteScalar(data, static_cast<T>(val)) // clang-format off
#define FLATBUFFERS_SET(T) WriteScalar(data, static_cast<T>(val))
switch (type) { switch (type) {
case reflection::UType: case reflection::UType:
case reflection::Bool: case reflection::Bool:
@@ -129,12 +131,13 @@ void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val) {
// TODO: support strings // TODO: support strings
default: break; default: break;
} }
# undef FLATBUFFERS_SET #undef FLATBUFFERS_SET
// clang-format on
} }
void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val) { void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val) {
switch (type) { switch (type) {
case reflection::Float: WriteScalar(data, static_cast<float>(val)); break; case reflection::Float: WriteScalar(data, static_cast<float>(val)); break;
case reflection::Double: WriteScalar(data, val); break; case reflection::Double: WriteScalar(data, val); break;
// TODO: support strings. // TODO: support strings.
default: SetAnyValueI(type, data, static_cast<int64_t>(val)); break; default: SetAnyValueI(type, data, static_cast<int64_t>(val)); break;
@@ -165,9 +168,11 @@ class ResizeContext {
ResizeContext(const reflection::Schema &schema, uoffset_t start, int delta, ResizeContext(const reflection::Schema &schema, uoffset_t start, int delta,
std::vector<uint8_t> *flatbuf, std::vector<uint8_t> *flatbuf,
const reflection::Object *root_table = nullptr) const reflection::Object *root_table = nullptr)
: schema_(schema), startptr_(vector_data(*flatbuf) + start), : schema_(schema),
delta_(delta), buf_(*flatbuf), startptr_(vector_data(*flatbuf) + start),
dag_check_(flatbuf->size() / sizeof(uoffset_t), false) { delta_(delta),
buf_(*flatbuf),
dag_check_(flatbuf->size() / sizeof(uoffset_t), false) {
auto mask = static_cast<int>(sizeof(largest_scalar_t) - 1); auto mask = static_cast<int>(sizeof(largest_scalar_t) - 1);
delta_ = (delta_ + mask) & ~mask; delta_ = (delta_ + mask) & ~mask;
if (!delta_) return; // We can't shrink by less than largest_scalar_t. if (!delta_) return; // We can't shrink by less than largest_scalar_t.
@@ -176,16 +181,17 @@ class ResizeContext {
Straddle<uoffset_t, 1>(vector_data(buf_), root, vector_data(buf_)); Straddle<uoffset_t, 1>(vector_data(buf_), root, vector_data(buf_));
ResizeTable(root_table ? *root_table : *schema.root_table(), root); ResizeTable(root_table ? *root_table : *schema.root_table(), root);
// We can now add or remove bytes at start. // We can now add or remove bytes at start.
if (delta_ > 0) buf_.insert(buf_.begin() + start, delta_, 0); if (delta_ > 0)
else buf_.erase(buf_.begin() + start, buf_.begin() + start - delta_); buf_.insert(buf_.begin() + start, delta_, 0);
else
buf_.erase(buf_.begin() + start, buf_.begin() + start - delta_);
} }
// Check if the range between first (lower address) and second straddles // Check if the range between first (lower address) and second straddles
// the insertion point. If it does, change the offset at offsetloc (of // the insertion point. If it does, change the offset at offsetloc (of
// type T, with direction D). // type T, with direction D).
template<typename T, int D> void Straddle(const void *first, template<typename T, int D>
const void *second, void Straddle(const void *first, const void *second, void *offsetloc) {
void *offsetloc) {
if (first <= startptr_ && second >= startptr_) { if (first <= startptr_ && second >= startptr_) {
WriteScalar<T>(offsetloc, ReadScalar<T>(offsetloc) + delta_ * D); WriteScalar<T>(offsetloc, ReadScalar<T>(offsetloc) + delta_ * D);
DagCheck(offsetloc) = true; DagCheck(offsetloc) = true;
@@ -205,8 +211,7 @@ class ResizeContext {
} }
void ResizeTable(const reflection::Object &objectdef, Table *table) { void ResizeTable(const reflection::Object &objectdef, Table *table) {
if (DagCheck(table)) if (DagCheck(table)) return; // Table already visited.
return; // Table already visited.
auto vtable = table->GetVTable(); auto vtable = table->GetVTable();
// Early out: since all fields inside the table must point forwards in // Early out: since all fields inside the table must point forwards in
// memory, if the insertion point is before the table we can stop here. // memory, if the insertion point is before the table we can stop here.
@@ -228,13 +233,14 @@ class ResizeContext {
auto offset = table->GetOptionalFieldOffset(fielddef.offset()); auto offset = table->GetOptionalFieldOffset(fielddef.offset());
if (!offset) continue; if (!offset) continue;
// Ignore structs. // Ignore structs.
auto subobjectdef = base_type == reflection::Obj ? auto subobjectdef =
schema_.objects()->Get(fielddef.type()->index()) : nullptr; base_type == reflection::Obj
? schema_.objects()->Get(fielddef.type()->index())
: nullptr;
if (subobjectdef && subobjectdef->is_struct()) continue; if (subobjectdef && subobjectdef->is_struct()) continue;
// Get this fields' offset, and read it if safe. // Get this fields' offset, and read it if safe.
auto offsetloc = tableloc + offset; auto offsetloc = tableloc + offset;
if (DagCheck(offsetloc)) if (DagCheck(offsetloc)) continue; // This offset already visited.
continue; // This offset already visited.
auto ref = offsetloc + ReadScalar<uoffset_t>(offsetloc); auto ref = offsetloc + ReadScalar<uoffset_t>(offsetloc);
Straddle<uoffset_t, 1>(offsetloc, ref, offsetloc); Straddle<uoffset_t, 1>(offsetloc, ref, offsetloc);
// Recurse. // Recurse.
@@ -248,16 +254,16 @@ class ResizeContext {
if (elem_type != reflection::Obj && elem_type != reflection::String) if (elem_type != reflection::Obj && elem_type != reflection::String)
break; break;
auto vec = reinterpret_cast<Vector<uoffset_t> *>(ref); auto vec = reinterpret_cast<Vector<uoffset_t> *>(ref);
auto elemobjectdef = elem_type == reflection::Obj auto elemobjectdef =
? schema_.objects()->Get(fielddef.type()->index()) elem_type == reflection::Obj
: nullptr; ? schema_.objects()->Get(fielddef.type()->index())
: nullptr;
if (elemobjectdef && elemobjectdef->is_struct()) break; if (elemobjectdef && elemobjectdef->is_struct()) break;
for (uoffset_t i = 0; i < vec->size(); i++) { for (uoffset_t i = 0; i < vec->size(); i++) {
auto loc = vec->Data() + i * sizeof(uoffset_t); auto loc = vec->Data() + i * sizeof(uoffset_t);
if (DagCheck(loc)) if (DagCheck(loc)) continue; // This offset already visited.
continue; // This offset already visited.
auto dest = loc + vec->Get(i); auto dest = loc + vec->Get(i);
Straddle<uoffset_t, 1>(loc, dest ,loc); Straddle<uoffset_t, 1>(loc, dest, loc);
if (elemobjectdef) if (elemobjectdef)
ResizeTable(*elemobjectdef, reinterpret_cast<Table *>(dest)); ResizeTable(*elemobjectdef, reinterpret_cast<Table *>(dest));
} }
@@ -268,10 +274,8 @@ class ResizeContext {
reinterpret_cast<Table *>(ref)); reinterpret_cast<Table *>(ref));
break; break;
} }
case reflection::String: case reflection::String: break;
break; default: assert(false);
default:
assert(false);
} }
} }
// Check if the vtable offset points beyond the insertion point. // Check if the vtable offset points beyond the insertion point.
@@ -292,8 +296,8 @@ class ResizeContext {
}; };
void SetString(const reflection::Schema &schema, const std::string &val, void SetString(const reflection::Schema &schema, const std::string &val,
const String *str, std::vector<uint8_t> *flatbuf, const String *str, std::vector<uint8_t> *flatbuf,
const reflection::Object *root_table) { const reflection::Object *root_table) {
auto delta = static_cast<int>(val.size()) - static_cast<int>(str->Length()); auto delta = static_cast<int>(val.size()) - static_cast<int>(str->Length());
auto str_start = static_cast<uoffset_t>( auto str_start = static_cast<uoffset_t>(
reinterpret_cast<const uint8_t *>(str) - vector_data(*flatbuf)); reinterpret_cast<const uint8_t *>(str) - vector_data(*flatbuf));
@@ -317,8 +321,8 @@ uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize,
const reflection::Object *root_table) { const reflection::Object *root_table) {
auto delta_elem = static_cast<int>(newsize) - static_cast<int>(num_elems); auto delta_elem = static_cast<int>(newsize) - static_cast<int>(num_elems);
auto delta_bytes = delta_elem * static_cast<int>(elem_size); auto delta_bytes = delta_elem * static_cast<int>(elem_size);
auto vec_start = reinterpret_cast<const uint8_t *>(vec) - auto vec_start =
vector_data(*flatbuf); reinterpret_cast<const uint8_t *>(vec) - vector_data(*flatbuf);
auto start = static_cast<uoffset_t>(vec_start + sizeof(uoffset_t) + auto start = static_cast<uoffset_t>(vec_start + sizeof(uoffset_t) +
elem_size * num_elems); elem_size * num_elems);
if (delta_bytes) { if (delta_bytes) {
@@ -363,8 +367,7 @@ void CopyInline(FlatBufferBuilder &fbb, const reflection::Field &fielddef,
Offset<const Table *> CopyTable(FlatBufferBuilder &fbb, Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
const reflection::Schema &schema, const reflection::Schema &schema,
const reflection::Object &objectdef, const reflection::Object &objectdef,
const Table &table, const Table &table, bool use_string_pooling) {
bool use_string_pooling) {
// Before we can construct the table, we have to first generate any // Before we can construct the table, we have to first generate any
// subobjects, and collect their offsets. // subobjects, and collect their offsets.
std::vector<uoffset_t> offsets; std::vector<uoffset_t> offsets;
@@ -377,39 +380,41 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
switch (fielddef.type()->base_type()) { switch (fielddef.type()->base_type()) {
case reflection::String: { case reflection::String: {
offset = use_string_pooling offset = use_string_pooling
? fbb.CreateSharedString(GetFieldS(table, fielddef)).o ? fbb.CreateSharedString(GetFieldS(table, fielddef)).o
: fbb.CreateString(GetFieldS(table, fielddef)).o; : fbb.CreateString(GetFieldS(table, fielddef)).o;
break; break;
} }
case reflection::Obj: { case reflection::Obj: {
auto &subobjectdef = *schema.objects()->Get(fielddef.type()->index()); auto &subobjectdef = *schema.objects()->Get(fielddef.type()->index());
if (!subobjectdef.is_struct()) { if (!subobjectdef.is_struct()) {
offset = CopyTable(fbb, schema, subobjectdef, offset =
*GetFieldT(table, fielddef)).o; CopyTable(fbb, schema, subobjectdef, *GetFieldT(table, fielddef))
.o;
} }
break; break;
} }
case reflection::Union: { case reflection::Union: {
auto &subobjectdef = GetUnionType(schema, objectdef, fielddef, table); auto &subobjectdef = GetUnionType(schema, objectdef, fielddef, table);
offset = CopyTable(fbb, schema, subobjectdef, offset =
*GetFieldT(table, fielddef)).o; CopyTable(fbb, schema, subobjectdef, *GetFieldT(table, fielddef)).o;
break; break;
} }
case reflection::Vector: { case reflection::Vector: {
auto vec = table.GetPointer<const Vector<Offset<Table>> *>( auto vec =
fielddef.offset()); table.GetPointer<const Vector<Offset<Table>> *>(fielddef.offset());
auto element_base_type = fielddef.type()->element(); auto element_base_type = fielddef.type()->element();
auto elemobjectdef = element_base_type == reflection::Obj auto elemobjectdef =
? schema.objects()->Get(fielddef.type()->index()) element_base_type == reflection::Obj
: nullptr; ? schema.objects()->Get(fielddef.type()->index())
: nullptr;
switch (element_base_type) { switch (element_base_type) {
case reflection::String: { case reflection::String: {
std::vector<Offset<const String *>> elements(vec->size()); std::vector<Offset<const String *>> elements(vec->size());
auto vec_s = reinterpret_cast<const Vector<Offset<String>> *>(vec); auto vec_s = reinterpret_cast<const Vector<Offset<String>> *>(vec);
for (uoffset_t i = 0; i < vec_s->size(); i++) { for (uoffset_t i = 0; i < vec_s->size(); i++) {
elements[i] = use_string_pooling elements[i] = use_string_pooling
? fbb.CreateSharedString(vec_s->Get(i)).o ? fbb.CreateSharedString(vec_s->Get(i)).o
: fbb.CreateString(vec_s->Get(i)).o; : fbb.CreateString(vec_s->Get(i)).o;
} }
offset = fbb.CreateVector(elements).o; offset = fbb.CreateVector(elements).o;
break; break;
@@ -419,7 +424,7 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
std::vector<Offset<const Table *>> elements(vec->size()); std::vector<Offset<const Table *>> elements(vec->size());
for (uoffset_t i = 0; i < vec->size(); i++) { for (uoffset_t i = 0; i < vec->size(); i++) {
elements[i] = elements[i] =
CopyTable(fbb, schema, *elemobjectdef, *vec->Get(i)); CopyTable(fbb, schema, *elemobjectdef, *vec->Get(i));
} }
offset = fbb.CreateVector(elements).o; offset = fbb.CreateVector(elements).o;
break; break;
@@ -441,14 +446,11 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
default: // Scalars. default: // Scalars.
break; break;
} }
if (offset) { if (offset) { offsets.push_back(offset); }
offsets.push_back(offset);
}
} }
// Now we can build the actual table from either offsets or scalar data. // Now we can build the actual table from either offsets or scalar data.
auto start = objectdef.is_struct() auto start = objectdef.is_struct() ? fbb.StartStruct(objectdef.minalign())
? fbb.StartStruct(objectdef.minalign()) : fbb.StartTable();
: fbb.StartTable();
size_t offset_idx = 0; size_t offset_idx = 0;
for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) { for (auto it = fielddefs->begin(); it != fielddefs->end(); ++it) {
auto &fielddef = **it; auto &fielddef = **it;
@@ -469,7 +471,7 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
case reflection::Vector: case reflection::Vector:
fbb.AddOffset(fielddef.offset(), Offset<void>(offsets[offset_idx++])); fbb.AddOffset(fielddef.offset(), Offset<void>(offsets[offset_idx++]));
break; break;
default: { // Scalars. default: { // Scalars.
auto size = GetTypeSize(base_type); auto size = GetTypeSize(base_type);
CopyInline(fbb, fielddef, table, size, size); CopyInline(fbb, fielddef, table, size, size);
break; break;
@@ -487,51 +489,40 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
bool VerifyStruct(flatbuffers::Verifier &v, bool VerifyStruct(flatbuffers::Verifier &v,
const flatbuffers::Table &parent_table, const flatbuffers::Table &parent_table,
voffset_t field_offset, voffset_t field_offset, const reflection::Object &obj,
const reflection::Object &obj,
bool required) { bool required) {
auto offset = parent_table.GetOptionalFieldOffset(field_offset); auto offset = parent_table.GetOptionalFieldOffset(field_offset);
if (required && !offset) { if (required && !offset) { return false; }
return false;
}
return !offset || v.Verify(reinterpret_cast<const uint8_t*>(&parent_table) return !offset ||
+ offset, obj.bytesize()); v.Verify(reinterpret_cast<const uint8_t *>(&parent_table) + offset,
obj.bytesize());
} }
bool VerifyVectorOfStructs(flatbuffers::Verifier &v, bool VerifyVectorOfStructs(flatbuffers::Verifier &v,
const flatbuffers::Table &parent_table, const flatbuffers::Table &parent_table,
voffset_t field_offset, voffset_t field_offset,
const reflection::Object &obj, const reflection::Object &obj, bool required) {
bool required) { auto p = parent_table.GetPointer<const uint8_t *>(field_offset);
auto p = parent_table.GetPointer<const uint8_t*>(field_offset); const uint8_t *end;
const uint8_t* end; if (required && !p) { return false; }
if (required && !p) {
return false;
}
return !p || v.VerifyVector(p, obj.bytesize(), &end); return !p || v.VerifyVector(p, obj.bytesize(), &end);
} }
// forward declare to resolve cyclic deps between VerifyObject and VerifyVector // forward declare to resolve cyclic deps between VerifyObject and VerifyVector
bool VerifyObject(flatbuffers::Verifier &v, bool VerifyObject(flatbuffers::Verifier &v, const reflection::Schema &schema,
const reflection::Schema &schema,
const reflection::Object &obj, const reflection::Object &obj,
const flatbuffers::Table *table, const flatbuffers::Table *table, bool isRequired);
bool isRequired);
bool VerifyVector(flatbuffers::Verifier &v, bool VerifyVector(flatbuffers::Verifier &v, const reflection::Schema &schema,
const reflection::Schema &schema,
const flatbuffers::Table &table, const flatbuffers::Table &table,
const reflection::Field &vec_field) { const reflection::Field &vec_field) {
assert(vec_field.type()->base_type() == reflection::Vector); assert(vec_field.type()->base_type() == reflection::Vector);
if (!table.VerifyField<uoffset_t>(v, vec_field.offset())) if (!table.VerifyField<uoffset_t>(v, vec_field.offset())) return false;
return false;
switch (vec_field.type()->element()) { switch (vec_field.type()->element()) {
case reflection::None: case reflection::None: assert(false); break;
assert(false);
break;
case reflection::UType: case reflection::UType:
return v.Verify(flatbuffers::GetFieldV<uint8_t>(table, vec_field)); return v.Verify(flatbuffers::GetFieldV<uint8_t>(table, vec_field));
case reflection::Bool: case reflection::Bool:
@@ -553,17 +544,15 @@ bool VerifyVector(flatbuffers::Verifier &v,
return v.Verify(flatbuffers::GetFieldV<double>(table, vec_field)); return v.Verify(flatbuffers::GetFieldV<double>(table, vec_field));
case reflection::String: { case reflection::String: {
auto vecString = auto vecString =
flatbuffers::GetFieldV<flatbuffers:: flatbuffers::GetFieldV<flatbuffers::Offset<flatbuffers::String>>(
Offset<flatbuffers::String>>(table, vec_field); table, vec_field);
if (v.Verify(vecString) && v.VerifyVectorOfStrings(vecString)) { if (v.Verify(vecString) && v.VerifyVectorOfStrings(vecString)) {
return true; return true;
} else { } else {
return false; return false;
} }
} }
case reflection::Vector: case reflection::Vector: assert(false); break;
assert(false);
break;
case reflection::Obj: { case reflection::Obj: {
auto obj = schema.objects()->Get(vec_field.type()->index()); auto obj = schema.objects()->Get(vec_field.type()->index());
if (obj->is_struct()) { if (obj->is_struct()) {
@@ -573,10 +562,9 @@ bool VerifyVector(flatbuffers::Verifier &v,
} }
} else { } else {
auto vec = auto vec =
flatbuffers::GetFieldV<flatbuffers:: flatbuffers::GetFieldV<flatbuffers::Offset<flatbuffers::Table>>(
Offset<flatbuffers::Table>>(table, vec_field); table, vec_field);
if (!v.Verify(vec)) if (!v.Verify(vec)) return false;
return false;
if (vec) { if (vec) {
for (uoffset_t j = 0; j < vec->size(); j++) { for (uoffset_t j = 0; j < vec->size(); j++) {
if (!VerifyObject(v, schema, *obj, vec->Get(j), true)) { if (!VerifyObject(v, schema, *obj, vec->Get(j), true)) {
@@ -587,22 +575,16 @@ bool VerifyVector(flatbuffers::Verifier &v,
} }
return true; return true;
} }
case reflection::Union: case reflection::Union: assert(false); break;
assert(false); default: assert(false); break;
break;
default:
assert(false);
break;
} }
return false; return false;
} }
bool VerifyObject(flatbuffers::Verifier &v, bool VerifyObject(flatbuffers::Verifier &v, const reflection::Schema &schema,
const reflection::Schema &schema,
const reflection::Object &obj, const reflection::Object &obj,
const flatbuffers::Table *table, const flatbuffers::Table *table, bool required) {
bool required) {
if (!table) { if (!table) {
if (!required) if (!required)
return true; return true;
@@ -610,47 +592,37 @@ bool VerifyObject(flatbuffers::Verifier &v,
return false; return false;
} }
if (!table->VerifyTableStart(v)) if (!table->VerifyTableStart(v)) return false;
return false;
for (uoffset_t i = 0; i < obj.fields()->size(); i++) { for (uoffset_t i = 0; i < obj.fields()->size(); i++) {
auto field_def = obj.fields()->Get(i); auto field_def = obj.fields()->Get(i);
switch (field_def->type()->base_type()) { switch (field_def->type()->base_type()) {
case reflection::None: case reflection::None: assert(false); break;
assert(false);
break;
case reflection::UType: case reflection::UType:
if (!table->VerifyField<uint8_t>(v, field_def->offset())) if (!table->VerifyField<uint8_t>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Bool: case reflection::Bool:
case reflection::Byte: case reflection::Byte:
case reflection::UByte: case reflection::UByte:
if (!table->VerifyField<int8_t>(v, field_def->offset())) if (!table->VerifyField<int8_t>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Short: case reflection::Short:
case reflection::UShort: case reflection::UShort:
if (!table->VerifyField<int16_t>(v, field_def->offset())) if (!table->VerifyField<int16_t>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Int: case reflection::Int:
case reflection::UInt: case reflection::UInt:
if (!table->VerifyField<int32_t>(v, field_def->offset())) if (!table->VerifyField<int32_t>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Long: case reflection::Long:
case reflection::ULong: case reflection::ULong:
if (!table->VerifyField<int64_t>(v, field_def->offset())) if (!table->VerifyField<int64_t>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Float: case reflection::Float:
if (!table->VerifyField<float>(v, field_def->offset())) if (!table->VerifyField<float>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::Double: case reflection::Double:
if (!table->VerifyField<double>(v, field_def->offset())) if (!table->VerifyField<double>(v, field_def->offset())) return false;
return false;
break; break;
case reflection::String: case reflection::String:
if (!table->VerifyField<uoffset_t>(v, field_def->offset()) || if (!table->VerifyField<uoffset_t>(v, field_def->offset()) ||
@@ -659,8 +631,7 @@ bool VerifyObject(flatbuffers::Verifier &v,
} }
break; break;
case reflection::Vector: case reflection::Vector:
if (!VerifyVector(v, schema, *table, *field_def)) if (!VerifyVector(v, schema, *table, *field_def)) return false;
return false;
break; break;
case reflection::Obj: { case reflection::Obj: {
auto child_obj = schema.objects()->Get(field_def->type()->index()); auto child_obj = schema.objects()->Get(field_def->type()->index());
@@ -694,22 +665,17 @@ bool VerifyObject(flatbuffers::Verifier &v,
} }
break; break;
} }
default: default: assert(false); break;
assert(false);
break;
} }
} }
if (!v.EndTable()) if (!v.EndTable()) return false;
return false;
return true; return true;
} }
bool Verify(const reflection::Schema &schema, bool Verify(const reflection::Schema &schema, const reflection::Object &root,
const reflection::Object &root, const uint8_t *buf, size_t length) {
const uint8_t *buf,
size_t length) {
Verifier v(buf, length); Verifier v(buf, length);
return VerifyObject(v, schema, root, flatbuffers::GetAnyRoot(buf), true); return VerifyObject(v, schema, root, flatbuffers::GetAnyRoot(buf), true);
} }

View File

@@ -57,6 +57,7 @@ bool FileExists(const char *name) {
} }
bool DirExists(const char *name) { bool DirExists(const char *name) {
// clang-format off
#ifdef _WIN32 #ifdef _WIN32
#define flatbuffers_stat _stat #define flatbuffers_stat _stat
#define FLATBUFFERS_S_IFDIR _S_IFDIR #define FLATBUFFERS_S_IFDIR _S_IFDIR
@@ -64,6 +65,7 @@ bool DirExists(const char *name) {
#define flatbuffers_stat stat #define flatbuffers_stat stat
#define FLATBUFFERS_S_IFDIR S_IFDIR #define FLATBUFFERS_S_IFDIR S_IFDIR
#endif #endif
// clang-format on
struct flatbuffers_stat file_info; struct flatbuffers_stat file_info;
if (flatbuffers_stat(name, &file_info) != 0) return false; if (flatbuffers_stat(name, &file_info) != 0) return false;
return (file_info.st_mode & FLATBUFFERS_S_IFDIR) != 0; return (file_info.st_mode & FLATBUFFERS_S_IFDIR) != 0;
@@ -78,8 +80,8 @@ LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function) {
FileExistsFunction SetFileExistsFunction( FileExistsFunction SetFileExistsFunction(
FileExistsFunction file_exists_function) { FileExistsFunction file_exists_function) {
FileExistsFunction previous_function = g_file_exists_function; FileExistsFunction previous_function = g_file_exists_function;
g_file_exists_function = file_exists_function ? g_file_exists_function =
file_exists_function : FileExistsRaw; file_exists_function ? file_exists_function : FileExistsRaw;
return previous_function; return previous_function;
} }

View File

@@ -27,44 +27,36 @@ std::unique_ptr< MonsterStorage::Stub> MonsterStorage::NewStub(const std::shared
} }
MonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel) MonsterStorage::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
: channel_(channel) , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel) : channel_(channel) , rpcmethod_Store_(MonsterStorage_method_names[0], ::grpc::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel) , rpcmethod_Retrieve_(MonsterStorage_method_names[1], ::grpc::RpcMethod::SERVER_STREAMING, channel)
{} {}
::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) { ::grpc::Status MonsterStorage::Stub::Store(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, flatbuffers::grpc::Message<Stat>* response) {
return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response); return ::grpc::BlockingUnaryCall(channel_.get(), rpcmethod_Store_, context, request, response);
} }
::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) { ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, true); return ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request);
}
::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* MonsterStorage::Stub::PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return ::grpc::internal::ClientAsyncResponseReaderFactory< flatbuffers::grpc::Message<Stat>>::Create(channel_.get(), cq, rpcmethod_Store_, context, request, false);
} }
::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) { ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {
return ::grpc::internal::ClientReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), rpcmethod_Retrieve_, context, request); return new ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>(channel_.get(), rpcmethod_Retrieve_, context, request);
} }
::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) { ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {
return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, true, tag); return ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, tag);
}
::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* MonsterStorage::Stub::PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {
return ::grpc::internal::ClientAsyncReaderFactory< flatbuffers::grpc::Message<Monster>>::Create(channel_.get(), cq, rpcmethod_Retrieve_, context, request, false, nullptr);
} }
MonsterStorage::Service::Service() { MonsterStorage::Service::Service() {
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::RpcServiceMethod(
MonsterStorage_method_names[0], MonsterStorage_method_names[0],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>( new ::grpc::RpcMethodHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(
std::mem_fn(&MonsterStorage::Service::Store), this))); std::mem_fn(&MonsterStorage::Service::Store), this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::RpcServiceMethod(
MonsterStorage_method_names[1], MonsterStorage_method_names[1],
::grpc::internal::RpcMethod::SERVER_STREAMING, ::grpc::RpcMethod::SERVER_STREAMING,
new ::grpc::internal::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>( new ::grpc::ServerStreamingHandler< MonsterStorage::Service, flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(
std::mem_fn(&MonsterStorage::Service::Retrieve), this))); std::mem_fn(&MonsterStorage::Service::Retrieve), this)));
} }

View File

@@ -4,8 +4,8 @@
#ifndef GRPC_monster_5ftest__INCLUDED #ifndef GRPC_monster_5ftest__INCLUDED
#define GRPC_monster_5ftest__INCLUDED #define GRPC_monster_5ftest__INCLUDED
#include "monster_test_generated.h"
#include "flatbuffers/grpc.h" #include "flatbuffers/grpc.h"
#include "monster_test_generated.h"
#include <grpc++/impl/codegen/async_stream.h> #include <grpc++/impl/codegen/async_stream.h>
#include <grpc++/impl/codegen/async_unary_call.h> #include <grpc++/impl/codegen/async_unary_call.h>
@@ -20,6 +20,7 @@
namespace grpc { namespace grpc {
class CompletionQueue; class CompletionQueue;
class Channel; class Channel;
class RpcService;
class ServerCompletionQueue; class ServerCompletionQueue;
class ServerContext; class ServerContext;
} // namespace grpc } // namespace grpc
@@ -39,24 +40,16 @@ class MonsterStorage final {
std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) { std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq)); return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));
} }
std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));
}
std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) { std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {
return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request)); return std::unique_ptr< ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));
} }
std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) { std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {
return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag)); return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));
} }
std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));
}
private: private:
virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0; virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientAsyncResponseReaderInterface< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0; virtual ::grpc::ClientReaderInterface< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) = 0;
virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0; virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
virtual ::grpc::ClientAsyncReaderInterface< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) = 0;
}; };
class Stub final : public StubInterface { class Stub final : public StubInterface {
public: public:
@@ -65,28 +58,20 @@ class MonsterStorage final {
std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) { std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> AsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq)); return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(AsyncStoreRaw(context, request, cq));
} }
std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>> PrepareAsyncStore(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>>(PrepareAsyncStoreRaw(context, request, cq));
}
std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) { std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>> Retrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) {
return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request)); return std::unique_ptr< ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>>(RetrieveRaw(context, request));
} }
std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) { std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> AsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) {
return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag)); return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(AsyncRetrieveRaw(context, request, cq, tag));
} }
std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>> PrepareAsyncRetrieve(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) {
return std::unique_ptr< ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>>(PrepareAsyncRetrieveRaw(context, request, cq));
}
private: private:
std::shared_ptr< ::grpc::ChannelInterface> channel_; std::shared_ptr< ::grpc::ChannelInterface> channel_;
::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override; ::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* AsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;
::grpc::ClientAsyncResponseReader< flatbuffers::grpc::Message<Stat>>* PrepareAsyncStoreRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Monster>& request, ::grpc::CompletionQueue* cq) override;
::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override; ::grpc::ClientReader< flatbuffers::grpc::Message<Monster>>* RetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request) override;
::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override; ::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* AsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq, void* tag) override;
::grpc::ClientAsyncReader< flatbuffers::grpc::Message<Monster>>* PrepareAsyncRetrieveRaw(::grpc::ClientContext* context, const flatbuffers::grpc::Message<Stat>& request, ::grpc::CompletionQueue* cq) override; const ::grpc::RpcMethod rpcmethod_Store_;
const ::grpc::internal::RpcMethod rpcmethod_Store_; const ::grpc::RpcMethod rpcmethod_Retrieve_;
const ::grpc::internal::RpcMethod rpcmethod_Retrieve_;
}; };
static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions()); static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
@@ -179,7 +164,7 @@ class MonsterStorage final {
public: public:
WithStreamedUnaryMethod_Store() { WithStreamedUnaryMethod_Store() {
::grpc::Service::MarkMethodStreamed(0, ::grpc::Service::MarkMethodStreamed(0,
new ::grpc::internal::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2))); new ::grpc::StreamedUnaryHandler< flatbuffers::grpc::Message<Monster>, flatbuffers::grpc::Message<Stat>>(std::bind(&WithStreamedUnaryMethod_Store<BaseClass>::StreamedStore, this, std::placeholders::_1, std::placeholders::_2)));
} }
~WithStreamedUnaryMethod_Store() override { ~WithStreamedUnaryMethod_Store() override {
BaseClassMustBeDerivedFromService(this); BaseClassMustBeDerivedFromService(this);
@@ -200,7 +185,7 @@ class MonsterStorage final {
public: public:
WithSplitStreamingMethod_Retrieve() { WithSplitStreamingMethod_Retrieve() {
::grpc::Service::MarkMethodStreamed(1, ::grpc::Service::MarkMethodStreamed(1,
new ::grpc::internal::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2))); new ::grpc::SplitServerStreamingHandler< flatbuffers::grpc::Message<Stat>, flatbuffers::grpc::Message<Monster>>(std::bind(&WithSplitStreamingMethod_Retrieve<BaseClass>::StreamedRetrieve, this, std::placeholders::_1, std::placeholders::_2)));
} }
~WithSplitStreamingMethod_Retrieve() override { ~WithSplitStreamingMethod_Retrieve() override {
BaseClassMustBeDerivedFromService(this); BaseClassMustBeDerivedFromService(this);

File diff suppressed because it is too large Load Diff

View File

@@ -18,7 +18,7 @@ export class TableInNestedNS {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -48,8 +48,8 @@ static getRootAsTableInNestedNS(bb:flatbuffers.ByteBuffer, obj?:TableInNestedNS)
* @returns {number} * @returns {number}
*/ */
foo():number { foo():number {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;
}; };
/** /**
@@ -57,13 +57,13 @@ foo():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_foo(value:number):boolean { mutate_foo(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -101,7 +101,7 @@ export class StructInNestedNS {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -122,7 +122,7 @@ __init(i:number, bb:flatbuffers.ByteBuffer):StructInNestedNS {
* @returns {number} * @returns {number}
*/ */
a():number { a():number {
return this.bb!.readInt32(this.bb_pos); return this.bb.readInt32(this.bb_pos);
}; };
/** /**
@@ -130,13 +130,13 @@ a():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_a(value:number):boolean { mutate_a(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 0); var offset = this.bb.__offset(this.bb_pos, 0);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -144,7 +144,7 @@ mutate_a(value:number):boolean {
* @returns {number} * @returns {number}
*/ */
b():number { b():number {
return this.bb!.readInt32(this.bb_pos + 4); return this.bb.readInt32(this.bb_pos + 4);
}; };
/** /**
@@ -152,13 +152,13 @@ b():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_b(value:number):boolean { mutate_b(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };

View File

@@ -9,7 +9,7 @@ export class TableInFirstNS {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -40,16 +40,16 @@ static getRootAsTableInFirstNS(bb:flatbuffers.ByteBuffer, obj?:TableInFirstNS):T
* @returns {NamespaceA.NamespaceB.TableInNestedNS|null} * @returns {NamespaceA.NamespaceB.TableInNestedNS|null}
*/ */
fooTable(obj?:NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS|null { fooTable(obj?:NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS|null {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.TableInNestedNS).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;
}; };
/** /**
* @returns {NamespaceA.NamespaceB.EnumInNestedNS} * @returns {NamespaceA.NamespaceB.EnumInNestedNS}
*/ */
fooEnum():NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS { fooEnum():NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS {
var offset = this.bb!.__offset(this.bb_pos, 6); var offset = this.bb.__offset(this.bb_pos, 6);
return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb!.readInt8(this.bb_pos + offset)) : NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A; return offset ? /** @type {NamespaceA.NamespaceB.EnumInNestedNS} */ (this.bb.readInt8(this.bb_pos + offset)) : NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS.A;
}; };
/** /**
@@ -57,13 +57,13 @@ fooEnum():NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_foo_enum(value:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS):boolean { mutate_foo_enum(value:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS):boolean {
var offset = this.bb!.__offset(this.bb_pos, 6); var offset = this.bb.__offset(this.bb_pos, 6);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt8(this.bb_pos + offset, value); this.bb.writeInt8(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -72,8 +72,8 @@ mutate_foo_enum(value:NS9459827973991502386.NamespaceA.NamespaceB.EnumInNestedNS
* @returns {NamespaceA.NamespaceB.StructInNestedNS|null} * @returns {NamespaceA.NamespaceB.StructInNestedNS|null}
*/ */
fooStruct(obj?:NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS|null { fooStruct(obj?:NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS):NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS|null {
var offset = this.bb!.__offset(this.bb_pos, 8); var offset = this.bb.__offset(this.bb_pos, 8);
return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb!) : null; return offset ? (obj || new NS9459827973991502386.NamespaceA.NamespaceB.StructInNestedNS).__init(this.bb_pos + offset, this.bb) : null;
}; };
/** /**
@@ -126,7 +126,7 @@ export class TableInC {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -157,8 +157,8 @@ static getRootAsTableInC(bb:flatbuffers.ByteBuffer, obj?:TableInC):TableInC {
* @returns {NamespaceA.TableInFirstNS|null} * @returns {NamespaceA.TableInFirstNS|null}
*/ */
referToA1(obj?:NamespaceA.TableInFirstNS):NamespaceA.TableInFirstNS|null { referToA1(obj?:NamespaceA.TableInFirstNS):NamespaceA.TableInFirstNS|null {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? (obj || new NamespaceA.TableInFirstNS).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; return offset ? (obj || new NamespaceA.TableInFirstNS).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;
}; };
/** /**
@@ -166,8 +166,8 @@ referToA1(obj?:NamespaceA.TableInFirstNS):NamespaceA.TableInFirstNS|null {
* @returns {NamespaceA.SecondTableInA|null} * @returns {NamespaceA.SecondTableInA|null}
*/ */
referToA2(obj?:NamespaceA.SecondTableInA):NamespaceA.SecondTableInA|null { referToA2(obj?:NamespaceA.SecondTableInA):NamespaceA.SecondTableInA|null {
var offset = this.bb!.__offset(this.bb_pos, 6); var offset = this.bb.__offset(this.bb_pos, 6);
return offset ? (obj || new NamespaceA.SecondTableInA).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; return offset ? (obj || new NamespaceA.SecondTableInA).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;
}; };
/** /**
@@ -212,7 +212,7 @@ export class SecondTableInA {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -243,8 +243,8 @@ static getRootAsSecondTableInA(bb:flatbuffers.ByteBuffer, obj?:SecondTableInA):S
* @returns {NamespaceC.TableInC|null} * @returns {NamespaceC.TableInC|null}
*/ */
referToC(obj?:NamespaceC.TableInC):NamespaceC.TableInC|null { referToC(obj?:NamespaceC.TableInC):NamespaceC.TableInC|null {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? (obj || new NamespaceC.TableInC).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null; return offset ? (obj || new NamespaceC.TableInC).__init(this.bb.__indirect(this.bb_pos + offset), this.bb) : null;
}; };
/** /**

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@ export class Attacker {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -50,8 +50,8 @@ static getRootAsAttacker(bb:flatbuffers.ByteBuffer, obj?:Attacker):Attacker {
* @returns {number} * @returns {number}
*/ */
swordAttackDamage():number { swordAttackDamage():number {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0; return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;
}; };
/** /**
@@ -59,13 +59,13 @@ swordAttackDamage():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_sword_attack_damage(value:number):boolean { mutate_sword_attack_damage(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -101,7 +101,7 @@ export class Rapunzel {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -122,7 +122,7 @@ __init(i:number, bb:flatbuffers.ByteBuffer):Rapunzel {
* @returns {number} * @returns {number}
*/ */
hairLength():number { hairLength():number {
return this.bb!.readInt32(this.bb_pos); return this.bb.readInt32(this.bb_pos);
}; };
/** /**
@@ -130,13 +130,13 @@ hairLength():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_hair_length(value:number):boolean { mutate_hair_length(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 0); var offset = this.bb.__offset(this.bb_pos, 0);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -159,7 +159,7 @@ export class BookReader {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -180,7 +180,7 @@ __init(i:number, bb:flatbuffers.ByteBuffer):BookReader {
* @returns {number} * @returns {number}
*/ */
booksRead():number { booksRead():number {
return this.bb!.readInt32(this.bb_pos); return this.bb.readInt32(this.bb_pos);
}; };
/** /**
@@ -188,13 +188,13 @@ booksRead():number {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_books_read(value:number):boolean { mutate_books_read(value:number):boolean {
var offset = this.bb!.__offset(this.bb_pos, 0); var offset = this.bb.__offset(this.bb_pos, 0);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeInt32(this.bb_pos + offset, value); this.bb.writeInt32(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -217,7 +217,7 @@ export class Movie {
/** /**
* @type {flatbuffers.ByteBuffer} * @type {flatbuffers.ByteBuffer}
*/ */
bb: flatbuffers.ByteBuffer|null = null; bb: flatbuffers.ByteBuffer;
/** /**
* @type {number} * @type {number}
@@ -255,8 +255,8 @@ static bufferHasIdentifier(bb:flatbuffers.ByteBuffer):boolean {
* @returns {Character} * @returns {Character}
*/ */
mainCharacterType():Character { mainCharacterType():Character {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? /** @type {Character} */ (this.bb!.readUint8(this.bb_pos + offset)) : Character.NONE; return offset ? /** @type {Character} */ (this.bb.readUint8(this.bb_pos + offset)) : Character.NONE;
}; };
/** /**
@@ -264,13 +264,13 @@ mainCharacterType():Character {
* @returns {boolean} * @returns {boolean}
*/ */
mutate_main_character_type(value:Character):boolean { mutate_main_character_type(value:Character):boolean {
var offset = this.bb!.__offset(this.bb_pos, 4); var offset = this.bb.__offset(this.bb_pos, 4);
if (offset === 0) { if (offset === 0) {
return false; return false;
} }
this.bb!.writeUint8(this.bb_pos + offset, value); this.bb.writeUint8(this.bb_pos + offset, value);
return true; return true;
}; };
@@ -279,8 +279,8 @@ mutate_main_character_type(value:Character):boolean {
* @returns {?flatbuffers.Table} * @returns {?flatbuffers.Table}
*/ */
mainCharacter<T extends flatbuffers.Table>(obj:T):T|null { mainCharacter<T extends flatbuffers.Table>(obj:T):T|null {
var offset = this.bb!.__offset(this.bb_pos, 6); var offset = this.bb.__offset(this.bb_pos, 6);
return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null; return offset ? this.bb.__union(obj, this.bb_pos + offset) : null;
}; };
/** /**
@@ -288,24 +288,24 @@ mainCharacter<T extends flatbuffers.Table>(obj:T):T|null {
* @returns {Character} * @returns {Character}
*/ */
charactersType(index: number):Character|null { charactersType(index: number):Character|null {
var offset = this.bb!.__offset(this.bb_pos, 8); var offset = this.bb.__offset(this.bb_pos, 8);
return offset ? /** @type {Character} */ (this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index)) : /** @type {Character} */ (0); return offset ? /** @type {Character} */ (this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index)) : /** @type {Character} */ (0);
}; };
/** /**
* @returns {number} * @returns {number}
*/ */
charactersTypeLength():number { charactersTypeLength():number {
var offset = this.bb!.__offset(this.bb_pos, 8); var offset = this.bb.__offset(this.bb_pos, 8);
return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
}; };
/** /**
* @returns {Uint8Array} * @returns {Uint8Array}
*/ */
charactersTypeArray():Uint8Array|null { charactersTypeArray():Uint8Array|null {
var offset = this.bb!.__offset(this.bb_pos, 8); var offset = this.bb.__offset(this.bb_pos, 8);
return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null; return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null;
}; };
/** /**
@@ -314,16 +314,16 @@ charactersTypeArray():Uint8Array|null {
* @returns {?flatbuffers.Table} * @returns {?flatbuffers.Table}
*/ */
characters<T extends flatbuffers.Table>(index: number, obj:T):T|null { characters<T extends flatbuffers.Table>(index: number, obj:T):T|null {
var offset = this.bb!.__offset(this.bb_pos, 10); var offset = this.bb.__offset(this.bb_pos, 10);
return offset ? this.bb!.__union(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null; return offset ? this.bb.__union(obj, this.bb.__vector(this.bb_pos + offset) + index * 4) : null;
}; };
/** /**
* @returns {number} * @returns {number}
*/ */
charactersLength():number { charactersLength():number {
var offset = this.bb!.__offset(this.bb_pos, 10); var offset = this.bb.__offset(this.bb_pos, 10);
return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0; return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;
}; };
/** /**