mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-10 07:06:26 +00:00
[Rust] Add the Allocator trait for the builder API (#8106)
* Add an Allocator trait for FlatBufferBuilder * Update rust generated code
This commit is contained in:
@@ -989,7 +989,8 @@ class RustGenerator : public BaseGenerator {
|
||||
code_ += " }";
|
||||
// Pack flatbuffers union value
|
||||
code_ +=
|
||||
" pub fn pack(&self, fbb: &mut flatbuffers::FlatBufferBuilder)"
|
||||
" pub fn pack<'b, A: flatbuffers::Allocator + 'b>(&self, fbb: &mut "
|
||||
"flatbuffers::FlatBufferBuilder<'b, A>)"
|
||||
" -> Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>"
|
||||
" {";
|
||||
code_ += " match self {";
|
||||
@@ -1717,8 +1718,11 @@ class RustGenerator : public BaseGenerator {
|
||||
code_.SetValue("MAYBE_LT",
|
||||
TableBuilderArgsNeedsLifetime(struct_def) ? "<'args>" : "");
|
||||
code_ += " #[allow(unused_mut)]";
|
||||
code_ += " pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(";
|
||||
code_ += " _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr>,";
|
||||
code_ +=
|
||||
" pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: "
|
||||
"flatbuffers::Allocator + 'bldr>(";
|
||||
code_ +=
|
||||
" _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,";
|
||||
code_ += " {{MAYBE_US}}args: &'args {{STRUCT_TY}}Args{{MAYBE_LT}}";
|
||||
code_ += " ) -> flatbuffers::WIPOffset<{{STRUCT_TY}}<'bldr>> {";
|
||||
|
||||
@@ -2117,15 +2121,20 @@ class RustGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
// Generate a builder struct:
|
||||
code_ += "{{ACCESS_TYPE}} struct {{STRUCT_TY}}Builder<'a: 'b, 'b> {";
|
||||
code_ += " fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a>,";
|
||||
code_ +=
|
||||
"{{ACCESS_TYPE}} struct {{STRUCT_TY}}Builder<'a: 'b, 'b, A: "
|
||||
"flatbuffers::Allocator + 'a> {";
|
||||
code_ += " fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,";
|
||||
code_ +=
|
||||
" start_: flatbuffers::WIPOffset<"
|
||||
"flatbuffers::TableUnfinishedWIPOffset>,";
|
||||
code_ += "}";
|
||||
|
||||
// Generate builder functions:
|
||||
code_ += "impl<'a: 'b, 'b> {{STRUCT_TY}}Builder<'a, 'b> {";
|
||||
code_ +=
|
||||
"impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> "
|
||||
"{{STRUCT_TY}}Builder<'a, "
|
||||
"'b, A> {";
|
||||
ForAllTableFields(struct_def, [&](const FieldDef &field) {
|
||||
const bool is_scalar = IsScalar(field.value.type.base_type);
|
||||
std::string offset = namer_.LegacyRustFieldOffsetName(field);
|
||||
@@ -2160,8 +2169,8 @@ class RustGenerator : public BaseGenerator {
|
||||
// Struct initializer (all fields required);
|
||||
code_ += " #[inline]";
|
||||
code_ +=
|
||||
" pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>) -> "
|
||||
"{{STRUCT_TY}}Builder<'a, 'b> {";
|
||||
" pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> "
|
||||
"{{STRUCT_TY}}Builder<'a, 'b, A> {";
|
||||
code_.SetValue("NUM_FIELDS", NumToString(struct_def.fields.vec.size()));
|
||||
code_ += " let start = _fbb.start_table();";
|
||||
code_ += " {{STRUCT_TY}}Builder {";
|
||||
@@ -2264,9 +2273,9 @@ class RustGenerator : public BaseGenerator {
|
||||
|
||||
// Generate pack function.
|
||||
code_ += "impl {{STRUCT_OTY}} {";
|
||||
code_ += " pub fn pack<'b>(";
|
||||
code_ += " pub fn pack<'b, A: flatbuffers::Allocator + 'b>(";
|
||||
code_ += " &self,";
|
||||
code_ += " _fbb: &mut flatbuffers::FlatBufferBuilder<'b>";
|
||||
code_ += " _fbb: &mut flatbuffers::FlatBufferBuilder<'b, A>";
|
||||
code_ += " ) -> flatbuffers::WIPOffset<{{STRUCT_TY}}<'b>> {";
|
||||
// First we generate variables for each field and then later assemble them
|
||||
// using "StructArgs" to more easily manage ownership of the builder.
|
||||
@@ -2551,8 +2560,10 @@ class RustGenerator : public BaseGenerator {
|
||||
|
||||
// Finish a buffer with a given root object:
|
||||
code_ += "#[inline]";
|
||||
code_ += "pub fn finish_{{STRUCT_FN}}_buffer<'a, 'b>(";
|
||||
code_ += " fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>,";
|
||||
code_ +=
|
||||
"pub fn finish_{{STRUCT_FN}}_buffer<'a, 'b, A: "
|
||||
"flatbuffers::Allocator + 'a>(";
|
||||
code_ += " fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,";
|
||||
code_ += " root: flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>) {";
|
||||
if (parser_.file_identifier_.length()) {
|
||||
code_ += " fbb.finish(root, Some({{STRUCT_CONST}}_IDENTIFIER));";
|
||||
@@ -2564,8 +2575,8 @@ class RustGenerator : public BaseGenerator {
|
||||
code_ += "#[inline]";
|
||||
code_ +=
|
||||
"pub fn finish_size_prefixed_{{STRUCT_FN}}_buffer"
|
||||
"<'a, 'b>("
|
||||
"fbb: &'b mut flatbuffers::FlatBufferBuilder<'a>, "
|
||||
"<'a, 'b, A: flatbuffers::Allocator + 'a>("
|
||||
"fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, "
|
||||
"root: flatbuffers::WIPOffset<{{STRUCT_TY}}<'a>>) {";
|
||||
if (parser_.file_identifier_.length()) {
|
||||
code_ +=
|
||||
|
||||
Reference in New Issue
Block a user