[swift] Moves code to use VTablesStorage (#5888)

* Moves the code to use _vtablestorage

Rebuilt the test to confirm to the new API

Adds documentation + generates code for grpc

Reverts indentation

v0.4.0

Updated swift/readme.md

Updates VtableStorage to ensure space instead of reallocating each time

Fixes str count not being correct

* Fixes issue with boolean constant not being set + removes unused function
This commit is contained in:
mustiikhalil
2020-05-07 22:28:42 +03:00
committed by GitHub
parent c2da8d5d85
commit 870ecbc09a
15 changed files with 585 additions and 361 deletions

View File

@@ -140,6 +140,7 @@ class SwiftGenerator : public BaseGenerator {
bool generate() {
code_.Clear();
code_.SetValue("ACCESS", "_accessor");
code_.SetValue("TABLEOFFSET", "VTOFFSET");
code_ += "// " + std::string(FlatBuffersGeneratedWarning()) + "\n";
code_ += "import FlatBuffers\n";
// Generate code for all the enum declarations.
@@ -313,6 +314,7 @@ class SwiftGenerator : public BaseGenerator {
// Generates the reader for swift
void GenTable(const StructDef &struct_def) {
GenObjectHeader(struct_def);
GenTableAccessors(struct_def);
GenTableReader(struct_def);
GenTableWriter(struct_def);
if (parser_.opts.generate_object_based_api)
@@ -321,6 +323,28 @@ class SwiftGenerator : public BaseGenerator {
code_ += "}\n";
}
// Generates the reader for swift
void GenTableAccessors(const StructDef &struct_def) {
// Generate field id constants.
if (struct_def.fields.vec.size() > 0) {
code_ += "enum {{TABLEOFFSET}}: VOffset {";
Indent();
for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) {
const auto &field = **it;
if (field.deprecated) { continue; }
code_.SetValue("OFFSET_NAME", Name(field));
code_.SetValue("OFFSET_VALUE", NumToString(field.value.offset));
code_ += "case {{OFFSET_NAME}} = {{OFFSET_VALUE}}";
}
code_ += "var v: Int32 { Int32(self.rawValue) }";
code_ += "var p: VOffset { self.rawValue }";
Outdent();
code_ += "}";
code_ += "";
}
}
void GenerateObjectAPIExtensionHeader() {
code_ += "\n";
code_ += "public mutating func unpack() -> {{STRUCTNAME}}T {";
@@ -377,9 +401,7 @@ class SwiftGenerator : public BaseGenerator {
if (field.required)
require_fields.push_back(NumToString(field.value.offset));
GenTableWriterFields(
field, &create_func_body, &create_func_header,
static_cast<int>(it - struct_def.fields.vec.begin()));
GenTableWriterFields(field, &create_func_body, &create_func_header);
}
code_ +=
"public static func end{{STRUCTNAME}}(_ fbb: inout "
@@ -443,8 +465,7 @@ class SwiftGenerator : public BaseGenerator {
void GenTableWriterFields(const FieldDef &field,
std::vector<std::string> *create_body,
std::vector<std::string> *create_header,
const int position) {
std::vector<std::string> *create_header) {
std::string builder_string = ", _ fbb: inout FlatBufferBuilder) { fbb.add(";
auto &create_func_body = *create_body;
auto &create_func_header = *create_header;
@@ -452,7 +473,7 @@ class SwiftGenerator : public BaseGenerator {
auto type = GenType(field.value.type);
code_.SetValue("VALUENAME", name);
code_.SetValue("VALUETYPE", type);
code_.SetValue("OFFSET", NumToString(position));
code_.SetValue("OFFSET", name);
code_.SetValue("CONSTANT", field.value.constant);
std::string check_if_vector =
(field.value.type.base_type == BASE_TYPE_VECTOR ||
@@ -470,7 +491,8 @@ class SwiftGenerator : public BaseGenerator {
: field.value.constant;
auto is_enum = IsEnum(field.value.type) ? ".rawValue" : "";
code_ += "{{VALUETYPE}}" + builder_string + "element: {{VALUENAME}}" +
is_enum + ", def: {{CONSTANT}}, at: {{OFFSET}}) }";
is_enum +
", def: {{CONSTANT}}, at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
create_func_header.push_back("" + name + ": " + type + " = " +
default_value);
return;
@@ -482,7 +504,8 @@ class SwiftGenerator : public BaseGenerator {
code_.SetValue("VALUETYPE", "Bool");
code_.SetValue("CONSTANT", default_value);
code_ += "{{VALUETYPE}}" + builder_string +
"condition: {{VALUENAME}}, def: {{CONSTANT}}, at: {{OFFSET}}) }";
"condition: {{VALUENAME}}, def: {{CONSTANT}}, at: "
"{{TABLEOFFSET}}.{{OFFSET}}.p) }";
create_func_header.push_back(name + ": " + type + " = " + default_value);
return;
}
@@ -500,8 +523,8 @@ class SwiftGenerator : public BaseGenerator {
offset_type + " = Offset()");
auto reader_type =
IsStruct(field.value.type) && field.value.type.struct_def->fixed
? "structOffset: {{OFFSET}}) }"
: "offset: {{VALUENAME}}, at: {{OFFSET}}) }";
? "structOffset: {{TABLEOFFSET}}.{{OFFSET}}.p) }"
: "offset: {{VALUENAME}}, at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
code_ += offset_type + builder_string + reader_type;
}
@@ -511,7 +534,7 @@ class SwiftGenerator : public BaseGenerator {
auto type = GenType(field.value.type);
code_.SetValue("VALUENAME", name);
code_.SetValue("VALUETYPE", type);
code_.SetValue("OFFSET", offset);
code_.SetValue("OFFSET", name);
code_.SetValue("CONSTANT", field.value.constant);
std::string const_string = "return o == 0 ? {{CONSTANT}} : ";
GenComment(field.doc_comment);
@@ -524,12 +547,14 @@ class SwiftGenerator : public BaseGenerator {
}
if (IsBool(field.value.type.base_type)) {
std::string default_value =
"0" == field.value.constant ? "false" : "true";
code_.SetValue("CONSTANT", default_value);
code_.SetValue("VALUETYPE", "Bool");
code_ += GenReaderMainBody() + "\\";
code_.SetValue("VALUETYPE", "Byte");
code_ += GenOffset() +
"return o == 0 ? false : 0 != " + GenReader("VALUETYPE", "o") +
" }";
code_ += GenOffset() + "return o == 0 ? {{CONSTANT}} : 0 != " +
GenReader("VALUETYPE", "o") + " }";
if (parser_.opts.mutable_buffer) code_ += GenMutate("o", GenOffset());
return;
}
@@ -567,7 +592,7 @@ class SwiftGenerator : public BaseGenerator {
"{{ACCESS}}.string(at: o) }";
code_ +=
"public var {{VALUENAME}}SegmentArray: [UInt8]? { return "
"{{ACCESS}}.getVector(at: {{OFFSET}}) }";
"{{ACCESS}}.getVector(at: {{TABLEOFFSET}}.{{OFFSET}}.v) }";
break;
case BASE_TYPE_ARRAY: FLATBUFFERS_FALLTHROUGH(); // fall thru
@@ -620,7 +645,7 @@ class SwiftGenerator : public BaseGenerator {
"{{ACCESS}}.vector(at: o) + index * {{SIZE}}) }";
code_ +=
"public var {{VALUENAME}}: [{{VALUETYPE}}] { return "
"{{ACCESS}}.getVector(at: {{OFFSET}}) ?? [] }";
"{{ACCESS}}.getVector(at: {{TABLEOFFSET}}.{{OFFSET}}.v) ?? [] }";
if (parser_.opts.mutable_buffer) code_ += GenMutateArray();
return;
}
@@ -1194,7 +1219,9 @@ class SwiftGenerator : public BaseGenerator {
for (auto it = dc.begin(); it != dc.end(); ++it) { code_ += "/// " + *it; }
}
std::string GenOffset() { return "let o = {{ACCESS}}.offset({{OFFSET}}); "; }
std::string GenOffset() {
return "let o = {{ACCESS}}.offset({{TABLEOFFSET}}.{{OFFSET}}.v); ";
}
std::string GenReaderMainBody(const std::string &optional = "") {
return "public var {{VALUENAME}}: {{VALUETYPE}}" + optional + " { ";