mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-09 06:30:54 +00:00
[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:
@@ -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 + " { ";
|
||||
|
||||
Reference in New Issue
Block a user