Mass Refactoring to use IsString and other BASE_TYPE helpers (#6193)

* Updated SupportsAdvancedUnionFeatures to look out for string

* Mass refactoring to use BASE_TYPE helper functions.

Co-authored-by: Casper Neo <cneo@google.com>
This commit is contained in:
Casper
2020-10-20 08:00:31 -07:00
committed by GitHub
parent 8f6fa4b715
commit fe8e3c7e5d
15 changed files with 125 additions and 128 deletions

View File

@@ -885,7 +885,7 @@ class CppGenerator : public BaseGenerator {
return wrap ? WrapInNameSpace(ev.union_type.struct_def->defined_namespace, return wrap ? WrapInNameSpace(ev.union_type.struct_def->defined_namespace,
name) name)
: name; : name;
} else if (ev.union_type.base_type == BASE_TYPE_STRING) { } else if (IsString(ev.union_type)) {
return actual_type ? (native_type ? "std::string" : "flatbuffers::String") return actual_type ? (native_type ? "std::string" : "flatbuffers::String")
: Name(ev); : Name(ev);
} else { } else {
@@ -996,8 +996,8 @@ class CppGenerator : public BaseGenerator {
for (auto it = types.begin(); it != types.end(); ++it) { for (auto it = types.begin(); it != types.end(); ++it) {
auto &type = *it; auto &type = *it;
if (!ts.empty()) ts += ",\n "; if (!ts.empty()) ts += ",\n ";
auto is_vector = type.base_type == BASE_TYPE_VECTOR; auto is_vector = IsVector(type);
auto is_array = type.base_type == BASE_TYPE_ARRAY; auto is_array = IsArray(type);
auto bt = is_vector || is_array ? type.element : type.base_type; auto bt = is_vector || is_array ? type.element : type.base_type;
auto et = IsScalar(bt) || bt == BASE_TYPE_STRING auto et = IsScalar(bt) || bt == BASE_TYPE_STRING
? bt - BASE_TYPE_UTYPE + ET_UTYPE ? bt - BASE_TYPE_UTYPE + ET_UTYPE
@@ -1424,7 +1424,7 @@ class CppGenerator : public BaseGenerator {
code_ += getptr; code_ += getptr;
code_ += " return verifier.VerifyTable(ptr);"; code_ += " return verifier.VerifyTable(ptr);";
} }
} else if (ev.union_type.base_type == BASE_TYPE_STRING) { } else if (IsString(ev.union_type)) {
code_ += getptr; code_ += getptr;
code_ += " return verifier.VerifyString(ptr);"; code_ += " return verifier.VerifyString(ptr);";
} else { } else {
@@ -1476,7 +1476,7 @@ class CppGenerator : public BaseGenerator {
} else { } else {
code_ += " return ptr->UnPack(resolver);"; code_ += " return ptr->UnPack(resolver);";
} }
} else if (ev.union_type.base_type == BASE_TYPE_STRING) { } else if (IsString(ev.union_type)) {
code_ += " return new std::string(ptr->c_str(), ptr->size());"; code_ += " return new std::string(ptr->c_str(), ptr->size());";
} else { } else {
FLATBUFFERS_ASSERT(false); FLATBUFFERS_ASSERT(false);
@@ -1508,7 +1508,7 @@ class CppGenerator : public BaseGenerator {
code_ += code_ +=
" return Create{{NAME}}(_fbb, ptr, _rehasher).Union();"; " return Create{{NAME}}(_fbb, ptr, _rehasher).Union();";
} }
} else if (ev.union_type.base_type == BASE_TYPE_STRING) { } else if (IsString(ev.union_type)) {
code_ += " return _fbb.CreateString(*ptr).Union();"; code_ += " return _fbb.CreateString(*ptr).Union();";
} else { } else {
FLATBUFFERS_ASSERT(false); FLATBUFFERS_ASSERT(false);
@@ -1667,10 +1667,10 @@ class CppGenerator : public BaseGenerator {
void GenParam(const FieldDef &field, bool direct, const char *prefix) { void GenParam(const FieldDef &field, bool direct, const char *prefix) {
code_.SetValue("PRE", prefix); code_.SetValue("PRE", prefix);
code_.SetValue("PARAM_NAME", Name(field)); code_.SetValue("PARAM_NAME", Name(field));
if (direct && field.value.type.base_type == BASE_TYPE_STRING) { if (direct && IsString(field.value.type)) {
code_.SetValue("PARAM_TYPE", "const char *"); code_.SetValue("PARAM_TYPE", "const char *");
code_.SetValue("PARAM_VALUE", "nullptr"); code_.SetValue("PARAM_VALUE", "nullptr");
} else if (direct && field.value.type.base_type == BASE_TYPE_VECTOR) { } else if (direct && IsVector(field.value.type)) {
const auto vtype = field.value.type.VectorType(); const auto vtype = field.value.type.VectorType();
std::string type; std::string type;
if (IsStruct(vtype)) { if (IsStruct(vtype)) {
@@ -1705,7 +1705,7 @@ class CppGenerator : public BaseGenerator {
auto cpp_type = field.attributes.Lookup("cpp_type"); auto cpp_type = field.attributes.Lookup("cpp_type");
auto full_type = auto full_type =
(cpp_type (cpp_type
? (field.value.type.base_type == BASE_TYPE_VECTOR ? (IsVector(field.value.type)
? "std::vector<" + ? "std::vector<" +
GenTypeNativePtr(cpp_type->constant, &field, GenTypeNativePtr(cpp_type->constant, &field,
false) + false) +
@@ -1934,7 +1934,7 @@ class CppGenerator : public BaseGenerator {
// Generate CompareWithValue method for a key field. // Generate CompareWithValue method for a key field.
void GenKeyFieldMethods(const FieldDef &field) { void GenKeyFieldMethods(const FieldDef &field) {
FLATBUFFERS_ASSERT(field.key); FLATBUFFERS_ASSERT(field.key);
const bool is_string = (field.value.type.base_type == BASE_TYPE_STRING); const bool is_string = (IsString(field.value.type));
code_ += " bool KeyCompareLessThan(const {{STRUCT_NAME}} *o) const {"; code_ += " bool KeyCompareLessThan(const {{STRUCT_NAME}} *o) const {";
if (is_string) { if (is_string) {
@@ -2257,7 +2257,7 @@ class CppGenerator : public BaseGenerator {
// that doesn't need alignment code. // that doesn't need alignment code.
std::string GenVectorForceAlign(const FieldDef &field, std::string GenVectorForceAlign(const FieldDef &field,
const std::string &field_size) { const std::string &field_size) {
FLATBUFFERS_ASSERT(field.value.type.base_type == BASE_TYPE_VECTOR); FLATBUFFERS_ASSERT(IsVector(field.value.type));
// Get the value of the force_align attribute. // Get the value of the force_align attribute.
const auto *force_align = field.attributes.Lookup("force_align"); const auto *force_align = field.attributes.Lookup("force_align");
const int align = force_align ? atoi(force_align->constant.c_str()) : 1; const int align = force_align ? atoi(force_align->constant.c_str()) : 1;
@@ -2288,8 +2288,8 @@ class CppGenerator : public BaseGenerator {
if (field.deprecated) continue; if (field.deprecated) continue;
const bool is_scalar = IsScalar(field.value.type.base_type); const bool is_scalar = IsScalar(field.value.type.base_type);
const bool is_default_scalar = is_scalar && !field.IsScalarOptional(); const bool is_default_scalar = is_scalar && !field.IsScalarOptional();
const bool is_string = field.value.type.base_type == BASE_TYPE_STRING; const bool is_string = IsString(field.value.type);
const bool is_vector = field.value.type.base_type == BASE_TYPE_VECTOR; const bool is_vector = IsVector(field.value.type);
if (is_string || is_vector) { has_string_or_vector_fields = true; } if (is_string || is_vector) { has_string_or_vector_fields = true; }
std::string offset = GenFieldOffsetName(field); std::string offset = GenFieldOffsetName(field);
@@ -2418,7 +2418,7 @@ class CppGenerator : public BaseGenerator {
const auto &field = **it; const auto &field = **it;
if (!field.deprecated) { if (!field.deprecated) {
code_.SetValue("FIELD_NAME", Name(field)); code_.SetValue("FIELD_NAME", Name(field));
if (field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(field.value.type)) {
if (!field.shared) { if (!field.shared) {
code_.SetValue("CREATE_STRING", "CreateString"); code_.SetValue("CREATE_STRING", "CreateString");
} else { } else {
@@ -2427,7 +2427,7 @@ class CppGenerator : public BaseGenerator {
code_ += code_ +=
" auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? " " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
"_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : 0;"; "_fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : 0;";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(field.value.type)) {
const std::string force_align_code = const std::string force_align_code =
GenVectorForceAlign(field, Name(field) + "->size()"); GenVectorForceAlign(field, Name(field) + "->size()");
if (!force_align_code.empty()) { if (!force_align_code.empty()) {
@@ -2462,8 +2462,8 @@ class CppGenerator : public BaseGenerator {
if (!field.deprecated) { if (!field.deprecated) {
code_.SetValue("FIELD_NAME", Name(field)); code_.SetValue("FIELD_NAME", Name(field));
code_ += ",\n {{FIELD_NAME}}\\"; code_ += ",\n {{FIELD_NAME}}\\";
if (field.value.type.base_type == BASE_TYPE_STRING || if (IsString(field.value.type) ||
field.value.type.base_type == BASE_TYPE_VECTOR) { IsVector(field.value.type)) {
code_ += "__\\"; code_ += "__\\";
} }
} }
@@ -2915,7 +2915,7 @@ class CppGenerator : public BaseGenerator {
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) { continue; } if (field.deprecated) { continue; }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
const std::string force_align_code = const std::string force_align_code =
GenVectorForceAlign(field, "_o->" + Name(field) + ".size()"); GenVectorForceAlign(field, "_o->" + Name(field) + ".size()");
if (!force_align_code.empty()) { code_ += " " + force_align_code; } if (!force_align_code.empty()) { code_ += " " + force_align_code; }

View File

@@ -313,7 +313,7 @@ class CSharpGenerator : public BaseGenerator {
if (!enum_def.is_union) return false; if (!enum_def.is_union) return false;
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) { for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
auto &val = **it; auto &val = **it;
if (val.union_type.base_type == BASE_TYPE_STRING) { return true; } if (IsString(val.union_type)) { return true; }
} }
return false; return false;
} }
@@ -486,7 +486,7 @@ class CSharpGenerator : public BaseGenerator {
key_getter += "int tableOffset = Table."; key_getter += "int tableOffset = Table.";
key_getter += "__indirect(vectorLocation + 4 * (start + middle)"; key_getter += "__indirect(vectorLocation + 4 * (start + middle)";
key_getter += ", bb);\n "; key_getter += ", bb);\n ";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
key_getter += "int comp = Table."; key_getter += "int comp = Table.";
key_getter += "CompareStrings("; key_getter += "CompareStrings(";
key_getter += GenOffsetGetter(key_field); key_getter += GenOffsetGetter(key_field);
@@ -501,7 +501,7 @@ class CSharpGenerator : public BaseGenerator {
std::string GenKeyGetter(flatbuffers::FieldDef *key_field) const { std::string GenKeyGetter(flatbuffers::FieldDef *key_field) const {
std::string key_getter = ""; std::string key_getter = "";
auto data_buffer = "builder.DataBuffer"; auto data_buffer = "builder.DataBuffer";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
key_getter += "Table.CompareStrings("; key_getter += "Table.CompareStrings(";
key_getter += GenOffsetGetter(key_field, "o1") + ", "; key_getter += GenOffsetGetter(key_field, "o1") + ", ";
key_getter += GenOffsetGetter(key_field, "o2") + ", " + data_buffer + ")"; key_getter += GenOffsetGetter(key_field, "o2") + ", " + data_buffer + ")";
@@ -604,7 +604,7 @@ class CSharpGenerator : public BaseGenerator {
if (!struct_def.fixed && if (!struct_def.fixed &&
(field.value.type.base_type == BASE_TYPE_STRUCT || (field.value.type.base_type == BASE_TYPE_STRUCT ||
field.value.type.base_type == BASE_TYPE_UNION || field.value.type.base_type == BASE_TYPE_UNION ||
(field.value.type.base_type == BASE_TYPE_VECTOR && (IsVector(field.value.type) &&
(field.value.type.element == BASE_TYPE_STRUCT || (field.value.type.element == BASE_TYPE_STRUCT ||
field.value.type.element == BASE_TYPE_UNION)))) { field.value.type.element == BASE_TYPE_UNION)))) {
optional = "?"; optional = "?";
@@ -626,10 +626,10 @@ class CSharpGenerator : public BaseGenerator {
"); return o != 0 ? "); "); return o != 0 ? ");
// Generate the accessors that don't do object reuse. // Generate the accessors that don't do object reuse.
if (field.value.type.base_type == BASE_TYPE_STRUCT) { if (field.value.type.base_type == BASE_TYPE_STRUCT) {
} else if (field.value.type.base_type == BASE_TYPE_VECTOR && } else if (IsVector(field.value.type) &&
field.value.type.element == BASE_TYPE_STRUCT) { field.value.type.element == BASE_TYPE_STRUCT) {
} else if (field.value.type.base_type == BASE_TYPE_UNION || } else if (field.value.type.base_type == BASE_TYPE_UNION ||
(field.value.type.base_type == BASE_TYPE_VECTOR && (IsVector(field.value.type) &&
field.value.type.VectorType().base_type == BASE_TYPE_UNION)) { field.value.type.VectorType().base_type == BASE_TYPE_UNION)) {
method_start += "<TTable>"; method_start += "<TTable>";
type_name = type_name_dest; type_name = type_name_dest;
@@ -639,7 +639,7 @@ class CSharpGenerator : public BaseGenerator {
std::string default_cast = ""; std::string default_cast = "";
// only create default casts for c# scalars or vectors of scalars // only create default casts for c# scalars or vectors of scalars
if ((IsScalar(field.value.type.base_type) || if ((IsScalar(field.value.type.base_type) ||
(field.value.type.base_type == BASE_TYPE_VECTOR && (IsVector(field.value.type) &&
IsScalar(field.value.type.element)))) { IsScalar(field.value.type.element)))) {
// For scalars, default value will be returned by GetDefaultValue(). // For scalars, default value will be returned by GetDefaultValue().
// If the scalar is an enum, GetDefaultValue() returns an actual c# enum // If the scalar is an enum, GetDefaultValue() returns an actual c# enum
@@ -647,7 +647,7 @@ class CSharpGenerator : public BaseGenerator {
// elements of vectors are integer literals ("0") and are still casted // elements of vectors are integer literals ("0") and are still casted
// for clarity. // for clarity.
if (field.value.type.enum_def == nullptr || if (field.value.type.enum_def == nullptr ||
field.value.type.base_type == BASE_TYPE_VECTOR) { IsVector(field.value.type)) {
default_cast = "(" + type_name_dest + ")"; default_cast = "(" + type_name_dest + ")";
} }
} }
@@ -762,7 +762,7 @@ class CSharpGenerator : public BaseGenerator {
} }
code += member_suffix; code += member_suffix;
code += "}\n"; code += "}\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += " public int " + MakeCamel(field.name, true); code += " public int " + MakeCamel(field.name, true);
code += "Length"; code += "Length";
code += " { get"; code += " { get";
@@ -793,9 +793,9 @@ class CSharpGenerator : public BaseGenerator {
} }
} }
// Generate a ByteBuffer accessor for strings & vectors of scalars. // Generate a ByteBuffer accessor for strings & vectors of scalars.
if ((field.value.type.base_type == BASE_TYPE_VECTOR && if ((IsVector(field.value.type) &&
IsScalar(field.value.type.VectorType().base_type)) || IsScalar(field.value.type.VectorType().base_type)) ||
field.value.type.base_type == BASE_TYPE_STRING) { IsString(field.value.type)) {
code += "#if ENABLE_SPAN_T\n"; code += "#if ENABLE_SPAN_T\n";
code += " public Span<" + GenTypeBasic(field.value.type.VectorType()) + code += " public Span<" + GenTypeBasic(field.value.type.VectorType()) +
"> Get"; "> Get";
@@ -1046,7 +1046,7 @@ class CSharpGenerator : public BaseGenerator {
code += ", "; code += ", ";
code += GenDefaultValue(field, false); code += GenDefaultValue(field, false);
code += "); }\n"; code += "); }\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
auto vector_type = field.value.type.VectorType(); auto vector_type = field.value.type.VectorType();
auto alignment = InlineAlignment(vector_type); auto alignment = InlineAlignment(vector_type);
auto elem_size = InlineSize(vector_type); auto elem_size = InlineSize(vector_type);
@@ -1068,8 +1068,8 @@ class CSharpGenerator : public BaseGenerator {
code += "("; code += "(";
code += SourceCastBasic(vector_type); code += SourceCastBasic(vector_type);
code += "data[i]"; code += "data[i]";
if ((vector_type.base_type == BASE_TYPE_STRUCT || if (vector_type.base_type == BASE_TYPE_STRUCT ||
vector_type.base_type == BASE_TYPE_STRING)) IsString(vector_type))
code += ".Value"; code += ".Value";
code += "); return "; code += "); return ";
code += "builder.EndVector(); }\n"; code += "builder.EndVector(); }\n";
@@ -1147,7 +1147,7 @@ class CSharpGenerator : public BaseGenerator {
code += "int vectorLocation, "; code += "int vectorLocation, ";
code += GenTypeGet(key_field->value.type); code += GenTypeGet(key_field->value.type);
code += " key, ByteBuffer bb) {\n"; code += " key, ByteBuffer bb) {\n";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
code += " byte[] byteKey = "; code += " byte[] byteKey = ";
code += "System.Text.Encoding.UTF8.GetBytes(key);\n"; code += "System.Text.Encoding.UTF8.GetBytes(key);\n";
} }
@@ -1291,7 +1291,7 @@ class CSharpGenerator : public BaseGenerator {
code += " default: return 0;\n"; code += " default: return 0;\n";
} else { } else {
code += " case " + enum_def.name + "." + ev.name + ": return "; code += " case " + enum_def.name + "." + ev.name + ": return ";
if (ev.union_type.base_type == BASE_TYPE_STRING) { if (IsString(ev.union_type)) {
code += "builder.CreateString(_o.As" + ev.name + "()).Value;\n"; code += "builder.CreateString(_o.As" + ev.name + "()).Value;\n";
} else { } else {
code += GenTypeGet(ev.union_type) + ".Pack(builder, _o.As" + ev.name + code += GenTypeGet(ev.union_type) + ".Pack(builder, _o.As" + ev.name +
@@ -1425,7 +1425,7 @@ class CSharpGenerator : public BaseGenerator {
code += indent + " case " + WrapInNameSpace(enum_def) + "." + ev.name + code += indent + " case " + WrapInNameSpace(enum_def) + "." + ev.name +
":\n"; ":\n";
code += indent + " " + varialbe_name + ".Value = this." + camel_name; code += indent + " " + varialbe_name + ".Value = this." + camel_name;
if (ev.union_type.base_type == BASE_TYPE_STRING) { if (IsString(ev.union_type)) {
code += "AsString" + func_suffix + ";\n"; code += "AsString" + func_suffix + ";\n";
} else { } else {
code += "<" + GenTypeGet(ev.union_type) + ">" + func_suffix; code += "<" + GenTypeGet(ev.union_type) + ">" + func_suffix;
@@ -1927,7 +1927,7 @@ class CSharpGenerator : public BaseGenerator {
auto utype_name = WrapInNameSpace(*field.value.type.enum_def); auto utype_name = WrapInNameSpace(*field.value.type.enum_def);
code += code +=
" [Newtonsoft.Json.JsonProperty(\"" + field.name + "_type\")]\n"; " [Newtonsoft.Json.JsonProperty(\"" + field.name + "_type\")]\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += " private " + utype_name + "[] " + camel_name + "Type {\n"; code += " private " + utype_name + "[] " + camel_name + "Type {\n";
code += " get {\n"; code += " get {\n";
code += " if (this." + camel_name + " == null) return null;\n"; code += " if (this." + camel_name + " == null) return null;\n";
@@ -1966,7 +1966,7 @@ class CSharpGenerator : public BaseGenerator {
code += " [Newtonsoft.Json.JsonProperty(\"" + field.name + "\")]\n"; code += " [Newtonsoft.Json.JsonProperty(\"" + field.name + "\")]\n";
if (IsUnion(field.value.type)) { if (IsUnion(field.value.type)) {
auto union_name = auto union_name =
(field.value.type.base_type == BASE_TYPE_VECTOR) (IsVector(field.value.type))
? GenTypeGet_ObjectAPI(field.value.type.VectorType(), opts) ? GenTypeGet_ObjectAPI(field.value.type.VectorType(), opts)
: type_name; : type_name;
code += " [Newtonsoft.Json.JsonConverter(typeof(" + union_name + code += " [Newtonsoft.Json.JsonConverter(typeof(" + union_name +

View File

@@ -330,13 +330,13 @@ class DartGenerator : public BaseGenerator {
bool parent_is_vector = false) { bool parent_is_vector = false) {
if (type.base_type == BASE_TYPE_BOOL) { if (type.base_type == BASE_TYPE_BOOL) {
return "const " + _kFb + ".BoolReader()"; return "const " + _kFb + ".BoolReader()";
} else if (type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(type)) {
return "const " + _kFb + ".ListReader<" + return "const " + _kFb + ".ListReader<" +
GenDartTypeName(type.VectorType(), current_namespace, def) + ">(" + GenDartTypeName(type.VectorType(), current_namespace, def) + ">(" +
GenReaderTypeName(type.VectorType(), current_namespace, def, GenReaderTypeName(type.VectorType(), current_namespace, def,
true) + true) +
")"; ")";
} else if (type.base_type == BASE_TYPE_STRING) { } else if (IsString(type)) {
return "const " + _kFb + ".StringReader()"; return "const " + _kFb + ".StringReader()";
} }
if (IsScalar(type.base_type)) { if (IsScalar(type.base_type)) {
@@ -808,7 +808,7 @@ class DartGenerator : public BaseGenerator {
continue; continue;
code += " final int " + MakeCamel(field.name, false) + "Offset"; code += " final int " + MakeCamel(field.name, false) + "Offset";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += code +=
" = _" + MakeCamel(field.name, false) + "?.isNotEmpty == true\n"; " = _" + MakeCamel(field.name, false) + "?.isNotEmpty == true\n";
code += " ? fbBuilder.writeList"; code += " ? fbBuilder.writeList";
@@ -832,7 +832,7 @@ class DartGenerator : public BaseGenerator {
code += ")"; code += ")";
} }
code += "\n : null;\n"; code += "\n : null;\n";
} else if (field.value.type.base_type == BASE_TYPE_STRING) { } else if (IsString(field.value.type)) {
code += " = fbBuilder.writeString(_" + MakeCamel(field.name, false) + code += " = fbBuilder.writeString(_" + MakeCamel(field.name, false) +
");\n"; ");\n";
} else { } else {

View File

@@ -458,7 +458,7 @@ class GoGenerator : public BaseGenerator {
"(a + flatbuffers.UOffsetT(j*" + "(a + flatbuffers.UOffsetT(j*" +
NumToString(InlineSize(vectortype)) + "))"); NumToString(InlineSize(vectortype)) + "))");
code += "\n\t}\n"; code += "\n\t}\n";
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code += "\treturn nil\n"; code += "\treturn nil\n";
} else if (vectortype.base_type == BASE_TYPE_BOOL) { } else if (vectortype.base_type == BASE_TYPE_BOOL) {
code += "\treturn false\n"; code += "\treturn false\n";
@@ -640,7 +640,7 @@ class GoGenerator : public BaseGenerator {
default: FLATBUFFERS_ASSERT(0); default: FLATBUFFERS_ASSERT(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
GetVectorLen(struct_def, field, code_ptr); GetVectorLen(struct_def, field, code_ptr);
if (field.value.type.element == BASE_TYPE_UCHAR) { if (field.value.type.element == BASE_TYPE_UCHAR) {
GetUByteSlice(struct_def, field, code_ptr); GetUByteSlice(struct_def, field, code_ptr);
@@ -708,7 +708,7 @@ class GoGenerator : public BaseGenerator {
} else { } else {
MutateScalarFieldOfTable(struct_def, field, code_ptr); MutateScalarFieldOfTable(struct_def, field, code_ptr);
} }
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(field.value.type)) {
if (IsScalar(field.value.type.element)) { if (IsScalar(field.value.type.element)) {
MutateElementOfVectorOfNonStruct(struct_def, field, code_ptr); MutateElementOfVectorOfNonStruct(struct_def, field, code_ptr);
} }
@@ -726,7 +726,7 @@ class GoGenerator : public BaseGenerator {
auto offset = it - struct_def.fields.vec.begin(); auto offset = it - struct_def.fields.vec.begin();
BuildFieldOfTable(struct_def, field, offset, code_ptr); BuildFieldOfTable(struct_def, field, offset, code_ptr);
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
BuildVectorOfTable(struct_def, field, code_ptr); BuildVectorOfTable(struct_def, field, code_ptr);
} }
} }
@@ -869,10 +869,10 @@ class GoGenerator : public BaseGenerator {
std::string offset = MakeCamel(field.name, false) + "Offset"; std::string offset = MakeCamel(field.name, false) + "Offset";
if (field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(field.value.type)) {
code += "\t" + offset + " := builder.CreateString(t." + code += "\t" + offset + " := builder.CreateString(t." +
MakeCamel(field.name) + ")\n"; MakeCamel(field.name) + ")\n";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR && } else if (IsVector(field.value.type) &&
field.value.type.element == BASE_TYPE_UCHAR && field.value.type.element == BASE_TYPE_UCHAR &&
field.value.type.enum_def == nullptr) { field.value.type.enum_def == nullptr) {
code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n"; code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n";
@@ -880,7 +880,7 @@ class GoGenerator : public BaseGenerator {
code += "\t\t" + offset + " = builder.CreateByteString(t." + code += "\t\t" + offset + " = builder.CreateByteString(t." +
MakeCamel(field.name) + ")\n"; MakeCamel(field.name) + ")\n";
code += "\t}\n"; code += "\t}\n";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(field.value.type)) {
code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n"; code += "\t" + offset + " := flatbuffers.UOffsetT(0)\n";
code += "\tif t." + MakeCamel(field.name) + " != nil {\n"; code += "\tif t." + MakeCamel(field.name) + " != nil {\n";
std::string length = MakeCamel(field.name, false) + "Length"; std::string length = MakeCamel(field.name, false) + "Length";
@@ -984,15 +984,15 @@ class GoGenerator : public BaseGenerator {
continue; continue;
code += code +=
"\tt." + field_name_camel + " = rcv." + field_name_camel + "()\n"; "\tt." + field_name_camel + " = rcv." + field_name_camel + "()\n";
} else if (field.value.type.base_type == BASE_TYPE_STRING) { } else if (IsString(field.value.type)) {
code += "\tt." + field_name_camel + " = string(rcv." + code += "\tt." + field_name_camel + " = string(rcv." +
field_name_camel + "())\n"; field_name_camel + "())\n";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR && } else if (IsVector(field.value.type) &&
field.value.type.element == BASE_TYPE_UCHAR && field.value.type.element == BASE_TYPE_UCHAR &&
field.value.type.enum_def == nullptr) { field.value.type.enum_def == nullptr) {
code += "\tt." + field_name_camel + " = rcv." + field_name_camel + code += "\tt." + field_name_camel + " = rcv." + field_name_camel +
"Bytes()\n"; "Bytes()\n";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(field.value.type)) {
code += "\t" + length + " := rcv." + field_name_camel + "Length()\n"; code += "\t" + length + " := rcv." + field_name_camel + "Length()\n";
code += "\tt." + field_name_camel + " = make(" + code += "\tt." + field_name_camel + " = make(" +
NativeType(field.value.type) + ", " + length + ")\n"; NativeType(field.value.type) + ", " + length + ")\n";
@@ -1225,9 +1225,9 @@ class GoGenerator : public BaseGenerator {
} else { } else {
return GetEnumTypeName(*type.enum_def); return GetEnumTypeName(*type.enum_def);
} }
} else if (type.base_type == BASE_TYPE_STRING) { } else if (IsString(type)) {
return "string"; return "string";
} else if (type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(type)) {
return "[]" + NativeType(type.VectorType()); return "[]" + NativeType(type.VectorType());
} else if (type.base_type == BASE_TYPE_STRUCT) { } else if (type.base_type == BASE_TYPE_STRUCT) {
return "*" + WrapInNameSpaceAndTrack(type.struct_def->defined_namespace, return "*" + WrapInNameSpaceAndTrack(type.struct_def->defined_namespace,

View File

@@ -526,7 +526,7 @@ class JavaGenerator : public BaseGenerator {
key_getter += "int tableOffset = "; key_getter += "int tableOffset = ";
key_getter += "__indirect(vectorLocation + 4 * (start + middle)"; key_getter += "__indirect(vectorLocation + 4 * (start + middle)";
key_getter += ", bb);\n "; key_getter += ", bb);\n ";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
key_getter += "int comp = "; key_getter += "int comp = ";
key_getter += "compareStrings("; key_getter += "compareStrings(";
key_getter += GenOffsetGetter(key_field); key_getter += GenOffsetGetter(key_field);
@@ -543,7 +543,7 @@ class JavaGenerator : public BaseGenerator {
std::string GenKeyGetter(flatbuffers::FieldDef *key_field) const { std::string GenKeyGetter(flatbuffers::FieldDef *key_field) const {
std::string key_getter = ""; std::string key_getter = "";
auto data_buffer = "_bb"; auto data_buffer = "_bb";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
key_getter += " return "; key_getter += " return ";
key_getter += ""; key_getter += "";
key_getter += "compareStrings("; key_getter += "compareStrings(";
@@ -669,7 +669,7 @@ class JavaGenerator : public BaseGenerator {
code += MakeCamel(field.name, false); code += MakeCamel(field.name, false);
code += "(new "; code += "(new ";
code += type_name + "()); }\n"; code += type_name + "()); }\n";
} else if (field.value.type.base_type == BASE_TYPE_VECTOR && } else if (IsVector(field.value.type) &&
field.value.type.element == BASE_TYPE_STRUCT) { field.value.type.element == BASE_TYPE_STRUCT) {
// Accessors for vectors of structs also take accessor objects, this // Accessors for vectors of structs also take accessor objects, this
// generates a variant without that argument. // generates a variant without that argument.
@@ -772,7 +772,7 @@ class JavaGenerator : public BaseGenerator {
} }
code += member_suffix; code += member_suffix;
code += "}\n"; code += "}\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += " public int " + MakeCamel(field.name, false); code += " public int " + MakeCamel(field.name, false);
code += "Length"; code += "Length";
code += "()"; code += "()";
@@ -813,7 +813,7 @@ class JavaGenerator : public BaseGenerator {
} }
} }
// Generate the accessors for vector of structs with vector access object // Generate the accessors for vector of structs with vector access object
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
std::string vector_type_name; std::string vector_type_name;
const auto &element_base_type = field.value.type.VectorType().base_type; const auto &element_base_type = field.value.type.VectorType().base_type;
if (IsScalar(element_base_type)) { if (IsScalar(element_base_type)) {
@@ -842,15 +842,15 @@ class JavaGenerator : public BaseGenerator {
code += "bb) : null" + member_suffix + "}\n"; code += "bb) : null" + member_suffix + "}\n";
} }
// Generate a ByteBuffer accessor for strings & vectors of scalars. // Generate a ByteBuffer accessor for strings & vectors of scalars.
if ((field.value.type.base_type == BASE_TYPE_VECTOR && if ((IsVector(field.value.type) &&
IsScalar(field.value.type.VectorType().base_type)) || IsScalar(field.value.type.VectorType().base_type)) ||
field.value.type.base_type == BASE_TYPE_STRING) { IsString(field.value.type)) {
code += " public ByteBuffer "; code += " public ByteBuffer ";
code += MakeCamel(field.name, false); code += MakeCamel(field.name, false);
code += "AsByteBuffer() { return "; code += "AsByteBuffer() { return ";
code += "__vector_as_bytebuffer("; code += "__vector_as_bytebuffer(";
code += NumToString(field.value.offset) + ", "; code += NumToString(field.value.offset) + ", ";
code += NumToString(field.value.type.base_type == BASE_TYPE_STRING code += NumToString(IsString(field.value.type)
? 1 ? 1
: InlineSize(field.value.type.VectorType())); : InlineSize(field.value.type.VectorType()));
code += "); }\n"; code += "); }\n";
@@ -859,7 +859,7 @@ class JavaGenerator : public BaseGenerator {
code += "InByteBuffer(ByteBuffer _bb) { return "; code += "InByteBuffer(ByteBuffer _bb) { return ";
code += "__vector_in_bytebuffer(_bb, "; code += "__vector_in_bytebuffer(_bb, ";
code += NumToString(field.value.offset) + ", "; code += NumToString(field.value.offset) + ", ";
code += NumToString(field.value.type.base_type == BASE_TYPE_STRING code += NumToString(IsString(field.value.type)
? 1 ? 1
: InlineSize(field.value.type.VectorType())); : InlineSize(field.value.type.VectorType()));
code += "); }\n"; code += "); }\n";
@@ -1036,7 +1036,7 @@ class JavaGenerator : public BaseGenerator {
code += SourceCastBasic(field.value.type); code += SourceCastBasic(field.value.type);
code += GenDefaultValue(field); code += GenDefaultValue(field);
code += "); }\n"; code += "); }\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
auto vector_type = field.value.type.VectorType(); auto vector_type = field.value.type.VectorType();
auto alignment = InlineAlignment(vector_type); auto alignment = InlineAlignment(vector_type);
auto elem_size = InlineSize(vector_type); auto elem_size = InlineSize(vector_type);
@@ -1132,7 +1132,7 @@ class JavaGenerator : public BaseGenerator {
code += "int vectorLocation, "; code += "int vectorLocation, ";
code += GenTypeNameDest(key_field->value.type); code += GenTypeNameDest(key_field->value.type);
code += " key, ByteBuffer bb) {\n"; code += " key, ByteBuffer bb) {\n";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
code += " byte[] byteKey = "; code += " byte[] byteKey = ";
code += "key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n"; code += "key.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n";
} }

View File

@@ -491,10 +491,9 @@ class JsTsGenerator : public BaseGenerator {
std::string GenTypeName(const Type &type, bool input, std::string GenTypeName(const Type &type, bool input,
bool allowNull = false) { bool allowNull = false) {
if (!input) { if (!input) {
if (type.base_type == BASE_TYPE_STRING || if (IsString(type) || type.base_type == BASE_TYPE_STRUCT) {
type.base_type == BASE_TYPE_STRUCT) {
std::string name; std::string name;
if (type.base_type == BASE_TYPE_STRING) { if (IsString(type)) {
name = "string|Uint8Array"; name = "string|Uint8Array";
} else { } else {
name = WrapInNameSpace(*type.struct_def); name = WrapInNameSpace(*type.struct_def);
@@ -714,7 +713,7 @@ class JsTsGenerator : public BaseGenerator {
return std::any_of(union_enum.Vals().begin(), union_enum.Vals().end(), return std::any_of(union_enum.Vals().begin(), union_enum.Vals().end(),
[](const EnumVal *ev) { [](const EnumVal *ev) {
return !(ev->IsZero()) && return !(ev->IsZero()) &&
(ev->union_type.base_type == BASE_TYPE_STRING); (IsString(ev->union_type));
}); });
} }
@@ -733,7 +732,7 @@ class JsTsGenerator : public BaseGenerator {
if (ev.IsZero()) { continue; } if (ev.IsZero()) { continue; }
std::string type = ""; std::string type = "";
if (ev.union_type.base_type == BASE_TYPE_STRING) { if (IsString(ev.union_type)) {
type = "string"; // no need to wrap string type in namespace type = "string"; // no need to wrap string type in namespace
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) { } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
if (!parser_.opts.generate_all) { if (!parser_.opts.generate_all) {
@@ -767,7 +766,7 @@ class JsTsGenerator : public BaseGenerator {
if (ev.IsZero()) { continue; } if (ev.IsZero()) { continue; }
std::string type = ""; std::string type = "";
if (ev.union_type.base_type == BASE_TYPE_STRING) { if (IsString(ev.union_type)) {
type = "string"; // no need to wrap string type in namespace type = "string"; // no need to wrap string type in namespace
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) { } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
type = GenPrefixedTypeName( type = GenPrefixedTypeName(
@@ -830,7 +829,7 @@ class JsTsGenerator : public BaseGenerator {
ret += " case '" + ev.name + "': "; ret += " case '" + ev.name + "': ";
if (ev.union_type.base_type == BASE_TYPE_STRING) { if (IsString(ev.union_type)) {
ret += "return " + accessor_str + "'') as string;"; ret += "return " + accessor_str + "'') as string;";
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) { } else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
const auto type = GenPrefixedTypeName( const auto type = GenPrefixedTypeName(
@@ -1044,7 +1043,7 @@ class JsTsGenerator : public BaseGenerator {
// Emit a scalar field // Emit a scalar field
if (IsScalar(field.value.type.base_type) || if (IsScalar(field.value.type.base_type) ||
field.value.type.base_type == BASE_TYPE_STRING) { IsString(field.value.type)) {
if (field.value.type.enum_def) { if (field.value.type.enum_def) {
if (!parser_.opts.generate_all) { if (!parser_.opts.generate_all) {
imported_files.insert(field.value.type.enum_def->file); imported_files.insert(field.value.type.enum_def->file);
@@ -1413,10 +1412,10 @@ class JsTsGenerator : public BaseGenerator {
// Emit a scalar field // Emit a scalar field
if (IsScalar(field.value.type.base_type) || if (IsScalar(field.value.type.base_type) ||
field.value.type.base_type == BASE_TYPE_STRING) { IsString(field.value.type)) {
GenDocComment( GenDocComment(
field.doc_comment, code_ptr, field.doc_comment, code_ptr,
std::string(field.value.type.base_type == BASE_TYPE_STRING std::string(IsString(field.value.type)
? GenTypeAnnotation(kParam, "flatbuffers.Encoding=", ? GenTypeAnnotation(kParam, "flatbuffers.Encoding=",
"optionalEncoding") "optionalEncoding")
: "") + : "") +
@@ -1425,7 +1424,7 @@ class JsTsGenerator : public BaseGenerator {
"", false)); "", false));
if (lang_.language == IDLOptions::kTs) { if (lang_.language == IDLOptions::kTs) {
std::string prefix = MakeCamel(field.name, false) + "("; std::string prefix = MakeCamel(field.name, false) + "(";
if (field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(field.value.type)) {
code += prefix + "):string|null\n"; code += prefix + "):string|null\n";
code += prefix + "optionalEncoding:flatbuffers.Encoding" + code += prefix + "optionalEncoding:flatbuffers.Encoding" +
"):" + GenTypeName(field.value.type, false, true) + "\n"; "):" + GenTypeName(field.value.type, false, true) + "\n";
@@ -1449,7 +1448,7 @@ class JsTsGenerator : public BaseGenerator {
} else { } else {
code += object_name + ".prototype." + MakeCamel(field.name, false); code += object_name + ".prototype." + MakeCamel(field.name, false);
code += " = function("; code += " = function(";
if (field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(field.value.type)) {
code += "optionalEncoding"; code += "optionalEncoding";
} }
code += ") {\n"; code += ") {\n";
@@ -1463,7 +1462,7 @@ class JsTsGenerator : public BaseGenerator {
";\n"; ";\n";
} else { } else {
std::string index = "this.bb_pos + offset"; std::string index = "this.bb_pos + offset";
if (field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(field.value.type)) {
index += ", optionalEncoding"; index += ", optionalEncoding";
} }
code += offset_prefix + code += offset_prefix +
@@ -1569,7 +1568,7 @@ class JsTsGenerator : public BaseGenerator {
if (!parser_.opts.generate_all) { if (!parser_.opts.generate_all) {
imported_files.insert(vectortype.struct_def->file); imported_files.insert(vectortype.struct_def->file);
} }
} else if (vectortype.base_type == BASE_TYPE_STRING) { } else if (IsString(vectortype)) {
code += prefix + "):string\n"; code += prefix + "):string\n";
code += prefix + ",optionalEncoding:flatbuffers.Encoding" + code += prefix + ",optionalEncoding:flatbuffers.Encoding" +
"):" + vectortypename + "\n"; "):" + vectortypename + "\n";
@@ -1588,7 +1587,7 @@ class JsTsGenerator : public BaseGenerator {
code += " = function(index"; code += " = function(index";
if (vectortype.base_type == BASE_TYPE_STRUCT || is_union) { if (vectortype.base_type == BASE_TYPE_STRUCT || is_union) {
code += ", obj"; code += ", obj";
} else if (vectortype.base_type == BASE_TYPE_STRING) { } else if (IsString(vectortype)) {
code += ", optionalEncoding"; code += ", optionalEncoding";
} }
code += ") {\n"; code += ") {\n";
@@ -1605,7 +1604,7 @@ class JsTsGenerator : public BaseGenerator {
} else { } else {
if (is_union) { if (is_union) {
index = "obj, " + index; index = "obj, " + index;
} else if (vectortype.base_type == BASE_TYPE_STRING) { } else if (IsString(vectortype)) {
index += ", optionalEncoding"; index += ", optionalEncoding";
} }
code += offset_prefix + GenGetter(vectortype, "(" + index + ")"); code += offset_prefix + GenGetter(vectortype, "(" + index + ")");
@@ -1732,7 +1731,7 @@ class JsTsGenerator : public BaseGenerator {
} }
// Emit vector helpers // Emit vector helpers
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
// Emit a length helper // Emit a length helper
GenDocComment(code_ptr, GenDocComment(code_ptr,
GenTypeAnnotation(kReturns, "number", "", false)); GenTypeAnnotation(kReturns, "number", "", false));
@@ -1884,7 +1883,7 @@ class JsTsGenerator : public BaseGenerator {
} }
code += ");\n};\n\n"; code += ");\n};\n\n";
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
auto vector_type = field.value.type.VectorType(); auto vector_type = field.value.type.VectorType();
auto alignment = InlineAlignment(vector_type); auto alignment = InlineAlignment(vector_type);
auto elem_size = InlineSize(vector_type); auto elem_size = InlineSize(vector_type);

View File

@@ -87,7 +87,7 @@ std::string GenType(BaseType type) {
std::string GenBaseType(const Type &type) { std::string GenBaseType(const Type &type) {
if (type.struct_def != nullptr) { return GenTypeRef(type.struct_def); } if (type.struct_def != nullptr) { return GenTypeRef(type.struct_def); }
if (type.enum_def != nullptr) { return GenTypeRef(type.enum_def); } if (type.enum_def != nullptr) { return GenTypeRef(type.enum_def); }
if (type.base_type == BASE_TYPE_ARRAY || type.base_type == BASE_TYPE_VECTOR) { if (IsArray(type) || IsVector(type)) {
return "\"type\" : \"array\", \"items\" : {" + GenType(type.element) + "}"; return "\"type\" : \"array\", \"items\" : {" + GenType(type.element) + "}";
} }
return GenType(type.base_type); return GenType(type.base_type);

View File

@@ -513,7 +513,7 @@ class KotlinGenerator : public BaseGenerator {
if (field.key) key_field = &field; if (field.key) key_field = &field;
GenerateAddField(NumToString(field_pos), field, writer, options); GenerateAddField(NumToString(field_pos), field, writer, options);
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
auto vector_type = field.value.type.VectorType(); auto vector_type = field.value.type.VectorType();
if (!IsStruct(vector_type)) { if (!IsStruct(vector_type)) {
GenerateCreateVectorField(field, writer, options); GenerateCreateVectorField(field, writer, options);
@@ -571,7 +571,7 @@ class KotlinGenerator : public BaseGenerator {
writer += writer +=
"val tableOffset = __indirect(vector" "val tableOffset = __indirect(vector"
"Location + 4 * (start + middle), bb)"; "Location + 4 * (start + middle), bb)";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
writer += "val comp = compareStrings(\\"; writer += "val comp = compareStrings(\\";
writer += GenOffsetGetter(key_field) + "\\"; writer += GenOffsetGetter(key_field) + "\\";
writer += ", byteKey, bb)"; writer += ", byteKey, bb)";
@@ -1192,7 +1192,7 @@ class KotlinGenerator : public BaseGenerator {
GenerateOverrideFun( GenerateOverrideFun(
writer, "keysCompare", "o1: Int, o2: Int, _bb: ByteBuffer", "Int", writer, "keysCompare", "o1: Int, o2: Int, _bb: ByteBuffer", "Int",
[&]() { [&]() {
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field->value.type)) {
writer.SetValue("offset", NumToString(key_field->value.offset)); writer.SetValue("offset", NumToString(key_field->value.offset));
writer += writer +=
" return compareStrings(__offset({{offset}}, o1, " " return compareStrings(__offset({{offset}}, o1, "

View File

@@ -62,7 +62,7 @@ class LobsterGenerator : public BaseGenerator {
auto bits = NumToString(SizeOf(type.base_type) * 8); auto bits = NumToString(SizeOf(type.base_type) * 8);
if (IsInteger(type.base_type)) return "int" + bits; if (IsInteger(type.base_type)) return "int" + bits;
if (IsFloat(type.base_type)) return "float" + bits; if (IsFloat(type.base_type)) return "float" + bits;
if (type.base_type == BASE_TYPE_STRING) return "string"; if (IsString(type)) return "string";
if (type.base_type == BASE_TYPE_STRUCT) return "table"; if (type.base_type == BASE_TYPE_STRUCT) return "table";
return "none"; return "none";
} }
@@ -152,7 +152,7 @@ class LobsterGenerator : public BaseGenerator {
code += NamespacedName(*field.value.type.struct_def) + " { buf_, " + code += NamespacedName(*field.value.type.struct_def) + " { buf_, " +
start + " }\n"; start + " }\n";
} else { } else {
if (vectortype.base_type == BASE_TYPE_STRING) if (IsString(vectortype))
code += "buf_.flatbuffers_string"; code += "buf_.flatbuffers_string";
else else
code += "buf_.read_" + GenTypeName(vectortype) + "_le"; code += "buf_.read_" + GenTypeName(vectortype) + "_le";
@@ -176,7 +176,7 @@ class LobsterGenerator : public BaseGenerator {
} }
default: FLATBUFFERS_ASSERT(0); default: FLATBUFFERS_ASSERT(0);
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += def + code += def +
"_length():\n return " "_length():\n return "
"buf_.flatbuffers_field_vector_len(pos_, " + "buf_.flatbuffers_field_vector_len(pos_, " +
@@ -210,7 +210,7 @@ class LobsterGenerator : public BaseGenerator {
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
auto &field = **it; auto &field = **it;
if (field.deprecated) continue; if (field.deprecated) continue;
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
code += "def " + NormalizedName(struct_def) + "Start" + code += "def " + NormalizedName(struct_def) + "Start" +
MakeCamel(NormalizedName(field)) + MakeCamel(NormalizedName(field)) +
"Vector(b_:flatbuffers_builder, n_:int):\n b_.StartVector("; "Vector(b_:flatbuffers_builder, n_:int):\n b_.StartVector(";

View File

@@ -327,7 +327,7 @@ class LuaGenerator : public BaseGenerator {
code += "a + ((j-1) * "; code += "a + ((j-1) * ";
code += NumToString(InlineSize(vectortype)) + "))\n"; code += NumToString(InlineSize(vectortype)) + "))\n";
code += std::string(Indent) + End; code += std::string(Indent) + End;
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code += std::string(Indent) + "return ''\n"; code += std::string(Indent) + "return ''\n";
} else { } else {
code += std::string(Indent) + "return 0\n"; code += std::string(Indent) + "return 0\n";
@@ -502,7 +502,7 @@ class LuaGenerator : public BaseGenerator {
default: FLATBUFFERS_ASSERT(0); default: FLATBUFFERS_ASSERT(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
GetVectorLen(struct_def, field, code_ptr); GetVectorLen(struct_def, field, code_ptr);
} }
} }
@@ -518,7 +518,7 @@ class LuaGenerator : public BaseGenerator {
auto offset = it - struct_def.fields.vec.begin(); auto offset = it - struct_def.fields.vec.begin();
BuildFieldOfTable(struct_def, field, offset, code_ptr); BuildFieldOfTable(struct_def, field, offset, code_ptr);
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
BuildVectorOfTable(struct_def, field, code_ptr); BuildVectorOfTable(struct_def, field, code_ptr);
} }
} }

View File

@@ -401,7 +401,7 @@ class PhpGenerator : public BaseGenerator {
code += Indent + Indent + "$o = $this->__offset(" + code += Indent + Indent + "$o = $this->__offset(" +
NumToString(field.value.offset) + ");\n"; NumToString(field.value.offset) + ");\n";
if (field.value.type.VectorType().base_type == BASE_TYPE_STRING) { if (IsString(field.value.type.VectorType())) {
code += Indent + Indent; code += Indent + Indent;
code += "return $o != 0 ? $this->__string($this->__vector($o) + $j * "; code += "return $o != 0 ? $this->__string($this->__vector($o) + $j * ";
code += NumToString(InlineSize(vectortype)) + ") : "; code += NumToString(InlineSize(vectortype)) + ") : ";
@@ -705,7 +705,7 @@ class PhpGenerator : public BaseGenerator {
default: FLATBUFFERS_ASSERT(0); default: FLATBUFFERS_ASSERT(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
GetVectorLen(field, code_ptr); GetVectorLen(field, code_ptr);
if (field.value.type.element == BASE_TYPE_UCHAR) { if (field.value.type.element == BASE_TYPE_UCHAR) {
GetUByte(field, code_ptr); GetUByte(field, code_ptr);
@@ -735,7 +735,7 @@ class PhpGenerator : public BaseGenerator {
} else { } else {
BuildFieldOfTable(field, offset, code_ptr); BuildFieldOfTable(field, offset, code_ptr);
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
BuildVectorOfTable(field, code_ptr); BuildVectorOfTable(field, code_ptr);
} }
} }

View File

@@ -370,7 +370,7 @@ class PythonGenerator : public BaseGenerator {
code += "return " + GenGetter(field.value.type); code += "return " + GenGetter(field.value.type);
code += "a + flatbuffers.number_types.UOffsetTFlags.py_type(j * "; code += "a + flatbuffers.number_types.UOffsetTFlags.py_type(j * ";
code += NumToString(InlineSize(vectortype)) + "))\n"; code += NumToString(InlineSize(vectortype)) + "))\n";
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code += Indent + Indent + "return \"\"\n"; code += Indent + Indent + "return \"\"\n";
} else { } else {
code += Indent + Indent + "return 0\n"; code += Indent + Indent + "return 0\n";
@@ -400,7 +400,7 @@ class PythonGenerator : public BaseGenerator {
code += MakeCamel(GenTypeGet(field.value.type)); code += MakeCamel(GenTypeGet(field.value.type));
code += "Flags, o)\n"; code += "Flags, o)\n";
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code += Indent + Indent + "return \"\"\n"; code += Indent + Indent + "return \"\"\n";
} else { } else {
code += Indent + Indent + "return 0\n"; code += Indent + Indent + "return 0\n";
@@ -614,8 +614,7 @@ class PythonGenerator : public BaseGenerator {
default: FLATBUFFERS_ASSERT(0); default: FLATBUFFERS_ASSERT(0);
} }
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR || if (IsVector(field.value.type) || IsArray(field.value.type)) {
field.value.type.base_type == BASE_TYPE_ARRAY) {
GetVectorLen(struct_def, field, code_ptr); GetVectorLen(struct_def, field, code_ptr);
GetVectorIsNone(struct_def, field, code_ptr); GetVectorIsNone(struct_def, field, code_ptr);
} }
@@ -642,7 +641,7 @@ class PythonGenerator : public BaseGenerator {
auto offset = it - struct_def.fields.vec.begin(); auto offset = it - struct_def.fields.vec.begin();
BuildFieldOfTable(struct_def, field, offset, code_ptr); BuildFieldOfTable(struct_def, field, offset, code_ptr);
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (IsVector(field.value.type)) {
BuildVectorOfTable(struct_def, field, code_ptr); BuildVectorOfTable(struct_def, field, code_ptr);
} }
} }
@@ -1265,7 +1264,7 @@ class PythonGenerator : public BaseGenerator {
// each string element. And this generated code, needs to be // each string element. And this generated code, needs to be
// placed ahead of code_prefix. // placed ahead of code_prefix.
auto vectortype = field.value.type.VectorType(); auto vectortype = field.value.type.VectorType();
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code_prefix += GenIndents(3) + MakeLowerCamel(field) + "list = []"; code_prefix += GenIndents(3) + MakeLowerCamel(field) + "list = []";
code_prefix += GenIndents(3) + "for i in range(len(self." + code_prefix += GenIndents(3) + "for i in range(len(self." +
field_instance_name + ")):"; field_instance_name + ")):";

View File

@@ -87,7 +87,7 @@ enum FullType {
FullType GetFullType(const Type &type) { FullType GetFullType(const Type &type) {
// N.B. The order of these conditionals matters for some types. // N.B. The order of these conditionals matters for some types.
if (type.base_type == BASE_TYPE_STRING) { if (IsString(type)) {
return ftString; return ftString;
} else if (type.base_type == BASE_TYPE_STRUCT) { } else if (type.base_type == BASE_TYPE_STRUCT) {
if (type.struct_def->fixed) { if (type.struct_def->fixed) {
@@ -95,7 +95,7 @@ FullType GetFullType(const Type &type) {
} else { } else {
return ftTable; return ftTable;
} }
} else if (type.base_type == BASE_TYPE_VECTOR) { } else if (IsVector(type)) {
switch (GetFullType(type.VectorType())) { switch (GetFullType(type.VectorType())) {
case ftInteger: { case ftInteger: {
return ftVectorOfInteger; return ftVectorOfInteger;

View File

@@ -508,8 +508,8 @@ class SwiftGenerator : public BaseGenerator {
code_.SetValue("OFFSET", name); code_.SetValue("OFFSET", name);
code_.SetValue("CONSTANT", field.value.constant); code_.SetValue("CONSTANT", field.value.constant);
std::string check_if_vector = std::string check_if_vector =
(field.value.type.base_type == BASE_TYPE_VECTOR || (IsVector(field.value.type) ||
field.value.type.base_type == BASE_TYPE_ARRAY) IsArray(field.value.type))
? "VectorOf(" ? "VectorOf("
: "("; : "(";
auto body = "add" + check_if_vector + name + ": "; auto body = "add" + check_if_vector + name + ": ";
@@ -565,12 +565,12 @@ class SwiftGenerator : public BaseGenerator {
return; return;
} }
auto offset_type = field.value.type.base_type == BASE_TYPE_STRING auto offset_type = IsString(field.value.type)
? "Offset<String>" ? "Offset<String>"
: "Offset<UOffset>"; : "Offset<UOffset>";
auto camel_case_name = auto camel_case_name =
(field.value.type.base_type == BASE_TYPE_VECTOR || (IsVector(field.value.type) ||
field.value.type.base_type == BASE_TYPE_ARRAY IsArray(field.value.type)
? "vectorOf" ? "vectorOf"
: "offsetOf") + : "offsetOf") +
MakeCamel(name, true); MakeCamel(name, true);
@@ -586,8 +586,8 @@ class SwiftGenerator : public BaseGenerator {
if ((vectortype.base_type == BASE_TYPE_STRUCT && if ((vectortype.base_type == BASE_TYPE_STRUCT &&
field.value.type.struct_def->fixed) && field.value.type.struct_def->fixed) &&
(field.value.type.base_type == BASE_TYPE_VECTOR || (IsVector(field.value.type) ||
field.value.type.base_type == BASE_TYPE_ARRAY)) { IsArray(field.value.type))) {
auto field_name = NameWrappedInNameSpace(*vectortype.struct_def); auto field_name = NameWrappedInNameSpace(*vectortype.struct_def);
code_ += "public static func startVectorOf" + MakeCamel(name, true) + code_ += "public static func startVectorOf" + MakeCamel(name, true) +
"(_ size: Int, in builder: inout " "(_ size: Int, in builder: inout "
@@ -738,7 +738,7 @@ class SwiftGenerator : public BaseGenerator {
return; return;
} }
if (vectortype.base_type == BASE_TYPE_STRING) { if (IsString(vectortype)) {
code_ += code_ +=
"{{ACCESS}}.directString(at: {{ACCESS}}.vector(at: o) + " "{{ACCESS}}.directString(at: {{ACCESS}}.vector(at: o) + "
"index * {{SIZE}}) }"; "index * {{SIZE}}) }";
@@ -915,8 +915,8 @@ class SwiftGenerator : public BaseGenerator {
auto name = Name(field); auto name = Name(field);
auto type = GenType(field.value.type); auto type = GenType(field.value.type);
std::string check_if_vector = std::string check_if_vector =
(field.value.type.base_type == BASE_TYPE_VECTOR || (IsVector(field.value.type) ||
field.value.type.base_type == BASE_TYPE_ARRAY) IsArray(field.value.type))
? "VectorOf(" ? "VectorOf("
: "("; : "(";
std::string body = "add" + check_if_vector + name + ": "; std::string body = "add" + check_if_vector + name + ": ";
@@ -1192,7 +1192,7 @@ class SwiftGenerator : public BaseGenerator {
} }
case BASE_TYPE_UTYPE: break; case BASE_TYPE_UTYPE: break;
default: { default: {
code_.SetValue("VALUETYPE", (vectortype.base_type == BASE_TYPE_STRING code_.SetValue("VALUETYPE", (IsString(vectortype)
? "String?" ? "String?"
: GenType(vectortype))); : GenType(vectortype)));
code_ += "{{ACCESS_TYPE}} var {{VALUENAME}}: [{{VALUETYPE}}]"; code_ += "{{ACCESS_TYPE}} var {{VALUENAME}}: [{{VALUETYPE}}]";
@@ -1224,7 +1224,7 @@ class SwiftGenerator : public BaseGenerator {
auto type = GenType(field.union_type); auto type = GenType(field.union_type);
if (field.union_type.base_type == BASE_TYPE_NONE || if (field.union_type.base_type == BASE_TYPE_NONE ||
field.union_type.base_type == BASE_TYPE_STRING) { IsString(field.union_type)) {
continue; continue;
} }
code_ += "case ." + ev_name + ":"; code_ += "case ." + ev_name + ":";
@@ -1254,7 +1254,7 @@ class SwiftGenerator : public BaseGenerator {
auto field = **it; auto field = **it;
auto ev_name = Name(field); auto ev_name = Name(field);
if (field.union_type.base_type == BASE_TYPE_NONE || if (field.union_type.base_type == BASE_TYPE_NONE ||
field.union_type.base_type == BASE_TYPE_STRING) { IsString(field.union_type)) {
continue; continue;
} }
buffer_constructor.push_back(indentation + "case ." + ev_name + ":"); buffer_constructor.push_back(indentation + "case ." + ev_name + ":");
@@ -1291,7 +1291,7 @@ class SwiftGenerator : public BaseGenerator {
"fbb: " "fbb: "
"ByteBuffer) -> {{VALUENAME}}? {"; "ByteBuffer) -> {{VALUENAME}}? {";
Indent(); Indent();
if (key_field.value.type.base_type == BASE_TYPE_STRING) if (IsString(key_field.value.type))
code_ += "let key = key.utf8.map { $0 }"; code_ += "let key = key.utf8.map { $0 }";
code_ += "var span = fbb.read(def: Int32.self, position: Int(vector - 4))"; code_ += "var span = fbb.read(def: Int32.self, position: Int(vector - 4))";
code_ += "var start: Int32 = 0"; code_ += "var start: Int32 = 0";
@@ -1300,7 +1300,7 @@ class SwiftGenerator : public BaseGenerator {
code_ += "var middle = span / 2"; code_ += "var middle = span / 2";
code_ += code_ +=
"let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)"; "let tableOffset = Table.indirect(vector + 4 * (start + middle), fbb)";
if (key_field.value.type.base_type == BASE_TYPE_STRING) { if (IsString(key_field.value.type)) {
code_ += "let comp = Table.compare(" + offset_reader + ", key, fbb: fbb)"; code_ += "let comp = Table.compare(" + offset_reader + ", key, fbb: fbb)";
} else { } else {
code_ += "let comp = fbb.read(def: {{TYPE}}.self, position: Int(" + code_ += "let comp = fbb.read(def: {{TYPE}}.self, position: Int(" +

View File

@@ -716,7 +716,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
// with a special suffix. // with a special suffix.
ECHECK(AddField(struct_def, name + UnionTypeFieldSuffix(), ECHECK(AddField(struct_def, name + UnionTypeFieldSuffix(),
type.enum_def->underlying_type, &typefield)); type.enum_def->underlying_type, &typefield));
} else if (type.base_type == BASE_TYPE_VECTOR && } else if (IsVector(type) &&
type.element == BASE_TYPE_UNION) { type.element == BASE_TYPE_UNION) {
// Only cpp, js and ts supports the union vector feature so far. // Only cpp, js and ts supports the union vector feature so far.
if (!SupportsAdvancedUnionFeatures()) { if (!SupportsAdvancedUnionFeatures()) {
@@ -793,9 +793,8 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
// Default value of union and vector in NONE, NULL translated to "0". // Default value of union and vector in NONE, NULL translated to "0".
FLATBUFFERS_ASSERT(IsInteger(type.base_type) || FLATBUFFERS_ASSERT(IsInteger(type.base_type) ||
(type.base_type == BASE_TYPE_UNION) || (type.base_type == BASE_TYPE_UNION) ||
(type.base_type == BASE_TYPE_VECTOR) || IsVector(type) || IsArray(type));
(type.base_type == BASE_TYPE_ARRAY)); if (IsVector(type)) {
if (type.base_type == BASE_TYPE_VECTOR) {
// Vector can't use initialization list. // Vector can't use initialization list.
FLATBUFFERS_ASSERT(field->value.constant == "0"); FLATBUFFERS_ASSERT(field->value.constant == "0");
} else { } else {
@@ -815,7 +814,7 @@ CheckedError Parser::ParseField(StructDef &struct_def) {
field->deprecated = field->attributes.Lookup("deprecated") != nullptr; field->deprecated = field->attributes.Lookup("deprecated") != nullptr;
auto hash_name = field->attributes.Lookup("hash"); auto hash_name = field->attributes.Lookup("hash");
if (hash_name) { if (hash_name) {
switch ((type.base_type == BASE_TYPE_VECTOR) ? type.element switch ((IsVector(type)) ? type.element
: type.base_type) { : type.base_type) {
case BASE_TYPE_SHORT: case BASE_TYPE_SHORT:
case BASE_TYPE_USHORT: { case BASE_TYPE_USHORT: {
@@ -969,7 +968,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
auto &type = elem->second->value.type; auto &type = elem->second->value.type;
if (type.enum_def == val.type.enum_def) { if (type.enum_def == val.type.enum_def) {
if (inside_vector) { if (inside_vector) {
if (type.base_type == BASE_TYPE_VECTOR && if (IsVector(type) &&
type.element == BASE_TYPE_UTYPE) { type.element == BASE_TYPE_UTYPE) {
// Vector of union type field. // Vector of union type field.
uoffset_t offset; uoffset_t offset;
@@ -1037,7 +1036,7 @@ CheckedError Parser::ParseAnyValue(Value &val, FieldDef *field,
builder_.ClearOffsets(); builder_.ClearOffsets();
val.constant = NumToString(builder_.GetSize()); val.constant = NumToString(builder_.GetSize());
} }
} else if (enum_val->union_type.base_type == BASE_TYPE_STRING) { } else if (IsString(enum_val->union_type)) {
ECHECK(ParseString(val, field->shared)); ECHECK(ParseString(val, field->shared));
} else { } else {
FLATBUFFERS_ASSERT(false); FLATBUFFERS_ASSERT(false);
@@ -2960,7 +2959,7 @@ CheckedError Parser::ParseRoot(const char *source, const char **include_paths,
if (field.value.type.struct_def == &struct_def) { if (field.value.type.struct_def == &struct_def) {
field.value.type.struct_def = nullptr; field.value.type.struct_def = nullptr;
field.value.type.enum_def = enum_def; field.value.type.enum_def = enum_def;
auto &bt = field.value.type.base_type == BASE_TYPE_VECTOR auto &bt = IsVector(field.value.type)
? field.value.type.element ? field.value.type.element
: field.value.type.base_type; : field.value.type.base_type;
FLATBUFFERS_ASSERT(bt == BASE_TYPE_STRUCT); FLATBUFFERS_ASSERT(bt == BASE_TYPE_STRUCT);