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
This commit is contained in:
Fedor Osetrov
2026-03-20 05:01:45 +03:00
committed by GitHub
parent 48babd417d
commit 8396e00dd8

View File

@@ -30,23 +30,21 @@ namespace flatbuffers {
// ------------------------- GETTERS ------------------------- // ------------------------- GETTERS -------------------------
inline bool IsScalar(reflection::BaseType t) { constexpr bool IsScalar(reflection::BaseType t) {
return t >= reflection::UType && t <= reflection::Double; 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; 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; 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; 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. // This needs to correspond to the BaseType enum.
static size_t sizes[] = { constexpr size_t kBaseTypeSize[] = {
0, // None 0, // None
1, // UType 1, // UType
1, // Bool 1, // Bool
@@ -70,10 +68,14 @@ inline size_t GetTypeSize(reflection::BaseType base_type) {
0 // MaxBaseType. This must be kept the last entry in this array. 0 // MaxBaseType. This must be kept the last entry in this array.
}; };
static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1, static_assert(sizeof(kBaseTypeSize) / sizeof(size_t) ==
reflection::MaxBaseType + 1,
"Size of sizes[] array does not match the count of BaseType " "Size of sizes[] array does not match the count of BaseType "
"enum values."); "enum values.");
return sizes[base_type];
// 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 // Same as above, but now correctly returns the size of a struct if
@@ -420,7 +422,7 @@ pointer_inside_vector<T, U> piv(T* ptr, std::vector<U>& vec) {
return pointer_inside_vector<T, U>(ptr, vec); 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. // Helper to figure out the actual table type a union refers to.
inline const reflection::Object& GetUnionType( inline const reflection::Object& GetUnionType(