allow to use reflection in constant time evaluation (#8978)
* Update reflection.h
allow to use reflection in constant time evaluation
* make GetTypeSize constexpr
* fix clang-format
diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h
index 371df72..bc8c2a9 100644
--- a/include/flatbuffers/reflection.h
+++ b/include/flatbuffers/reflection.h
@@ -30,50 +30,52 @@
// ------------------------- 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;
}
-// 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
+// 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(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1,
- "Size of sizes[] array does not match the count of BaseType "
- "enum values.");
- return sizes[base_type];
+ 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.
+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 @@
return pointer_inside_vector<T, U>(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(