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