Document requirement for custom string types to implement empty() and be constructible from std::string.

Add new option --cpp-str-flex-ctor to construct custom string types not via std::string, but (char * + length).
This commit is contained in:
Luca Longinotti
2019-03-01 16:15:36 +01:00
parent 28cb2e92d5
commit 92b90d7f0f
5 changed files with 44 additions and 9 deletions

View File

@@ -578,6 +578,12 @@ class CppGenerator : public BaseGenerator {
return ret;
}
bool FlexibleStringConstructor(const FieldDef *field) {
auto attr = field ? (field->attributes.Lookup("cpp_str_flex_ctor") != nullptr) : false;
auto ret = attr ? attr : parser_.opts.cpp_object_api_string_flexible_constructor;
return (ret && NativeString(field) != "std::string"); // Only for custom string types.
}
std::string GenTypeNativePtr(const std::string &type, const FieldDef *field,
bool is_constructor) {
auto &ptr_type = PtrType(field);
@@ -2138,7 +2144,11 @@ class CppGenerator : public BaseGenerator {
bool invector, const FieldDef &afield) {
switch (type.base_type) {
case BASE_TYPE_STRING: {
return val + "->str()";
if (FlexibleStringConstructor(&afield)) {
return NativeString(&afield) + "(" + val + "->c_str(), " + val + "->size())";
} else {
return val + "->str()";
}
}
case BASE_TYPE_STRUCT: {
const auto name = WrapInNameSpace(*type.struct_def);
@@ -2169,7 +2179,7 @@ class CppGenerator : public BaseGenerator {
break;
}
}
};
}
std::string GenUnpackFieldStatement(const FieldDef &field,
const FieldDef *union_field) {