xref: /aosp_15_r20/external/libtextclassifier/native/utils/flatbuffers/reflection.h (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker  *
4*993b0882SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker  *
8*993b0882SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker  *
10*993b0882SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker  * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker  */
16*993b0882SAndroid Build Coastguard Worker 
17*993b0882SAndroid Build Coastguard Worker // Utility functions for working with FlatBuffers.
18*993b0882SAndroid Build Coastguard Worker 
19*993b0882SAndroid Build Coastguard Worker #ifndef LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_REFLECTION_H_
20*993b0882SAndroid Build Coastguard Worker #define LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_REFLECTION_H_
21*993b0882SAndroid Build Coastguard Worker 
22*993b0882SAndroid Build Coastguard Worker #include "utils/flatbuffers/flatbuffers_generated.h"
23*993b0882SAndroid Build Coastguard Worker #include "utils/optional.h"
24*993b0882SAndroid Build Coastguard Worker #include "utils/strings/stringpiece.h"
25*993b0882SAndroid Build Coastguard Worker #include "utils/variant.h"
26*993b0882SAndroid Build Coastguard Worker #include "flatbuffers/reflection.h"
27*993b0882SAndroid Build Coastguard Worker #include "flatbuffers/reflection_generated.h"
28*993b0882SAndroid Build Coastguard Worker 
29*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
30*993b0882SAndroid Build Coastguard Worker 
31*993b0882SAndroid Build Coastguard Worker template <typename T>
32*993b0882SAndroid Build Coastguard Worker struct flatbuffers_base_type {
33*993b0882SAndroid Build Coastguard Worker   static const reflection::BaseType value;
34*993b0882SAndroid Build Coastguard Worker };
35*993b0882SAndroid Build Coastguard Worker 
36*993b0882SAndroid Build Coastguard Worker template <typename T>
37*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<T>::value =
38*993b0882SAndroid Build Coastguard Worker     reflection::None;
39*993b0882SAndroid Build Coastguard Worker 
40*993b0882SAndroid Build Coastguard Worker template <>
41*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<bool>::value =
42*993b0882SAndroid Build Coastguard Worker     reflection::Bool;
43*993b0882SAndroid Build Coastguard Worker 
44*993b0882SAndroid Build Coastguard Worker template <>
45*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<int8>::value =
46*993b0882SAndroid Build Coastguard Worker     reflection::Byte;
47*993b0882SAndroid Build Coastguard Worker 
48*993b0882SAndroid Build Coastguard Worker template <>
49*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<uint8>::value =
50*993b0882SAndroid Build Coastguard Worker     reflection::UByte;
51*993b0882SAndroid Build Coastguard Worker 
52*993b0882SAndroid Build Coastguard Worker template <>
53*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<int16>::value =
54*993b0882SAndroid Build Coastguard Worker     reflection::Short;
55*993b0882SAndroid Build Coastguard Worker 
56*993b0882SAndroid Build Coastguard Worker template <>
57*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<uint16>::value =
58*993b0882SAndroid Build Coastguard Worker     reflection::UShort;
59*993b0882SAndroid Build Coastguard Worker 
60*993b0882SAndroid Build Coastguard Worker template <>
61*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<int32>::value =
62*993b0882SAndroid Build Coastguard Worker     reflection::Int;
63*993b0882SAndroid Build Coastguard Worker 
64*993b0882SAndroid Build Coastguard Worker template <>
65*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<uint32>::value =
66*993b0882SAndroid Build Coastguard Worker     reflection::UInt;
67*993b0882SAndroid Build Coastguard Worker 
68*993b0882SAndroid Build Coastguard Worker template <>
69*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<int64>::value =
70*993b0882SAndroid Build Coastguard Worker     reflection::Long;
71*993b0882SAndroid Build Coastguard Worker 
72*993b0882SAndroid Build Coastguard Worker template <>
73*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<uint64>::value =
74*993b0882SAndroid Build Coastguard Worker     reflection::ULong;
75*993b0882SAndroid Build Coastguard Worker 
76*993b0882SAndroid Build Coastguard Worker template <>
77*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<float>::value =
78*993b0882SAndroid Build Coastguard Worker     reflection::Float;
79*993b0882SAndroid Build Coastguard Worker 
80*993b0882SAndroid Build Coastguard Worker template <>
81*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<double>::value =
82*993b0882SAndroid Build Coastguard Worker     reflection::Double;
83*993b0882SAndroid Build Coastguard Worker 
84*993b0882SAndroid Build Coastguard Worker template <>
85*993b0882SAndroid Build Coastguard Worker inline const reflection::BaseType flatbuffers_base_type<StringPiece>::value =
86*993b0882SAndroid Build Coastguard Worker     reflection::String;
87*993b0882SAndroid Build Coastguard Worker 
88*993b0882SAndroid Build Coastguard Worker template <reflection::BaseType>
89*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type;
90*993b0882SAndroid Build Coastguard Worker 
91*993b0882SAndroid Build Coastguard Worker template <>
92*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Bool> {
93*993b0882SAndroid Build Coastguard Worker   using value = bool;
94*993b0882SAndroid Build Coastguard Worker };
95*993b0882SAndroid Build Coastguard Worker 
96*993b0882SAndroid Build Coastguard Worker template <>
97*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Byte> {
98*993b0882SAndroid Build Coastguard Worker   using value = int8;
99*993b0882SAndroid Build Coastguard Worker };
100*993b0882SAndroid Build Coastguard Worker 
101*993b0882SAndroid Build Coastguard Worker template <>
102*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::UByte> {
103*993b0882SAndroid Build Coastguard Worker   using value = uint8;
104*993b0882SAndroid Build Coastguard Worker };
105*993b0882SAndroid Build Coastguard Worker 
106*993b0882SAndroid Build Coastguard Worker template <>
107*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Short> {
108*993b0882SAndroid Build Coastguard Worker   using value = int16;
109*993b0882SAndroid Build Coastguard Worker };
110*993b0882SAndroid Build Coastguard Worker 
111*993b0882SAndroid Build Coastguard Worker template <>
112*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::UShort> {
113*993b0882SAndroid Build Coastguard Worker   using value = uint16;
114*993b0882SAndroid Build Coastguard Worker };
115*993b0882SAndroid Build Coastguard Worker 
116*993b0882SAndroid Build Coastguard Worker template <>
117*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Int> {
118*993b0882SAndroid Build Coastguard Worker   using value = int32;
119*993b0882SAndroid Build Coastguard Worker };
120*993b0882SAndroid Build Coastguard Worker 
121*993b0882SAndroid Build Coastguard Worker template <>
122*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::UInt> {
123*993b0882SAndroid Build Coastguard Worker   using value = uint32;
124*993b0882SAndroid Build Coastguard Worker };
125*993b0882SAndroid Build Coastguard Worker 
126*993b0882SAndroid Build Coastguard Worker template <>
127*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Long> {
128*993b0882SAndroid Build Coastguard Worker   using value = int64;
129*993b0882SAndroid Build Coastguard Worker };
130*993b0882SAndroid Build Coastguard Worker 
131*993b0882SAndroid Build Coastguard Worker template <>
132*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::ULong> {
133*993b0882SAndroid Build Coastguard Worker   using value = uint64;
134*993b0882SAndroid Build Coastguard Worker };
135*993b0882SAndroid Build Coastguard Worker 
136*993b0882SAndroid Build Coastguard Worker template <>
137*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Float> {
138*993b0882SAndroid Build Coastguard Worker   using value = float;
139*993b0882SAndroid Build Coastguard Worker };
140*993b0882SAndroid Build Coastguard Worker 
141*993b0882SAndroid Build Coastguard Worker template <>
142*993b0882SAndroid Build Coastguard Worker struct flatbuffers_cpp_type<reflection::BaseType::Double> {
143*993b0882SAndroid Build Coastguard Worker   using value = double;
144*993b0882SAndroid Build Coastguard Worker };
145*993b0882SAndroid Build Coastguard Worker 
146*993b0882SAndroid Build Coastguard Worker // Gets the field information for a field name, returns nullptr if the
147*993b0882SAndroid Build Coastguard Worker // field was not defined.
148*993b0882SAndroid Build Coastguard Worker const reflection::Field* GetFieldOrNull(const reflection::Object* type,
149*993b0882SAndroid Build Coastguard Worker                                         const StringPiece field_name);
150*993b0882SAndroid Build Coastguard Worker 
151*993b0882SAndroid Build Coastguard Worker // Gets the field information for a field offet, returns nullptr if no field was
152*993b0882SAndroid Build Coastguard Worker // defined with the given offset.
153*993b0882SAndroid Build Coastguard Worker const reflection::Field* GetFieldOrNull(const reflection::Object* type,
154*993b0882SAndroid Build Coastguard Worker                                         const int field_offset);
155*993b0882SAndroid Build Coastguard Worker 
156*993b0882SAndroid Build Coastguard Worker // Gets a field by name or offset, returns nullptr if no field was found.
157*993b0882SAndroid Build Coastguard Worker const reflection::Field* GetFieldOrNull(const reflection::Object* type,
158*993b0882SAndroid Build Coastguard Worker                                         const StringPiece field_name,
159*993b0882SAndroid Build Coastguard Worker                                         const int field_offset);
160*993b0882SAndroid Build Coastguard Worker 
161*993b0882SAndroid Build Coastguard Worker // Gets a field by a field spec, either by name or offset. Returns nullptr if no
162*993b0882SAndroid Build Coastguard Worker // such field was found.
163*993b0882SAndroid Build Coastguard Worker const reflection::Field* GetFieldOrNull(const reflection::Object* type,
164*993b0882SAndroid Build Coastguard Worker                                         const FlatbufferField* field);
165*993b0882SAndroid Build Coastguard Worker 
166*993b0882SAndroid Build Coastguard Worker const reflection::Field* GetFieldOrNull(const reflection::Object* type,
167*993b0882SAndroid Build Coastguard Worker                                         const FlatbufferFieldT* field);
168*993b0882SAndroid Build Coastguard Worker 
169*993b0882SAndroid Build Coastguard Worker // Gets the type information for the given type name or nullptr if not
170*993b0882SAndroid Build Coastguard Worker // specified.
171*993b0882SAndroid Build Coastguard Worker const reflection::Object* TypeForName(const reflection::Schema* schema,
172*993b0882SAndroid Build Coastguard Worker                                       const StringPiece type_name);
173*993b0882SAndroid Build Coastguard Worker 
174*993b0882SAndroid Build Coastguard Worker // Gets the type id for a type name.
175*993b0882SAndroid Build Coastguard Worker Optional<int> TypeIdForName(const reflection::Schema* schema,
176*993b0882SAndroid Build Coastguard Worker                             const StringPiece type_name);
177*993b0882SAndroid Build Coastguard Worker 
178*993b0882SAndroid Build Coastguard Worker // Gets the type id for a type.
179*993b0882SAndroid Build Coastguard Worker Optional<int> TypeIdForObject(const reflection::Schema* schema,
180*993b0882SAndroid Build Coastguard Worker                               const reflection::Object* type);
181*993b0882SAndroid Build Coastguard Worker 
182*993b0882SAndroid Build Coastguard Worker // Resolves field lookups by name to the concrete field offsets.
183*993b0882SAndroid Build Coastguard Worker bool SwapFieldNamesForOffsetsInPath(const reflection::Schema* schema,
184*993b0882SAndroid Build Coastguard Worker                                     FlatbufferFieldPathT* path);
185*993b0882SAndroid Build Coastguard Worker 
186*993b0882SAndroid Build Coastguard Worker // Checks whether a type denotes an enum.
187*993b0882SAndroid Build Coastguard Worker inline bool IsEnum(const reflection::Type* type) {
188*993b0882SAndroid Build Coastguard Worker   return flatbuffers::IsInteger(type->base_type()) && type->index() >= 0;
189*993b0882SAndroid Build Coastguard Worker }
190*993b0882SAndroid Build Coastguard Worker 
191*993b0882SAndroid Build Coastguard Worker // Parses an enum value.
192*993b0882SAndroid Build Coastguard Worker Variant ParseEnumValue(const reflection::Schema* schema,
193*993b0882SAndroid Build Coastguard Worker                        const reflection::Type* type, StringPiece value);
194*993b0882SAndroid Build Coastguard Worker 
195*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
196*993b0882SAndroid Build Coastguard Worker 
197*993b0882SAndroid Build Coastguard Worker #endif  // LIBTEXTCLASSIFIER_UTILS_FLATBUFFERS_REFLECTION_H_
198