xref: /aosp_15_r20/external/flatbuffers/samples/sample_binary.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker /*
2*890232f2SAndroid Build Coastguard Worker  * Copyright 2015 Google Inc. 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 Worker #include "monster_generated.h"  // Already includes "flatbuffers/flatbuffers.h".
18*890232f2SAndroid Build Coastguard Worker 
19*890232f2SAndroid Build Coastguard Worker using namespace MyGame::Sample;
20*890232f2SAndroid Build Coastguard Worker 
21*890232f2SAndroid Build Coastguard Worker // Example how to use FlatBuffers to create and read binary buffers.
22*890232f2SAndroid Build Coastguard Worker 
main(int,const char * [])23*890232f2SAndroid Build Coastguard Worker int main(int /*argc*/, const char * /*argv*/[]) {
24*890232f2SAndroid Build Coastguard Worker   // Build up a serialized buffer algorithmically:
25*890232f2SAndroid Build Coastguard Worker   flatbuffers::FlatBufferBuilder builder;
26*890232f2SAndroid Build Coastguard Worker 
27*890232f2SAndroid Build Coastguard Worker   // First, lets serialize some weapons for the Monster: A 'sword' and an 'axe'.
28*890232f2SAndroid Build Coastguard Worker   auto weapon_one_name = builder.CreateString("Sword");
29*890232f2SAndroid Build Coastguard Worker   short weapon_one_damage = 3;
30*890232f2SAndroid Build Coastguard Worker 
31*890232f2SAndroid Build Coastguard Worker   auto weapon_two_name = builder.CreateString("Axe");
32*890232f2SAndroid Build Coastguard Worker   short weapon_two_damage = 5;
33*890232f2SAndroid Build Coastguard Worker 
34*890232f2SAndroid Build Coastguard Worker   // Use the `CreateWeapon` shortcut to create Weapons with all fields set.
35*890232f2SAndroid Build Coastguard Worker   auto sword = CreateWeapon(builder, weapon_one_name, weapon_one_damage);
36*890232f2SAndroid Build Coastguard Worker   auto axe = CreateWeapon(builder, weapon_two_name, weapon_two_damage);
37*890232f2SAndroid Build Coastguard Worker 
38*890232f2SAndroid Build Coastguard Worker   // Create a FlatBuffer's `vector` from the `std::vector`.
39*890232f2SAndroid Build Coastguard Worker   std::vector<flatbuffers::Offset<Weapon>> weapons_vector;
40*890232f2SAndroid Build Coastguard Worker   weapons_vector.push_back(sword);
41*890232f2SAndroid Build Coastguard Worker   weapons_vector.push_back(axe);
42*890232f2SAndroid Build Coastguard Worker   auto weapons = builder.CreateVector(weapons_vector);
43*890232f2SAndroid Build Coastguard Worker 
44*890232f2SAndroid Build Coastguard Worker   // Second, serialize the rest of the objects needed by the Monster.
45*890232f2SAndroid Build Coastguard Worker   auto position = Vec3(1.0f, 2.0f, 3.0f);
46*890232f2SAndroid Build Coastguard Worker 
47*890232f2SAndroid Build Coastguard Worker   auto name = builder.CreateString("MyMonster");
48*890232f2SAndroid Build Coastguard Worker 
49*890232f2SAndroid Build Coastguard Worker   unsigned char inv_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
50*890232f2SAndroid Build Coastguard Worker   auto inventory = builder.CreateVector(inv_data, 10);
51*890232f2SAndroid Build Coastguard Worker 
52*890232f2SAndroid Build Coastguard Worker   // Shortcut for creating monster with all fields set:
53*890232f2SAndroid Build Coastguard Worker   auto orc = CreateMonster(builder, &position, 150, 80, name, inventory,
54*890232f2SAndroid Build Coastguard Worker                            Color_Red, weapons, Equipment_Weapon, axe.Union());
55*890232f2SAndroid Build Coastguard Worker 
56*890232f2SAndroid Build Coastguard Worker   builder.Finish(orc);  // Serialize the root of the object.
57*890232f2SAndroid Build Coastguard Worker 
58*890232f2SAndroid Build Coastguard Worker   // We now have a FlatBuffer we can store on disk or send over a network.
59*890232f2SAndroid Build Coastguard Worker 
60*890232f2SAndroid Build Coastguard Worker   // ** file/network code goes here :) **
61*890232f2SAndroid Build Coastguard Worker   // access builder.GetBufferPointer() for builder.GetSize() bytes
62*890232f2SAndroid Build Coastguard Worker 
63*890232f2SAndroid Build Coastguard Worker   // Instead, we're going to access it right away (as if we just received it).
64*890232f2SAndroid Build Coastguard Worker 
65*890232f2SAndroid Build Coastguard Worker   // Get access to the root:
66*890232f2SAndroid Build Coastguard Worker   auto monster = GetMonster(builder.GetBufferPointer());
67*890232f2SAndroid Build Coastguard Worker 
68*890232f2SAndroid Build Coastguard Worker   // Get and test some scalar types from the FlatBuffer.
69*890232f2SAndroid Build Coastguard Worker   assert(monster->hp() == 80);
70*890232f2SAndroid Build Coastguard Worker   assert(monster->mana() == 150);  // default
71*890232f2SAndroid Build Coastguard Worker   assert(monster->name()->str() == "MyMonster");
72*890232f2SAndroid Build Coastguard Worker 
73*890232f2SAndroid Build Coastguard Worker   // Get and test a field of the FlatBuffer's `struct`.
74*890232f2SAndroid Build Coastguard Worker   auto pos = monster->pos();
75*890232f2SAndroid Build Coastguard Worker   assert(pos);
76*890232f2SAndroid Build Coastguard Worker   assert(pos->z() == 3.0f);
77*890232f2SAndroid Build Coastguard Worker   (void)pos;
78*890232f2SAndroid Build Coastguard Worker 
79*890232f2SAndroid Build Coastguard Worker   // Get a test an element from the `inventory` FlatBuffer's `vector`.
80*890232f2SAndroid Build Coastguard Worker   auto inv = monster->inventory();
81*890232f2SAndroid Build Coastguard Worker   assert(inv);
82*890232f2SAndroid Build Coastguard Worker   assert(inv->Get(9) == 9);
83*890232f2SAndroid Build Coastguard Worker   (void)inv;
84*890232f2SAndroid Build Coastguard Worker 
85*890232f2SAndroid Build Coastguard Worker   // Get and test the `weapons` FlatBuffers's `vector`.
86*890232f2SAndroid Build Coastguard Worker   std::string expected_weapon_names[] = { "Sword", "Axe" };
87*890232f2SAndroid Build Coastguard Worker   short expected_weapon_damages[] = { 3, 5 };
88*890232f2SAndroid Build Coastguard Worker   auto weps = monster->weapons();
89*890232f2SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < weps->size(); i++) {
90*890232f2SAndroid Build Coastguard Worker     assert(weps->Get(i)->name()->str() == expected_weapon_names[i]);
91*890232f2SAndroid Build Coastguard Worker     assert(weps->Get(i)->damage() == expected_weapon_damages[i]);
92*890232f2SAndroid Build Coastguard Worker   }
93*890232f2SAndroid Build Coastguard Worker   (void)expected_weapon_names;
94*890232f2SAndroid Build Coastguard Worker   (void)expected_weapon_damages;
95*890232f2SAndroid Build Coastguard Worker 
96*890232f2SAndroid Build Coastguard Worker   // Get and test the `Equipment` union (`equipped` field).
97*890232f2SAndroid Build Coastguard Worker   assert(monster->equipped_type() == Equipment_Weapon);
98*890232f2SAndroid Build Coastguard Worker   auto equipped = static_cast<const Weapon *>(monster->equipped());
99*890232f2SAndroid Build Coastguard Worker   assert(equipped->name()->str() == "Axe");
100*890232f2SAndroid Build Coastguard Worker   assert(equipped->damage() == 5);
101*890232f2SAndroid Build Coastguard Worker   (void)equipped;
102*890232f2SAndroid Build Coastguard Worker 
103*890232f2SAndroid Build Coastguard Worker   printf("The FlatBuffer was successfully created and verified!\n");
104*890232f2SAndroid Build Coastguard Worker }
105