diff --git a/CMakeLists.txt b/CMakeLists.txt index 70a7dd54f..304087062 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,8 +82,15 @@ if(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ -Wall -pedantic -Werror -Wextra") elseif(CMAKE_COMPILER_IS_GNUCXX) + if(CYGWIN) + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -std=gnu++11") + else(CYGWIN) + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -std=c++0x") + endif(CYGWIN) set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra -Werror=shadow") + "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Werror=shadow") if (GCC_VERSION VERSION_GREATER 4.4) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-result -Werror=unused-result") diff --git a/docs/source/Tutorial.md b/docs/source/Tutorial.md index 74941be8c..de1e9fd95 100644 --- a/docs/source/Tutorial.md +++ b/docs/source/Tutorial.md @@ -432,10 +432,10 @@ our `orc` Monster, lets create some `Weapon`s: a `Sword` and an `Axe`.
~~~{.java} - String weaponOneName = builder.createString("Sword") + int weaponOneName = builder.createString("Sword") short weaponOneDamage = 3; - String weaponTwoName = builder.createString("Axe"); + int weaponTwoName = builder.createString("Axe"); short weaponTwoDamage = 5; // Use the `createWeapon()` helper function to create the weapons, since we set every field. diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 0b6bd1762..8e4a79639 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -91,6 +91,14 @@ #else #define FLATBUFFERS_FINAL_CLASS #endif + +#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) + #define FLATBUFFERS_CONSTEXPR constexpr +#else + #define FLATBUFFERS_CONSTEXPR +#endif + /// @endcond /// @file @@ -1112,14 +1120,14 @@ FLATBUFFERS_FINAL_CLASS bool force_defaults_; // Serialize values equal to their defaults anyway. struct StringOffsetCompare { - StringOffsetCompare(const vector_downward &buf) : buf_(buf) {} + StringOffsetCompare(const vector_downward &buf) : buf_(&buf) {} bool operator() (const Offset &a, const Offset &b) const { - auto stra = reinterpret_cast(buf_.data_at(a.o)); - auto strb = reinterpret_cast(buf_.data_at(b.o)); + auto stra = reinterpret_cast(buf_->data_at(a.o)); + auto strb = reinterpret_cast(buf_->data_at(b.o)); return strncmp(stra->c_str(), strb->c_str(), std::min(stra->size(), strb->size()) + 1) < 0; } - const vector_downward &buf_; + const vector_downward *buf_; }; // For use with CreateSharedString. Instantiated on first use only. diff --git a/include/flatbuffers/idl.h b/include/flatbuffers/idl.h index 14062d9c7..fbc696f55 100644 --- a/include/flatbuffers/idl.h +++ b/include/flatbuffers/idl.h @@ -331,6 +331,7 @@ struct IDLOptions { bool proto_mode; bool generate_all; bool skip_unexpected_fields_in_json; + bool generate_name_strings; // Possible options for the more general generator below. enum Language { kJava, kCSharp, kGo, kMAX }; @@ -349,6 +350,7 @@ struct IDLOptions { proto_mode(false), generate_all(false), skip_unexpected_fields_in_json(false), + generate_name_strings(false), lang(IDLOptions::kJava) {} }; diff --git a/php/Table.php b/php/Table.php index 7f6114560..6f917c1af 100644 --- a/php/Table.php +++ b/php/Table.php @@ -89,9 +89,15 @@ abstract class Table return $offset + $this->bb->getInt($offset) + Constants::SIZEOF_INT; } -// protected function __vector_as_bytebuffer($vector_offset, $elem_size) -// { -// } + protected function __vector_as_bytes($vector_offset, $elem_size=1) + { + $o = $this->__offset($vector_offset); + if ($o == 0) { + return null; + } + + return substr($this->bb->_buffer, $this->__vector($o), $this->__vector_len($o) * $elem_size); + } /** * @param Table $table diff --git a/readme.md b/readme.md index 4806f9d07..954604863 100755 --- a/readme.md +++ b/readme.md @@ -47,7 +47,7 @@ you would leave it in. [CONTRIBUTING]: http://github.com/google/flatbuffers/blob/master/CONTRIBUTING [`flatbuffers` tag]: https://stackoverflow.com/questions/tagged/flatbuffers - [FlatBuffers Google Group]: http://group.google.com/group/flatbuffers + [FlatBuffers Google Group]: https://groups.google.com/forum/#!forum/flatbuffers [FlatBuffers Issues Tracker]: http://github.com/google/flatbuffers/issues [stackoverflow.com]: http://www.stackoverflow.com [landing page]: http://google.github.io/flatbuffers diff --git a/src/flatc.cpp b/src/flatc.cpp index c0696dd46..d4be151c8 100644 --- a/src/flatc.cpp +++ b/src/flatc.cpp @@ -96,31 +96,32 @@ static void Error(const std::string &err, bool usage, bool show_exe_name) { : " ", generators[i].generator_help); printf( - " -o PATH Prefix PATH to all generated files.\n" - " -I PATH Search for includes in the specified path.\n" - " -M Print make rules for generated files.\n" - " --version Print the version number of flatc and exit.\n" - " --strict-json Strict JSON: field names must be / will be quoted,\n" - " no trailing commas in tables/vectors.\n" - " --defaults-json Output fields whose value is the default when\n" - " writing JSON\n" - " --unknown-json Allow fields in JSON that are not defined in the\n" - " schema. These fields will be discared when generating\n" - " binaries.\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" - " also implies --no-prefix.\n" - " --gen-includes (deprecated), this is the default behavior.\n" - " If the original behavior is required (no include\n" - " statements) use --no-includes.\n" - " --no-includes Don\'t generate include statements for included\n" - " schemas the generated file depends on (C++).\n" - " --gen-mutable Generate accessors that can mutate buffers in-place.\n" - " --gen-onefile Generate single output file for C#\n" - " --raw-binary Allow binaries without file_indentifier to be read.\n" - " This may crash flatc given a mismatched schema.\n" - " --proto Input is a .proto, translate to .fbs.\n" - " --schema Serialize schemas instead of JSON (use with -b)\n" + " -o PATH Prefix PATH to all generated files.\n" + " -I PATH Search for includes in the specified path.\n" + " -M Print make rules for generated files.\n" + " --version Print the version number of flatc and exit.\n" + " --strict-json Strict JSON: field names must be / will be quoted,\n" + " no trailing commas in tables/vectors.\n" + " --defaults-json Output fields whose value is the default when\n" + " writing JSON\n" + " --unknown-json Allow fields in JSON that are not defined in the\n" + " schema. These fields will be discared when generating\n" + " binaries.\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" + " also implies --no-prefix.\n" + " --gen-includes (deprecated), this is the default behavior.\n" + " If the original behavior is required (no include\n" + " statements) use --no-includes.\n" + " --no-includes Don\'t generate include statements for included\n" + " schemas the generated file depends on (C++).\n" + " --gen-mutable Generate accessors that can mutate buffers in-place.\n" + " --gen-onefile Generate single output file for C#\n" + " --gen-name-strings Generate type name functions for C++.\n" + " --raw-binary Allow binaries without file_indentifier to be read.\n" + " This may crash flatc given a mismatched schema.\n" + " --proto Input is a .proto, translate to .fbs.\n" + " --schema Serialize schemas instead of JSON (use with -b)\n" "FILEs may be schemas, or JSON files (conforming to preceding schema)\n" "FILEs after the -- must be binary flatbuffer format files.\n" "Output files are named using the base file name of the input,\n" @@ -171,6 +172,8 @@ int main(int argc, const char *argv[]) { opts.scoped_enums = true; } else if(arg == "--gen-mutable") { opts.mutable_buffer = true; + } else if(arg == "--gen-name-strings") { + opts.generate_name_strings = true; } else if(arg == "--gen-all") { opts.generate_all = true; opts.include_dependence_headers = false; diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index eb5093461..cae3812db 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -267,6 +267,14 @@ std::string GenFieldOffsetName(const FieldDef &field) { return "VT_" + uname; } +static void GenFullyQualifiedNameGetter(const Parser &parser, const std::string& name, std::string &code) { + if (parser.opts.generate_name_strings) { + code += " static FLATBUFFERS_CONSTEXPR const char *GetFullyQualifiedName() {\n"; + code += " return \"" + parser.namespaces_.back()->GetFullyQualifiedName(name) + "\";\n"; + code += " }\n"; + } +} + // Generate an accessor struct, builder structs & function for a table. static void GenTable(const Parser &parser, StructDef &struct_def, std::string *code_ptr) { @@ -277,6 +285,8 @@ static void GenTable(const Parser &parser, StructDef &struct_def, code += "struct " + struct_def.name; code += " FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table"; code += " {\n"; + // Generate GetFullyQualifiedName + GenFullyQualifiedNameGetter(parser, struct_def.name, code); // Generate field id constants. if (struct_def.fields.vec.size() > 0) { code += " enum {\n"; @@ -583,8 +593,12 @@ static void GenStruct(const Parser &parser, StructDef &struct_def, GenPadding(field, code, padding_id, PaddingDefinition); } + // Generate GetFullyQualifiedName + code += "\n public:\n"; + GenFullyQualifiedNameGetter(parser, struct_def.name, code); + // Generate a constructor that takes all fields as arguments. - code += "\n public:\n " + struct_def.name + "("; + code += " " + struct_def.name + "("; for (auto it = struct_def.fields.vec.begin(); it != struct_def.fields.vec.end(); ++it) { diff --git a/src/idl_gen_php.cpp b/src/idl_gen_php.cpp index 2488b1d18..5b904a077 100644 --- a/src/idl_gen_php.cpp +++ b/src/idl_gen_php.cpp @@ -165,6 +165,22 @@ namespace php { code += Indent + "}\n\n"; } + // Get a [ubyte] vector as a byte array. + static void GetUByte(const FieldDef &field, + std::string *code_ptr) { + std::string &code = *code_ptr; + + code += Indent + "/**\n"; + code += Indent + " * @return string\n"; + code += Indent + " */\n"; + code += Indent + "public function get"; + code += MakeCamel(field.name) + "Bytes()\n"; + code += Indent + "{\n"; + code += Indent + Indent + "return $this->__vector_as_bytes("; + code += NumToString(field.value.offset) + ");\n"; + code += Indent + "}\n\n"; + } + // Get the value of a struct's scalar. static void GetScalarFieldOfStruct(const FieldDef &field, std::string *code_ptr) { @@ -250,7 +266,7 @@ namespace php { ");\n"; code += Indent + Indent; code += "return $o != 0 ? $obj->init("; - if (field.value.type.struct_def->fixed) + if (field.value.type.struct_def->fixed) { code += "$o + $this->bb_pos, $this->bb) : "; } else { @@ -690,6 +706,9 @@ namespace php { } if (field.value.type.base_type == BASE_TYPE_VECTOR) { GetVectorLen(field, code_ptr); + if (field.value.type.element == BASE_TYPE_UCHAR) { + GetUByte(field, code_ptr); + } } } diff --git a/tests/MyGame/Example/Monster.php b/tests/MyGame/Example/Monster.php index 6c1d34a0b..48b9c7df2 100644 --- a/tests/MyGame/Example/Monster.php +++ b/tests/MyGame/Example/Monster.php @@ -98,6 +98,14 @@ class Monster extends Table return $o != 0 ? $this->__vector_len($o) : 0; } + /** + * @return string + */ + public function getInventoryBytes() + { + return $this->__vector_as_bytes(14); + } + /** * @return sbyte */ @@ -210,6 +218,14 @@ class Monster extends Table return $o != 0 ? $this->__vector_len($o) : 0; } + /** + * @return string + */ + public function getTestnestedflatbufferBytes() + { + return $this->__vector_as_bytes(30); + } + public function getTestempty() { $obj = new Stat(); diff --git a/tests/phpTest.php b/tests/phpTest.php index 0afc0af7f..4dc83b28d 100644 --- a/tests/phpTest.php +++ b/tests/phpTest.php @@ -128,6 +128,7 @@ function test_buffer(Assert $assert, Google\FlatBuffers\ByteBuffer $bb) { } $assert->strictEqual($invsum, 10); + $assert->strictEqual(bin2hex($monster->GetInventoryBytes()), "0001020304"); $test_0 = $monster->GetTest4(0); $test_1 = $monster->GetTest4(1);