CppUsage: address requested changes.

idl_gen_cpp.cpp: fix formatting, keep CreateVectorOfStrings for normal string cases.
This commit is contained in:
Luca Longinotti 2019-03-05 18:09:32 +01:00
parent 371d4e0b79
commit 2f0402f9ff
2 changed files with 16 additions and 12 deletions

View File

@ -270,8 +270,8 @@ custom string types; the `--cpp-str-flex-ctor` argument to `flatc` or the
per field attribute `cpp_str_flex_ctor` can be used to change this behavior, per field attribute `cpp_str_flex_ctor` can be used to change this behavior,
so that the custom string type is constructed by passing the pointer and so that the custom string type is constructed by passing the pointer and
length of the FlatBuffers String. The custom string class will require a length of the FlatBuffers String. The custom string class will require a
constructor in the following format: custom_str_class(const char *, uint32_t). constructor in the following format: custom_str_class(const char *, size_t).
Please note that the character array is not guaranteed to be NUL terminated, Please note that the character array is not guaranteed to be NULL terminated,
you should always use the provided size to determine end of string. you should always use the provided size to determine end of string.
## Reflection (& Resizing) ## Reflection (& Resizing)

View File

@ -581,7 +581,7 @@ class CppGenerator : public BaseGenerator {
bool FlexibleStringConstructor(const FieldDef *field) { bool FlexibleStringConstructor(const FieldDef *field) {
auto attr = field ? (field->attributes.Lookup("cpp_str_flex_ctor") != nullptr) : false; auto attr = field ? (field->attributes.Lookup("cpp_str_flex_ctor") != nullptr) : false;
auto ret = attr ? attr : parser_.opts.cpp_object_api_string_flexible_constructor; auto ret = attr ? attr : parser_.opts.cpp_object_api_string_flexible_constructor;
return (ret && NativeString(field) != "std::string"); // Only for custom string types. return ret && NativeString(field) != "std::string"; // Only for custom string types.
} }
std::string GenTypeNativePtr(const std::string &type, const FieldDef *field, std::string GenTypeNativePtr(const std::string &type, const FieldDef *field,
@ -2341,6 +2341,9 @@ class CppGenerator : public BaseGenerator {
auto vector_type = field.value.type.VectorType(); auto vector_type = field.value.type.VectorType();
switch (vector_type.base_type) { switch (vector_type.base_type) {
case BASE_TYPE_STRING: { case BASE_TYPE_STRING: {
if (NativeString(&field) == "std::string") {
code += "_fbb.CreateVectorOfStrings(" + value + ")";
} else {
// Use by-function serialization to emulate CreateVectorOfStrings(); // Use by-function serialization to emulate CreateVectorOfStrings();
// this works also with non-std strings. // this works also with non-std strings.
code += "_fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>> "; code += "_fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>> ";
@ -2348,6 +2351,7 @@ class CppGenerator : public BaseGenerator {
code += "[](size_t i, _VectorArgs *__va) { "; code += "[](size_t i, _VectorArgs *__va) { ";
code += "return __va->__fbb->CreateString(__va->_" + value + "[i]);"; code += "return __va->__fbb->CreateString(__va->_" + value + "[i]);";
code += " }, &_va )"; code += " }, &_va )";
}
break; break;
} }
case BASE_TYPE_STRUCT: { case BASE_TYPE_STRUCT: {