xref: /aosp_15_r20/external/flatbuffers/dart/example/example.dart (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker/*
2*890232f2SAndroid Build Coastguard Worker * Copyright 2018 Dan Field. All rights reserved.
3*890232f2SAndroid Build Coastguard Worker *
4*890232f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*890232f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*890232f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*890232f2SAndroid Build Coastguard Worker *
8*890232f2SAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
9*890232f2SAndroid Build Coastguard Worker *
10*890232f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*890232f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*890232f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*890232f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*890232f2SAndroid Build Coastguard Worker * limitations under the License.
15*890232f2SAndroid Build Coastguard Worker */
16*890232f2SAndroid Build Coastguard Worker
17*890232f2SAndroid Build Coastguard Workerimport 'package:flat_buffers/flat_buffers.dart' as fb;
18*890232f2SAndroid Build Coastguard Workerimport './monster_my_game.sample_generated.dart' as my_game;
19*890232f2SAndroid Build Coastguard Worker
20*890232f2SAndroid Build Coastguard Worker// Example how to use FlatBuffers to create and read binary buffers.
21*890232f2SAndroid Build Coastguard Worker
22*890232f2SAndroid Build Coastguard Workervoid main() {
23*890232f2SAndroid Build Coastguard Worker  builderTest();
24*890232f2SAndroid Build Coastguard Worker  objectBuilderTest();
25*890232f2SAndroid Build Coastguard Worker}
26*890232f2SAndroid Build Coastguard Worker
27*890232f2SAndroid Build Coastguard Workervoid builderTest() {
28*890232f2SAndroid Build Coastguard Worker  final builder = fb.Builder(initialSize: 1024);
29*890232f2SAndroid Build Coastguard Worker  final int? weaponOneName = builder.writeString("Sword");
30*890232f2SAndroid Build Coastguard Worker  final int weaponOneDamage = 3;
31*890232f2SAndroid Build Coastguard Worker
32*890232f2SAndroid Build Coastguard Worker  final int? weaponTwoName = builder.writeString("Axe");
33*890232f2SAndroid Build Coastguard Worker  final int weaponTwoDamage = 5;
34*890232f2SAndroid Build Coastguard Worker
35*890232f2SAndroid Build Coastguard Worker  final swordBuilder = my_game.WeaponBuilder(builder)
36*890232f2SAndroid Build Coastguard Worker    ..begin()
37*890232f2SAndroid Build Coastguard Worker    ..addNameOffset(weaponOneName)
38*890232f2SAndroid Build Coastguard Worker    ..addDamage(weaponOneDamage);
39*890232f2SAndroid Build Coastguard Worker  final int sword = swordBuilder.finish();
40*890232f2SAndroid Build Coastguard Worker
41*890232f2SAndroid Build Coastguard Worker  final axeBuilder = my_game.WeaponBuilder(builder)
42*890232f2SAndroid Build Coastguard Worker    ..begin()
43*890232f2SAndroid Build Coastguard Worker    ..addNameOffset(weaponTwoName)
44*890232f2SAndroid Build Coastguard Worker    ..addDamage(weaponTwoDamage);
45*890232f2SAndroid Build Coastguard Worker  final int axe = axeBuilder.finish();
46*890232f2SAndroid Build Coastguard Worker
47*890232f2SAndroid Build Coastguard Worker  // Serialize a name for our monster, called "Orc".
48*890232f2SAndroid Build Coastguard Worker  final int? name = builder.writeString('Orc');
49*890232f2SAndroid Build Coastguard Worker
50*890232f2SAndroid Build Coastguard Worker  // Create a list representing the inventory of the Orc. Each number
51*890232f2SAndroid Build Coastguard Worker  // could correspond to an item that can be claimed after he is slain.
52*890232f2SAndroid Build Coastguard Worker  final List<int> treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
53*890232f2SAndroid Build Coastguard Worker  final inventory = builder.writeListUint8(treasure);
54*890232f2SAndroid Build Coastguard Worker  final weapons = builder.writeList([sword, axe]);
55*890232f2SAndroid Build Coastguard Worker
56*890232f2SAndroid Build Coastguard Worker  // Struct builders are very easy to reuse.
57*890232f2SAndroid Build Coastguard Worker  final vec3Builder = my_game.Vec3Builder(builder);
58*890232f2SAndroid Build Coastguard Worker
59*890232f2SAndroid Build Coastguard Worker  vec3Builder.finish(4.0, 5.0, 6.0);
60*890232f2SAndroid Build Coastguard Worker  vec3Builder.finish(1.0, 2.0, 3.0);
61*890232f2SAndroid Build Coastguard Worker  // Set his hit points to 300 and his mana to 150.
62*890232f2SAndroid Build Coastguard Worker  final int hp = 300;
63*890232f2SAndroid Build Coastguard Worker  final int mana = 150;
64*890232f2SAndroid Build Coastguard Worker
65*890232f2SAndroid Build Coastguard Worker  final monster = my_game.MonsterBuilder(builder)
66*890232f2SAndroid Build Coastguard Worker    ..begin()
67*890232f2SAndroid Build Coastguard Worker    ..addNameOffset(name)
68*890232f2SAndroid Build Coastguard Worker    ..addInventoryOffset(inventory)
69*890232f2SAndroid Build Coastguard Worker    ..addWeaponsOffset(weapons)
70*890232f2SAndroid Build Coastguard Worker    ..addEquippedType(my_game.EquipmentTypeId.Weapon)
71*890232f2SAndroid Build Coastguard Worker    ..addEquippedOffset(axe)
72*890232f2SAndroid Build Coastguard Worker    ..addHp(hp)
73*890232f2SAndroid Build Coastguard Worker    ..addMana(mana)
74*890232f2SAndroid Build Coastguard Worker    ..addPos(vec3Builder.finish(1.0, 2.0, 3.0))
75*890232f2SAndroid Build Coastguard Worker    ..addColor(my_game.Color.Red);
76*890232f2SAndroid Build Coastguard Worker
77*890232f2SAndroid Build Coastguard Worker  final int monsteroff = monster.finish();
78*890232f2SAndroid Build Coastguard Worker  builder.finish(monsteroff);
79*890232f2SAndroid Build Coastguard Worker  if (verify(builder.buffer)) {
80*890232f2SAndroid Build Coastguard Worker    print(
81*890232f2SAndroid Build Coastguard Worker        "The FlatBuffer was successfully created with a builder and verified!");
82*890232f2SAndroid Build Coastguard Worker  }
83*890232f2SAndroid Build Coastguard Worker}
84*890232f2SAndroid Build Coastguard Worker
85*890232f2SAndroid Build Coastguard Workervoid objectBuilderTest() {
86*890232f2SAndroid Build Coastguard Worker  // Create the builder here so we can use it for both weapons and equipped
87*890232f2SAndroid Build Coastguard Worker  // the actual data will only be written to the buffer once.
88*890232f2SAndroid Build Coastguard Worker  var axe = my_game.WeaponObjectBuilder(name: 'Axe', damage: 5);
89*890232f2SAndroid Build Coastguard Worker
90*890232f2SAndroid Build Coastguard Worker  var monsterBuilder = my_game.MonsterObjectBuilder(
91*890232f2SAndroid Build Coastguard Worker    pos: my_game.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0),
92*890232f2SAndroid Build Coastguard Worker    mana: 150,
93*890232f2SAndroid Build Coastguard Worker    hp: 300,
94*890232f2SAndroid Build Coastguard Worker    name: 'Orc',
95*890232f2SAndroid Build Coastguard Worker    inventory: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
96*890232f2SAndroid Build Coastguard Worker    color: my_game.Color.Red,
97*890232f2SAndroid Build Coastguard Worker    weapons: [my_game.WeaponObjectBuilder(name: 'Sword', damage: 3), axe],
98*890232f2SAndroid Build Coastguard Worker    equippedType: my_game.EquipmentTypeId.Weapon,
99*890232f2SAndroid Build Coastguard Worker    equipped: axe,
100*890232f2SAndroid Build Coastguard Worker  );
101*890232f2SAndroid Build Coastguard Worker
102*890232f2SAndroid Build Coastguard Worker  var buffer = monsterBuilder.toBytes();
103*890232f2SAndroid Build Coastguard Worker
104*890232f2SAndroid Build Coastguard Worker  // We now have a FlatBuffer we can store on disk or send over a network.
105*890232f2SAndroid Build Coastguard Worker
106*890232f2SAndroid Build Coastguard Worker  // ** file/network code goes here :) **
107*890232f2SAndroid Build Coastguard Worker
108*890232f2SAndroid Build Coastguard Worker  // Instead, we're going to access it right away (as if we just received it).
109*890232f2SAndroid Build Coastguard Worker  if (verify(buffer)) {
110*890232f2SAndroid Build Coastguard Worker    print(
111*890232f2SAndroid Build Coastguard Worker        "The FlatBuffer was successfully created with an object builder and verified!");
112*890232f2SAndroid Build Coastguard Worker  }
113*890232f2SAndroid Build Coastguard Worker}
114*890232f2SAndroid Build Coastguard Worker
115*890232f2SAndroid Build Coastguard Workerbool verify(List<int> buffer) {
116*890232f2SAndroid Build Coastguard Worker  // Get access to the root:
117*890232f2SAndroid Build Coastguard Worker  var monster = my_game.Monster(buffer);
118*890232f2SAndroid Build Coastguard Worker
119*890232f2SAndroid Build Coastguard Worker  // Get and test some scalar types from the FlatBuffer.
120*890232f2SAndroid Build Coastguard Worker  assert(monster.hp == 80);
121*890232f2SAndroid Build Coastguard Worker  assert(monster.mana == 150); // default
122*890232f2SAndroid Build Coastguard Worker  assert(monster.name == "MyMonster");
123*890232f2SAndroid Build Coastguard Worker
124*890232f2SAndroid Build Coastguard Worker  // Get and test a field of the FlatBuffer's `struct`.
125*890232f2SAndroid Build Coastguard Worker  var pos = monster.pos!;
126*890232f2SAndroid Build Coastguard Worker  assert(pos.z == 3.0);
127*890232f2SAndroid Build Coastguard Worker
128*890232f2SAndroid Build Coastguard Worker  // Get a test an element from the `inventory` FlatBuffer's `vector`.
129*890232f2SAndroid Build Coastguard Worker  var inv = monster.inventory!;
130*890232f2SAndroid Build Coastguard Worker  assert(inv.length == 10);
131*890232f2SAndroid Build Coastguard Worker  assert(inv[9] == 9);
132*890232f2SAndroid Build Coastguard Worker
133*890232f2SAndroid Build Coastguard Worker  // Get and test the `weapons` FlatBuffers's `vector`.
134*890232f2SAndroid Build Coastguard Worker  var expectedWeaponNames = ["Sword", "Axe"];
135*890232f2SAndroid Build Coastguard Worker  var expectedWeaponDamages = [3, 5];
136*890232f2SAndroid Build Coastguard Worker  var weps = monster.weapons!;
137*890232f2SAndroid Build Coastguard Worker  for (int i = 0; i < weps.length; i++) {
138*890232f2SAndroid Build Coastguard Worker    assert(weps[i].name == expectedWeaponNames[i]);
139*890232f2SAndroid Build Coastguard Worker    assert(weps[i].damage == expectedWeaponDamages[i]);
140*890232f2SAndroid Build Coastguard Worker  }
141*890232f2SAndroid Build Coastguard Worker
142*890232f2SAndroid Build Coastguard Worker  // Get and test the `Equipment` union (`equipped` field).
143*890232f2SAndroid Build Coastguard Worker  assert(monster.equippedType!.value == my_game.EquipmentTypeId.Weapon.value);
144*890232f2SAndroid Build Coastguard Worker  assert(monster.equippedType == my_game.EquipmentTypeId.Weapon);
145*890232f2SAndroid Build Coastguard Worker
146*890232f2SAndroid Build Coastguard Worker  assert(monster.equipped is my_game.Weapon);
147*890232f2SAndroid Build Coastguard Worker  var equipped = monster.equipped as my_game.Weapon;
148*890232f2SAndroid Build Coastguard Worker  assert(equipped.name == "Axe");
149*890232f2SAndroid Build Coastguard Worker  assert(equipped.damage == 5);
150*890232f2SAndroid Build Coastguard Worker
151*890232f2SAndroid Build Coastguard Worker  print(monster);
152*890232f2SAndroid Build Coastguard Worker  return true;
153*890232f2SAndroid Build Coastguard Worker}
154