mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-06 05:27:24 +00:00
[Swift] Migrates struct write APIS to write directly to the buffer (#6093)
* Migrates struct write APIS to in place APIS * Fixes indentation in grpc swift
This commit is contained in:
@@ -199,20 +199,20 @@ class SwiftGenerator : public BaseGenerator {
|
||||
code_.SetValue("SHORT_STRUCTNAME", Name(struct_def));
|
||||
code_ += "extension {{STRUCTNAME}} {";
|
||||
Indent();
|
||||
code_ += "{{ACCESS_TYPE}} static func create{{SHORT_STRUCTNAME}}(\\";
|
||||
code_ += "@discardableResult";
|
||||
code_ +=
|
||||
"{{ACCESS_TYPE}} static func create{{SHORT_STRUCTNAME}}(builder: inout "
|
||||
"FlatBufferBuilder, \\";
|
||||
std::string func_header = "";
|
||||
GenerateStructArgs(struct_def, &func_header, "", "");
|
||||
code_ += func_header.substr(0, func_header.size() - 2) + "\\";
|
||||
code_ += ") -> UnsafeMutableRawPointer {";
|
||||
code_ += ") -> Offset<UOffset> {";
|
||||
Indent();
|
||||
code_ +=
|
||||
"let memory = UnsafeMutableRawPointer.allocate(byteCount: "
|
||||
"{{STRUCTNAME}}.size, alignment: {{STRUCTNAME}}.alignment)";
|
||||
code_ +=
|
||||
"memory.initializeMemory(as: UInt8.self, repeating: 0, count: "
|
||||
"{{STRUCTNAME}}.size)";
|
||||
"builder.createStructOf(size: {{STRUCTNAME}}.size, alignment: "
|
||||
"{{STRUCTNAME}}.alignment)";
|
||||
GenerateStructBody(struct_def, "");
|
||||
code_ += "return memory";
|
||||
code_ += "return builder.endStruct()";
|
||||
Outdent();
|
||||
code_ += "}\n";
|
||||
Outdent();
|
||||
@@ -233,9 +233,9 @@ class SwiftGenerator : public BaseGenerator {
|
||||
static_cast<int>(field.value.offset));
|
||||
} else {
|
||||
auto off = NumToString(offset + field.value.offset);
|
||||
code_ += "memory.storeBytes(of: " + name +
|
||||
code_ += "builder.reverseAdd(v: " + name +
|
||||
(field_type.enum_def ? ".rawValue" : "") +
|
||||
", toByteOffset: " + off + ", as: " + type + ".self)";
|
||||
", postion: " + off + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -392,9 +392,9 @@ class SwiftGenerator : public BaseGenerator {
|
||||
GenerateObjectAPIExtensionHeader();
|
||||
std::string code;
|
||||
GenerateStructArgs(struct_def, &code, "", "", "obj", true);
|
||||
code_ += "return builder.create(struct: create{{SHORT_STRUCTNAME}}(\\";
|
||||
code_ += "return create{{SHORT_STRUCTNAME}}(builder: &builder, \\";
|
||||
code_ += code.substr(0, code.size() - 2) + "\\";
|
||||
code_ += "), type: {{STRUCTNAME}}.self)";
|
||||
code_ += ")";
|
||||
Outdent();
|
||||
code_ += "}";
|
||||
}
|
||||
@@ -429,7 +429,8 @@ class SwiftGenerator : public BaseGenerator {
|
||||
if (field.required)
|
||||
require_fields.push_back(NumToString(field.value.offset));
|
||||
|
||||
GenTableWriterFields(field, &create_func_body, &create_func_header);
|
||||
GenTableWriterFields(field, &create_func_body, &create_func_header,
|
||||
should_generate_create);
|
||||
}
|
||||
code_ +=
|
||||
"{{ACCESS_TYPE}} static func end{{SHORT_STRUCTNAME}}(_ fbb: inout "
|
||||
@@ -497,7 +498,8 @@ class SwiftGenerator : public BaseGenerator {
|
||||
|
||||
void GenTableWriterFields(const FieldDef &field,
|
||||
std::vector<std::string> *create_body,
|
||||
std::vector<std::string> *create_header) {
|
||||
std::vector<std::string> *create_header,
|
||||
bool &contains_structs) {
|
||||
std::string builder_string = ", _ fbb: inout FlatBufferBuilder) { ";
|
||||
auto &create_func_body = *create_body;
|
||||
auto &create_func_header = *create_header;
|
||||
@@ -552,15 +554,12 @@ class SwiftGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
if (IsStruct(field.value.type)) {
|
||||
auto struct_type = "UnsafeMutableRawPointer?";
|
||||
contains_structs = false;
|
||||
auto struct_type = "Offset<UOffset>?";
|
||||
auto camel_case_name = "structOf" + MakeCamel(name, true);
|
||||
create_func_header.push_back(camel_case_name + " " + name + ": " +
|
||||
struct_type + " = nil");
|
||||
auto create_struct =
|
||||
"guard let {{VALUENAME}} = {{VALUENAME}} else { return }; "
|
||||
"fbb.create(struct: {{VALUENAME}}, type: {{VALUETYPE}}.self); ";
|
||||
auto reader_type =
|
||||
"fbb.add(structOffset: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
|
||||
auto create_struct = "guard {{VALUENAME}} != nil else { return }; ";
|
||||
code_ += struct_type + builder_string + create_struct + reader_type;
|
||||
return;
|
||||
}
|
||||
@@ -579,8 +578,27 @@ class SwiftGenerator : public BaseGenerator {
|
||||
auto reader_type =
|
||||
IsStruct(field.value.type) && field.value.type.struct_def->fixed
|
||||
? "structOffset: {{TABLEOFFSET}}.{{OFFSET}}.p) }"
|
||||
: "offset: {{VALUENAME}}, at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
|
||||
: "offset: {{VALUENAME}}, at: {{TABLEOFFSET}}.{{OFFSET}}.p) }";
|
||||
code_ += offset_type + builder_string + "fbb.add(" + reader_type;
|
||||
|
||||
auto vectortype = field.value.type.VectorType();
|
||||
|
||||
if ((vectortype.base_type == BASE_TYPE_STRUCT &&
|
||||
field.value.type.struct_def->fixed) &&
|
||||
(field.value.type.base_type == BASE_TYPE_VECTOR ||
|
||||
field.value.type.base_type == BASE_TYPE_ARRAY)) {
|
||||
auto field_name = NameWrappedInNameSpace(*vectortype.struct_def);
|
||||
code_ += "public static func startVectorOf" + MakeCamel(name, true) +
|
||||
"(_ size: Int, in builder: inout "
|
||||
"FlatBufferBuilder) {";
|
||||
Indent();
|
||||
code_ += "builder.startVectorOfStructs(count: size, size: " + field_name +
|
||||
".size, "
|
||||
"alignment: " +
|
||||
field_name + ".alignment)";
|
||||
Outdent();
|
||||
code_ += "}";
|
||||
}
|
||||
}
|
||||
|
||||
void GenTableReaderFields(const FieldDef &field) {
|
||||
@@ -929,16 +947,17 @@ class SwiftGenerator : public BaseGenerator {
|
||||
GenerateStructArgs(*field.value.type.struct_def, &code, "", "",
|
||||
"$0", true);
|
||||
code = code.substr(0, code.size() - 2);
|
||||
code_ += "let __" + name + " = obj." + name + ".map { " +
|
||||
NameWrappedInNameSpace(*field.value.type.struct_def) +
|
||||
".create" + Name(*field.value.type.struct_def) + "(" +
|
||||
code + ") }";
|
||||
unpack_body.push_back(
|
||||
"{{STRUCTNAME}}." + body + "obj." + name + ".map { " +
|
||||
NameWrappedInNameSpace(*field.value.type.struct_def) +
|
||||
".create" + Name(*field.value.type.struct_def) +
|
||||
"(builder: &builder, " + code + ") }" + builder);
|
||||
} else {
|
||||
code_ += "let __" + name + " = " + type +
|
||||
".pack(&builder, obj: &obj." + name + ")";
|
||||
unpack_body.push_back("{{STRUCTNAME}}." + body + "__" + name +
|
||||
builder);
|
||||
}
|
||||
unpack_body.push_back("{{STRUCTNAME}}." + body + "__" + name +
|
||||
builder);
|
||||
break;
|
||||
}
|
||||
case BASE_TYPE_STRING: {
|
||||
@@ -1002,7 +1021,8 @@ class SwiftGenerator : public BaseGenerator {
|
||||
code_ += "let __" + name + " = builder.createVector(ofOffsets: __" +
|
||||
name + "__)";
|
||||
} else {
|
||||
code_ += "var __" + name + "__: [UnsafeMutableRawPointer] = []";
|
||||
code_ += "{{STRUCTNAME}}.startVectorOf" + MakeCamel(name, true) +
|
||||
"(obj." + name + ".count, in: &builder)";
|
||||
std::string code;
|
||||
GenerateStructArgs(*field.value.type.struct_def, &code, "", "", "_o",
|
||||
true);
|
||||
@@ -1010,14 +1030,14 @@ class SwiftGenerator : public BaseGenerator {
|
||||
code_ += "for i in obj." + name + " {";
|
||||
Indent();
|
||||
code_ += "guard let _o = i else { continue }";
|
||||
code_ += "__" + name + "__.append(" +
|
||||
NameWrappedInNameSpace(*field.value.type.struct_def) +
|
||||
".create" + Name(*field.value.type.struct_def) + "(" + code +
|
||||
"))";
|
||||
code_ += NameWrappedInNameSpace(*field.value.type.struct_def) +
|
||||
".create" + Name(*field.value.type.struct_def) +
|
||||
"(builder: &builder, " + code + ")";
|
||||
Outdent();
|
||||
code_ += "}";
|
||||
code_ += "let __" + name + " = builder.createVector(structs: __" +
|
||||
name + "__, type: " + type + ".self)";
|
||||
code_ += "let __" + name +
|
||||
" = builder.endVectorOfStructs(count: obj." + name +
|
||||
".count)";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user