diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h index 371df72526..bc8c2a9288 100644 --- a/include/flatbuffers/reflection.h +++ b/include/flatbuffers/reflection.h @@ -30,50 +30,52 @@ namespace flatbuffers { // ------------------------- GETTERS ------------------------- -inline bool IsScalar(reflection::BaseType t) { +constexpr bool IsScalar(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::Double; } -inline bool IsInteger(reflection::BaseType t) { +constexpr bool IsInteger(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::ULong; } -inline bool IsFloat(reflection::BaseType t) { +constexpr bool IsFloat(reflection::BaseType t) { return t == reflection::Float || t == reflection::Double; } -inline bool IsLong(reflection::BaseType t) { +constexpr bool IsLong(reflection::BaseType t) { return t == reflection::Long || t == reflection::ULong; } +// This needs to correspond to the BaseType enum. +constexpr size_t kBaseTypeSize[] = { + 0, // None + 1, // UType + 1, // Bool + 1, // Byte + 1, // UByte + 2, // Short + 2, // UShort + 4, // Int + 4, // UInt + 8, // Long + 8, // ULong + 4, // Float + 8, // Double + 4, // String + 4, // Vector + 4, // Obj + 4, // Union + 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds + // errors. + 8, // Vector64 + + 0 // MaxBaseType. This must be kept the last entry in this array. +}; +static_assert(sizeof(kBaseTypeSize) / sizeof(size_t) == + reflection::MaxBaseType + 1, + "Size of sizes[] array does not match the count of BaseType " + "enum values."); + // Size of a basic type, don't use with structs. -inline size_t GetTypeSize(reflection::BaseType base_type) { - // This needs to correspond to the BaseType enum. - static size_t sizes[] = { - 0, // None - 1, // UType - 1, // Bool - 1, // Byte - 1, // UByte - 2, // Short - 2, // UShort - 4, // Int - 4, // UInt - 8, // Long - 8, // ULong - 4, // Float - 8, // Double - 4, // String - 4, // Vector - 4, // Obj - 4, // Union - 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds - // errors. - 8, // Vector64 - - 0 // MaxBaseType. This must be kept the last entry in this array. - }; - static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1, - "Size of sizes[] array does not match the count of BaseType " - "enum values."); - return sizes[base_type]; +constexpr size_t GetTypeSize(reflection::BaseType base_type) { + return kBaseTypeSize[base_type]; } // Same as above, but now correctly returns the size of a struct if @@ -420,7 +422,7 @@ pointer_inside_vector piv(T* ptr, std::vector& vec) { return pointer_inside_vector(ptr, vec); } -inline const char* UnionTypeFieldSuffix() { return "_type"; } +constexpr const char* UnionTypeFieldSuffix() { return "_type"; } // Helper to figure out the actual table type a union refers to. inline const reflection::Object& GetUnionType(