dart - add Packable interface (#6846)

This commit is contained in:
Ivan Dlugos
2021-09-28 22:23:30 +02:00
committed by GitHub
parent 2ece9e25b4
commit b9d43a557c
14 changed files with 66 additions and 30 deletions

View File

@@ -187,7 +187,7 @@ class Monster {
int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150); int get mana => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 6, 150);
int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100); int get hp => const fb.Int16Reader().vTableGet(_bc, _bcOffset, 8, 100);
String? get name => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10); String? get name => const fb.StringReader().vTableGetNullable(_bc, _bcOffset, 10);
List<int>? get inventory => const fb.ListReader<int>(fb.Uint8Reader()).vTableGetNullable(_bc, _bcOffset, 14); List<int>? get inventory => const fb.Uint8ListReader().vTableGetNullable(_bc, _bcOffset, 14);
Color get color => Color.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 16, 2)); Color get color => Color.fromValue(const fb.Int8Reader().vTableGet(_bc, _bcOffset, 16, 2));
List<Weapon>? get weapons => const fb.ListReader<Weapon>(Weapon.reader).vTableGetNullable(_bc, _bcOffset, 18); List<Weapon>? get weapons => const fb.ListReader<Weapon>(Weapon.reader).vTableGetNullable(_bc, _bcOffset, 18);
EquipmentTypeId? get equippedType => EquipmentTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 20)); EquipmentTypeId? get equippedType => EquipmentTypeId._createOrNull(const fb.Uint8Reader().vTableGetNullable(_bc, _bcOffset, 20));

View File

@@ -77,6 +77,12 @@ class BufferContext {
int _getUint8(int offset) => _buffer.getUint8(offset); int _getUint8(int offset) => _buffer.getUint8(offset);
} }
/// Interface implemented by the "object-api" classes (ending with "T").
abstract class Packable {
/// Serialize the object using the given builder, returning the offset.
int pack(Builder fbBuilder);
}
/// Class implemented by typed builders generated by flatc. /// Class implemented by typed builders generated by flatc.
abstract class ObjectBuilder { abstract class ObjectBuilder {
int? _firstOffset; int? _firstOffset;

View File

@@ -751,6 +751,7 @@ class BuilderTest {
class ObjectAPITest { class ObjectAPITest {
void test_tableStat() { void test_tableStat() {
final object1 = example.StatT(count: 3, id: "foo", val: 4); final object1 = example.StatT(count: 3, id: "foo", val: 4);
expect(object1 is Packable, isTrue);
final fbb = Builder(); final fbb = Builder();
fbb.finish(object1.pack(fbb)); fbb.finish(object1.pack(fbb));
final object2 = example.Stat(fbb.buffer).unpack(); final object2 = example.Stat(fbb.buffer).unpack();

View File

@@ -35,7 +35,8 @@ class Monster {
} }
} }
class MonsterT { class MonsterT implements fb.Packable {
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(0); fbBuilder.startTable(0);
return fbBuilder.endTable(); return fbBuilder.endTable();

View File

@@ -277,7 +277,7 @@ class Test {
} }
} }
class TestT { class TestT implements fb.Packable {
int a; int a;
int b; int b;
@@ -285,6 +285,7 @@ class TestT {
required this.a, required this.a,
required this.b}); required this.b});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.pad(1); fbBuilder.pad(1);
fbBuilder.putInt8(b); fbBuilder.putInt8(b);
@@ -379,12 +380,13 @@ class TestSimpleTableWithEnum {
} }
} }
class TestSimpleTableWithEnumT { class TestSimpleTableWithEnumT implements fb.Packable {
Color color; Color color;
TestSimpleTableWithEnumT({ TestSimpleTableWithEnumT({
this.color = Color.Green}); this.color = Color.Green});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(1); fbBuilder.startTable(1);
fbBuilder.addUint8(0, color.value); fbBuilder.addUint8(0, color.value);
@@ -482,7 +484,7 @@ class Vec3 {
} }
} }
class Vec3T { class Vec3T implements fb.Packable {
double x; double x;
double y; double y;
double z; double z;
@@ -498,6 +500,7 @@ class Vec3T {
required this.test2, required this.test2,
required this.test3}); required this.test3});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.pad(2); fbBuilder.pad(2);
test3.pack(fbBuilder); test3.pack(fbBuilder);
@@ -620,7 +623,7 @@ class Ability {
} }
} }
class AbilityT { class AbilityT implements fb.Packable {
int id; int id;
int distance; int distance;
@@ -628,6 +631,7 @@ class AbilityT {
required this.id, required this.id,
required this.distance}); required this.distance});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.putUint32(distance); fbBuilder.putUint32(distance);
fbBuilder.putUint32(id); fbBuilder.putUint32(id);
@@ -719,7 +723,7 @@ class StructOfStructs {
} }
} }
class StructOfStructsT { class StructOfStructsT implements fb.Packable {
AbilityT a; AbilityT a;
TestT b; TestT b;
AbilityT c; AbilityT c;
@@ -729,6 +733,7 @@ class StructOfStructsT {
required this.b, required this.b,
required this.c}); required this.c});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
c.pack(fbBuilder); c.pack(fbBuilder);
b.pack(fbBuilder); b.pack(fbBuilder);
@@ -830,7 +835,7 @@ class Stat {
} }
} }
class StatT { class StatT implements fb.Packable {
String? id; String? id;
int val; int val;
int count; int count;
@@ -840,6 +845,7 @@ class StatT {
this.val = 0, this.val = 0,
this.count = 0}); this.count = 0});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? idOffset = id == null ? null final int? idOffset = id == null ? null
: fbBuilder.writeString(id!); : fbBuilder.writeString(id!);
@@ -953,12 +959,13 @@ class Referrable {
} }
} }
class ReferrableT { class ReferrableT implements fb.Packable {
int id; int id;
ReferrableT({ ReferrableT({
this.id = 0}); this.id = 0});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(1); fbBuilder.startTable(1);
fbBuilder.addUint64(0, id); fbBuilder.addUint64(0, id);
@@ -1173,7 +1180,7 @@ class Monster {
} }
/// an example documentation comment: "monster object" /// an example documentation comment: "monster object"
class MonsterT { class MonsterT implements fb.Packable {
Vec3T? pos; Vec3T? pos;
int mana; int mana;
int hp; int hp;
@@ -1279,6 +1286,7 @@ class MonsterT {
this.testrequirednestedflatbuffer, this.testrequirednestedflatbuffer,
this.scalarKeySortedTables}); this.scalarKeySortedTables});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? nameOffset = name == null ? null final int? nameOffset = name == null ? null
: fbBuilder.writeString(name!); : fbBuilder.writeString(name!);
@@ -1942,7 +1950,7 @@ class TypeAliases {
} }
} }
class TypeAliasesT { class TypeAliasesT implements fb.Packable {
int i8; int i8;
int u8; int u8;
int i16; int i16;
@@ -1970,6 +1978,7 @@ class TypeAliasesT {
this.v8, this.v8,
this.vf64}); this.vf64});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? v8Offset = v8 == null ? null final int? v8Offset = v8 == null ? null
: fbBuilder.writeListInt8(v8!); : fbBuilder.writeListInt8(v8!);

View File

@@ -35,7 +35,8 @@ class InParentNamespace {
} }
} }
class InParentNamespaceT { class InParentNamespaceT implements fb.Packable {
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(0); fbBuilder.startTable(0);
return fbBuilder.endTable(); return fbBuilder.endTable();

View File

@@ -513,7 +513,7 @@ class DartGenerator : public BaseGenerator {
GenDocComment(struct_def.doc_comment, &code, ""); GenDocComment(struct_def.doc_comment, &code, "");
std::string class_name = struct_def.name + "T"; std::string class_name = struct_def.name + "T";
code += "class " + class_name + " {\n"; code += "class " + class_name + " implements " + _kFb + ".Packable {\n";
std::string constructor_args; std::string constructor_args;
for (auto it = non_deprecated_fields.begin(); for (auto it = non_deprecated_fields.begin();
@@ -615,6 +615,7 @@ class DartGenerator : public BaseGenerator {
const std::vector<std::pair<int, FieldDef *>> &non_deprecated_fields) { const std::vector<std::pair<int, FieldDef *>> &non_deprecated_fields) {
std::string code; std::string code;
code += " @override\n";
code += " int pack(fb.Builder fbBuilder) {\n"; code += " int pack(fb.Builder fbBuilder) {\n";
code += GenObjectBuilderImplementation(struct_def, non_deprecated_fields, code += GenObjectBuilderImplementation(struct_def, non_deprecated_fields,
false, true); false, true);

View File

@@ -53,7 +53,7 @@ class MonsterExtra {
} }
} }
class MonsterExtraT { class MonsterExtraT implements fb.Packable {
double d0; double d0;
double d1; double d1;
double d2; double d2;
@@ -77,6 +77,7 @@ class MonsterExtraT {
this.dvec, this.dvec,
this.fvec}); this.fvec});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? dvecOffset = dvec == null ? null final int? dvecOffset = dvec == null ? null
: fbBuilder.writeListFloat64(dvec!); : fbBuilder.writeListFloat64(dvec!);

View File

@@ -35,7 +35,8 @@ class Monster {
} }
} }
class MonsterT { class MonsterT implements fb.Packable {
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(0); fbBuilder.startTable(0);
return fbBuilder.endTable(); return fbBuilder.endTable();

View File

@@ -277,7 +277,7 @@ class Test {
} }
} }
class TestT { class TestT implements fb.Packable {
int a; int a;
int b; int b;
@@ -285,6 +285,7 @@ class TestT {
required this.a, required this.a,
required this.b}); required this.b});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.pad(1); fbBuilder.pad(1);
fbBuilder.putInt8(b); fbBuilder.putInt8(b);
@@ -379,12 +380,13 @@ class TestSimpleTableWithEnum {
} }
} }
class TestSimpleTableWithEnumT { class TestSimpleTableWithEnumT implements fb.Packable {
Color color; Color color;
TestSimpleTableWithEnumT({ TestSimpleTableWithEnumT({
this.color = Color.Green}); this.color = Color.Green});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(1); fbBuilder.startTable(1);
fbBuilder.addUint8(0, color.value); fbBuilder.addUint8(0, color.value);
@@ -482,7 +484,7 @@ class Vec3 {
} }
} }
class Vec3T { class Vec3T implements fb.Packable {
double x; double x;
double y; double y;
double z; double z;
@@ -498,6 +500,7 @@ class Vec3T {
required this.test2, required this.test2,
required this.test3}); required this.test3});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.pad(2); fbBuilder.pad(2);
test3.pack(fbBuilder); test3.pack(fbBuilder);
@@ -620,7 +623,7 @@ class Ability {
} }
} }
class AbilityT { class AbilityT implements fb.Packable {
int id; int id;
int distance; int distance;
@@ -628,6 +631,7 @@ class AbilityT {
required this.id, required this.id,
required this.distance}); required this.distance});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.putUint32(distance); fbBuilder.putUint32(distance);
fbBuilder.putUint32(id); fbBuilder.putUint32(id);
@@ -719,7 +723,7 @@ class StructOfStructs {
} }
} }
class StructOfStructsT { class StructOfStructsT implements fb.Packable {
AbilityT a; AbilityT a;
TestT b; TestT b;
AbilityT c; AbilityT c;
@@ -729,6 +733,7 @@ class StructOfStructsT {
required this.b, required this.b,
required this.c}); required this.c});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
c.pack(fbBuilder); c.pack(fbBuilder);
b.pack(fbBuilder); b.pack(fbBuilder);
@@ -830,7 +835,7 @@ class Stat {
} }
} }
class StatT { class StatT implements fb.Packable {
String? id; String? id;
int val; int val;
int count; int count;
@@ -840,6 +845,7 @@ class StatT {
this.val = 0, this.val = 0,
this.count = 0}); this.count = 0});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? idOffset = id == null ? null final int? idOffset = id == null ? null
: fbBuilder.writeString(id!); : fbBuilder.writeString(id!);
@@ -953,12 +959,13 @@ class Referrable {
} }
} }
class ReferrableT { class ReferrableT implements fb.Packable {
int id; int id;
ReferrableT({ ReferrableT({
this.id = 0}); this.id = 0});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(1); fbBuilder.startTable(1);
fbBuilder.addUint64(0, id); fbBuilder.addUint64(0, id);
@@ -1173,7 +1180,7 @@ class Monster {
} }
/// an example documentation comment: "monster object" /// an example documentation comment: "monster object"
class MonsterT { class MonsterT implements fb.Packable {
Vec3T? pos; Vec3T? pos;
int mana; int mana;
int hp; int hp;
@@ -1279,6 +1286,7 @@ class MonsterT {
this.testrequirednestedflatbuffer, this.testrequirednestedflatbuffer,
this.scalarKeySortedTables}); this.scalarKeySortedTables});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? nameOffset = name == null ? null final int? nameOffset = name == null ? null
: fbBuilder.writeString(name!); : fbBuilder.writeString(name!);
@@ -1942,7 +1950,7 @@ class TypeAliases {
} }
} }
class TypeAliasesT { class TypeAliasesT implements fb.Packable {
int i8; int i8;
int u8; int u8;
int i16; int i16;
@@ -1970,6 +1978,7 @@ class TypeAliasesT {
this.v8, this.v8,
this.vf64}); this.vf64});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? v8Offset = v8 == null ? null final int? v8Offset = v8 == null ? null
: fbBuilder.writeListInt8(v8!); : fbBuilder.writeListInt8(v8!);

View File

@@ -35,7 +35,8 @@ class InParentNamespace {
} }
} }
class InParentNamespaceT { class InParentNamespaceT implements fb.Packable {
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(0); fbBuilder.startTable(0);
return fbBuilder.endTable(); return fbBuilder.endTable();

View File

@@ -125,12 +125,13 @@ class TableInNestedNS {
} }
} }
class TableInNestedNST { class TableInNestedNST implements fb.Packable {
int foo; int foo;
TableInNestedNST({ TableInNestedNST({
this.foo = 0}); this.foo = 0});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.startTable(1); fbBuilder.startTable(1);
fbBuilder.addInt32(0, foo); fbBuilder.addInt32(0, foo);
@@ -220,7 +221,7 @@ class StructInNestedNS {
} }
} }
class StructInNestedNST { class StructInNestedNST implements fb.Packable {
int a; int a;
int b; int b;
@@ -228,6 +229,7 @@ class StructInNestedNST {
required this.a, required this.a,
required this.b}); required this.b});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
fbBuilder.putInt32(b); fbBuilder.putInt32(b);
fbBuilder.putInt32(a); fbBuilder.putInt32(a);

View File

@@ -49,7 +49,7 @@ class TableInFirstNS {
} }
} }
class TableInFirstNST { class TableInFirstNST implements fb.Packable {
namespace_a_namespace_b.TableInNestedNST? fooTable; namespace_a_namespace_b.TableInNestedNST? fooTable;
EnumInNestedNS fooEnum; EnumInNestedNS fooEnum;
UnionInNestedNSTypeId? fooUnionType; UnionInNestedNSTypeId? fooUnionType;
@@ -63,6 +63,7 @@ class TableInFirstNST {
this.fooUnion, this.fooUnion,
this.fooStruct}); this.fooStruct});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? fooTableOffset = fooTable?.pack(fbBuilder); final int? fooTableOffset = fooTable?.pack(fbBuilder);
final int? fooUnionOffset = fooUnion?.pack(fbBuilder); final int? fooUnionOffset = fooUnion?.pack(fbBuilder);
@@ -198,12 +199,13 @@ class SecondTableInA {
} }
} }
class SecondTableInAT { class SecondTableInAT implements fb.Packable {
namespace_c.TableInCT? referToC; namespace_c.TableInCT? referToC;
SecondTableInAT({ SecondTableInAT({
this.referToC}); this.referToC});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? referToCOffset = referToC?.pack(fbBuilder); final int? referToCOffset = referToC?.pack(fbBuilder);
fbBuilder.startTable(1); fbBuilder.startTable(1);

View File

@@ -38,7 +38,7 @@ class TableInC {
} }
} }
class TableInCT { class TableInCT implements fb.Packable {
namespace_a.TableInFirstNST? referToA1; namespace_a.TableInFirstNST? referToA1;
namespace_a.SecondTableInAT? referToA2; namespace_a.SecondTableInAT? referToA2;
@@ -46,6 +46,7 @@ class TableInCT {
this.referToA1, this.referToA1,
this.referToA2}); this.referToA2});
@override
int pack(fb.Builder fbBuilder) { int pack(fb.Builder fbBuilder) {
final int? referToA1Offset = referToA1?.pack(fbBuilder); final int? referToA1Offset = referToA1?.pack(fbBuilder);
final int? referToA2Offset = referToA2?.pack(fbBuilder); final int? referToA2Offset = referToA2?.pack(fbBuilder);